[[2018b/Member]] *課題 [#ofb64055] 指定されたコースで黒い線に沿って動き、途中でボールをゴール付近に立てた350mlの空き缶(黄色で表示)に当てるロボットを製作せよ。 *ロボット [#m77d9da9] &ref(2018b/Member/kaito/Mission2/KIMG0094 (2).jpg,50%,コース); ボールを投げる腕をつけた &ref(2018b/Member/kaito/Mission2/KIMG0093.jpg,50%,コース); ボールを持った時の様子 *自分ができた・できなかったこと [#w72a4dbe] ・交差点を認識して止まるプログラミングが二種類できた。 ・超音波センサを使って缶の位置を探るプログラミングができなかった。(なんとなくぐらいしか理解できなかった。) *ライントレースのプログラミング(交差点を認識する) [#c68a7046] **黒が一定時間以上になた場合交差点を認識(自分で作ったプログラム) [#oa85df8c] #define TR_R OnFwd(OUT_B,15);OnRev(OUT_C,15); //右旋回 #define GO_R Float(OUT_B);OnFwd(OUT_C,30); //右折 #define GO_S OnFwd(OUT_BC,30); //直進 #define GO_L OnFwd(OUT_B,30);Float(OUT_C); //左折 #define TR_L OnFwd(OUT_C,15);OnRev(OUT_B,15); //直進 #define MIDL 40 //中間色 task main() { SetSensorLight(S1); long t0=CurrentTick(); while (CurrentTick()-t0<1000) { //黒が1秒続くまで行う if(SENSOR_1>MIDL+20){TR_R t0=CurrentTick();} //真っ白なら右旋回・リセット else if(SENSOR_1>MIDL+10){GO_R t0=CurrentTick();} //ちょい白なら右折・リセット else if(SENSOR_1>MIDL){GO_S t0=CurrentTick();} //グレーなら直進・リセット else if(SENSOR_1>MIDL-10){GO_L t0=CurrentTick();} //ちょい黒なら左折・リセット else{TR_L CurrentTick();} //真っ黒なら左旋回・数える } Off(OUT_BC); } **変数を用いた場合(自分で作ったもの) [#w97dd0ba] #define TR_R OnFwd(OUT_B,15);OnRev(OUT_C,15); //右旋回 #define GO_R Float(OUT_B);OnFwd(OUT_C,30); //右折 #define GO_S OnFwd(OUT_BC,30); //直進 #define GO_L OnFwd(OUT_B,30);Float(OUT_C); //左折 #define TR_L OnFwd(OUT_C,15);OnRev(OUT_B,15); //直進 #define MIDL 45 //中間色 task main() { SetSensorLight(S1); int n=0; while(true){ if(SENSOR_1>MIDL+8){TR_R} //真っ白なら右旋回 else if(SENSOR_1>MIDL+6){GO_R} //ちょい白なら右折 else if(SENSOR_1>MIDL){GO_S} //グレーなら直進 else if(SENSOR_1>MIDL-4){GO_L} //ちょい黒なら左折 else do{ TR_L Wait(1); n++;}while (n<28); //真っ黒なら0.001秒左旋回・28回繰り返したら終了 } Off(OUT_BC); } *缶を見つけるプログラミング(相方のプログラム) [#o4899f1c] void mitsukeru() { ResetTachoCount(OUT_ABC); OnFwd(OUT_A,50); OnRev(OUT_C,50); SetSensorLowspeed(S4); int d1; d1=1000;//仮の最小値 long t0=CurrentTick(); long t1=CurrentTick(); long t2=CurrentTick(); while(t2-t0<=3570){ //3.57秒間サーチする t2=CurrentTick(); if(SensorUS(S4)<d1){ d1=SensorUS(S4);//最小値より小さい値が出た時、そこを新しい最小値とする t1=CurrentTick();//時間をリセットする } t2=CurrentTick(); } t0=CurrentTick(); Off(OUT_AC); OnFwd(OUT_C,50); OnRev(OUT_A,50); Wait(t0-t1);//最後に、最小値をとった場所まで回る } ある値を設定してその値より小さくなった時の時刻を記憶し、逆戻りして進んでいると思われる。 *完成したプログラミング(相方のプログラム) [#u6acc65e] task main() { Line();//AからBまでライントレース RIGHT(15);//Bを右折 Line();//BからKまでライントレース Wait(1000);//一時停止 LEFT(15);//Kを左折 Line();//KからJまでライントレース go(50);//微調節 Line();//KからJまでライントレース go(100);//微調節 mitsukeru();//缶を探す OnFwd(OUT_B,30);//缶を落とす Wait(2000); Off(OUT_B); Line();//JからIまでライントレース go(50)//微調節 Line();//IからHまでライントレース LEFT(15);//左に曲がる Line();//HからGまでライントレース Wait(1000);//一時停止 LEFT(15);//Gで左折 Line2();//ある場所まで進み続ける Line();//そこからEmまでライントレース Wait(1000);//一時停止 RIGHT(15);//Eを曲がる Line();//Lまで行く go(100);//ゴールに入る Off(OUT_BC);// } ライントレース→交差点(右折・直進・左折)→ライントレース …を操作してゴールに向かっている。 *まとめ [#icdf9542] 結局のところ課題を解決することはできなかった。次回はチームの人に聞いたり、役割分担しながら課題をクリアしたい。超音波センサーはなるべく駆動輪間の上・位置は下にあると正確な計測・認知がしやすくなる。