目次
#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つのセンサーでのライントレースは難しく、思うように動いてくれないときもありました。しかし、最終的には満足のゆくプログラムが書けたのでよかったです。

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