目次
今回のロボットはこれです。
そして、コースはこれです コースは自分たちのグループで自由に書くことができますが、以下のことを入れなくてはなりません。
赤色で着色してある部分は色が薄くプログラムを書く際の難点となりました。
NXTを使うグループはライトセンサーが一つしかないため、黒い線と白い部分の境界線を走るロボットになりました。 基本的な動きは図のようになっています。黒い部分はラインを、赤い部分はセンサーの感知部分を示しています。
まっすぐ走る
左に曲がる
右に曲がる
最初に作ったロボットはライトセンサーとロボットの距離が遠く、紙を押させながら走行するようなバーを装着していましたが、走行中に車輪が浮いてしまい止まってしまったので取り除きました。
また、ライトセンサーが車体に近い方がよいとアドバイスをもらったため、極限まで車体に近づけました。センサー自体は2本の軸でしっかり固定してあります。
図のように1〜8の場所において、以下の対応するプログラムが適用されるようになっています。
#define black 27 //黒は27以下 白は43以上の値として認識する #define white 43 long time; task main() { SetSensorLight(IN_3); //3にライトセンサーをセット SetSensorSound(IN_2); //2にサウンドセンサーをセット time=CurrentTick(); //タイマー開始 PlayTone(440,100); //音を鳴らす OnFwd(OUT_A,40); //コースへ入る Wait(600); OnFwd(OUT_AC,30); while(CurrentTick()-time<20500) //1、急カーブの手前まで進む { if (Sensor(IN_3) <= black) //ライン内に入ったら右へ曲がる ラインから外れたら左へ曲がる { Off(OUT_AC); OnFwd(OUT_C,40); Wait(50); OnFwd(OUT_AC,30); } if (Sensor(IN_3) >= white) { Off(OUT_AC); OnFwd(OUT_A, 30); Wait(50); OnFwd(OUT_AC,30); } } PlayTone(220,100); //音を鳴らす while(CurrentTick()-time<23500) //2 急カーブを曲がる { if (Sensor(IN_3) <= 36) //ライン内に入ったら右へ曲がる ラインから外れたら左へ曲がる { Off(OUT_AC); OnFwd(OUT_C,40); OnFwd(OUT_A,-30); Wait(50); OnFwd(OUT_AC,30); } if (Sensor(IN_3) >= white) { Off(OUT_AC); OnFwd(OUT_A,30); OnFwd(OUT_C,20); Wait(50); OnFwd(OUT_AC,30); } } PlayTone(110,100); //音を鳴らす while(CurrentTick()-time<36000) //3、急カーブから出から次の地点まで進む { if (Sensor(IN_3) <= 31) //ライン内に入ったら右へ曲がる ラインから外れたら左へ曲がる { Off(OUT_AC); OnFwd(OUT_C,40); Wait(50); OnFwd(OUT_AC,30); } if (Sensor(IN_3) >= white) { Off(OUT_AC); OnFwd(OUT_A, 30); Wait(50); OnFwd(OUT_AC,30); } } PlayTone(220,100); //音を鳴らす while(CurrentTick()-time45000) //4 ヘアピンカーブを曲がる { //ライン内に入ったら小さく右へ曲がる ラインから外れたら小さく左へ曲がる if (Sensor(IN_3) <= 36) { Off(OUT_AC); OnFwd(OUT_C,40); OnFwd(OUT_A,-30); Wait(50); OnFwd(OUT_AC,30); } if (Sensor(IN_3) >= white) { Off(OUT_AC); OnFwd(OUT_A,30); OnFwd(OUT_C,-20); Wait(50); OnFwd(OUT_AC,30); } } PlayTone(220,100); //音を鳴らす while(CurrentTick()-time<59000) //5 一段階と同じプログラム { if (Sensor(IN_3) <= black) { Off(OUT_AC); OnFwd(OUT_C,40); Wait(50); OnFwd(OUT_AC,30); } if (Sensor(IN_3) >= white) { Off(OUT_AC); OnFwd(OUT_A, 30); Wait(50); OnFwd(OUT_AC,30); } } PlayTone(220,100); //音を鳴らす while(CurrentTick()-time<67000) //6、ラインが薄い場所を進む { if (Sensor(IN_3) <= 35) //ライン内に入ったら右へ曲がる ラインから外れたら左へ曲がる { Off(OUT_AC); OnFwd(OUT_C,40); Wait(50); OnFwd(OUT_AC,30); } if (Sensor(IN_3) >= white) { Off(OUT_AC); OnFwd(OUT_A, 30); Wait(50); OnFwd(OUT_AC,30); } } PlayTone(220,100); //音を鳴らす Off(OUT_AC); while(CurrentTick()-time<75000) //7、直角を曲がる { if (Sensor(IN_3) >=43) //ライン内に入ったら小さく右へ曲がる ラインから外れたら小さく左へ曲がる { Off(OUT_AC); OnFwd(OUT_A,30); OnFwd(OUT_C,-20); Wait(10); OnFwd(OUT_AC,20); } if (Sensor(IN_3) <=36) { Off(OUT_AC); OnFwd(OUT_C,30); OnFwd(OUT_A,-20); Wait(10); OnFwd(OUT_AC,20); } } PlayTone(220,100); //音を鳴らす Off(OUT_AC); while(true) //8 左へ曲がってコースから出る { OnFwd(OUT_A,40); Wait(1400); OnFwd(OUT_AC,40); Wait(1000); Off(OUT=AC); } }
今回、プログラミングの点で難関となったのは、コースラインの色の濃さにムラがあるということでした。ですから、途中でコースから脱線してしまいました。それでセンサーの閾値を変えて、少しの色の違いでも反応するようにしたところ、今度は速度がとても遅くなってしまい、さらに十字路で誤作動が起こってしまいました。これらの点を解決するために、タイマーを使用してプログラムを時間ごとに区切って作動させました。また、ヘアピンカーブや直角を曲がる際には、両方のタイヤを回すことによって小さく回れるようにしました。 一見簡単そうに思っていた課題でしたが、1つのセンサーでのライントレースは難しく、思うように動いてくれないときもありました。しかし、最終的には満足のゆくプログラムが書けたのでよかったです。発表では最後の離脱のタイミングずれてしまいました。摩擦によって毎回離脱地点に到達する時間が違うので、その点も考慮してプログラムを作れればよかったと思います。また、発表の1週間まえにプログラムを完成させていたため、当日になって動かしてみると電池の残量が減っており、タイマーの値を書き換えなくてはならず大変でした。