トレースするコースは、C地点を出発地点とし、そこから十字路をまっすぐ進み、三叉路を右に曲がってゴール地点であるA地点まで行く、というのである。
今回は繊細な動きが出来るように細かく定義をした。
#define THRESHOLD 45 //しきい値 #define SPEED_H 25 #define SPEED_L 25 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define GO_STR OnRL(SPEED_H, SPEED_H); #define LEFT_TURN0 OnRL(SPEED_L, 0); // 左折 #define LEFT_TURN1 OnRL(SPEED_L, -SPEED_L); // 左旋回 #define RIGHT_TURN0 OnRL(0, SPEED_L); // 右折 #define RIGHT_TURN1 OnRL(-SPEED_L, SPEED_L); // 右旋回 #define STEP 100 // 1回の判断で動作させる時間 #define nMAX 300 // 通常のカーブとして許容できる繰り返しの最大値 #define short_break Off(OUT_BC); Wait(1000); // 小休止 #define CROSS_TIME 200 // 交差点通過にかかる時間 #define LINE_CRO OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break; //交差点をわたる #define arm_close(t) OnRev(OUT_A,30);Wait(t); //アームを閉じる #define Shoot OnFwd(OUT_A,30);Wait(200);OnFwd(OUT_BC,50);Wait(1000);Off(OUT_BC); //シュートを打つ。シュートとはアームを開いた後急加速、急停止を行ってボールに勢いをつけ、慣性力でゴールさせるというものである。
今回は、速度が速いとカーブがうまく曲がれなかったり、大きく脱線してしまう事が多々あったため、速度は遅めに設定してある。
これは参考プログラムを主体とし、シュートやアームを閉じてボールを捕まえる動作を付け加えた。
task main() { SetSensorLight(S3); int nOnline=0; // 続けて黒になった回数 (カウンター) while (true) { while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-15) { LEFT_TURN1; nOnline++; // カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-7) { LEFT_TURN0; } else if (SENSOR_3 < THRESHOLD+7) { GO_STR; } else if (SENSOR_3 < THRESHOLD+15) { RIGHT_TURN0; } else { RIGHT_TURN1; } nOnline=0; // カウンターをリセット } Wait(STEP); } short_break; // 小休憩 RIGHT_TURN1; Wait(nMAX*STEP); // 進行方向修正 LINE_CRO; // 交差点を渡る arm_close(500); nOnline=0; //カウンターをリセット PlaySound(SOUND_DOWN); //交差点を認識した事がわかるように音がなる Wait(500); long t0 = CurrentTick(); //シュートを打つにあたって、コース上には何か合図になるよな特徴的な地点がなかった。したがって、タイマーを設定してゴール手前の直線でシュートのプログラムが起動するようにした。 while(CurrentTick()-t0 <= 11000){ //11秒後にタイマーによってShootが起動する。ちなみにこの11秒とは何度かタイムを計測し、ボールをゴールさせるのに最適なShootのタイミングのことである。 if (SENSOR_3 < THRESHOLD-15) { LEFT_TURN1; nOnline++; // カウンターを増やす } else { if (SENSOR_3 < THRESHOLD-7) { LEFT_TURN0; } else if (SENSOR_3 < THRESHOLD+7) { GO_STR; } else if (SENSOR_3 < THRESHOLD+15) { RIGHT_TURN0; } else { RIGHT_TURN1; } nOnline=0; // カウンターをリセット } Wait(STEP); } Shoot; } }
ロボットがこの形になるまでに様々な試作機を製作した。特に苦労したのは、アームの機構が決まった後に本体とどのように組み合わせるかであった。
この機体は光センサーを2つの前輪の間に設置してある。ここで、機体と光センサーの距離が離れてしまうとヘアピンカーブのような急カーブを認識するのが難しくなり、曲がる際にこまめに旋回のプログラムをいれなければならなくなってしまう。なので、可能な限りこの距離が短くなるように設置した。 この写真はロボットを下から撮ったものである。
真ん中のライトが付いたようなパーツが光センサーである。
前輪はモーターが直接ついており、後輪はその補助輪としての役割を担っている。この時、後輪は柔軟性の優れた動きができるように、360度回転できるような機構を取っている。しかし、この機構は重さに耐性がない事が欠点である。今回のロボットは、パーツの中で最も重量のある本体(ロボットのコンピューター)が、設計上後輪の真上に来てしまっている。これにより、後輪は少し曲がってしまっている。上の写真は後輪で、下の写真はロボットである。
この写真からよく分かるように、本体が後輪の真上にある。
今回ボールをつかむ上で様々な機構のアームを考えた。そして結論として、クワガタの様に両側から囲むようなものになった。アームが閉じる機構は、前輪モーターの上にもう一つアームを閉じさせる為のモーターを設置する。そして、パーツをいくつか使用し、モーターの動きが前輪と同じ高さまで下げたアームに連動する様に調節した。
正直なところ、ライントレースロボットの製作は書道ロボットよりも難しくはなかった。しかし、プログラムについては今回の方が遥かに難易度が高かった。論理式やカウンター、タイマーに関する習熟度が低かったため、思った通りの動きが出来なかったり、プログラムの不備が見抜けないために何時間もプログラムの転送に時間を費やしてしまった。次回からは、このような事が少なくなるように、よりプログラムを理解したいと思った。