ライントレースロボット

今回のメンバー

・川澄
主にHP・プログラム担当
・ru-(広瀬)
ロボット制作担当。プログラムもちょっと
・滝沢クリステル
ロボット制作担当

ロボットの説明と写真

ロボット

プロトタイプ、光センサーは中央に二つ、タッチセンサーは両側に一つずつ、本体に配線できるのは三つ、タッチセンサーは左右どちらにぶつかっても同じ命令しか加えないので同じ場所に配線することにした。
横からの衝撃に反応が疎く、カーブでぶつかっても相手のロボット押しのけるまで突き進み続けた。

ロボット

進化形(クワガタ型)、先端の角(?)を加えることによって横からの衝撃にも反応するようになった。これでカーブで衝突してもよけられるようになった。
今回は意味のあるオプションです。(笑)

ロボット

これが裏側から見た図。この光センサーの幅が
この幅が狭すぎると誤作動を起こしてしまい、広すぎるとコースを回るスピードがかなり落ちてしまう。

コース

これがコース、修正液のあとがあるのはコースがすごく簡単すぎて修正したため。ロボットを作りコースを走らせてみたら、左上のS字カーブに手こずった。

ライントレースするプログラム

まずはライントレースだけをするプログラムを作ってみた。

 task main()
 {
   SetSensor(SENSOR_1, SENSOR_LIGHT); //センサ−1がライトセンサーであると宣言
   SetSensor(SENSOR_3, SENSOR_LIGHT); //センサ−3がライトセンサーであると宣言
   while(true)
   {
       OnFwd(OUT_A+OUT_C);    //何もセンサーに反応がないときは直進
       if(SENSOR_1<40)               //左の光センサーが黒い線を踏んだら
       {
           OnFwd(OUT_C);             //黒い線から外れるまで左に曲がり続ける
           OnRev(OUT_A);
           until(SENSOR_1>40);
       }
       if(SENSOR_3<40)               //右の光センサーが黒い線を踏んだら
       {
           OnFwd(OUT_A);             //黒い線から外れるまで右に曲がり続ける
           OnRev(OUT_C);
           until(SENSOR_3>40);
       } 
   }
 }

ぶつかると右走するプログラム

 #define TURN_RIGHT OnFwd(OUT_A);OnRev(OUT_C);Wait(50);Off(OUT_A+OUT_C);
 #define TURN_LEFT OnRev(OUT_A);OnFwd(OUT_C);Wait(70);Off(OUT_A+OUT_C);
 
   SetSensor(SENSOR_2,SENSOR_TOUCH);  //センサ−2がタッチセンサーであると宣言
 
       if(SENSOR_2==1)                      //タッチセンサーが反応したとき
       {
           OnRev(OUT_A+OUT_C);        //0.5秒後退
           Wait(50);
           TURN_RIGHT;                          //0.5秒左に旋回
           OnFwd(OUT_A+OUT_C);       //1秒直進
           Wait(100);
           TURN_LEFT;                       //0.7秒右に旋回

このプログラムで成功したように見えた。しかし、画用紙の外にはみ出したときにロボットが不可解な動きになってしまって立ち止まってしまった。そこで、画用紙の外に出たら復帰するプログラムを追加

        if((SENSOR_1<40)&&(SENSOR_3<40)) //二つの光センサーが両方とも黒に反応した場合
      {
          OnRev(OUT_A+OUT_C);    //5秒後退
          Wait(500);

このプログラムで、もし画用紙の外に行っても後退してコースに戻ることに成功。 ただし、このプログラムは画用紙の外が黒またはそれに近い色だった場合にのみ有効。
それでこれにライントレースのプログラムを書き加えた完成形のプログラムがこれ↓

 #define TURN_RIGHT OnFwd(OUT_A);OnRev(OUT_C);Wait(50);Off(OUT_A+OUT_C);
 #define TURN_LEFT OnRev(OUT_A);OnFwd(OUT_C);Wait(70);Off(OUT_A+OUT_C);
 
 task main()
 {
   SetSensor(SENSOR_1, SENSOR_LIGHT);
   SetSensor(SENSOR_2,SENSOR_TOUCH);
   SetSensor(SENSOR_3, SENSOR_LIGHT);
   while(true)
   {
       OnFwd(OUT_A+OUT_C);
 
       if((SENSOR_1<40)&&(SENSOR_3>40))
       {
           OnFwd(OUT_C);
           OnRev(OUT_A);
           until(SENSOR_1>40);
       }
       if((SENSOR_3<40)&&(SENSOR_1>40))
       {
           OnFwd(OUT_A);
           OnRev(OUT_C);
           until(SENSOR_3>40);
       }
       if(SENSOR_2==1)
       {
           OnRev(OUT_A+OUT_C);
           Wait(50);
           TURN_RIGHT;
           OnFwd(OUT_A+OUT_C);
           Wait(70);
           TURN_LEFT;
           OnFwd(OUT_A+OUT_C);
           Wait(70);
        }
        if((SENSOR_1<40)&&(SENSOR_3<40))
      {
          OnRev(OUT_A+OUT_C);
          Wait(300);
      }
   }
 }

ぶつかると反転して進むプログラム

 #define turn_RIGHT  OnFwd(OUT_A);OnRev(OUT_C);Wait(185);             
      
 
       SetSensor(SENSOR_2,SENSOR_TOUCH);
 
 
      if(SENSOR_2==1) {    //タッチセンサーが反応した場合
       OnRev(OUT_A+OUT_C);    //0.8秒後退
       Wait(80);
       turn_RIGHT  //逆向きになるまで回転

しかしこれだけだとコースアウトしてしまう可能性が高い。
そこで元のコースに戻るようにプログラムを追加

       OnRev(OUT_A+OUT_C);    //1秒後退
       Wait(100);
       }
   }    
}

これにライントレースするプログラムを加え完成!
で、完成形がこれ↓

 #define turn_RIGHT  OnFwd(OUT_A);OnRev(OUT_C);Wait(185);             
 
 task main () 
 {
       SetSensor(SENSOR_1, SENSOR_LIGHT);
       SetSensor(SENSOR_2,SENSOR_TOUCH);
       SetSensor(SENSOR_3,SENSOR_LIGHT);
 
       while (true) {
           OnFwd(OUT_A+OUT_C);
               if (SENSOR_1 <  40)  {
                     OnFwd(OUT_C);
                OnRev(OUT_A);
                until (SENSOR_1>40);}
          if(SENSOR_3<40) {
            OnFwd(OUT_A);
            OnRev(OUT_C);
             until(SENSOR_3>40);      }     
 
       
 
      if(SENSOR_2==1) {    
       OnRev(OUT_A+OUT_C);    
       Wait(80);
       turn_RIGHT  
       OnRev(OUT_A+OUT_C);    
       Wait(100);
       }
   }    
}

苦労した点

ロボット

・なかなか横からの衝撃に反応してくれなかった点。
・クワガタ型にしたときに、重心が前に行き過ぎて、その調整に手こずった。
・スピードを速くすることがなかなかできなかった。

プログラム

・if文で条件が重複して動かなくなってしまい、それを修正することに苦労した。
・右によけるプログラムがなかなか相手のロボットをよけてくれなかった点。

工夫した点

ロボット(広瀬、滝沢)

・センサーの幅をできるだけ狭くすることでコースを回るスピードをできるだけ速くした点
・タッチセンサーの死角を無くすためにクワガタ型に改造した。サイドバンパーで横の物を、牙バンパーで前の物を、そして下バンパーで小さい物を感知し、行動する。

プログラム(川澄)

・右走するプログラムで画用紙からはみ出ても復帰するようにした点
・逆走するプログラムでコースアウトを防ぐためにコースに戻るプログラムを追加した点

反省点

川澄

・プログラム作りに没頭しすぎてロボット作りがおろそかになってしまった点
・画用紙はつなぎ合わせたときの出っ張りが生じるので模造紙にしとけばよかった

ru-

•プログラムが複雑になって、班員に手取り足取り教えてもらった。自分でできるようにならないと....。足手まといになってしまう。以上今回の愚痴です。
•ロボット自体はとてもいいものが完成しました。しかしプログラムに関して、反転した時、稀にですが線のないところまで走ってしまい、暴走することがあるので反転した時に頭を振って線を探すプログラムを追加しとけばよっかたです。反省してます。

コメントよろしくお願いします



添付ファイル: file060609_2238~01.jpg 164件 [詳細] file060609_1605~02.jpg 168件 [詳細] file060609_1605~01.jpg 161件 [詳細] file060519_1529~01.jpg 178件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-07-06 (木) 10:33:52