経路を黒い線にそって動くロボットを作成する
B地点からA地点へ (Q交差点では直進、P三叉路では直進)
途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止すること。
可能であれば、A,B,Cのそれぞれにエリアに入る三叉路付近からボールをシュートする。
初めに作ったロボットをそのまま代用。前輪側にライトセンサーを設置した。 前方のボールを掴む装置が重くなってしまい傾いてしまったので後方にタイヤをおもりの代わりとして設置した。
(OUT_A)で上から見て左側のタイヤが反応して、(OUT_C)で上から見て右側のタイヤが反応するようになっている
(OUT_B)で反応するようになっている。
OnFwdでボールを吸収するように掴み、OnRevでボールを発射するように設計。
ぴったりとボールを掴むので安定して運ぶことができるようになっていると思う。
#define THRESHOLD 48 //ライントレースの基準値を定める int n = 0; // 白、黒に連続で接した時に数える変数n int t = 0; //十字路にあたった時に戻る時間を定めるための変数t
task main(){
OnFwd(OUT_C); //ボールを吸収する動作 SetSensor(SENSOR_2,SENSOR_LIGHT); //ライトを示す ClearTimer(0); //タイマー(0)をリセット while(n<=10){ if(SENSOR_2<THRESHOLD+11){ //もし、黒を識別したら OnFwd(OUT_B);OnRev(OUT_A); //右に進み、タイマー(0)をリセット ClearTimer(0); }else{ //もし、黒を識別しないなら OnFwd(OUT_A);Off(OUT_B); //左に進み、変数nを+1していく n=n+1; } } t=FastTimer(0); //十字路に入った時タイマーをスタート OnRev(OUT_A);OnFwd(OUT_B); //十字路で進んだ時間戻る Wait(t); Off(OUT_AB); //十字路を識別した時に2秒止まる Wait(200); OnFwd(OUT_AB); //十字路を横切るためにライントレースせずに1秒進ませる Wait(100); n = 0; //変数nを0にする while(n<10){ if(SENSOR_2<THRESHOLD+11){ //もし、黒を識別したら OnFwd(OUT_A);Off(OUT_B); //左に進み、タイマー(0)をリセット ClearTimer(0); }else{ //もし黒を識別しないなら OnFwd(OUT_B);OnRev(OUT_A); //右に進み、変数nを+1していく n=n+1; } } t=FastTimer(0); //ゴールしたあとタイマーをスタート OnRev(OUT_A);Off(OUT_B); //ゴール後に進んだ時間戻る Wait(t); Off(OUT_AB); //止まってボールを発射する OnRev(OUT_C);
}
十字路を過ぎる前と過ぎた後でwhileのくくりを変化させて最終的にシュートをできるように工夫しました。
タイマーを使って十字路やゴールを認識したときに移動してしまった時間戻れるようにプログラムしました。
もっとライトセンサーをタイヤの付近に設置できるようにロボットを設計したほうが良かった。
ボールをつかむ部分が大きくなりすぎて重くなってしまったので、もう少し小さくできたらよかったと思った。
それでもボールを掴む部分の設計は面白くできたと思うので良かった。