*センサーを使って、ライントレースロボットを作る(障害物を右側にさけていく) [#wf5f2439] **プログラムの概要 [#c59bfbe4] 2つの光センサーで、黒い線を挟んで、それぞれのセンサーは、ある一定以上の暗さ(ある一定以下の明るさ)になったら、少しバックして、また前進していく。 また、右に曲がって、相手のロボットを避けるときは、一度バックし、右に曲がって、前に進み、その後、左斜め前に進んでいく。 **プログラム [#x0dc164d] ***ライントレースロボット(障害物を右側にさけていく) [#xf9dc7fb] task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetPower(OUT_A,5); SetPower(OUT_C,3); OnFwd(OUT_A+OUT_C); while(true) { if(SENSOR_1<43) { OnRev(OUT_A); Wait(10); OnFwd(OUT_A+ OUT_C); } if(SENSOR_3 <43) { OnRev(OUT_C); Wait(10); OnFwd(OUT_A+OUT_C); } if(SENSOR_2==1) { OnRev(OUT_A+OUT_C); Wait(50); Off(OUT_A+OUT_C); OnFwd(OUT_A); OnRev(OUT_C); Wait(362/4); OnFwd(OUT_A+OUT_C); Wait(100); OnFwd(OUT_C); OnRev(OUT_A); Wait(362/4); OnFwd(OUT_A+OUT_C); Wait(100); OnFwd(OUT_C); OnRev(OUT_A); Wait(40); OnFwd(OUT_A+OUT_C); if(SENSOR_1<43) OnFwd(OUT_A); } } ***ほかにも、プロブラムをのせておいた [#ve750aea] ***ライントレースロボット(障害物にあたると、反転する) [#l11072db] task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetPower(OUT_A,5); SetPower(OUT_C,3); OnFwd(OUT_A+OUT_C); while(true) { if(SENSOR_1<40) { OnRev(OUT_A); Wait(10); OnFwd(OUT_A+ OUT_C); } if(SENSOR_3 <40) { OnRev(OUT_C); Wait(10); OnFwd(OUT_A+OUT_C); } if(SENSOR_2==1) { OnRev(OUT_A+OUT_C); Wait(100); Off(OUT_A+OUT_C); OnFwd(OUT_A); OnRev(OUT_C); Wait(362/2); OnFwd(OUT_A+OUT_C); } } ***練習問題の、タッチセンサーを使った、壁を90度に反射するロボット [#dbe68a78] task main() { SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_1,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_TOUCH); SetPower(OUT_A,5); SetPower(OUT_C,3); OnFwd(OUT_A+OUT_C); while(true) { if(SENSOR_1==1) { OnRev(OUT_A+OUT_C); Wait(50); Off(OUT_A+OUT_C); OnFwd(OUT_A); OnRev(OUT_C); Wait(362/4); OnFwd(OUT_A+OUT_C); } if(SENSOR_3==1) { OnRev(OUT_A+OUT_C); Wait(50); Off(OUT_A+OUT_C); OnFwd(OUT_C); OnRev(OUT_A); Wait(362/4); OnFwd(OUT_A+OUT_C); } } **工夫したこと、困ったこと [#b7bdd6d1] まず、モーターの元々の力が違うため、セットパワーでその製造誤差をなくした。 光センサーを2つつけ、両側から黒い線を挟んで、センサーに反応させた。これによって、黒い線からロボットの軌道が外れにくくした。 Waitで旋回させるときにも工夫した。一周の時間を計り、その後、例えば、90度だけ旋回させるとき、(一周の時間)/4をして、プログラム上でも、表現した。これによって、それが、一周の時間をいくつで割ったのか、一目で分かる。これによって、実際の時間を入力するより、何度旋回するか、分かりやすくなる。 また、ライントレースロボットが、障害物にぶつかって、右に曲がるときには、工夫したことが多かった。右に曲がって、元のラインに戻るとき、あまりその動きが大きすぎると、途中でライン上に乗ってしまって、うまく右に避けていく動作が終了しないという問題があった。そのため、できるだけ、相手のロボットにあたらないように、かつ、周りのラインにもあたらないように、適度な大きさの動きにするのが難しかった。 このライントレースや、ぶつかったら、右にさけるという動作も、どちらも、書くラインによるところが大きかった。 今回のプログラムは、明るさが低い(黒い線上にいるとき)を基準にして、そのときにプログラムを組んでいった。だが、明るさが高いとき(線上から外れたとき)にもプログラムを組んでいく方法もある。これによって、センサーから外れたとき、線上にいるときで、プログラムを組むこといよって、センサ−1つで線上(線のあるところと線のないところの境界線上)を動くことができる。このプログラムも、別に作ってみるとよいと思った。 2つの光センサーを使ったが、それぞれのセンサーが反応したときのプログラムとして、バックした後、前進させた。これについて、もう少し、動きを繊細にできるとよいと思った。もう少し、滑らかに黒い線上を動けるとよいと思った。 今回も、先生に写真を撮ってもらい、貼付けるつもりである。今回のロボットは、練習問題のタッチセンサーを使った、反射ロボットからの流れから、そのロボットを流用した。今回は、前回の課題でプログラムを担当したものが、ロボット作りを担当できて、よかった。これからも、プログラム作り、ホームページ作り、ロボット作りを担当を入れ替わりながら、作業が、偏らないようにしていこうと思う。そういう訳で、今回のロボットは、ロボット作りになれていないものが作ったため、ロボットはオーソドックスなタイプになった。