#define light 44 // 閾値を定義 task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーに定義 SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー2をタッチセンサーに定義 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーに定義 while(true) { if(SENSOR_1 < light){ //左側の光センサーが黒を感知したら左へ OnFwd(OUT_C); OnRev(OUT_A); } else if(SENSOR_3 < light){ // 右側の光センサーが黒を感知したら右へ OnFwd(OUT_A); OnRev(OUT_C); } else if(SENSOR_2 ==1){ //衝突した後、右へ迂回しつつライン上へ戻る OnRev(OUT_A+OUT_C) ; //微調整のためバック Wait(50); OnFwd(OUT_A); //旋回 Wait(70); OnFwd(OUT_C); Wait(100); OnRev(OUT_A); //旋回 Wait(110); until(SENSOR_1 < light || SENSOR_3 < light){ //左右どちらかの光センサーがラインを感知するまで直進 OnFwd(OUT_A+OUT_C); } if(SENSOR_3 < light){ //右が先にラインを感知した場合、やや後退した後に左を接触させる OnRev(OUT_A+OUT_C) ; //後退 Wait(30); OnFwd(OUT_A); until(SENSOR_1 < light){ //左が接触するまで Off(OUT_C); //旋回 } } if(SENSOR_1 < light){ //左が接触 until(SENSOR_1 > light && SENSOR_3 >light){ //接触後、左右のセンサーでラインを挟むように機動 Off(OUT_C); } } } else{ //上記以外の場合前進 OnFwd(OUT_A+OUT_C); } } }
コースの曲線が急な場面が多いので、コースに戻れなくてそのまま直進して行ったり、ショートカットしてしまった。
何度も実験を繰り返しては失敗してその度にプログラムを変更しなくてはいけなくて大変だった。
コースに戻るときに右のセンサーが先に触れたら少し戻って、左のセンサーを触れるようにした。そうすることでどんな入り方をしてもコースに戻れるようにした。
思っていたように出来ずに、しかもプログラムが無駄に複雑になってしまった。
もっとスマートなやり方があると思うので今度はそう出来るようにしたい。
コースがなかなか厄介なものだったので、コースそのものを変えることも考えたが、妥協せずに粘って成功してよかった。
何か意見がありましたらこちらにどうぞ