目次
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
次の経路を黒い線にそって動くロボットを作成する。ただし、なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。
前回の機体は大きなタイヤと小さなタイヤを2つずつ付けていたが、このままでは小回りがきかないと考えた。そこで、大きいタイヤを外し、機体の底に回転する半球状のパーツを付けることによって動きやすくすることができた。
今回は、線の境界を辿って進むようにプログラミングした。下図のように機体が線の右側をトレースする。
まず定義を述べる。
#define ONLINE 29//センサーが黒線上にある時間 #define THRESHOLD 45//白黒中間の値 #define HIPOWER 6 #define LOWPOWER 1 #define set_power_H SetPower(OUT_AC,HIPOWER);//AとCのモーターを早めに動かす #define set_power_L SetPower(OUT_AC,LOWPOWER);//AとCのモーターを遅めに動かす #define turn_left1 set_power_L;OnFwd(OUT_C); OnRev(OUT_A);//左旋回 #define turn_left2 set_power_L;OnFwd(OUT_C); Off(OUT_A);//左回転 #define turn_right2 set_power_L;OnFwd(OUT_A); Off(OUT_C);//右回転 #define turn_right1 set_power_L;OnFwd(OUT_A); OnRev(OUT_C);//右旋回 #define go_forward set_power_H; OnFwd(OUT_AC);//直進
次にサブルーチンを定める。
sub line_follow()//ライントレースするサブルーチン { SetSensor(SENSOR_2, SENSOR_LIGHT);//光センサーを用いる ClearTimer(0);//タイマーを用いる int ch=0;//変数を宣言する while(ch==0){ //変数が0の間実行する if(SENSOR_2 < THRESHOLD-7) { turn_right1; //センサーが黒線上にいたら右旋回する } else if (SENSOR_2 < THRESHOLD-5) { ClearTimer(0); turn_right2; //センサーが黒に寄った境界上にいたらタイマーをリセットして右回転する } else if (SENSOR_2 < THRESHOLD+4) { ClearTimer(0); go_forward; //センサーが境界上にいたらタイマーをリセットして直進する } else if (SENSOR_2 < THRESHOLD+6) { ClearTimer(0); turn_left2; //センサーが白に寄った境界上にいたらタイマーをリセットして左回転する } else { ClearTimer(0); turn_left1; //センサーが白紙上にいたらタイマーをリセットして左旋回する } if(FastTimer(0) > ONLINE) { //もしタイマーのカウントが0.29秒を超えたら(交差点と判断したら)実行する Off(OUT_AC); PlaySound(SOUND_DOUBLE_BEEP);//音を鳴らす Wait(100);//一秒間停止 ClearTimer(0);//タイマーをリセットする ch=1;//変数を1にする } Wait(1); } }
この時宣言した変数はライントレースと交差点を認識した時の動作の切り替えの役目を持っている。交差点を認識した時に変数を1にすることでwhile(ch==0)から抜け出し、次の動作へ移る。 その時の動作は以下のサブルーチン2つである。
sub cross_turn()//右折するサブルーチン { OnFwd(OUT_A);OnRev(OUT_C); Wait(60); Off(OUT_AC); }
sub cross_forward()//直進するサブルーチン { OnFwd(OUT_AC);Wait(70);OnFwd(OUT_C);Wait(20); Off(OUT_AC); }
最後にタスクを示す。
task main() { line_follow(); cross_turn();//1つ目の交差点 line_follow(); cross_forward();//2つ目の交差点 line_follow(); cross_forward();//3つ目の交差点 line_follow(); cross_turn();//4つ目の交差点 line_follow(); cross_turn();//5つ目の交差点 line_follow(); OnFwd(OUT_C); OnRev(OUT_A);//旋回して機体の向きを調整する Wait(25); Off(OUT_AC); OnFwd(OUT_AC);//前進して機体の位置を調整する Wait(250); Off(OUT_AC); }