[[2012a/MemberOnly/進行状況A]] *課題2 ライントレースロボ [#s72f173a] -黒い線の上を走るロボットを作る ***ルール説明 [#vca7f3c8] -光センサーを付けたロボットを利用して、黒い線の上をなぞりながら走るロボットを作る。 -走らせるコースには十字路を2つ、ヘアピンカーブを1つ、直角のカーブを1つ、出入り口を4つ作ること。 -出入り口の1つから入り、1週半してから出ること。 ***ロボット [#w729f847] とてもシンプルなロボットです。 ~ロボットの前に光学センサーを設置して明暗を感知できるようにしました。 ~できるだけ小回りが利くように車体はコンパクトにしました。 #ref(2012a/A4/Kaiyohmaru/M2/201206151616091.jpg,100%,ロボット) #ref(2012a/A4/Kaiyohmaru/M2/20120615161647.jpg,100%,ロボット) ***コース [#j4e88d89] #ref(2012a/A4/Kaiyohmaru/M2/20120615161709.jpg,100%,ロボット) コースです。課題のルールにある十字路、ヘアピンカーブ、直角カーブを作りました。 ~赤い丸で囲った所は進むのが難しかったところです。特に直角カーブのところは、とても曲がりにくく何度も失敗して改良を続けた結果、克服することに成功しました。 ~ループになっている場所はロボットが乗り越えにくく、抜け出せなくなることもありました。交差点を越えるときに両方の車輪を違う速さで回すことによって、曲がりながらも前進することができ、ループを抜け出すことができるようになりました。 #ref(2012a/A4/Kaiyohmaru/M2/コース番号.jpg,100%,ロボット) *プログラム [#vfca595a] 閾値を明るい場所と暗い場所とその間の3つに分けました。それによってロボットは白と黒の境界を進むようになりました。 閾値を明るい場所と暗い場所とその間の3つに分けました。それによってロボットは図のように白と黒の境界を進むようになりました。 #ref(2012a/A4/Kaiyohmaru/M2/tyokusin.png,80%,ライン) #ref(2012a/A4/Kaiyohmaru/M2/migi.png,80%,ライン) #ref(2012a/A4/Kaiyohmaru/M2/higari.png,80%,ライン) ~タイマーを設定し、交差点を越えるプログラムを作りました。 #define THRESHOLD 52 //閾値1 #define THRESHOLD_K 32 //閾値2 #define THRESHOLD_W 65 //閾値3 task main() { SetSensorLight(IN_1); //光センサー long t0,time; //タイマー t0=CurrentTick(); int mode=1 while(1){ switch(mode) //ラインをトレースするプログラミング { case 1: time=CurrentTick()-t0; //タイマー開始 if(THRESHOLD+5>SENSOR_1&&SENSOR_1>THRESHOLD-5) //閾値1+5>センサー>閾値1−5 { Float(OUT_AC); OnFwd(OUT_A,40); OnFwd(OUT_C,40); Wait(5); } if(THRESHOLD_K<SENSOR_1&&SENSOR_1<THRESHOLD_K+10) //閾値2<センサー<閾値2+10 { Float(OUT_AC); OnFwd(OUT_A,40); OnFwd(OUT_C,10); Wait(5); } if(THRESHOLD_W-10<SENSOR_1&&SENSOR_1<THRESHOLD_W) //閾値3−10<センサー<閾値3 { Float(OUT_AC); OnFwd(OUT_A,10); OnFwd(OUT_C,40); Wait(5); } if(SENSOR_1<THRESHOLD_K) //センサー<閾値2 { Float(OUT_AC); OnFwd(OUT_A,40); OnFwd(OUT_C,40); Wait(5); } if(SENSOR_1>THRESHOLD_W) //センサー>閾値3 { Float(OUT_AC); OnRev(OUT_A,40); OnFwd(OUT_C,40); Wait(5); } } if(time>21000) //〜21秒まで { mode=2; } break; case 2://交差点を通過するプログラミング { time=CurrentTick()-t0; //タイマーリセット if(THRESHOLD+5>SENSOR_1&&SENSOR_1>THRESHOLD-5) //閾値1+5>センサー>閾値1-5 { Float(OUT_AC); OnFwd(OUT_A,40); OnFwd(OUT_C,40); Wait(5); } if(THRESHOLD_K<SENSOR_1&&SENSOR_1<THRESHOLD_K+10) //閾値2<センサー<閾値2+10 { Float(OUT_AC); OnFwd(OUT_A,40); OnFwd(OUT_C,10); Wait(5); } if(THRESHOLD_W-10<SENSOR_1&&SENSOR_1<THRESHOLD_W) //閾値3-10<センサー<閾値3 { Float(OUT_AC); OnFwd(OUT_A,10); OnFwd(OUT_C,40); Wait(5); } if(SENSOR_1<THRESHOLD_K) //センサー<閾値2 { Float(OUT_AC); OnFwd(OUT_A,40); OnRev(OUT_C,40); Wait(5); } if(SENSOR_1>THRESHOLD_W) //センサー>閾値3 { Float(OUT_AC); OnFwd(OUT_A,40); OnRev(OUT_C,30); Wait(5); } } while(21000<time&&time<23000); //21秒〜23秒間 Off(OUT_AC); } } *感想 [#h7c1abb5] 前の似顔絵を描くロボットと比べて動き自体は簡単だからプログラミングも簡単なんだろうと思っていたが、タイマーや場合分けをしなければならずとても難しかった。何度も調整を繰り返し、何度も失敗を繰り返し挫けそうにもなったが、仲間の助けも借りて作り上げるができた。 前の似顔絵を描くロボットと比べて動き自体は簡単だからプログラミングも簡単なんだろうと思っていたが、タイマーや場合分けをしなければならずとても難しかった。何度も調整を繰り返し、何度も失敗を繰り返し挫けそうにもなったが、仲間の助けも借りて作り上げるができた。機械というものは、簡単に制御出来るものではないということが分かった課題だった。