A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。 黒い線をトレースする。 交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。
2コースあるうち私は下記のルートを担当した。
A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)
動きやすさを重視するために全体の軽量化を試みた。
担当したコースの道順上、線の右側をトレースすることにした。
#define turn_right OnFwd(OUT_A);Off(OUT_C);左折
#define turn_left OnFwd(OUT_C);Off(OUT_A);左旋回
#define circling_left OnFwd(OUT_C);OnRev(OUT_A);右旋回
#define circling_right OnRev(OUT_C);OnFwd(OUT_A);直進
#define go_ahead OnFwd(OUT_AC);
int t;
sub follow_line1() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0);ClearTimer(1); while((FastTimer(0)<15)&&(FastTimer(1)<t)){ if(SENSOR_2<41){ circling_right; } else if(SENSOR_2<43){ turn_right;ClearTimer(0); } else if(SENSOR_2<48){ go_ahead;ClearTimer(0); } else if(SENSOR_2<50){ turn_left;ClearTimer(0); } else if(SENSOR_2<55){ circling_left;ClearTimer(0); } } Off(OUT_AC); PlaySound(SOUND_CLICK); }
sub follow_line() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0);ClearTimer(1); while((FastTimer(0)<25)&&(FastTimer(1)<t)){ if(SENSOR_2<41){ circling_right; } else if(SENSOR_2<43){ turn_right;ClearTimer(0); } else if(SENSOR_2<48){ go_ahead;ClearTimer(0); } else if(SENSOR_2<50){ turn_left;ClearTimer(0); } else if(SENSOR_2<55){ circling_left;ClearTimer(0); } } Off(OUT_AC); } sub cross_line() { go_ahead;Wait(30);Off(OUT_AC); }
また光センサーによる認識の数値は
とし、それぞれの値による動きは以下の通り。 41:右旋回 43:右折 48:直進 50:左折 55:左旋回 交差点の判断 黒線の左側の境界を使用する。光センターの感知する色が、真っ黒なら左旋回、それより少し白くなったら左回転、黒と白の中間(これを灰とする)なら直進、白よりの灰なら右回転、真っ白なら右旋回、となるようにプログラムを組む。そして、左旋回(真っ黒)の続く時間によって交差点の判別を行い、左旋回がある一定時間続いたら止まるようにする。
またwhileを使うことで、交差点まではトレースし続けることが出来る。
Timer(0)で、グローバル変数tを使って、左旋回(真っ黒)が続いた時間を測る。左旋回以外の四つの挙動にはClearTimer(0);を入れることで左旋回の時間だけを計測している。
実際に光センサーを使って値を測定し、プログラムにしたものが下のプログラムである。グローバル変数tはプログラム冒頭に、int t;で指定する。tを変えることで、交差点判別の時間をその都度変えることが出来る。
task main() { t=10000;follow_line();cross_line();//C t=10000;follow_line();Wait(100);cross_line();//D t=10000;follow_line();Wait(100);//E circling_right;Wait(30);Off(OUT_AC); t=10000;follow_line();Wait(100);//F t=10000;follow_line();Wait(100);//G circling_right;Wait(40);Off(OUT_AC); t=10000;follow_line1();Wait(100);cross_line();//H t=10000;follow_line1();Wait(100);cross_line();//I t=10000;follow_line1();Wait(100);//J t=10000;follow_line();Wait(100);//K go_ahead;Wait(30);Off(OUT_AC); t=300;follow_line();Wait(100); OnRev(OUT_B);Wait(20);Off(OUT_B); t=10000;follow_line();Wait(100);cross_line();//K t=10000;follow_line();//M OnFwd(OUT_B);Wait(20);Off(OUT_B); }
上の図のスタートからシュートまで一連の動きでできたのは5回に1回程度だった。タイヤを四輪から二輪にしたり、全体の軽量化をして改善を試みたができなかった。そこでプログラミングによる調整をした。グローバル変数を用いて交差点と円の区別をさせようとしたが、うまくできなかった。ピンポン球の回収・発射させる部分はつまる事なくできた。 次回はロボットにあったプログラミングは組みたい。