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