目次 #contents * 課題2 [#nd86a976] #ref(./2016b-mission2.png,75%,コース) 図のようなコースを作り、次の経路を黒い線に沿って進むロボットを作る。 Bスタート → R直進 → P右折 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S右折 → Cへシュート * ロボットの説明 [#f1c42aa3] #ref(./_20161222_163051.JPG,75%,全体図) #ref(./_20161222_170651.JPG,75%,アーム) #ref(./_20161222_170750.JPG,75%,駆動部) * プログラム [#d16edb76] #define power 30 //モーターのパワー #define nMax 1500 //この数値よりも黒と判断される回数が大きいと交差点と判断する #define LET_TIME 850 //交差点を直進するときにロボットを引き戻す際に使う時間 #define CATCH_TIME 500 //ボールを取るためにアームを動かす時間 #define SHOOT_TIME 500 //シュートするときにロボットを動作させる時間 #define go_foward OnFwd(OUT_AC,power); //前進 #define go_back OnRev(OUT_AC,power); //後退 #define turn_right OnFwd(OUT_A,power); //右折 #define turn_left OnFwd(OUT_C,power); //左折 #define circle_right OnFwd(OUT_A,power); OnRev(OUT_C,power); //方向転換(右) #define circle_left OnFwd(OUT_C,power); OnRev(OUT_A,power); //方向転換(左) #define CROSS_LINE_TIME 800 //交差点を直進するときに動作させる時間 #define CROSS_TURN_RIGHT_TIME 2750 //右に90度旋回させるために動作させる時間 #define cross_line circle_left; Wait(LET_TIME); go_foward; Wait(CROSS_LINE_TIME);Off(OUT_AC); //交差点を直進 #define cross_turn_right circle_right Wait(CROSS_TURN_RIGHT_TIME-nMax);Off(OUT_AC); //交差点を右折 #define white 60 //白 #define pale_gray 50 //白よりの灰 #define deep_gray 40 //黒よりの灰 #define black 34 //黒 #define ball_catch OnFwd(OUT_B,power); Wait(CATCH_TIME); Off(OUT_B); //ボールを取る #define ball_shoot circle_left; Wait(nMax); OnRev(OUT_B,power); Wait(CATCH_TIME); Off(OUT_B); go_back; Wait(SHOOT_TIME); go_foward; Wait(SHOOT_TIME+300); //ボールをシュートする sub line_trace() //ボールを取るまでの間、ライントレースする { if (SENSOR_1 > white){ circle_left; } else if (SENSOR_1 > pale_gray){ turn_left; } else if (SENSOR_1 > deep_gray){ go_foward; } else if (SENSOR_1 > black){ turn_right; } else{ circle_right; } } task main() { SetSensorLight(S1); SetSensorLowspeed(S2); int nOnline=0; //黒い線の上にいた回数 int n=0; //交差点に着いた回数 while(1){ while(1){ n++; nOnline=0; while(nOnline < nMax){ if (SENSOR_1 > white){ circle_left; nOnline=0; } else if (SENSOR_1 > pale_gray){ turn_left; nOnline=0; } else if (SENSOR_1 > deep_gray){ go_foward; nOnline=0; } else if (SENSOR_1 > black){ turn_right; nOnline=0; } else{ circle_right; nOnline++; } } //交差点に差し掛かるまでの間ライントレースする Off(OUT_AC); Wait(1000); if(n==1){ PlaySound(SOUND_FAST_UP); cross_line; break; } //最初の交差点を横断する else if(n==2){ PlaySound(SOUND_FAST_UP); cross_turn_right; break; } //二回目のの交差点を右折する else if(n==3){ PlaySound(SOUND_FAST_UP); cross_line; while(SensorUS(S2) > 10){ line_trace(); } ball_catch; break; } //三回目の交差点を横断して、ボールを認識したところでキャッチする else if(n==4){ PlaySound(SOUND_FAST_UP); cross_line; break; } //四回目の交差点を横断する else if(n==5){ PlaySound(SOUND_FAST_UP); cross_turn_right; go_foward; Wait(1000); break; } //ヘアピンカーブの入り口を交差点と判断して曲がる else if(n==6){ PlaySound(SOUND_FAST_UP); cross_turn_right; go_foward; Wait(500); Off(OUT_AC); break; } //ヘアピンカーブの出口付近を交差点と判断して曲がる else if(n==7){ PlaySound(SOUND_FAST_UP); cross_turn_right; break; } //五回目の交差点を右折する else if(n==8){ PlaySound(SOUND_FAST_UP); cross_line; break; } //六回目の交差点を直進する else if(n==9){ PlaySound(SOUND_FAST_UP); cross_turn_right; break; } //七回目の交差点を右折する else{ PlaySound(SOUND_FAST_UP); cross_line; ball_shoot; } //ゴールにボールをシュートする } } } * まとめ [#j096b03d]