[[2006a/A1]]
#contents

*課題2:黒い線に沿って動くロボット [#v2b9b732]
黒い線に沿って動くロボットを作成せよ。そして一つの周回コースを2台のロボットが走行すること想定し、以下の2種類のプログラムを作成せよ。

+前方のロボットに接触したら反転して進む 
+前方のロボットに接触したらそのロボットを右側から追い抜いて(あるいは避けて通り)、再びライン上に戻って進む
ただし、スピードと確実性をできる限り両立させること。自由課題1も参考に。光センサは2つ使用してよい。

(期限:6月15日)

**今回もがんばりましょう。 [#mbcba84d]
*完成までの道のり [#oea81c7c]
**6月8日 [#da0c3f79]
試作プログラム1 [#t148dd63]
 作成者;僕
 作成日;6月8日
 task main ()
 {
   SetSensor(SENSOR_1, SENSOR_LIGHT);
   SetSensor(SENSOR_3, SENSOR_LIGHT);
   SetSensor(SENSOR_2, SENSOR_TOUCH);
   
    while (true) 
    {
        if (SENSOR_1 < THRESHOLD)           // (1)黒線上にいるとき
        {
            OnFwd(OUT_A);
            Off(OUT_C);
        } 
        if (SENSOR_3 < THRESHOLD)           // (3)黒線上にいるとき
        {
            OnFwd(OUT_C);
            Off(OUT_A);
        }
        if (SENSOR_2==1 )
       {
           OnFwd(OUT_A);OnRev(OUT_C);Wait(150);    //タッチしたら180°反転する
           OnFwd(OUT_C);
       }
         
     }         
 }

プログラムはかなり簡単につくった。
実際に動かしたところ結構うまくカーブを曲がることが出来たので、
速攻完成かと思ったが、直線のところが無駄の多いうごきになってしまう。

<マシーンの改良…>
自動車と同じでコンパクトにしたほうが小回りが利くと考えて、
車輪の幅を6ブロックほど短くした。
そして直線では前方に2つつけた光センサーの幅を調整した結果一番近づけたときが無駄が少なくなった。

**6月9日 [#c0e04827]
直線での無駄をなくすために、センサーが両方白いときは直進するプログラムを書いたが、
カーブを曲がるときにセンサーが黒い線から両方出てしまうとうまく曲がりきれずに直進してしまった。

**6月14日 [#v8422af9]
ぶつかったら右側から追い抜くプログラム
 作成者;僕
 作成日;6月14日
 #define THRESHOLD 40 
 task main ()
 {
   SetSensor(SENSOR_1, SENSOR_LIGHT);
   SetSensor(SENSOR_3, SENSOR_LIGHT);
   SetSensor(SENSOR_2, SENSOR_TOUCH);
    
    while (true) 
    {
        if (SENSOR_1 < THRESHOLD)           
        {
            OnFwd(OUT_A);
            Off(OUT_C);
        } 
        if (SENSOR_3 < THRESHOLD)           
        {
            OnFwd(OUT_C);
            Off(OUT_A);
        }
        if (SENSOR_2==1 )
       {
           OnFwd(OUT_A);OnRev(OUT_C);Wait(70);    
           OnFwd(OUT_C);Wait(30);
           OnFwd(OUT_C);OnRev(OUT_A);Wait(70);
           OnFwd(OUT_A);Wait(200);
           OnFwd(OUT_C);OnRev(OUT_A);Wait(90);
           OnFwd(OUT_A);
            
       }
         
     }
    }

それらしい動きはするが、うまく線上に復帰できなかったり、直角に線に進入するとうまくいかなかった。
**6月15日 [#b683025a]
 作成者;tomo
 作成日;6月15日
 #define THRESHOLD 40 
 task main ()
 {
  SetSensor(SENSOR_1, SENSOR_LIGHT);
  SetSensor(SENSOR_2, SENSOR_TOUCH);
  SetSensor(SENSOR_3, SENSOR_LIGHT);
  
   while (true) 
   {
      if (SENSOR_1 < THRESHOLD)   //黒線上にきたらAを回転         
       {
           OnFwd(OUT_A);
           OnRev(OUT_C);
       }
      else
        {
          OnFwd(OUT_C);
         }
       if (SENSOR_3 < THRESHOLD)  //黒線上にきたらCを回転         
       {
           OnFwd(OUT_C);
           OnRev(OUT_A);
       }
        else
       {
          OnFwd(OUT_A);
        }
          
       if (SENSOR_2==1 )             //ぶつかったら半回転
      {
          OnFwd(OUT_A);OnRev(OUT_C);Wait(200);
          OnRev(OUT_A);OnFwd(OUT_C);Wait(50);             
      }
        
    }
   }
今までelseではifのときの逆をプログラムしていたが、そうするとプログラムに重複する部分ができてしまい、うまく動かなかった。そこでelseを上のように書き換えたところ、急なカーブも確実に曲がれ、直線も速く進むようになった。

*完成プログラムの詳しい説明 [#y2f3b4fb]
**完成プログラム [#tf61f8cf]
 作成者;tomo
 作成日;6月15日
 #define THRESHOLD 40 
 task main ()
 {
  SetSensor(SENSOR_1, SENSOR_LIGHT);
  SetSensor(SENSOR_2, SENSOR_TOUCH);
  SetSensor(SENSOR_3, SENSOR_LIGHT);
  
   while (true) 
   {
      if (SENSOR_1 < THRESHOLD)   //黒線上にきたらAを回転         
       {
           OnFwd(OUT_A);
           OnRev(OUT_C);
       }
      else
        {
          OnFwd(OUT_C);      //センサー1が外れたらCのみ回転
         }
       if (SENSOR_3 < THRESHOLD)  //黒線上にきたらCを回転         
       {
           OnFwd(OUT_C);
           OnRev(OUT_A);
       }
        else
       {
          OnFwd(OUT_A);      //センサー3が外れたらAのみ回転
        }
          
       if (SENSOR_2==1 )             //ぶつかったら半回転
      {
          OnFwd(OUT_A);OnRev(OUT_C);Wait(200);
          OnRev(OUT_A);OnFwd(OUT_C);Wait(50);             
      }
     if (SENSOR_2==1 )            //ぶつかったら右側から追い抜く
      {
         OnFwd(OUT_A);OnRev(OUT_C);Wait(70);    
           OnFwd(OUT_C);Wait(30);
           OnFwd(OUT_C);OnRev(OUT_A);Wait(70);
           OnFwd(OUT_A);Wait(200);
           OnFwd(OUT_C);OnRev(OUT_A);Wait(90);
           OnFwd(OUT_A);
       } 
    }
   }
省略のため逆回転と、右側から追い抜くプログラムを両方載せています。
**課題となったところ [#re75ddca]
elaeを使わないとカーブが滑らかに曲がることが出来たが、直線での無駄が大きいので両方のセンサーが白(線外)のとき直進するプログラムを書いた。すると、確かに直線をまっすぐ進むが、カーブを曲がるときに両方のセンサーが線から外れると、曲がりきらずに直進してしまった。
まとめると…
+カーブで両方のセンサーをはずさないこと。
+直線での無駄を極力省くこと。
+ぶつかったら逆方向に進むとき、また、右側から追い抜くときにうまく線上に復帰すること。
**解決(工夫した点) [#b1d16987]
+else を使い、片側のセンサーが外れたときの動きを変えたところ、滑らかさはなくなったが確実に曲がるようになった。
+elseを使うことで直線でも両方センサーが外れたとき直進するようなプログラムになり直線のスピードが上がった。
+逆方向に進むときの反転で、確実に線に乗るために180度回転ではなく、おおきめに回転して頭を振るようにして線を探すようにしたところかならず線に乗るようになった。
*ロボットの説明 [#t8215122]
カーブでなるべくスムーズに曲がるためにタイヤの幅を狭くして小回りが利くようにした。

*感想&考察 [#r301c079]
今回はマシーンは簡単に作れたが、プログラムに手間取った。プログラムを書いて、予想道理に動くことのほうが少ないので試行錯誤にかなり時間を使ってしまった。

-誰が書いたプログラムかを記入してください。 -- [[いまい(TA)]] &new{2006-06-16 (金) 13:55:20};

#comment


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