[[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/3340931B-EB4B-4714-9B87-081F88384D69.jpeg) #ref(2019a/Member/shinshin/Mission2/39039BC7-714D-48AB-9553-AF7C5C4C0A0B.jpeg) #ref(2019a/Member/shinshin/Mission2/90CB3E2A-7439-4B43-BC83-0D58FBA5D8F4.jpeg) #ref(2019a/Member/shinshin/Mission2/F95146AA-1548-4658-BABE-7CB77EF2161F.jpeg) *プログラムについて [#h65e3b65] **defineについて [#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つ定義した。 「左側をライントレースして次の交差点で止まる」 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); } 「右側をライントレースして次の交差点で止まる」 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); } 「左側をライントレース(白を見過ぎると一旦停止)」 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; } } 「右側をライントレース(白を見過ぎると一旦停止)」 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; } } 「交差点を乗り越える」 sub cross_line() { while(SENSOR_2<black){ straight; } } 「ボールに向かって走る」 sub go_to_ball() { ClearTimer(1); FastTimer(1); while(FastTimer(1)<200){ if(SENSOR_2<black){ OnFwd(OUT_C);Off(OUT_A); }else{ OnFwd(OUT_A);Off(OUT_C); } } Off(OUT_AC); } 「ボールを掴む」 sub ball_catch() { OnFwd(OUT_B);Wait(24); Off(OUT_B); } 「シュート」 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); }