[[2019a/Member]] 目次 #contents *課題について [#n09c5be2] 次のようなコースを作成し、ライントレースをします。 #ref(2019a-mission2.png) 進む順番 A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール) 交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止します。 *ロボットの本体の説明 [#qee10873] *プログラムの説明 [#nf96d142] #define zenshin OnFwd(OUT_BC,50); //前進 #define koushin OnFwd(OUT_BC,-50); //後進 #define migikaiten OnFwd(OUT_B,-70);OnFwd(OUT_C,40); //右回転 #define hidarikaiten OnFwd(OUT_B,40);OnFwd(OUT_C,-70); //左回転 #define mi OnFwd(OUT_C,40);Off(OUT_B);//右に進む #define hi OnFwd(OUT_B,40);Off(OUT_C); //左に進む #define smi OnFwd(OUT_C,30);Off(OUT_B);//s右に進む #define shi OnFwd(OUT_B,30);Off(OUT_C); //s左に進む #define tomaru Off(OUT_BC); //ストップ long A=0;//コーナーで止まる時間を計測する変数 long B=0;//ライントレースしている時間を計測する変数 void stop_corner(){ SetSensorLight(S1); while(A<400){ if(SENSOR_1<40){ hi; A=A+1; B=B+1; }else{ mi; B=B+1; A=0; } } tomaru; Wait(1000); B=0; }//コーナーで止まるライントレース(ラインの左側を進む) void cross_line(){ SetSensorLight(S1); if(SENSOR_1<40){ hi; B=B+1; }else{ mi; B=B+1; } }//コーナーを直進するライントレース(ラインの左側を進む) void re_stop_corner(){ SetSensorLight(S1); while(A<400){ if(SENSOR_1>40){ hi; A=0; B=B+1; }else{ mi; A=A+1; B=B+1; } } tomaru; Wait(1000); B=0; }//コーナーで止まるライントレース(ラインの右側を進む) void re_cross_line(){ SetSensorLight(S1); if(SENSOR_1>40){ hi; B=B+1; }else{ mi; B=B+1; } }//コーナーを直進するライントレース(ラインの右側を進む) void stop_ball(){ SetSensorLight(S1); while(A<800){ if(SENSOR_1<40){ hi; A=0; B=B+1; }else{ mi; B=B+1; A=A+1; } } tomaru; Wait(1000); B=0; }//コーナーで止まるライントレース(ラインの左側を進む) void stop_corner1(){ SetSensorLight(S1); while(A<400){ if(SENSOR_1<40){ hi; A=A+1; B=B+1; }else{ mi; B=B+1; A=0; } } tomaru; Wait(1000); B=5000; }//コーナーで止まるライントレース(ラインの左側を進む) task main() { while(B<4000){ cross_line(); } while(B>=4000){ stop_corner(); }//Dの交差点で一時停止する。 mi; Wait(100); tomaru; Wait(200);//交差点で止まったとき、機体の向きを調整する動作 while(B<5000){ cross_line(); } while(B>=5000){ stop_corner(); } migi; Wait(300); tomaru; Wait(100); zenshin; Wait(200); tomaru; Wait(100);//円の部分での、ライン上にのるための動作 while(B<3000){ cross_line(); } while(B>=3000){ stop_corner(); }//円の終わり zenshin; Wait(900); tomaru; Wait(100);//円の終わりでの機体の向きの調整 while(B<4000){ stop_corner1(); } B=0; hidari; Wait(200); tomaru; Wait(100);//ロボットの向きの調整 while(B<2000){ re_cross_line(); } while(B>=2000){ stop_ball(); } //ボールのところ 白が続くと止まるのを作る B=0; OnFwd(OUT_A,-50);//ボールを取る Wait(600); Off(OUT_A); Wait(100); hidari; Wait(1000); tomaru; Wait(100); zenshin; Wait(400); tomaru; Wait(100);//ボールをとった後、ライン上に復帰する動作 while(B<10000){ re_cross_line();//ラインの右側をトレースする。 } while(B>=10000){ re_stop_corner(); }//ラインの右側をトレースし、ゴールの前で泊まる。 OnFwd(OUT_A,50); Wait(600);//ボールを下ろす Off(OUT_A); Wait(100); zenshin; Wait(100); tomaru; Wait(100);//シュートする }