目次
今回の課題は、ロボットに光センサーを取り付け、紙に書いた線のうちの決められたコースをロボットが走れるようにする、というものだった。
ただライントレースをさせるだけでなく、なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止することが課題となってくる。
僕は画像のBコースを担当した。
画像のように、ロボット本体の前方に光センサーを取り付けた。 他に特筆することは無い。
定義
#define THRESHOLD 53 #define SPEED_H 40 // 直線用のスピード #define SPEED_L 20 // カーブのスピード #define OnRL(speedR,speedL) \ OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_H,SPEED_H); // 直進 #define turn_left1 OnRL(SPEED_L,-SPEED_L);// 左旋回 #define turn_left0 OnRL(SPEED_L,0); // 左折 #define turn_right0 OnRL(0,SPEED_L); // 右折 #define turn_right1 OnRL(-SPEED_L,SPEED_L);// 右旋回 #define STEP 1 // 1回の判断で動く時間 #define nMAX 260 // 通常のカーブとして許容できる繰り返しの最大値 (調整する) #define short_break Off(OUT_BC); Wait(1000); // 小休止 #define CROSS_TIME 400 // 交差点通過にかかる時間 /* 交差点を渡る */ #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
メイン
task main() { SetSensorLight(S1); Long t0 = CurrentTick(); int nOnline=0; // 続けて黒になった回数 (カウンタ)
0〜1000s(交差点で右折)
while (CurrentTick()-t0 <= 1000) { while (nOnline < nMAX) { if (SENSOR_1 < THRESHOLD-15) { turn_right1; nOnline++; // カウンタを増やす } else { if (SENSOR_1 < THRESHOLD-10) { turn_right0; } else if (SENSOR_1 < THRESHOLD) { go_forward; } else if (SENSOR_1 < THRESHOLD+6) { turn_left0; } else { turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP); } short_break; // 小休憩 PlaySound(SOUND_UP); turn_right1; // 右折 nOnline=0; //カウンタをリセット }
1000〜20000s(交差点で直進)
while (CurrentTick()-t0 <= 20000) { while (nOnline < nMAX) { if (SENSOR_1 < THRESHOLD-15) { turn_right1; nOnline++; // カウンタを増やす } else { if (SENSOR_1 < THRESHOLD-10) { turn_right0; } else if (SENSOR_1 < THRESHOLD) { go_forward; } else if (SENSOR_1 < THRESHOLD+6) { turn_left0; } else { turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP); } short_break; // 小休憩 PlaySound(SOUND_UP); turn_left1; Wait(nMAX*STEP); // 進行方向修正 cross_line; // 交差点を渡る nOnline=0; //カウンタをリセット
20000〜55000s(交差点で右折)
while (CurrentTick()-t0 <= 55000) { while (nOnline < nMAX) { if (SENSOR_1 < THRESHOLD-15) { turn_right1; nOnline++; // カウンタを増やす } else { if (SENSOR_1 < THRESHOLD-10) { turn_right0; } else if (SENSOR_1 < THRESHOLD) { go_forward; } else if (SENSOR_1 < THRESHOLD+6) { turn_left0; } else { turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP); } short_break; // 小休憩 PlaySound(SOUND_UP); turn_right1; // 右折 nOnline=0; //カウンタをリセット }
車庫入れ
turn_left1; Wait(500); go_foward; Wait(1400) Off(OUT_BC); }
時間で交差点での対応を変えるプログラムにしたから、とにかく調節が大変だった。
nMAXや交差点の通過時間も微調整が必要で、そこにかなり時間を取られた。
ロボットが図の赤丸の部分を安定して交差点と認識せず、スピードを調節して認識できるようにするのにかなり苦労した。
何回も試行錯誤を繰り返してやっと完成したから、達成感がすごかった。
次の課題は2班が協力して行うから、積極的に班に貢献していきたい。