目次
こちらが本体です。ロボットの中心にセンサーを付けました。中心にセンサーを付けることによって小回りがきくようにしました。前はタイヤではなく滑っていくようにしました。
私のコースはC地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点です。
#define TURNLEFT OnFwd(OUT_C); OnRev(OUT_A); // 左回転
#define LEFT Off(OUT_A);OnFwd(OUT_C);// 右回転
#define TURNRIGHT OnFwd(OUT_A); OnRev(OUT_C);// 右回転
#define RIGHT Off(OUT_C);OnFwd(OUT_A)// 右旋回
#define STRAIGHT Onfwd(OUT_AC) // 直進
黒い線の左側をたどる
sub trace(){ ClearTimer(0);// 交差点判定用のタイマをリセットする。ここから計測を始める while(FastTimer(0)<50) // 黒の判定が0.5秒を超えたら交差点と判定する。 if(54 <= SENSOR_2){ //白 TURNRIGHT; }else if(51 <= SENSOR_2) { //少し白 RIGHT; }else if(46 <= SENSOR_2) { //灰色 STRAIGHT; }else if(43 <= SENSOR_2) { // 少し黒 LEFT; }else { //黒 TURNLEFT; } // 白を認識した場合、交差点判定用のタイマをリセットする if(44 <= SENSOR_2) ClearTimer(0); } Off(OUT_AC); PlaySound(SOUND_UP);//音を鳴らす Wait(100);//一秒間停止する ClearTimer(0); }
交差点を直進
sub go_straight() { STRAIGHT; Wait(30); }
交差点を左折
sub turn_left() { while(FastTimer(0)<160){ LEFT ; } ClearTimer(0); }
交差点を右折
sub turn_right() { while(FastTimer(0)<100){ RIGHT; } ClearTimer(0); }
task main(){ SetSensor(SENSOR_2,SENSOR_LIGHT);// センサを用意 ClearTimer(0);// 三秒間交差点判定を無効化 trace(); turn_left();// 一つ目の交差点: 左折 trace(); turn_left();// 二つ目の交差点: 左折 trace(); go_straight();// 三つ目の交差点: 直進 trace(); go_straight();// 四つ目の交差点: 左折 trace(); turn_right();// 五つ目の交差点: 右折 trace(); turn_left();// 六つ目の交差点: 左折 trace(); }
サブを使ったのでメインは簡潔にはなりました。しかし、急なカーブを交差点と認識してしまうことがありました。急なカーブのところを違うサブルーチンを使ったり、そこだけを交差点判定を無効化したりできたがエラーに苦しみ思うようにできませんでした。
成功率はそれはど高くありませんでした。急なカーブが一番難しく、交差点と判断してしまいました。関数や、サブを十分に使いこなせていなかったのが原因の一つだと思います。次の課題はもっと難しい課題になると思うので早めに 理解できるようにしたいです。