2009a

ライントレースロボットの作成

目次

ロボットの概要

・シンプルな構造
・機動力  

この2つを心掛けました。
しかし何がいいのか分からなかったのでとりあえず小回りの利くタイヤを採用しました。
before.JPG

タッチセンサと光センサ

・障害物があるということでバンパーを制作しました。
 シングルバンパーを採用したのでタッチセンサは1つ使用しました。
singlebumper.JPG

・光センサは2つ搭載。
 タッチセンサが光センサより前にくるように下の写真のように接続しました。
setuzoku.jpg
光センサは地面スレスレに取り付け、コースを読み取りやすいようにしました。

問題と改善その1 三輪へ変更

・実際にコースを走らせると急なカーブに対応しきれないことが判明。  
さらに小回りが利くように後輪を外し、キャスターを付けて三輪に変更しました。  
after.JPG

・キャスター部分
caster.JPG
この変更によりだいぶコースから外れにくくなりました。

問題と改善その2 タッチセンサの改良

課題で使われる牛乳パックが軽いため上のようなタッチセンサでは反応しないことが分かった。
そこで支点から力点の距離(うで)を長くし、小さな力でも反応するように改良しました。
また、紙パックを運べるように先端部分も改良しました。
remakebumper2.JPG

完成したロボット

最終的にこのようなロボットになりました。
after3.JPG

プログラムについて

今回のプログラムは2種類。
交差点の牛乳パックに当たったら、
  ̄回して避けていく
 牛乳パックを次の交差点に運んでから迂回し避けていく
の2つです。

KEIのプログラム(プログラム)

#define THRESHOLD 40
#define A OUT_A 
#define B OUT_B 
#define C OUT_C
#define time 100
#define runtime 15000                                                     //三周する時間
task main()
{     
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_3,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_TOUCH);
  ClearTimer(0);     
      start hikari;
      while(FastTimer(0)< runtime)                                          //三周する時間内
         {if(SENSOR_2 == 1 )                                        //牛乳パックにぶつかった時
              {stop hikari;start touch;}              
         }
      while(FastTimer(0)>= runtime)

      {Off(A+C);}

 }
 
 task touch()                                                            //牛乳パックをよけるプログラム
       {if(count == 1)
         {OnRev(A+C);Wait(60);Off(A+C);OnFwd(A);OnRev(C);Wait(60);OnFwd(C);Wait(time);  
          OnRev(A);OnFwd(C);Wait(60);                                    //最初の交差点用
          OnFwd(A);Wait(225);OnRev(A);Wait(60);Off(A+C);
          count = count * -1;start hikari;}
     else{OnRev(A+C);Wait(60);Off(A+C);OnFwd(C);OnRev(A);Wait(60);OnFwd(A);Wait(time);
          OnRev(C);OnFwd(A);Wait(60);                                    //2回目の交差点用
          OnFwd(C);Wait(200);OnRev(C);Wait(65);Off(A+C);
          count = count * -1;start hikari;}  
          
      }
 
  task hikari()                                                           //黒い線を追いかけるプログラム
       {
         while(FastTimer(0)<= runtime)
          {
            if(SENSOR_1>THRESHOLD&& SENSOR_3 >THRESHOLD)                    //両方のタッチセンサに反応がない時
               {OnFwd(A+C);}
            else{if(SENSOR_1< THRESHOLD && SENSOR_3 >THRESHOLD)            //左のタッチセンサが線に反応した時
                   {OnFwd(C);Off(A);}
                 }
            if(SENSOR_1>THRESHOLD&& SENSOR_3 >THRESHOLD)
               {OnFwd(A+C);}
            else{if(SENSOR_3< THRESHOLD && SENSOR_1>THRESHOLD)            //右のタッチセンサが線に反応した時
                   {OnFwd(A);Off(C);}
                 }  
            
           }    
           
        }


program1.jpgロボットの動きはこの通りです。紙パックに当たったら少しバックし、図の矢印のように動いてパックを避けるようになっています。

KOUのプログラム(プログラム)

#define THRESHOLD 40
#define A OUT_A 
#define B OUT_B 
#define C OUT_C
#define time 115
#define runtime 13200
int count;
task main()
{  
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_3,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_TOUCH);
  ClearTimer(0);
  count = 0;     
      start hikari;
      while(FastTimer(0)< runtime)                        //三周する時間内
         {
         if(SENSOR_1<THRESHOLD&& SENSOR_3 <THRESHOLD)
              {stop hikari;start touch;}              
         }
      while(FastTimer(0)>= runtime)
           {Off(A+C);}   
 }

 task touch()
      {if(count == 1)                            //牛乳パックを次の交差点まで運び置いてくるプログラム
         {start hikari;Wait(90);Wait(818);stop hikari;
          OnRev(A+C);Wait(60);Off(A+C);OnFwd(C);OnRev(A);count=count+1;Wait(60);OnFwd(A);Wait(time);
          OnRev(C);OnFwd(A);Wait(60);
          OnFwd(C);Wait(200);OnRev(C);Wait(65);Off(A+C);start hikari;
          }
     else{if(count ==2)                                                      //避ける途中黒い線を踏むので続けて避けるプログラム
            {OnFwd(C);Wait(130);count=count+1;OnRev(C);Wait(65);Off(A+C);start hikari;}
        else{if(count==5)                           //一周を仕切りなおすプログラム
               {count=0;start hikari;}
           else{start hikari;Wait(10);count=count+1;}            //交差点を数えるプログラム
            }  
         }
       } 
          
  task hikari()                                                             //黒い線を追いかけるプログラム                              
       {
         while(FastTimer(0)<= runtime)
          {
            if(SENSOR_1>THRESHOLD&& SENSOR_3 >THRESHOLD)                     //両方のタッチセンサに反応がない時
               {OnFwd(A+C);}
            else{if(SENSOR_1< THRESHOLD && SENSOR_3 >THRESHOLD)              //左のタッチセンサが線に反応した時
                   {OnFwd(C);Off(A);}
                 }
            if(SENSOR_1>THRESHOLD&& SENSOR_3 >THRESHOLD)
               {OnFwd(A+C);}
            else{if(SENSOR_3< THRESHOLD && SENSOR_1>THRESHOLD)               //右のタッチセンサが線に反応した時
                   {OnFwd(A);Off(C);}
                 }  
            
           }    
           
        }


program2.jpg 紙パックを運び,量隶の動きをし、交差点まで来たら少しバックし、△竜案擦濃罐僖奪を避けて進んでいく。

感想

KOU:交差点を数えさせるのに苦労した。

KEI:ロボットを改良していく過程が大変だった。

コメントをどうぞ

  • 全体的に説明が良くできています。プログラムについては、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- こさか? 2009-07-02 (木) 22:22:25
  • プログラムもロボットもそれらの説明もよくできています。 -- FI? 2009-07-03 (金) 03:37:28


添付ファイル: fileprogram2.jpg 239件 [詳細] fileprogram1.jpg 246件 [詳細] fileafter3.JPG 255件 [詳細] fileremakebumper2.JPG 241件 [詳細] filecaster.JPG 239件 [詳細] filesinglebumper.JPG 234件 [詳細] filesetuzoku.jpg 223件 [詳細] fileafter.JPG 247件 [詳細] filebefore.JPG 253件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-07-10 (金) 01:37:57