自分たちで作った黒い線によるコースの上を走るロボットの作成。
ただし、
・速さと正確さを追求する
・交差点で優先側を走っていない場合には、一時停止する
・前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つ
・コースを2周したら自動的に止まる
の4点に注意する。
プログラムをいろいろと工夫しているようです。
レポートで積極的に図や写真を使って、考察してみてもいいでしょう。 FI
キット付属のドライブベースを使用し、黒い線によるコースの上を走るロボットを作成した。
余分な部品はつけず、なるべく小回りがきくようにした。
前輪に稼動しないようなただ回るだけの部品を使おうとしたが、うまく稼動しなかったため全部の車輪が動くような部品を使用した。
センサーがどの程度反応するかというところでかなり苦労した。
センサーとセンサーの間が広すぎると修正が遅くなり、狭すぎると反応しすぎてしまうため、どの程度センサーとセンサーの間を開けておくかということをかなり吟味した。
その結果、黒い線を挟むくらいの幅に設定した。
コースはカーブを3カ所に作り、交差する部分を2カ所作った。
カーブは少しきつめの場所がある。
交差点の手前でT字を作り、交差点の手前でいったん停止するようにした。
#define THRESHOLD 40 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); int n=0; //交差点を渡った回数 while(n<4) //4回交差点を渡ったら繰り返しを抜ける { if(SENSOR_1 < THRESHOLD) { if(SENSOR_3 < THRESHOLD) { /* 両方の光センサーがラインを感知(交差点) */ /* いったん後退し,少し待ってから交差点を渡る */ OnRev(OUT_A); OnRev(OUT_C); Wait(50); Off(OUT_A+OUT_C); Wait(30); OnFwd(OUT_A+OUT_C); Wait(200); n=n+1; //交差点を渡った回数を1増やす } else { /* 左の光センサーがラインを感知 */ /* 左へ方向修正 */ Off(OUT_A); OnFwd(OUT_C); } } else { if(SENSOR_3 < THRESHOLD) { /* 右の光センサーがラインを感知 */ /* 右へ方向修正 */ OnFwd(OUT_A); Off(OUT_C); } else { /* 光センサー感知なし */ /* 直進 */ OnFwd(OUT_A); OnFwd(OUT_C); } } if(SENSOR_2 == 1){ /* タッチセンサーに触れたら少し後退し一時停止 */ OnRev(OUT_A+OUT_C); Wait(50); Off(OUT_A+OUT_C); Wait(50); } } Off(OUT_A+OUT_C); //停止 }
センサーが黒い線を感知したときに、どの程度の調整を行うかをかなり工夫した。
結局Waitをなくしたら一番うまく行ったので、Waitの使用をなくした。
また、ロボットは優先道路を通る際に一度後退するようプログラムした。
変数を使用し、交差点を4回渡ったら止まるようにプログラミングした。
ロボットの軽量化でタイヤを交換すると、交換してからは光センサーが働かなくなり大変でした。
また、センサーが働き始めてもコースが密接しているところなどは違うコースにいってしまったため、コースの書き方もだいぶ工夫して反応しやすくし、優先道路も認識できるようになりました。
優先道路をロボットが認識できるようにコースのいったん停止部分に横に線を入れ、その線を認識したら一回後退してから進むようにしました。
そして、交差点を4回通ったら止まるよう、横線を通るたび変数nが1回ずつ増加していき、4回通ったら止まるようにプログラミングしました。
方向修正のときにWaitを使用していた時は、いきすぎてしまったり動きが細かすぎてしまったりしたので、Waitをなくしたらうまくいきました。
アドバイスなどコメントをお願いします。