#contents *課題 [#y81382c6] #ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2016b%2FMission2&openfile=2016b-mission2.png) ルート1を担当する。 「A地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ、そのピンポン玉をD地点においたゴールへシュートする Aスタート → P直進 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S左折 → Dへシュート ただし、 なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。 ピンポン玉はQ近くの3/4円周上ならどこにおいてもよい 可能であればC,Dのゴールエリアライン上からシュートする」 *ロボット本体 [#bd99d88b] **本体 [#jeb0d1df] *プログラム [#e14514df] **定義 [#d37083b9] **サブルーチンプログラム [#fea0d26a] ***線を追う [#c3b5760e] #define turn_right OnRev(OUT_B,40); #define turn_right_slow OnRev(OUT_B,40); OnFwd(OUT_C,30); #define turn_left OnRev(OUT_C,40); #define turn_left_slow OnRev(OUT_C,40); OnFwd(OUT_B,30); #define go OnRev(OUT_BC,40); #define MAX_TIME 500 sub FOLLOW_LINE() { long t0=CurrentTick(); while(CurrentTick()-t0<MAX_TIME){ if(SENSOR_1<=42){ //線上黒なら右折 turn_right; }else if(SENSOR_1<=48){ turn_right_slow; t0=CurrentTick(); }else if(SENSOR_1<=58){ go; t0=CurrentTick(); }else if(SENSOR_1<=65){ turn_left_slow; t0=CurrentTick(); }else{ turn_left; //線外白なら左折 t0=CurrentTick(); } } Off(OUT_BC); PlaySound(SOUND_UP); Wait(2000); } ・QR間の急なカーブを曲がる #define kokizami_right OnRev(OUT_B,50); OnFwd(OUT_C,40); #define kokizami_left OnRev(OUT_C,50); OnFwd(OUT_B,40); sub FOLLOW_LINE_KOKIZAMI() { long t0=CurrentTick(); while(CurrentTick()-t0<MAX_TIME){ if(SENSOR_1<=42){ //線上黒なら右折 kokizami_right; }else if(SENSOR_1<=48){ turn_right_slow; t0=CurrentTick(); }else if(SENSOR_1<=58){ go; t0=CurrentTick(); }else if(SENSOR_1<=65){ turn_left_slow; t0=CurrentTick(); }else{ kokizami_left; //線外白なら左折 t0=CurrentTick(); } } Off(OUT_BC); PlaySound(SOUND_UP); Wait(2000); } ***右折・左折・直線 [#nede7519] sub USETSU() { OnFwd(OUT_BC,50); Wait(500); Off(OUT_BC); OnRev(OUT_C,50); Wait(1500); Off(OUT_C); } sub SASETSU() { OnFwd(OUT_BC,50); Wait(500); Off(OUT_BC); OnRev(OUT_B,50); Wait(1500); Off(OUT_B); } sub CROSS() { go; Wait(800); Off(OUT_BC); } ***ゴールにシュート [#m3d8c6fb] **メインプログラム [#ua9900a3] task main() { SetSensorLight(S1); SetSensorLowspeed(S2); FOLLOW_LINE(); CROSS(); //直進P FOLLOW_LINE(); CROSS(); //直進Q go; until (abs(SensorUS(S2)-13)>=4); if(abs(SensorUS(S2)-13)>=4){ Off(OUT_BC); CATCH_BALL; } FOLLOW_LINE(); CROSS(); //直進Q FOLLOW_LINE_KOKIZAMI(); USETSU(); //右折R FOLLOW_LINE(); CROSS(); //直進P FOLLOW_LINE(); SASETSU(); //左折S FOLLOW_LINE(); GOAL(); } *実演の反省 [#t2e538f8] *学んだこと [#r6b9eff9] *感想 [#p819a847]