- 追加された行はこの色です。
- 削除された行はこの色です。
[[]]
*センサーを使って、ライントレースロボットを作る(障害物を右側にさけていく) [#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つの光センサーを使ったが、それぞれのセンサーが反応したときのプログラムとして、バックした後、前進させた。これについて、もう少し、動きを繊細にできるとよいと思った。もう少し、滑らかに黒い線上を動けるとよいと思った。
今回も、先生に写真を撮ってもらい、貼付けるつもりである。今回のロボットは、練習問題のタッチセンサーを使った、反射ロボットからの流れから、そのロボットを流用した。今回は、前回の課題でプログラムを担当したものが、ロボット作りを担当できて、よかった。これからも、プログラム作り、ホームページ作り、ロボット作りを担当を入れ替わりながら、作業が、偏らないようにしていこうと思う。そういう訳で、今回のロボットは、ロボット作りになれていないものが作ったため、ロボットはオーソドックスなタイプになった。