ロボットの説明

モーター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);
}

問題点

改善案


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

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