- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*ライントレースロボット [#pa8b6c75]
*ロボット本体 [#zace780e]
今回のロボットはこれです。
最初は
そして、コースはこれです [#g2e8d7a5]
コースは自分たちのグループで自由に書くことができますが、以下のことを入れなくてはなりません。
-交差点を2つ
-ヘアピンカーブを一つ
-直角を一つ
-コースから出入りする線を四本
最初はロボットに紙を押させながら走行するようにしましたが、走行中に車輪が浮いてしまい止まってしまったので、取り除きました。また、ライトセンサーが車体に近い方がよいとアドバイスをもらったため、極限まで車体に近づけました
*プログラム [#y1836eb2]
#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<17800) //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<22500) //二段階 急カーブを曲がる
{
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<45000) //三段階、急カーブから出から次の地点まで進む
{
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()-time50000)
{
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<57000) //四段階、ラインが薄い場所を進む
{
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<66000) //五段階、直角を曲がる
{
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) //左へ曲がってコースから出る
{
OnFwd(OUT_A,40);
Wait(1400);
OnFwd(OUT_AC,40);
Wait(1000);
}
}
今回、プログラミングの点で難関となったのは、コースラインの色の濃さにムラがあるということでした。ですから、途中でコースから脱線してしまいました。それでセンサーの閾値を変えて、少しの色の違いでも反応するようにしたところ、今度は速度がとても遅くなってしまい、さらに十字路で誤作動が起こってしまいました。これらの点を解決するために、タイマーを使用してプログラムを時間ごとに区切って作動させました。また、急なカーブや直角を曲がる際には、両方のタイヤを回すことによって小さく回れるようにしました。
一見簡単そうに思っていた課題でしたが、1つのセンサーでのライントレースは難しく、思うように動いてくれないときもありました。しかし、最終的には満足のゆくプログラムが書けたのでよかったです。