元々は4輪だったものを写真のように前輪2輪だけにしました。そしてロボットの裏側に滑りやすくするために少し球面を帯びたパーツを取り付けました。これによって、少しだけ進むスピードが上がりました。
光センサーはこの写真ぐらい紙からはなし、ロボット本体が作る陰がぎりぎり入らないようにしました。
このプログラムは黒線の左側をトレースするように書きました。
#define LIGHT 39 #define turn_left1 OnFwd(OUT_C); OnRev(OUT_A); #define turn_left2 OnFwd(OUT_C); Off(OUT_A); #define turn_right1 OnFwd(OUT_A); OnRev(OUT_C); #define turn_right2 OnFwd(OUT_A); Off(OUT_C); #define go OnFwd(OUT_AC); #define sound PlaySound(SOUND_FAST_UP);
sub fowerd() { sound; OnFwd(OUT_AC); Wait(40); Off(OUT_AC); }
sub left() { sound; turn_left1; Wait(30); Off(OUT_C); }
黒線の真ん中の値(光センサーでの)を基準にし、最初は必ず左折するようにしました。また、ライントレースのサブルーチンを終わらせるために関数を使いました。ch=0の時にラインとレースを開始し、ch=1(交差点まで来たら)になったら終了するようにしました。交差点の識別は、黒色の部分が0,4秒続いたらそこを交差点とし、停止するようにしました。
sub line() { int ch=0; SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(ch==0) { if(FastTimer(0)>40) { Off(OUT_AC); Wait(100); ClearTimer(0); ch=1; } if (SENSOR_2 < LIGHT){ turn_left1; } else if (SENSOR_2 < LIGHT + 3){ turn_left2; } else if (SENSOR_2 < LIGHT + 6){ ClearTimer(0); go; } else if (SENSOR_2 < LIGHT + 9){ ClearTimer(0); turn_right2; } else { ClearTimer(0); turn_right1; } Wait(3); } }
task main() { line(); fowerd(); line(); fowerd(); line(); fowerd(); line(); left(); line(); sound; turn_right1; Wait(30); OnFwd(OUT_AC); Wait(150); Off(OUT_AC); }
ライントレースをさせるだけなら簡単だったけど、そこに交差点を認識させるプログラムで、ClearTimerをどこに入れるかで悩みました。今回特に難しかったのがラインとレースを終わらせるところです。そのまま関数を使わずにいると、交差点は認識できても、ずっとライントレースの指示のまま動き続けます。まずそれに気づくのに時間がかかり、そこから関数を使おうと思うまですごく悩みました。