A地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ、そのピンポン玉をD地点においたゴールへシュートする (一人目)
Aスタート → P直進 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S左折 → Dへシュート
ただし
・なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること
・ピンポン玉はQ近くの3/4円周上ならどこにおいてもよい
・可能であればC,Dのゴールエリアライン上からシュートする
左右や真っ直ぐ進むように、本体の左右に一個ずつタイヤをつけて、
後ろの部分に丸い球状の部分をつけて、三点で進むようにした。
光センサーは、本体の前の中央部分につけて、ロボットの回転軸にできるだけ
近づけられるところにつけた。
アームにギアをかまして、上下に動かせるようにした。
アームを上から下げて、左右にあるブロックの壁と、光センサーの四点でピンポン玉を
固定するようにした。
光センサーで線上にいるかどうかを判別して、線上にいるならロボットを左に動かして、
線上にいないなら、右に動かして、境界線上をじぐざくしながら、進んでいく。
また、交差点は何秒間まがっているかで、交差点かどうかを判断する。
二回目のP点では、ロボットが交差点と判断するときと、しない時があったので
基準値を二種類作り、二回目のP点のときは、基準値の小さいほうを適応させた。
#define go_forward OnFwd(OUT_AC);//前に進む #define turn_left1 Off(OUT_A);OnFwd(OUT_C);//小さく左に曲がる #define turn_left2 OnRev(OUT_A);OnFwd(OUT_C);//大きく左に曲がる #define turn_right1 Off(OUT_C);OnFwd(OUT_A);//小さく右に曲がる #define turn_right2 OnRev(OUT_C);OnFwd(OUT_A);//大きく右に曲がる #define MAX_TIME 22//二回目のP点以外での基準値 #define MAX_TIME2 20//二回目のP点での基準値
sub crossing_stop1() //交差点に入って止まる { ClearTimer(0); while(FastTimer(0)<MAX_TIME){//タイマーが基準値以下のときに実行される if(SENSOR_2<35){ turn_left2;//しきい値が35以下のところで大きく左に曲がる }else if(SENSOR_2<40){ turn_left1;ClearTimer(0);//しきい値が40以下のところで小さく左に曲がる }else if(SENSOR_2<43){ go_forward;ClearTimer(0);//しきい値が43以下のところで直進する }else if(SENSOR_2<47){ turn_right1;ClearTimer(0);//しきい値が47以下のところで小さく右に曲がる }else{ turn_right2;ClearTimer(0);//しきい値が48以上のところで大きく右に曲がる } } Off(OUT_AC);Wait(100); OnRev(OUT_AC);Wait(20);//タイマーが基準値を上回ったとき、一時停止して、後退する }
sub crossing_stop2()//交差点に入って止まる { ClearTimer(0); while(FastTimer(0)<MAX_TIME2){ if(SENSOR_2<35){ turn_left2; }else if(SENSOR_2<40){ turn_left1;ClearTimer(0); }else if(SENSOR_2<43){ go_forward;ClearTimer(0); }else if(SENSOR_2<47){ turn_right1;ClearTimer(0); }else{ turn_right2;ClearTimer(0); } } Off(OUT_AC);Wait(100);OnRev(OUT_AC);Wait(20); }
sub crossing_fwd()//交差点で止まってから、前に進みだす { go_forward; Wait(50); }
sub crossing_right()//T字路で止まってから、右に曲がる { turn_right1; Wait(100); }
sub crossing_left()//T字路で止まってから、左に曲がる { turn_left1; Wait(100); }
sub arm_down()//アームを下げる { OnRev(OUT_B);Wait(20);Off(OUT_B); }
sub arm_up()//アームを上げる { OnFwd(OUT_B);Wait(20);Off(OUT_B); }
task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); crossing_stop();//P点まで進む crossing_fwd(); crossing_stop();//Q点まで進む OnFwd(OUT_A);OnRev(OUT_C);Wait(10); crossing_fwd(); arm_down();//アームを下げる crossing_stop();//Q点まで進む crossing_fwd(); crossing_stop();//R点まで進む crossing_right(); crossing_stop();//P点まで進む OnRev(OUT_C);Off(OUT_A);Wait(10); OnFwd(OUT_AC);Wait(80); crossing_stop();//S点まで進む crossing_left(); crossing_stop();//D点まで進む arm_up();//アームを上げる OnFwd(OUT_AC);Wait(100);//ピンポン球を押して、シュートする Off(OUT_AC); }
練習の時には、プログラミング通りにいかなくて、なかなか苦戦した。でも、本体やプログラミングを修正していくたびに、徐々に良くなっていくところが、すごく楽しかった。
今回の経験を、最後の課題にむけて活かしていきたい。