[[2019a/Member]] #contents *課題について [#sf9b88ae] 下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。 #ref(2019a/Member/Syoshida/Mission2/robotics_mission2_corse2.jpg,100%,コース説明) **選択したコース [#a8f80e44] A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール) #ref(2019a/Member/Syoshida/Mission2/robotics_mission2_corse.jpg,100%,コースルート) ※赤丸地点で一時停止 *ロボットについて [#j6ab90ed] *プログラミングについて [#o6594a4a] #define THRESHOLD 42 #define runtime 1450 #define runtime1 50 #define RUN_TIME1 30 #define RUN_TIME_JIH 170 #define RUN_TIME_HGF 380 #define RUN_TIME_FE 180 #define RUN_TIME_DB 1000 #define turn90 OnFwd(OUT_A);OnRev(OUT_C);Wait(100);Off(OUT_AC);//90度回転 #define power(s) SetPower(OUT_B,s); //モータのパワーをsにする #define STEP 1 // 一回の判定で進む時間 #define turn_left Off(OUT_A); OnFwd(OUT_C); #define turn180 OnFwd(OUT_C);OnRev(OUT_A);Wait(190);Off(OUT_AC);//180度回転 #define turn_right OnFwd(OUT_A);OnRev(OUT_C); #define turn_left90 OnRev(OUT_A);OnFwd(OUT_C);Wait(100); #define go_straight OnFwd(OUT_AC); #define go_back OnRev(OUT_AC); sub across_turn() { SetSensor(SENSOR_2, SENSOR_LIGHT); ClearTimer(0); while (FastTimer(0) <= runtime) { if (SENSOR_2 < THRESHOLD){ // 線上なら turn_left; // 左へ } else { // 線上でなければ turn_right; // 右へ } Wait(STEP); // STEPの値 } } sub across_turn1() { SetSensor(SENSOR_2, SENSOR_LIGHT); ClearTimer(0); while (FastTimer(0) <= runtime1) { if (SENSOR_2 < THRESHOLD){ // 線上なら turn_left; // 左へ } else { // 線上でなければ turn_right; // 右へ } Wait(STEP); // STEPの値 } } sub line_trace1() //交差点で止まるまで動き続けるプログラム { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while ( FastTimer(0) <= RUN_TIME1 ) { if ( 48 < SENSOR_2 ){ OnFwd(OUT_A); Off(OUT_C);ClearTimer(0); //白なら右へ } else if (45 <SENSOR_2 < 49) { Off(OUT_A); OnFwd(OUT_C); //灰色なら左へ } else { OnRev(OUT_A);OnFwd(OUT_C); //黒なら右へ旋回 } } Off(OUT_AC);Wait(100); } sub line_trace_JIH() //JからI、IからHまでのライントレース 一定時間内でライントレースし続ける { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while ( FastTimer(0) <= RUN_TIME_JIH ) { if ( 48 < SENSOR_2 ){ OnFwd(OUT_A); Off(OUT_C); //白なら右へ } else if (45 <SENSOR_2 < 49) { Off(OUT_A); OnFwd(OUT_C); //灰色なら左へ } else { OnRev(OUT_A);OnFwd(OUT_C); //黒なら右へ旋回 } } turn_right;Wait(22);OnFwd(OUT_AC);Wait(15); } sub line_trace_HGF() //HからFまで 一定時間内ライントレースし続ける { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while ( FastTimer(0) <= RUN_TIME_HGF ) { if ( 48 < SENSOR_2 ){ OnFwd(OUT_A); Off(OUT_C); //白なら右へ } else if (45 <SENSOR_2 < 49) { Off(OUT_A); OnFwd(OUT_C); //灰色なら左へ } else { OnRev(OUT_A);OnFwd(OUT_C); //黒なら右へ旋回 } } } sub line_trace_FE() //FからEまで 一定時間内ライントレースし続ける { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while ( FastTimer(0) <= RUN_TIME_FE ) { if ( 48 < SENSOR_2 ){ OnFwd(OUT_A); Off(OUT_C); //白なら右へ } else if (45 <SENSOR_2 < 49) { Off(OUT_A); OnFwd(OUT_C); //灰色なら左へ } else { OnRev(OUT_A);OnFwd(OUT_C); //黒なら右へ旋回 } } } sub line_trace_DB() //DからBまでのライントレース 一定時間内ライントレースし続ける { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while ( FastTimer(0) <= RUN_TIME_DB ) { if ( 48 < SENSOR_2 ){ OnFwd(OUT_A); Off(OUT_C); //白なら右へ } else if (45 <SENSOR_2 < 49) { Off(OUT_A); OnFwd(OUT_C); //灰色なら左へ } else { OnRev(OUT_A);OnFwd(OUT_C); //黒なら右へ旋回 } } } task main(){ across_turn(); turn180; OnFwd(OUT_B); power(0);//ゆっくり前進 Wait(25); Off(OUT_B); across_turn1(); turn90; Off(OUT_AC); line_trace1(); //kから出発 line_trace_JIH(); //JからI line_trace_JIH(); //IからH line_trace_HGF(); //HからF turn_left90; //Fで左90度旋回 line_trace_FE(); //FからE turn_left; //Eで左旋回(90度以下) Wait(30); line_trace1(); //EからDまでのライントレース後、一時停止 turn_right;Wait(25); //Dで左へ傾いた分、右に曲がって位置調整 line_trace_DB(); //DからB turn180; //180度旋回 OnRev(OUT_B); //アーム展開 power(0); Wait(25); Off(OUT_B); go_straight; //ボールから離れる Wait(100); OnFwd(OUT_B); //アームを閉じる power(0); Wait(25); go_back; //後ろに下がって位置調整 Wait(55); OnFwd(OUT_B); Wait(10); //ボールをアームで弾いてAにシュート } *結果 [#y39b78d2] *まとめ [#k1bf251c]