#define THRESHOLD 44 //しきい値 #define LOWPOWER 1 //早すぎるため全て遅くする #define set_power_L SetPower(OUT_AC,LOWPOWER); //力 #define go_forward set_power_L; OnFwd(OUT_AC); //直進 #define turn_left1 set_power_L; OnRev(OUT_A); OnFwd(OUT_C); //左旋回 #define turn_left0 set_power_L; Off(OUT_A); OnFwd(OUT_C); //左折 #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C); //右折 #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); //右旋回 #define STEP 1 //1回の判断で動作させる時間(これは1/100秒) #define n0MAX 15 //通常のカーブとして許容できる繰り返しの最大値 #define n1AMAX 2 //コース前半の急なカーブと判断される回数 #define n1BMAX 4 //コース後半の急なカーブと判断される回数 #define short_break Off(OUT_AC); Wait(100); //小休止 #define CROSS_TIME 20 //交差点を渡る時間 #define first_time 400 //交差点を認識する時間 #define dribble set_power_L; OnFwd(OUT_B); Wait(47); //ボールをつかむ #define shoot set_power_L; OnRev(OUT_B); Wait(47); //ボールをシュート task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサーをセット int n0nline=0; //続けて黒になった回数(カウンタ) int n1nline=0; //急カーブの回数 while(n1nline < n1AMAX) //急なカーブが2回あるまで{}の中を繰り返す(n1AMAXは2なので) { while(n0nline < n0MAX)//急なカーブがあるまで繰り返す { if (SENSOR_2 < THRESHOLD -8){ turn_left1; n0nline++;} //より暗いとき左旋回してカウンタを1増やす else if (SENSOR_2 < THRESHOLD -4){ turn_left0; } //暗いとき左折 else if (SENSOR_2 < THRESHOLD +1){ go_forward; } //中間のとき直進 else if (SENSOR_2 < THRESHOLD +12){ turn_right0; } //明るいとき右折 else { turn_right1; } //より明るいとき右旋回 Wait(STEP); } PlaySound(SOUND_UP); //急なカーブの度に高い音を1回鳴らす n0nline=0; //カウンタをリセット n1nline++; //急なカーブの数をカウント } n1nline=0; ClearTimer(0); //タイマーをリセットして開始 while(FastTimer(0) <= first_time) //交差点を渡りきるまで繰り返す { while(n0nline < n0MAX) { if (SENSOR_2 < THRESHOLD -8){ turn_left1; n0nline++; } else if (SENSOR_2 < THRESHOLD -4){ turn_left0; } else if (SENSOR_2 < THRESHOLD +1){ go_forward; } else if (SENSOR_2 < THRESHOLD +12){ turn_right0; } else { turn_right1; } Wait(STEP); } short_break; //小休止 turn_right1; Wait(n0MAX*STEP); //進行方向修正 cross_line; //交差点を渡る n0nline=0; //カウンタをリセット } n0nline=0; while((FastTimer(0) > first_time)&&(n1nline <n1BMAX)) //急なカーブが4回あるまで(最後のT字路を含む)繰り返す { while(n0nline < n0MAX) { if (SENSOR_2 < THRESHOLD -8){ turn_left1; n0nline++; } else if (SENSOR_2 < THRESHOLD -4){ turn_left0; } else if (SENSOR_2 < THRESHOLD +1){ go_forward; } else if (SENSOR_2 < THRESHOLD +12){ turn_right0; } else { turn_right1; } Wait(STEP); } n1nline++; n0nline=0; PlaySound(SOUND_DOWN); //急なカーブがある度に低い音を鳴らす } }
ロボット本体の小回りやアームなどを考えるのに時間がかかりすぎた、またプログラムではアームのおろすタイミングなどが難しく苦戦した。