*センサーを使って、ライントレースロボットを作る(障害物を右側にさけていく) [#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つの光センサーを使ったが、それぞれのセンサーが反応したときのプログラムとして、バックした後、前進させた。これについて、もう少し、動きを繊細にできるとよいと思った。もう少し、滑らかに黒い線上を動けるとよいと思った。

 今回も、先生に写真を撮ってもらい、貼付けるつもりである。今回のロボットは、練習問題のタッチセンサーを使った、反射ロボットからの流れから、そのロボットを流用した。今回は、前回の課題でプログラムを担当したものが、ロボット作りを担当できて、よかった。これからも、プログラム作り、ホームページ作り、ロボット作りを担当を入れ替わりながら、作業が、偏らないようにしていこうと思う。そういう訳で、今回のロボットは、ロボット作りになれていないものが作ったため、ロボットはオーソドックスなタイプになった。

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS