[[2015b/Member]] 目次 #contents *課題内容 [#kfaf69dd] #ref(./2015b-mission2.png,65%,ロボット全体図) 課題は上図の黒線にそって動くライントレースロボットを制作するというものです。ライントレースをする際には、光センサを1つ用います。 地点A→Bまたはその逆からスタートし、ライントレースしていきます。私は、地点Aから地点Bへと進むプログラムを組みました。ここで条件があり、地点A → P直進 → Q直進 → Q右折 → P右折 → Q左折 → P左折 → 地点Bというような動きをするロボットにしなければなりません。また、地点P,Qは交差点と判断し、そこで1秒間停止してから、次の行動に移るようにしなければなりません。そして、なるべく早く動くロボットするというのが条件になります。 *ライントレースとは? [#he44cd7b] ライントレースというのは、床面に描かれた線をロボットがセンサで読み取り、線に沿って動くことを言います。 *ライントレースロボット [#of50aded] **ロボット全体図 [#ya86efcb] #ref(./DSC_0221.JPG,40%,ロボット全体図) 上の写真のものが、今回の課題で制作したライントレースロボットの全体像になります。特徴として、急なカーブも曲がり切れるように車体を小さくしています。 **光センサについて [#icca71bd] #ref(./DSC_0222.JPG,40%,センサ位置) 上の写真の赤丸で囲ってあるものが光センサになります。光センサは、ライントレースする際に白か黒(明暗)かの判断をするためにあります。このロボットは光センサとモーター(タイヤ)を近くにしてます。そうすることで、光センサの判断がされてからすぐにモーター(タイヤ)が動き、誤動作が少なくなると考えたからです。 *ロボットの動作 [#gb308690] ロボットが走行するために、モーターを2つ使用しています。それぞれが独立して動作するので、直進や回転させることができます。 今回のライントレースは光センサが1つだけということもあり、黒線に沿って動くよりも、白と黒の中間にそって動くロボットの方が効率が良いので、そのように動くようにしました。 白と黒のちょうど中間に当たるところを読み取る時に、直進するようにしました。 *プログラム [#d4fb4ffe] #define THRESHOLD 39 #define START SetPower(OUT_A,7);SetPower(OUT_C,7);OnFwd(OUT_AC);Wait(120); #define TR SetPower(OUT_A,1);SetPower(OUT_C,1);Off(OUT_AC);OnFwd(OUT_A);Wait(1);OnRev(OUT_C);Wait(1); #define TL SetPower(OUT_A,2);SetPower(OUT_C,2);Off(OUT_AC);OnFwd(OUT_C);Wait(1);OnRev(OUT_A);Wait(1); #define TRL SetPower(OUT_A,1);SetPower(OUT_C,1);Off(OUT_AC);OnFwd(OUT_A);Wait(1); #define TLL SetPower(OUT_A,1);SetPower(OUT_C,2);Off(OUT_AC);OnFwd(OUT_C);Wait(1); #define ST SetPower(OUT_A,5);SetPower(OUT_C,5);Off(OUT_AC);OnFwd(OUT_AC);Wait(1); #define TR2 SetPower(OUT_A,2);SetPower(OUT_C,2);Off(OUT_AC);OnFwd(OUT_A);Wait(1);OnRev(OUT_C);Wait(1); #define TL2 SetPower(OUT_A,1);SetPower(OUT_C,1);Off(OUT_AC);OnFwd(OUT_C);Wait(1);OnRev(OUT_A);Wait(1); define TRL2 SetPower(OUT_A,1);SetPower(OUT_C,2);Off(OUT_AC);OnFwd(OUT_A);Wait(1); #define TLL2 SetPower(OUT_A,1);SetPower(OUT_C,1);Off(OUT_AC);OnFwd(OUT_C);Wait(1); #define PQ_ST SetPower(OUT_A,2);SetPower(OUT_C,2);Off(OUT_AC);OnFwd(OUT_AC);Wait(30); #define CCW SetPower(OUT_A,4);SetPower(OUT_C,4);Off(OUT_AC);OnFwd(OUT_C);Wait(11);OnRev(OUT_A);Wait(11); #define GOAL SetPower(OUT_AC,4);Off(OUT_AC);OnFwd(OUT_A);Wait(5);OnRev(OUT_C);Wait(5);OnFwd(OUT_AC);Wait(100); #define Do 1047 #define LaF 831 #define SiF 932 #define Si 988 int c_point; sub crossing() { Off(OUT_AC); Wait(100); c_point+=1; } sub music() { PlayTone(Do,20); Wait(30); PlayTone(Do,20); Wait(30); PlayTone(Do,20); Wait(30); PlayTone(Do,60); Wait(62); PlayTone(LaF,60); Wait(62); PlayTone(SiF,60); Wait(62); PlayTone(Do,20); Wait(42); PlayTone(Si,20); Wait(22); PlayTone(Do,90); Wait(92); } task main () { SetSensor(SENSOR_2,SENSOR_LIGHT); START; ClearTimer(0); ClearTimer(1); c_point=0; while (true) { while((FastTimer(0)<10)&&(c_point<=3)) { if(SENSOR_2>THRESHOLD+8) { TL; ClearTimer(0); } else if(SENSOR_2>THRESHOLD+7) { TLL; ClearTimer(0); } else if(SENSOR_2>THRESHOLD) { ST; ClearTimer(0); } else if(SENSOR_2>THRESHOLD-2) { TRL; ClearTimer(0); } else { TR; } } while((FastTimer(0)<10)&&(c_point>=4)) { if(SENSOR_2>THRESHOLD+8) { TR2; ClearTimer(0); } else if(SENSOR_2>THRESHOLD+7) { TRL2; ClearTimer(0); } else if(SENSOR_2>THRESHOLD) { ST; ClearTimer(0); } else if(SENSOR_2>THRESHOLD-2) { TLL2; ClearTimer(0); } else { TL2; } } if((FastTimer(1)>1400)&&(c_point==0)) { crossing(); PQ_ST; ClearTimer(0); } else { ClearTimer(0); } if((FastTimer(1)>2100)&&(c_point==1)) { crossing(); CCW; PQ_ST; ClearTimer(0); } if((FastTimer(1)>2800)&&(c_point==2)) { crossing(); ClearTimer(0); ClearTimer(1); } if((FastTimer(1)>500)&&(c_point==3)) { crossing(); PQ_ST; ClearTimer(0); ClearTimer(1); } if((FastTimer(1)>2060)&&(c_point==4)) { crossing(); ClearTimer(0); ClearTimer(1); } if((FastTimer(1)>500)&&(c_point==5)) { crossing(); ClearTimer(0); } if((FastTimer(1)>1300)&&(c_point==6)) { crossing(); GOAL; Off(OUT_AC); Wait(50); music(); Off(OUT_AC); Wait(10000); } } } *反省・感想 [#c72d73f0]