[[2019a/Member]] *目次 [#f57fc253] #contents *課題2について [#i1664c8e] #ref(2019a/Member/shinshin/Mission2/D9FF9282-8186-416D-98D0-1FF7344994D1.png) A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。 A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール) A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール) 交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。 #ref(2019a/Member/shinshin/Mission2/IMG_2245.png) 僕は後者の M→B のルートを選びました。 *ロボットについて [#x2ebafb7] #ref(2019a/Member/shinshin/Mission2/161D07AD-74F5-4BEC-890B-4CD3D4C84CB6.jpeg,20%) #ref(2019a/Member/shinshin/Mission2/90DDCB52-B9C0-49A7-AFF2-5BCC6FD998E2.jpeg,20%) #ref(2019a/Member/shinshin/Mission2/C62E7553-D07B-48C2-8F97-424D2958B289.jpeg,20%) #ref(2019a/Member/shinshin/Mission2/DB7A84F9-3ABD-4BE8-8E24-442339B5B7D1.jpeg,20%) *プログラムについて [#h65e3b65] **使用したマクロ [#ja644831] まずは明るさと交差点で止まるまでの時間を以下のように設定しました。 明るさについては複数色に分けることも考えたのですが、プログラムを簡潔にすることを優先視した結果、一つの値でやることに決定しました。 #define black 39 #define run_time 30 次に、左右回転や直進などの簡単な動作について以下のように設定しました。 #define right OnFwd(OUT_A);Off(OUT_C); #define left OnFwd(OUT_C);Off(OUT_A); #define straight OnFwd(OUT_AC); #define turn_left OnFwd(OUT_C);OnRev(OUT_A); #define turn_right OnFwd(OUT_A);OnRev(OUT_C); **使用したサブルーチン [#e9466326] ここではdefineとは違い、複雑な動作をサブルーチンによって8つ定義しました。 ***1.左側をライントレースして次の交差点で止まる [#ueeec16f] 光センサーの示す値が‘black’よりも高い(白の上を走っている)なら右折(right)、そうでない(黒線の上を走っている)なら左折するように定義しました。また、黒線の上を‘run_time’よりも長く走っていた場合は1秒間止まるように定義しました。 2はこれの左右対称版です。 sub follow_line_left() { ClearTimer(0); while(FastTimer(0)<run_time){ if(SENSOR_2>black){ right; ClearTimer(0); }else{ left; } }Off(OUT_AC);Wait(100); } ***2.右側をライントレースして次の交差点で止まる [#cc426375] sub follow_line_right() { ClearTimer(0); while(FastTimer(0)<run_time){ if(SENSOR_2>black){ left; ClearTimer(0); }else{ right; } }Off(OUT_AC);Wait(100); } ***3.左側をライントレース(白を見過ぎると一旦停止) [#b4824cde] ここでは、直角の外側を曲がる際に、光センサーの位置が前にあることもあり遠回りをしてしまったため、前の二つとは逆に、白の上を長く走った際に一旦止まって回転するように定義しました。4は1、2の時と同様、これの左右対称版です。 sub corner_stop_left() { ClearTimer(0); while(FastTimer(0)<100){ if(SENSOR_2<black){ left; ClearTimer(0); }else{ right; } } Off(OUT_AC);Wait(50); while(SENSOR_2>black){ turn_right; } } ***4.右側をライントレース(白を見過ぎると一旦停止) [#v0621f86] sub corner_stop_right() { ClearTimer(0); while(FastTimer(0)<100){ if(SENSOR_2<black){ right; ClearTimer(0); }else{ left; } } Off(OUT_AC);Wait(50); while(SENSOR_2>black){ turn_left; } } ***5.交差点を乗り越える [#w4896e7b] これは黒の上にいる間はまっすぐ走り続けるプログラムで、交差点を乗り越える際にはこれを使いました。 sub cross_line() { while(SENSOR_2<black){ straight; } } ***6.ボールに向かって走る [#rfbfd7de] sub go_to_ball() { ClearTimer(1); FastTimer(1); while(FastTimer(1)<200){ if(SENSOR_2<black){ left; }else{ right; } } Off(OUT_AC); } ***7.ボールを掴む [#x1a49914] sub ball_catch() { OnFwd(OUT_B);Wait(24); Off(OUT_B); } ***8.シュート [#tab94eba] sub ball_shoot() { OnRev(OUT_B);Wait(30); Off(OUT_B); straight;Wait(10); } **メインプログラムについて [#nd94b15b] task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); FastTimer(0); follow_line_right(); //M~K// cross_line(); corner_stop_left(); follow_line_left(); cross_line(); //K~L// Off(OUT_AC);Wait(50); go_to_ball(); //ボールへ!// ball_catch(); turn_left;Wait(170); //反転してL~K// follow_line_right(); turn_right;Wait(20); cross_line(); Off(OUT_AC);Wait(50); left;Wait(40); repeat(2){ //JからI、Hを越えてGへ// follow_line_left(); cross_line(); } follow_line_left(); cross_line(); Off(OUT_AC);Wait(50); turn_left;Wait(20); corner_stop_right(); //Fを曲がる// corner_stop_right(); //Eを曲がる// follow_line_right(); //E~D// cross_line(); Off(OUT_AC);Wait(50); follow_line_right(); //D~B// turn_left;Wait(10); ball_shoot(); Off(OUT_AC); }