**目次 [#rafa16c0]
#contents
*課題2 ライントレースするロボットを作成せよ!! [#zf57fcd9]
~各チームで作成したコースを3周するロボットを製作。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成。(他のメンバーと重ならないように一人一つのプログラムを作成する)

~1,紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい) 
~2,紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む 
~ただし、

~・速さと正確さを追求すること 
~・コースを3周したら自動的に止まること


**0,メンバー [#a38c4b9c]
~Ds ロボット、プログラム2担当
~はいじ プログラム1担当
**1,ロボットの概要 [#p8ab4222]
今回はなるべく小型になるようにしました
***第一段階 [#t54a8e0a]
~タイヤをなるべく近くに寄せて小型化を図る。
#ref(2009a/A3/課題2右/タイヤ部分.jpg)
~出来た結果がこれ↓
#ref(2009a/A3/課題2右/第一段階.jpg)
またバンパーに突起物を付けて反応しやすいように設計。
~ところが、このタイヤだと小回りが利かないためタイヤを変えることに。
***第二段階 [#tddef165]
~タイヤを小型のものにして、小回りが利くように設計。
~ところがギアをうまく組むことが出来ず、やむなく後輪駆動に。
~(見づらいですが後輪駆動になってます)↓
#ref(2009a/A3/課題2右/第二段階(最終形態).jpg)
~このときから、紙パックを運ぶための角(?)をつけた。
~ところが今度は前輪の力がないため、カーブを曲がりきれないため、またしても改良。
***第三段階 [#i7eef119]
~モーターを後ろに取り付けることでギアの問題を解決。
#ref(2009a/A3/課題2右/タイヤ&モーター.jpg)
~ところがこれだと後ろに重心がいってしまうので、補助タイヤを設置。
#ref(2009a/A3/課題2右/補助タイヤ.jpg)
~また、バンパーがうまく作動しないことがわかったので、さらに改良。
#ref(2009a/A3/課題2右/バンパー.jpg)
~(写真だと牛乳パックになってますが、紙パックの間違いです(^^;))
~できたのがコレ↓
#ref(2009a/A3/課題2右/第三段階(今度こそ最終形態).jpg)
~今度はバンパーが反応しすぎるため、再度改良。
#ref(2009a/A3/課題2右/改良バンパー.jpg)
~無駄にデカイ…が、てこの原理を利用しております。
~後にバンパーの補助輪のゴムを取り外し、紙パックのみに反応するようにしました(ゴムを付けとくと摩擦でちょくちょく反応してしまうため)。
~余談ですが、バンパーが重かったせいか、スピードが極端に落ちてしまいました。(電池切れもありましたが…)
~なお光センサーは↓のように車体前部に設置
#ref(2009a/A3/課題2右/光センサー1.jpg)
#ref(2009a/A3/課題2右/光センサー2.jpg)
**2,コースについて [#p45dc257]
~なにも言うことはあるまい・・・。
#ref(2009a/A3/課題2右/コース.jpg)
~見てのとおりです。
~強いていうなら右上と左下のカーブが少々きつい位ですかね。
**3,プログラムについて [#y8237184]
***Dsの作ったプログラム [#l770a664]
~障害物に当たったらそれを次の交差点まで運ぶプログラム(つまり2番のプログラム)。
~先にライントレースの基礎部分を書いたが、その後障害物に対するプログラムを作るのに一苦労(ToT)
~(運搬プログラムは途中経過です)
 #define BORDER 40   //閾値を設定 
 #define TIME  500 //タイマーの時間を設定
 task main()
 {
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_TOUCH);
  SetSensor(SENSOR_3,SENSOR_LIGHT);  //それぞれのセンサーを指定
    int flag=0;
  while(flag<12){    //交差点を12回またぐ(3周する)まで繰り返します。
         
         if(SENSOR_1>BORDER)
              {if(SENSOR_3>BORDER){OnFwd(OUT_A+OUT_C);} //センサーが両方白なら直進
               else {OnFwd(OUT_A);OnRev(OUT_C);} //右が黒なら右折
               }
          else{
          if (SENSOR_3>BORDER){OnFwd(OUT_C);OnRev(OUT_A);}  //左が黒なら左折
          else{OnFwd(OUT_A+OUT_C);flag++;}  //両方黒ならflagを1足して直進。
           }
          
             
    
      if(SENSOR_2==1)       //紙パックにぶつかったら運搬プログラム開始  
            {OnFwd(OUT_A+OUT_C);Wait(90);flag++; //交差点を通り越してflagを1足して、
             until((SENSOR_1<BORDER)&&(SENSOR_3<BORDER)){
              if(SENSOR_1>BORDER){
              if(SENSOR_3>BORDER){OnFwd(OUT_A+OUT_C);}
               else {OnFwd(OUT_A);OnRev(OUT_C);}
               }
          else{
          if (SENSOR_3>BORDER){OnFwd(OUT_C);OnRev(OUT_A);}
        }
      }            //交差点までライントレース
     OnRev(OUT_A+OUT_C);Wait(60);  //少し下がって
     OnFwd(OUT_A);Wait(50);     //右を向いて
     OnFwd(OUT_C);Wait(140);     //進んで
     OnRev(OUT_A);Wait(100);     //左向いて  
     OnFwd(OUT_A);Wait(140);     //また進んで
     OnRev(OUT_C);Wait(50);     //もう一回進んで
     OnRev(OUT_A);Wait(70);     //ちょっと下がって紙パックを交差点に押し戻し、
     flag++;            //flagを1足す。そしてライントレース再開。
     }
 }
 ClearTimer(0);
   while(Timer(0)<=TIME)
   {if(SENSOR_1>BORDER)
              {if(SENSOR_3>BORDER){OnFwd(OUT_A+OUT_C);}
               else 
               {OnFwd(OUT_A);OnRev(OUT_C);}
               }
          else
          {if (SENSOR_3>BORDER){OnFwd(OUT_C);OnRev(OUT_A);}
          else {OnFwd(OUT_A+OUT_C);}
  }
 }
  Off(OUT_A+OUT_C);}    //12回交差点を通ったら、元の位置まで進んで終了!!
 
~タッチセンサーの感度に踊らされ、運送プログラムの設定に頭を悩まされた。というより確認が出来なかった。
***はいじの作ったプログラム [#l770a664]
 #define THRESHOLD 40                //閾値設定 
 task main()
 {
  int i;
  i=0;
  
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_TOUCH);
  SetSensor(SENSOR_3,SENSOR_LIGHT);
  
  while(i<12){
   if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
    OnFwd(OUT_A+OUT_C);               //線上を直進
   }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
    Off(OUT_A);
    OnFwd(OUT_C);          //左折
   }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){
    Off(OUT_C);
    OnFwd(OUT_A);          //右折
   }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){
    OnFwd(OUT_A+OUT_C);             //交差点に来た時
    i=i++;             //最後にiに1を足す
   }
    if(SENSOR_2==1){               //障害にぶつかった時
    turn();                        //サブルーチンturnを発動    
 }
  ClearTimer(0);
  while(Timer(0)<=500){
   if(i==12){
    OnFwd(OUT_A+OUT_C);
    Off(OUT_A+OUT_C);        //3周して5秒したら止まる
  }}
  }}
  
 sub turn()                        //障害にぶつかった時の反応
 {
    OnRev(OUT_A+OUT_C);
    Wait(150);
    Off(OUT_A+OUT_C);
    Wait(200);           //一旦下がって待つ 
    OnFwd(OUT_A);
    Off(OUT_C);
    Wait(100);
    OnFwd(OUT_A+OUT_C);
    Wait(100);
    OnFwd(OUT_C);
    Off(OUT_A);
    Wait(100);
    OnFwd(OUT_A+OUT_C);
    Wait(100);
    OnFwd(OUT_C);
    Off(OUT_A);
    Wait(100);
    OnFwd(OUT_A+OUT_C);
    Wait(100);
    OnFwd(OUT_A);
    Off(OUT_C);
    Wait(100);           //回り込む
   }





**4,良かった点 [#t155d8f5]
~思ったより早い段階でライントレースのプログラムだけは作れることが出来た。また、今回はロボットも様々な工夫(タッチセンサーやロボットの小型化等)をこらすことが出来たので良かった。byDs
**5,苦労した点・反省点 [#kb399b1b]
~タッチセンサーを如何に反応させるかが今回最大の問題点だった。そのために運搬プログラムに時間がかかってしまった。別口で運搬プログラムを作れば良かったかもしれない。
~また、ロボット自体は小型化できたが、バンパーが大きくなってしまったのは残念だった。
~途中電池が弱くなり、モーターやセンサーの調子が悪くなり、そのままやっていた時期があったので、もしかしたらバンパーを変える必要はなかったかもしれない。byDs
~プログラムに時間がかかってしまいました。今回もロボットが任せきりになってしまってすみません(泣 byはいじ
*コメントをどうぞ [#pffdc37f]
- 間に合わないかもしれません;; -- [[A3R Ds]] &new{2009-06-18 (木) 15:37:50};
- あせらず急いでみてください。ロボットの説明が詳しくて良いです。プログラムは、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- [[こさか]] &new{2009-07-02 (木) 22:07:49};
- ロボットの説明は詳しくて良いです。1つ目のプログラムはライントレースの部分を何度も書いているのを改善したほうがいいと思います。NQC入門の8を参考にしてください。 2人目のプログラムに関しては、while(Timer(0)<=500)の中に、if(i==12)はいらないかと思います。
-- [[FI]] &new{2009-07-03 (金) 02:01:18};

#comment


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