目次 #contents *課題 [#b27324db] 下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。&br; &ref(2016a-mission2.png); **ミッション [#n6a0c1b2] 次の経路を黒い線にそって動くロボットを作成する。ただし、なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。&br; -B地点からC地点へ&br; B地点→R右折→Q直進→Q直進→P右折→S右折→C地点 *機体の改善 [#u6aa30d7] &ref(機体表.jpg);&ref(機体裏.jpg);&br; 前回の機体は大きなタイヤと小さなタイヤを2つずつ付けていたが、このままでは小回りがきかないと考えた。そこで、大きいタイヤを外し、機体の底に回転する半球状のパーツを付けることによって動きやすくすることができた。 *プログラム [#afa02d29] **機体の動かし方について [#i78f359c] 今回は、線の境界を辿って進むようにプログラミングした。下図のように機体が線の右側をトレースする。&ref(トレース方法.png); **プログラムの内容について [#vf194f31] まず定義を述べる。 #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; } Wait(1); } } 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); } *結果と反省[#ze7132c3] -ライントレースは意外と上手く動き、BからCまで行くのに53.4秒という好記録を出した。プログラムも前回の反省を活かしてスマートにすることができた。特に、サブルーチンを活用できたと思う。交差点もきちんと認識できていた。 -反省点としては、線の右側をトレースすることで円の内側を走ることとなり、誤作動が時々起こってしまったことが挙げられる。しかし、部品を取り替えてスムーズに動くようにしたので、誤作動の回数はとても少なくなった。今回は悪いところを改良していくことができ、その結果好タイムを出せたのではないかと考えている。