今回の課題は、決められたコースを線に沿って走るロボットを作ることだ。 これがコースの全体像だ。
私が選んだルートは C地点からA地点へ 『C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点』 です。
今回のロボットは小回りがきくように左右のタイヤの幅をできるだけ小さくした。
また、光センサーの位置をタイヤと近くし、センサーの左右への振り幅を小さくした。
今回は『task main』をシンプルにするためにサブルーチンを用いた。
まずは細かい定義を
#define THRESHOLD 45 #define BLACK 42 // これ以下は黒 #define WHITE 50 // これ以上は白 #define Go OnFwd(OUT_AC); #define L Off(OUT_A); OnFwd(OUT_C); #define R OnFwd(OUT_A); Off(OUT_C); #define L_senkai OnFwd(OUT_A); OnRev(OUT_C); #define R_senkai OnFwd(OUT_C); OnRev(OUT_A); #define STEP 1 #define NOTINTERSECTION FastTimer(0) <= 22 || FastTimer(1) <= 300
これが線の左側に沿ってライントレースするサブルーチンである。
sub Trace() { SetSensor(SENSOR_2, SENSOR_LIGHT); while (true) { if (SENSOR_2 < THRESHOLD){ L; } else { R; } Wait(STEP); } }
これが曲線を走るサブルーチンである。
sub Curve() { SetSensor(SENSOR_2, SENSOR_LIGHT); while(true) { if (SENSOR_2 < BLACK){ R_senkai; }else if(SENSOR_2 > THRESHOLD){ L_senkai; }else if (SENSOR_2 < THRESHOLD){ L; }else{ R; } Wait(STEP); } }
こせが交差点で停止するサブルーチンである。
sub IntersectionFreeze() { SetSensor(SENSOR_2, SENSOR_LIGHT); ClearTimer(0); while (true) { while (FastTimer(0) <= 30) { if (SENSOR_2 < BLACK) { R; } else if (SENSOR_2 < WHITE) { Go; ClearTimer(0); } else { R; ClearTimer(0); } Wait(STEP); } Off(OUT_AC); }}
これが交差点を左折するサブルーチンである。
sub IntersectionL() { ClearTimer(0); }
これが交差点を右折するサブルーチンである。
sub IntersectionR() { ClearTimer(0); while(NOTINTERSECTION){ if(FastTimer(1) >= 300){ ClearTimer(0); ClearTimer(1); break; } if(SENSOR_2 >= WHITE){ L; }else if(SENSOR_2 >= BLACK){ R; } } L; Wait(10); Off(OUT_AC); ClearTimer(0); ClearTimer(1); }
これが交差点を直進するサブルーチンである。
sub IntersectionGo() { Go; Wait(20); Off(OUT_AC); }
そして、『task main』がこれだ。
task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); Trace(); IntersectionL(); // Sを左折 Trace(); IntersectionL(); // Pを左折 Trace(); IntersectionGo(); // Qを直進 Trace(); IntersectionGo(); // Qを直進 Trace(); Curve(); // r=5のカーブ上を Trace(); IntersectionR(); // Rを右折 Trace(); Curve(); Trace(); IntersectionL(); // Pを左折 Trace(); Curve(); Trace(); IntersectionFreeze(); IntersectionGo(); }
ロボットを前回の似顔絵ロボットから大幅に形を変えたことによって小回りがきき、ライントレースに適した形にできてよかった。 ただ、プログラムを書くのに時間をかけすぎて、コース上を全て通しでスタートからゴールまで走らせることはできなかった。