次の経路の黒い線にそって動くロボットを作成する。
僕は、B地点からC地点へ(B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点)の経路をやった。
本体の左右にタイヤを2つずつ取り付け、モータを2つ使い、動くようにした。 また、本体の真下に光センサを取り付け、ライントレースできるようにした。 左の写真…本体を後ろから見た図。真ん中の写真…本体を前から見た図。右の写真…光センサの場所
定義…
#define THRESHOLD 38 //しきい値 #define turn_left0 Off(OUT_A); OnFwd(OUT_C); // 左折 #define turn_right0 OnFwd(OUT_A); Off(OUT_C); // 右折 #define go_forward OnFwd(OUT_AC); //直進 #define turn_left1 OnFwd(OUT_C); OnRev(OUT_A); // 左旋回 #define turn_right1 OnFwd(OUT_A); OnRev(OUT_C); // 右旋回 #define STEP 1 // 1回の判断で動作させる時間 #define CROSS_TIME 200 // 交差点通過にかかる時間 #define cross_line_right OnFwd(OUT_A); Off(OUT_C); Wait(CROSS_TIME); //交差点、右に曲がる
ライントレースをするためのサブルーチン… 続けて黒にいる時間が0.7秒以内のときは、whileの中のプログラムを繰り返す。黒にいるときには右旋回、黒に近いグレーにいるときには右折、白に近いグレーにいるときには左折、白にいるときには左旋回する。それ以外のときは直進する。また、白に近いグレーと白、それ以外と判断したときに、ClearTimer(0)によりFastTimer(0)の値を0にすることで、黒にいる時間が0.7秒続いたときに交差点と判断できるようにした。交差点で止まったときには音を出す。
sub line_trace() { ClearTimer(0); while (FastTimer(0) < 70) { if (SENSOR_2 <=THRESHOLD) { //黒のとき turn_right1; } else if (SENSOR_2 < THRESHOLD+2) { //黒よりのグレーのとき turn_right0; } else if (SENSOR_2 > THRESHOLD+8) { //白よりのグレーのとき turn_left0; ClearTimer(0); } else if (SENSOR_2 >= THRESHOLD+10) { //白のとき turn_left1; ClearTimer(0); } else{ //それ以外のとき go_forward; ClearTimer(0); } Wait(STEP); } Off(OUT_AC); ClearTimer(0); PlaySound(SOUND_UP); Wait(80); }
交差点を右に曲がるためのサブルーチン… 1,75秒間、右折を続ける。
sub crossing_right() // { while(FastTimer(0)< 175){ cross_line_right; } ClearTimer(0); }
交差点をまっすぐ進むためのサブルーチン… 1,68秒間、直進を続ける。
sub crossing_straight() { while(FastTimer(0)< 168){ go_forward; } ClearTimer(0); }
task main
task main () { SetSensor(SENSOR_2,SENSOR_LIGHT); go_forward; Wait(100); //ここまで、B地点を抜け出すためのプログラム line_trace(); crossing_right(); //Rを右折 line_trace(); crossing_straight(); //Qを直進 line_trace(); crossing_straight(); //Qを直進 line_trace(); crossing_right(); //Pを右折 line_trace(); crossing_right(); //Sを右折 go_forward; Wait(350); Off(OUT_AC); }
結果は、最後までライントレースさせることはできなかった。原因は、Q直進のときの交差点の判断が出来ていなかったところである。これは、ロボットが交差点Qに来たときに光センサをどこに来させたいのかを考えて、「交差点をまっすぐ進むためのサブルーチン」の中のプログラムを右折や左折に変えてやってみたら良かったと思う。また、光センサが左右に振られすぎていたので、左右に曲がるスピードやパワーを減らすことのできるプログラム(#define set_power_H SetPower(OUT_AC,HIPOWER);のようなもの)を加えればよかった。ライントレースをスタートさせる位置やTimerの値を少し変えたら、途中までうまくライントレース出来ていたので、もっと粘り強く、ライントレースをスタートさせる位置やTimerの値を変えて試せればよかった。最初はサブルーチンの使い方がわからなかったが、ホームページの説明などを参考にしたら理解することができ、task mainを短く簡潔にすることができるようになったので、次の課題でもうまく活用したい。今回の課題以外にも関係することだが、電池交換に失敗してしまい再度ファームウェアを転送するまでの間、ロボットを動かすことができなくなってしまったので今後は気をつけたい。