目次

課題2 ライントレースするロボットを作成せよ!!

各チームで作成したコースを3周するロボットを製作。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成。(他のメンバーと重ならないように一人一つのプログラムを作成する)

1,紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい)

2,紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む

ただし、

・速さと正確さを追求すること

・コースを3周したら自動的に止まること

0,メンバー

Ds ロボット、プログラム2担当

はいじ プログラム1担当

1,ロボットの概要

今回はなるべく小型になるようにしました

第一段階

タイヤをなるべく近くに寄せて小型化を図る。

タイヤ部分.jpg

出来た結果がこれ↓

第一段階.jpg

またバンパーに突起物を付けて反応しやすいように設計。

ところが、このタイヤだと小回りが利かないためタイヤを変えることに。

第二段階

タイヤを小型のものにして、小回りが利くように設計。

ところがギアをうまく組むことが出来ず、やむなく後輪駆動に。

(見づらいですが後輪駆動になってます)↓

第二段階(最終形態).jpg

このときから、紙パックを運ぶための角(?)をつけた。

ところが今度は前輪の力がないため、カーブを曲がりきれないため、またしても改良。

第三段階

モーターを後ろに取り付けることでギアの問題を解決。

タイヤ&モーター.jpg

ところがこれだと後ろに重心がいってしまうので、補助タイヤを設置。

補助タイヤ.jpg

また、バンパーがうまく作動しないことがわかったので、さらに改良。

バンパー.jpg

(写真だと牛乳パックになってますが、紙パックの間違いです(^^;))

できたのがコレ↓

第三段階(今度こそ最終形態).jpg

今度はバンパーが反応しすぎるため、再度改良。

改良バンパー.jpg

無駄にデカイ…が、てこの原理を利用しております。

後にバンパーの補助輪のゴムを取り外し、紙パックのみに反応するようにしました(ゴムを付けとくと摩擦でちょくちょく反応してしまうため)。

余談ですが、バンパーが重かったせいか、スピードが極端に落ちてしまいました。(電池切れもありましたが…)

なお光センサーは↓のように車体前部に設置

光センサー1.jpg
光センサー2.jpg

2,コースについて

なにも言うことはあるまい・・・。

コース.jpg

見てのとおりです。

強いていうなら右上と左下のカーブが少々きつい位ですかね。

3,プログラムについて

Dsの作ったプログラム

障害物に当たったらそれを次の交差点まで運ぶプログラム(つまり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回交差点を通ったら、元の位置まで進んで終了!!

タッチセンサーの感度に踊らされ、運送プログラムの設定に頭を悩まされた。というより確認が出来なかった。

はいじの作ったプログラム

#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,良かった点

思ったより早い段階でライントレースのプログラムだけは作れることが出来た。また、今回はロボットも様々な工夫(タッチセンサーやロボットの小型化等)をこらすことが出来たので良かった。byDs

5,苦労した点・反省点

タッチセンサーを如何に反応させるかが今回最大の問題点だった。そのために運搬プログラムに時間がかかってしまった。別口で運搬プログラムを作れば良かったかもしれない。

また、ロボット自体は小型化できたが、バンパーが大きくなってしまったのは残念だった。

途中電池が弱くなり、モーターやセンサーの調子が悪くなり、そのままやっていた時期があったので、もしかしたらバンパーを変える必要はなかったかもしれない。byDs

プログラムに時間がかかってしまいました。今回もロボットが任せきりになってしまってすみません(泣 byはいじ

コメントをどうぞ

  • 間に合わないかもしれません;; -- A3R Ds? 2009-06-18 (木) 15:37:50
  • あせらず急いでみてください。ロボットの説明が詳しくて良いです。プログラムは、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- こさか? 2009-07-02 (木) 22:07:49
  • ロボットの説明は詳しくて良いです。1つ目のプログラムはライントレースの部分を何度も書いているのを改善したほうがいいと思います。NQC入門の8を参考にしてください。 2人目のプログラムに関しては、while(Timer(0)<=500)の中に、if(i==12)はいらないかと思います。
    • FI? 2009-07-03 (金) 02:01:18


添付ファイル: file光センサー2.jpg 317件 [詳細] file光センサー1.jpg 280件 [詳細] file改良バンパー.jpg 253件 [詳細] file補助タイヤ.jpg 269件 [詳細] file第二段階(最終形態).jpg 271件 [詳細] file第三段階(今度こそ最終形態).jpg 266件 [詳細] file第一段階.jpg 258件 [詳細] fileバンパー.jpg 260件 [詳細] fileタイヤ部分.jpg 274件 [詳細] fileタイヤ&モーター.jpg 270件 [詳細] fileコース.jpg 242件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-07-03 (金) 02:08:43 (3704d)