[[2008b]]
*ライントレースロボットの作成 [#ef19c9d6]
画用紙の上に描かれたコース上を走るロボットを作成する。
**目次 [#xc8fd32f]
#contents
**方針 [#aa36cd6d]
**作成の手順 [#p5fac459]
-基礎部分
ローヴァーロボットのドライブベースを一部改造して作成した。
この改造によって、本体を支える後部タイヤや光センサーを容易に設置できるようになった。&br;
&br;
#ref(base_side.jpg,around)
#ref(wheel.jpg)
-センサー部分
--タッチセンサー
付属の説明書に記載されていたシングルバンパーを設置した。&br;
&br;
#ref(touch_sensor.jpg)&br;
&br;
--光センサー&br;
&br;
#ref(hikari sensor.JPG)&br;
&br;
光センサーが光を認識しやすいように地面にできるだけ近づくようにした。&br;
&br;
--完成&br;
&br;
#ref(yoko.JPG)&br;
&br;
-工夫点
--安定性の向上のためにあえてキャスターを後方に取り付けホイールベースを長くした。
--車体の光センサー台座の位置を車輪の軸にできるだけ近づけるようにした。
--光センサーの位置をいつでも変更できるように車体だけでなくバンパーにもブロックをつけてセンサーをつけられるようにしてある。
**プログラムの作成 [#ab4b606d]
以下の条件をポイントにプログラムを作成した。
--コースを挟み込むように光センサーを設置しているので、それぞれのセンサーが暗い所を感知すると、進路を変更する。
#ref(straight.jpg,around)
#ref(turn.jpg)
--ロボットが障害物にぶつかったとき、前に設置したタッチセンサーが反応してロボットの動きを一定時間止める。
--ロボットが停止する場所を通った回数をカウントし、その回数が設定した値になった時に動作を終了する。&br;
//本文
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_3,SENSOR_LIGHT); //各センサーを設定
int count;
count = 0; //変数を設定する。この変数は、最後にロボットが停止する時に利用する。
while(count < 9){
if((SENSOR_1 > 40) && (SENSOR_3 > 40)){
OnFwd(OUT_A+OUT_C);
until((SENSOR_1 < 40) || (SENSOR_3 < 40) || (SENSOR_2 == 1)) ;
} //どちらかのセンサーが反応しない限り、前進し続ける。
if((SENSOR_1 < 40) && (SENSOR_3 > 40)){
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(1);
} //進行方向右側のセンサーが反応したとき、右折する
if((SENSOR_1 > 40) && (SENSOR_3 < 40)){
OnRev(OUT_C);
OnFwd(OUT_A);
Wait(1);
} //進行方向左側のセンサーが反応したとき、左折する
if((SENSOR_1 < 40) && (SENSOR_3 < 40)){
count = count + 1;
Off(OUT_A+OUT_C);
Wait(200);
OnFwd(OUT_A+OUT_C);
Wait(40);
} //両側のセンサーが反応した時、一定時間停止してカウンターに1を加える。(停止場所した場所をカウント)
if(SENSOR_2 == 1){
OnRev(OUT_A+OUT_C);
Wait(10);
Off(OUT_A+OUT_C);
Wait(200);
OnFwd(OUT_A+OUT_C);
Wait(10);
} //タッチセンサーが反応したとき、一定時間停止する。(カウントはしない)
}
Off(OUT_A+OUT_C); //動作をリセット(プログラムを繰り返す際の誤作動を防ぐ)
}
**実行結果 [#a0f89aee]
#ref(jikkou.jpg)
最初は順調にコース上を走っていたが、途中で突然コースからはみ出してしまい、復帰できなくなってしまった。原因は光センサーの位置の問題、又は各行動パターンに設定してある行動時間が長すぎたためコースをはみ出てしまったと考えられる。&br;
(例:右折の際に設定した右折時間が長すぎると光センサーが両方とも黒線からはみ出てしまい、光センサーに暗い部分が反応しなくなる。そのため次の行動の際にそこが黒線に平行な場所と判断して直進してしまう。)
**その後の改良点 [#c15119fd]
--センサーの位置を微調整
--各行動の行動時間を調整
最終的には無事に条件通りにコースを走り切った。
**反省&感想 [#v8c342bd]
プログラムの作成に時間がかかり、特に、ある回数コースを回ってから自動的に停止するプログラムが大変だった。&br;
最終的にはロボットがうまく走ってくれて安心した。
**コメント [#lcfbc487]
コメントをお願いします。
#comment
書くべきことは書けています。FI
書くべきことは書けています。カーブを曲がる際のプログラムにwaitを使う、untilを使う、何もなしのどれが一番いいか考えてみると面白いかもしれません。 FI