[[2017b/Member/Alex/Mission2]] #contents *概要 [#sb67315a] 今回の課題は黒い線の経路にそって動くロボットを作成します。 **コース [#bcc3e6be] #ref(2017b/Member/Alex/Mission2/333.jpg,100%) Dをスタート Cを直進 Bを左折 Pを左折(一時停止) Qを直進 Rを左折 Fを左折 Sを直進(一時停止) Y地点の紙コップを取得してコースに戻る Sを直進(一時停止) Qを左折(一時停止) Rを直進 X地点に紙コップを置いてコースに戻る Pを左折 B を左折(一時停止) A地点へ(ゴール) *ロボット [#g4850692] #ref(2017b/Member/Alex/Mission2/3.jpg,70%) コップが光センサーの邪魔にならないように、間にものを置きました。 #ref(2017b/Member/Alex/Mission2/2.jpg,70%) 右側にモーターをつけて、手の上げ下げを起動します。 #ref(2017b/Member/Alex/Mission2/3.png,30%) 左側は対応して、コープをつかむ手が形成されました。 #ref(2017b/Member/Alex/Mission2/9999.JPG,10%) #ref(2017b/Member/Alex/Mission2/777.png,40%) このような形の手でコップをつかみます。 **ライントレースする仕組み [#w3b0d660] #ref(2017b/Member/Alex/Mission2/667.png,70%) `それぞれの場所の光強さを示す *プログラミング概要 [#ed200de2] **定義 [#s3e1a511] #define t_l1 OnFwd(OUT_A,45); OnRev(OUT_C,10); //急左折 #define t_l2 OnFwd(OUT_A,55); OnFwd(OUT_C,10); //左折 #define t_l3 OnFwd(OUT_A,35); OnRev(OUT_C,30); //回転左折 #define go_forward OnFwd(OUT_AC,40); //前進 #define r_b OnRev(OUT_AC,40); //後退 #define t_r1 OnRev(OUT_A,10); OnFwd(OUT_C,45); //急右折 #define t_r2 OnFwd(OUT_A,10); OnFwd(OUT_C,55); //右折 #define t_r3 OnRev(OUT_A,30); OnFwd(OUT_C,35); //回転右折 #define DO 523 #define STEP 1 #define t_off OnFwd(OUT_B,50); Wait(300); Off(OUT_B); //手落とし #define t_on OnRev(OUT_B,50); Wait(300); Off(OUT_B); //手挙げる **サブルーチン [#w607bf28] sub DM() { int BT=0; //BTは続けて暗いときになった回数 while(BT < 140){ //回数が140以下の時ライントレースを繰り返す if (SENSOR_2 < 38) { //光強さが38以下の時に急左折する t_l1; BT++; //回数増加する }else{ if (SENSOR_2 < 47) { //光強さが38〜47の間の時に左折する t_l2; } else if (SENSOR_2 < 55) { //光強さが47〜55の間の時に前進する go_forward; } else if (SENSOR_2 < 60) { //光強さが55〜60の間の時に右折する t_r2; } else { //光強さが60以上の時に急右折する t_r1; } BT=0; //回数を初期化する } Wait(STEP); } Off(OUT_AC); PlayTone(DO,100); Wait(100); PlayTone(DO,100); Wait(100); //交差点で鳴らす Wait(1000); BT = 0; } sub CM() { int BP=0; //BPは続けて暗いときになった回数 while(BP < 140){ //回数が140以下の時ライントレースを繰り返す if (SENSOR_2 < 48) { //光強さが48以下の時に急左折する t_l1; BP++; //回数増加する } else{ if (SENSOR_2 < 55) { //光強さが48〜55の間の時に前進する go_forward; } else if (SENSOR_2 < 60) { //光強さが55〜60の間の時に回転右折する t_r3; } else { //光強さが60以上の時に急右折する t_r1; } BP=0; //回数を初期化する } Wait(STEP); } Off(OUT_AC); PlayTone(DO,100); Wait(100); PlayTone(DO,100); Wait(100); //交差点で鳴らす Wait(1000); BP = 0; } CMはDMより交差点を反応しやすいです。 左側に沿って動いてます。 **task main [#t592df51] task main() { SetSensorLight(S2); DM(); t_r2; //Cでちょっと右折する Wait(200); DM(); OnFwd(OUT_A,55); //Bで90度左折する Wait(1900); DM(); t_l2; //Pで左折する Wait(1200); CM(); t_r2; //Qで右折する Wait(300); CM(); t_l2; //Rで左折する Wait(300); DM(); OnFwd(OUT_A,55); //Eで90度左折する Wait(1900); DM(); OnFwd(OUT_A,55); Wait(3800); CM(); OnFwd(OUT_A,50); //Fで90度左折する Wait(1800); Wait(STEP); OnFwd(OUT_C,35);OnFwd(OUT_A,5); //Fのところで紙コップを探す Wait(200); Wait(STEP); t_on; //手を下げる Wait(STEP); OnFwd(OUT_C,50);OnRev(OUT_A,15); //軌道へ戻る Wait(1500); DM(); t_r1; //Sのところでちょっと右折する Wait(300); DM(); go_forward; //Qのところで反応して前にちょっと進む Wait(300); t_off; //手を上げる r_b; //後退して元の場所へ戻る Wait(1100); t_l2; //Qのところで左折する Wait(1100); DM(); t_r2; //Rのところで右折する Wait(300); CM(); t_l1; //Pのところで左折する Wait(800); DM(); OnFwd(OUT_A,50); //Bのところで90度左折する Wait(1400); DM(); t_r1; //Aの前の交差点で反応してちょっと右折する Wait(200); go_forward; //Aに入る Wait(500); } *結果 [#c922b252] テストの時はうまく行けたけど、最後の時、電池が消耗されて、思ったより変わったので、成功できませんでした。 *反省 [#k0a18516] 電池の消耗をもっと注意すべきです。