ロボットの説明

モーターA,Bに左右のタイヤをつけ、モーターCにアームを取り付けた。ボールはカタパルト方式で射出する。最初に360°回転し、空き缶の位置を記録する。次に記録した方向に向き、空き缶との距離が15cmになるまで前進する。

1438161541687.jpg

プログラムの説明

プログラムは
1)空き缶の位置(角度)の測定
2)空き缶の位置を向く
3)空き缶に向かって前進
4)ボールの射出
の順で動く。

定数や関数の定義

#define turn_left OnFwd(OUT_A,25);OnRev(OUT_B,25);
#define turn_right OnFwd(OUT_B,25);OnRev(OUT_A,25);
#define go_forward OnFwd(OUT_AB,25);
#define TURN_TIME_10=147; //10°回転するのにかかる時間

TURN_TIME_10の決定は、ロボットを回転させ180°回転するのに要する時間を計10回測定し、それのっ平均を18で割った値である。

空き缶の位置(角度)の測定

int scan_angle(int a){ //0<=a<=36で指定 a*10°の範囲をスキャンする
	PlaySound(SOUND_CLICK);
	Wait(500);
	int min_temp=0; //仮の最小値
	int min=100; //最小値
	int angle=0; //最小値を記録した角度[°]
	int i=0; //i*10[°]ごと記録する
	int turn_time=TURN_TIME_10;
	repeat(a){
		min_temp=SensorUS(S4);
		if(min>=min_temp){ //最小値比較
			min=min_temp; //最小値更新
			angle=i*10; //最小値
			PlaySound(SOUND_LOW_BEEP);
			Wait(500);
		}
		turn_right;
		Wait(turn_time);
		i++;
	}
	return angle;

} 10°ごと旋回してそのつど距離センサーの値を取得する。取得した値が保持している最小値よりも小さかった場合、保持する最小値を更新する。そのときの繰り返し回数*10°を、空き缶のある方向の暫定値として保持する。360°旋回後、暫定値を確定値として返す。

空き缶の位置を向く

task main(){
	int machine_turn_time=0; //ロボットの回転時間
	SetSensorLowspeed(S4);
	int angle=scan_angle(36); //360°スキャン
	if(angle<=180){
		machine_turn_time=TURN_TIME_10*angle;
		go_forward;
		Wait(machine_turn_time);
		Off(OUT_AB);
	}else{
		machine_turn_time=TURN_TIME_10*angle;
		go_forward;
		Wait(machine_turn_time);
		Off(OUT_AB);
	}

scan_angle()関数で空き缶のある位置(角度)が帰ってくる。その角度を180°以上か180°以下かで場合分けをして、それぞれ右旋回、左旋回をさせる。

空き缶に向かって前進

int flg=0;
	while(flg==0){
		go_forward;
		if(SensorUS(S4)<=15){
			flg=1;
		}
	}
Off(OUT_AB);

センサーの値を取得し、15cmを切ったら停止する。

ボールの射出

	OnFwd(OUT_C,100); //ボール射出
	Wait(500);
}

問題点

  • 電池の消耗によって、回転に要する時間が変わってくるので正確な角度まで回転できない。
  • ボールの射出方式が悪く、ボールを遠くに飛ばせない。

改善案

  • センサーが100cm以下の値を返してきたらスキャンを停止し、その方向に前進するように変更する。回転操作が大幅に少なくなるので誤差も小さくできる。

添付ファイル: file1438161541687.jpg 119件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-07-29 (水) 18:23:16