*目次 [#t9f4de6f] #contents *課題について [#xb343d49] 光センサを利用して指定されたコースを走る、というものである。実際に走ったコースは次図の通りで、B地点→Rを右折→Qを直進→Qを直進→Pを右折→Sを右折→C地点、である。~ #ref(2016a/Member/maccha/Mission2/2016a-mission2.2.png,50%,コース) 詳しくは[[2016年前期/課題2:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission2]]を参照していただきたい。 *ロボットについて [#z6b02fcc] #ref(2016a/Member/maccha/Mission2/IMG_3674.JPG,50%,ロボット1) #ref(2016a/Member/maccha/Mission2/IMG_3675.JPG,50%,ロボット2) 上の画像のように車輪を2つ、前方には滑りやすくなるようにドーム型のパーツを付けた。~ 光センサは車輪に近くなるように、ロボットの中央部に付けた。~ *プログラム [#f69c53c7] **基本的な定義 [#yefc8112] 以下はサブルーチンを組む上で基本的な定義である。 #define turn_time 5 #define turn_right_SENKAI OnFwd(OUT_A); OnRev(OUT_C); Wait(turn_time); //旋回 #define turn_right OnFwd(OUT_A); Off(OUT_C); Wait(turn_time); //片方のみ動かす #define turn_left_SENKAI OnFwd(OUT_C); OnRev(OUT_A); Wait(turn_time); //旋回 #define turn_left OnFwd(OUT_C); Off(OUT_A); Wait(turn_time); //片方のみ動かす #define turn_right_SENKAI OnFwd(OUT_A); OnRev(OUT_C); //旋回 #define turn_right OnFwd(OUT_A); Off(OUT_C); //片方のみ動かす #define turn_left_SENKAI OnFwd(OUT_C); OnRev(OUT_A); //旋回 #define turn_left OnFwd(OUT_C); Off(OUT_A); //片方のみ動かす #define go_forward(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC); #define Black 43 //これより小さかったら黒 #define White 52 //これより大きかったら白 #define STEP 1 //一回の判断の時間 **サブルーチン [#q1ec9f06] ライントレース、交差点を直進する、交差点を右折する、交差点Qの部分の円のライントレースの4つのサブルーチンを組んだ。~ sub trace_line() { ClearTimer(0); while (FastTimer(0) < 36) { if (SENSOR_2 <= Black) { //黒 turn_right_SENKAI; } else if (SENSOR_2 < Black +2) { //黒に近いグレー turn_right; } else if (SENSOR_2 > White -2) { //白に近いグレー turn_left; ClearTimer(0); } else if (SENSOR_2 >= White) { //白 turn_left_SENKAI; ClearTimer(0); } else { //グレー OnFwd(OUT_AC); ClearTimer(0); } Wait(STEP); } Off(OUT_AC); PlaySound(SOUND_UP); Wait(100); } ロボットの左側に黒のライン、右側に白が来るようにしてライントレースをするようにした。~ また、黒または黒に近いグレーの判断が0.36秒続いたら交差点と判断した。下の図の黄色の線を見れば分かるが、黒または黒に近いグレーという判断が交差点では続くため、このようにした。白と白に近いグレー、グレーと判断したら、 ClearTimer(0) によってFastTimer(0)の値を0にすることでこの判断を可能にした。また交差点と判断したことが分かるように、判断したら音を鳴らすようにした。 #ref(2016a/Member/maccha/Mission2/cross.png,50%,交差点) sub cross_right() { ClearTimer(0); while (FastTimer(0) < 100 ) { turn_right; } } これは右折する際に使うサブルーチンで、下の画像の赤い印の部分に光センサが来るようにして、その後ライントレースを再開するようにした。 #ref(2016a/Member/maccha/Mission2/IMG_3671.JPG,50%,右折) sub cross_straight() { ClearTimer(0); while (FastTimer(0) < 160 ) { turn_left; } } これは直進する際に使うサブルーチンで、右折と同様に下の画像の赤い部分に光センサが来るようにし、その後ライントレースを再開するようにした。 #ref(2016a/Member/maccha/Mission2/IMG_3672.JPG,50%,直進) sub circle_Q() { while (FastTimer(0) < 38) { if (SENSOR_2 < Black +2) { //黒に近いグレーと黒 turn_right; } else if (SENSOR_2 > White -2) { //白に近いグレー turn_left; ClearTimer(0); } else if (SENSOR_2 >= White) { //白 turn_left_SENKAI; ClearTimer(0); } else { //グレー OnFwd(OUT_AC); ClearTimer(0); } Wait(STEP); } Off(OUT_AC); PlaySound(SOUND_UP); Wait(100); } Qの部分の円は半径が大きいため、黒だったときに右に旋回する動作をするとなかなかラインから抜け出せず、交差点と判断してしまう。そのため黒だったときも片方の車輪のみ動かすことで、光センサが短時間で旋回したときよりも大きく移動するようにした。また交差点と判断する時間もほんの少し伸ばした。~ **全容 [#z9c96d50] task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); go_forward(120); //Bから出てライントレースへ trace_line(); cross_right(); //交差点Rを右折 trace_line(); cross_straight(); //交差点Qを直進 circle_Q(); cross_straight(); //交差点Qを直進 repeat(2){ trace_line(); cross_right(); //交差点P,Qを右折 } trace_line(); cross_straight(); //Cの直前で方向を修正 go_forward(50); } *反省 [#d0057464] 完走タイムは58.75秒だった。これが速いのか遅いのかは分からないが、完走できたというのは良かったと思う。~ 今回は光センサを用いたため、一つ一つの動作を時間で制御する必要がなく課題1よりはやりやすかった。また先生からのヒントの大半がそのままプログラムに使えるものだったので、プログラムを組むことも容易であった。ただその一方で、オリジナリティに欠けるプログラムになってしまったことは改善したい点である。~ またプログラムのみで問題解決に取り組まず、早期に機体の改良に取り組めたことも良かったと思う。「まず機体を改良する」という意識は次の課題でも持っていたい。ただ、今画像を見ると機体の横幅をもっと短くできたら曲がりやすくなったかもしれないと思ったので、プログラムが正常に動いているかだけでなく、改良点に気づくように試走を観察したい。