・速さと正確さを追求すること。
・交差点で優先側を走っていない場合には一時停止すること。
・前方にいるもう1台のロボットと接触した場合には停止して相手のロボットが通過する、あるいは距離が離れるのを待つ。
・コースを2周したら自動的に停止する。
センサーは光センサーにタッチセンサーを取り付けた形になっています。
。
今回は関数は前進する関数と後退する関数を用いた。
void go_straight(int t ){ //t/100秒間前進 OnFwd(OUT_A+OUT_C); Wait(t); Off(OUT_A+OUT_C); }
void go_back(int t ){ //t/100秒間後退 OnRev(OUT_A+OUT_C); Wait(t); Off(OUT_A+OUT_C); }
#define THRESHOLD 40 //閾値を40に設定 #define RUN_TIME 11000 //110s //タイマーを110秒に設定 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーに設定 SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ−2をタッチセンサーに設定 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーに設定 ClearTimer(0); //タイマー0をクリア while(1) { while(FastTimer(0)<=RUN_TIME) //タイマーが110秒になったら停止 { if(SENSOR_2==1) //タッチセンサーが反応したとき { Off(OUT_A+OUT_C); //1秒間後退して5秒待って1秒間前進 go_back(100); Wait(500); go_straight(100); } else { if(SENSOR_1<THRESHOLD) //左の光センサーが値域より小さいとき { OnFwd(OUT_C); //0,15秒間右に旋回 OnRev(OUT_A); Wait(15); } else {OnFwd(OUT_A+OUT_C);} //左の光センサーが値域より大きいとき前進 if(SENSOR_3<THRESHOLD) //右の光センサーが値域より小さいとき { OnFwd(OUT_A); //0,15秒間左に旋回 OnRev(OUT_C); Wait(15); } else {OnFwd(OUT_A+OUT_C);} //右の光センサーが値域より大きいとき前進 if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //左と右両方のセンサーが値域より小さいとき { Off(OUT_A+OUT_C); //一端止まって Wait(200); //2秒間待って OnFwd(OUT_A+OUT_C); //0,8秒間前進 Wait(80); } else {OnFwd(OUT_A+OUT_C);} //そうでなければ前進 } } Off(OUT_A+OUT_C); //110秒経過したら音を鳴らしながら停止 PlaySound(SOUND_FAST_UP); } }
タッチセンサーに反応があってからその後の動作に問題があり、接触後の動きが良くなかった。後ろに下がってから、同じとこまで前進するようにしてあるので、その間に再び接触すると、タッチセンサーが働かないようになってしまっている。 接触がなければ黒線の上をうまく走っていた。しかし、交差点ではうまくいかない時がたまにあった。 センサーで時間を計って停止するようにしてあるので、厳密に2周したら止まるようにはなっていない。
何かございましたらお願いします。
きちんと2周で止まらせる方法としては、両方のセンサが黒になった回数(交差点の数)を数えて、ある回数になった止まる方法や衝突した回数を数えてその分だけRun_timeをのばす方法があります。FI