目次 はじめに † 今回の課題はライントレースロボットで、図のようなコースを決められた順路を通り、途中においてあるピンポン玉をゴールまで運ぶロボットを作るというものでした。僕はC地点からA地点へ (Q交差点では直進、P三叉路では右折)を通るロボットを作りました。 ロボット本体 †全体 † 基本の車の形のものにアームとセンサーを付けた形になっています。 アーム † モーター1つで開閉ができるようにしました。モーターを直接つなぐと動きが早すぎたのでギア比を考えてゆっくり動くようにしています。 プログラム †#define turnleft OnFwd(OUT_C);OnRev(OUT_A); //左旋回 #define left OnFwd(OUT_C);Off(OUT_A); //左に曲がる #define right OnFwd(OUT_A);Off(OUT_C); //右に曲がる #define turnright OnFwd(OUT_A);OnRev(OUT_C); //右旋回 #define stop2sec Off(OUT_AC);Wait(200); //2秒止まる //ライントレース用の関数 void linetrase(int t){ ClearTimer(0); while(FastTimer(0)<t){ if(SENSOR_3<36){ turnright; }else if(SENSOR_3<39){ right; Wait(2); }else{ if(SENSOR_3<47){ OnFwd(OUT_AC); Wait(3); }else if(SENSOR_3<50){ left; Wait(2); }else{ turnleft; } ClearTimer(0); } } } task main () { SetSensor(SENSOR_3,SENSOR_LIGHT); int count=0; ClearTimer(1); while(count <= 1){ linetrase(28); if(FastTimer(1)>500||count==0){ count++; } ClearTimer(1); } stop2sec; left; OnFwd(OUT_B); Wait(20); Off(OUT_C); Wait(100); Off(OUT_B); linetrase(21); stop2sec; linetrase(28); Off(OUT_AC); OnRev(OUT_A); Wait(30); Off(OUT_A); OnRev(OUT_B); Wait(50); Off(OUT_B); OnFwd(OUT_AC); Wait(60); OnRev(OUT_AC); Wait(60); Off(OUT_AC); } 説明 †定義 †まずは以下の通り全方向に動くための定義をしました。 #define turnleft OnFwd(OUT_C);OnRev(OUT_A); //左旋回 #define left OnFwd(OUT_C);Off(OUT_A); //左に曲がる #define right OnFwd(OUT_A);Off(OUT_C); //右に曲がる #define turnright OnFwd(OUT_A);OnRev(OUT_C); //右旋回 さらに交差点で2秒止まるための定義をしました。 #define stop2sec Off(OUT_AC);Wait(200); //2秒止まる そして、交差点までライントレースするプログラムを関数で書きました。引数を入れたかったのでサブルーチンではなく関数を使っています。引数は一度にどれだけ右に曲がったら交差点と判断するのかを入れられるようにしています。これにより、様々な曲がり角に対応できるようになりました。 void linetrase(int t){ ClearTimer(0); while(FastTimer(0)<t){ if(SENSOR_3<36){ turnright; }else if(SENSOR_3<39){ right; Wait(2); }else{ if(SENSOR_3<47){ OnFwd(OUT_AC); Wait(3); }else if(SENSOR_3<50){ left; Wait(2); }else{ turnleft; } ClearTimer(0); } } } 動作 † 右の図の様にライントレースしました。
結果・感想 † 前回の課題の時より慣れていたためかすぐに完成させることができました。 |