目次 #contents *ライントレースロボット [#pa8b6c75] *ロボット本体 [#zace780e] 今回のロボットはこれです。 そして、コースはこれです コースは自分たちのグループで自由に書くことができますが、以下のことを入れなくてはなりません。 -交差点を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つのセンサーでのライントレースは難しく、思うように動いてくれないときもありました。しかし、最終的には満足のゆくプログラムが書けたのでよかったです。