黒い線に沿って動くロボットを作成せよ。そして一つの周回コースを2台のロボットが走行すること想定し、以下の2種類のプログラムを作成せよ。
(期限:6月15日)
作成者;僕 作成日;6月8日 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); while (true) { if (SENSOR_1 < THRESHOLD) // (1)黒線上にいるとき { OnFwd(OUT_A); Off(OUT_C); } if (SENSOR_3 < THRESHOLD) // (3)黒線上にいるとき { OnFwd(OUT_C); Off(OUT_A); } if (SENSOR_2==1 ) { OnFwd(OUT_A);OnRev(OUT_C);Wait(150); //タッチしたら180°反転する OnFwd(OUT_C); } } }
<コメント>
左のセンサが触れたら右回転。右のセンサが触れたら左回転をするだけのプログラム。
逆のモータはRevではなくoffにしているので、引きずるように進みます。
マシンのテスト目的に組んでみたら意外と早かったというオチ。
結構うまくカーブを曲がることが出来たので、
速攻完成かと思ったが、直線のところが無駄の多いうごきになってしまう。
<マシーンの改良…>
自動車と同じでコンパクトにしたほうが小回りが利くと考えて、車輪の幅を6ブロックほど短くした。
そして直線では前方に2つつけた光センサーの幅を調整した結果一番近づけたときが無駄が少なくなった。
<コメント>
直線での無駄をなくすために、センサーが両方白いときは直進するプログラムを書いたが、
カーブを曲がるときにセンサーが黒い線から両方出てしまうとうまく曲がりきれずに直進してしまった。
作成者;僕 作成日;6月14日 #define THRESHOLD 40 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); while (true) { if (SENSOR_1 < THRESHOLD) { OnFwd(OUT_A); Off(OUT_C); } if (SENSOR_3 < THRESHOLD) { OnFwd(OUT_C); Off(OUT_A); } if (SENSOR_2==1 ) { OnFwd(OUT_A);OnRev(OUT_C);Wait(70); OnFwd(OUT_A+OUT_C);Wait(30); OnFwd(OUT_C);OnRev(OUT_A);Wait(70); OnFwd(OUT_A);Wait(200); OnFwd(OUT_C);OnRev(OUT_A);Wait(90); OnFwd(OUT_A); } } }
<コメント>
ライントレースに加え、タッチセンサが触れたら右側から追い抜くプログラム。
ぶっちゃけ、初期のプログラムに追い抜きを追加しただけだったりします。
追い抜き機能自体も、右回転→直進→左回転→直進→左回転→直進→復帰、とかなり簡単。
そのせいか、うまく線上に復帰できなかったり、直角に線に進入するとうまくいかなかった。
作成者;tomo 作成日;6月15日 #define THRESHOLD 40 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); while (true) { if (SENSOR_1 < THRESHOLD) //黒線上にきたらAを回転 { OnFwd(OUT_A); OnRev(OUT_C); } else { OnFwd(OUT_C); } if (SENSOR_3 < THRESHOLD) //黒線上にきたらCを回転 { OnFwd(OUT_C); OnRev(OUT_A); } else { OnFwd(OUT_A); } if (SENSOR_2==1 ) //ぶつかったら半回転 { OnFwd(OUT_A);OnRev(OUT_C);Wait(200); OnRev(OUT_A);OnFwd(OUT_C);Wait(50); } } }
<コメント>
左のセンサが触れたら右回転。右のセンサが触れたら左回転をその場でするように改良。
しばらくelseではifのときの逆をプログラムしていたが、そうするとプログラムに重複する部分ができてしまい、うまく動かなかった。
そこで、elseでは片方のモータのみを動かし、両方elseのときに「結果として」直進になるよう改良してみた。
そうすると、直線、曲線共に早く進むようになった。
作成者;tomo 作成日;6月15日 #define THRESHOLD 40 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); while (true) { if (SENSOR_1 < THRESHOLD) //黒線上にきたらAを回転 { OnFwd(OUT_A); OnRev(OUT_C); } else { OnFwd(OUT_C); //センサー1が外れたらCのみ回転 } if (SENSOR_3 < THRESHOLD) //黒線上にきたらCを回転 { OnFwd(OUT_C); OnRev(OUT_A); } else { OnFwd(OUT_A); //センサー3が外れたらAのみ回転 } if (SENSOR_2==1 ) //ぶつかったら半回転 { OnFwd(OUT_A);OnRev(OUT_C);Wait(200); OnRev(OUT_A);OnFwd(OUT_C);Wait(50); } //ここから、右から追い抜くプログラム if (SENSOR_2==1 ) //ぶつかったら右側から追い抜く { OnFwd(OUT_A);OnRev(OUT_C);Wait(70); OnFwd(OUT_C);Wait(30); OnFwd(OUT_C);OnRev(OUT_A);Wait(70); OnFwd(OUT_A);Wait(200); OnFwd(OUT_C);OnRev(OUT_A);Wait(90); OnFwd(OUT_A); } } }
省略のため逆回転と、右側から追い抜くプログラムの両方を載せています。
elaeを使わないとカーブが滑らかに曲がることが出来たが、直線での無駄が大きいので両方のセンサーが白(線外)のとき直進するプログラムを書いた。
すると、確かに直線をまっすぐ進むが、カーブを曲がるときに両方のセンサーが線から外れると、曲がりきらずに直進してしまった。
まとめると…
カーブでなるべくスムーズに曲がるためにタイヤの幅を狭くして小回りが利くようにした。
タッチセンサを取ると、RCXよりも小さいです。
今回はマシーンは簡単に作れたが、プログラムに手間取った。
プログラムを書いて、予想道理に動くことのほうが少ないので試行錯誤にかなり時間を使ってしまった。