[[2013b/Member]]

#contents
*ロボットの紹介 [#e76e8d8f]
&ref(2013b/Member/ryois/Mission1/image.jpeg,15%);

・光センサーを車体に近づけることで。より正確に線を追うことができるようにした。

・タッチセンサーの前にバンパーを取り付けることで、タッチセンサーの反応をよくした。

・ロボットが安定して動けるように、ロボットの説明書を参考にした。

*コースの攻略 [#sc7bc5e5]

&ref(2013b/Member/ryois/Mission1/画像.xlsx,);

⓪:スタートから一回目の交差点までを
 О豌麑椶慮鮑硬

◆О豌麑椶慮鮑硬世ら二回目の交差点まで

:二回目の交差点から三回目の交差点を通り過ぎるまで

ぁЩ芦麑椶慮鮑硬世ら四回目の交差点まで

ァЩ猷麑椶慮鮑硬

ΑЩ猷麑椶慮鮑硬世らゴールまで

というようにコースを分割してロボットを動かす。

 カウンターを使う方法ではカーブ前の交差点、曲がり方の急なカーブが曲がれないのでタイマーを使うことで交差点、急カーブを克服した。

 急カーブのところでは光センサーによってモーターを早く動かし、ロボットがしっかりと曲がりきれるようにした。

 交差点の近くではロボットが旋回する速さを遅くして交差点のラインを渡り切るようにした。
急カーブ、緩いカーブ、直線、交差点で時間を区切りコースを攻略した。

*プログラム [#q1452173]



 #define THRESHOLD 42  //しきい値
 #define hp 7            //速さ(速い)
 #define lp 2            //速さ(遅い)
 #define set_power_h SetPower(OUT_AC,hp);   //速い回転
 #define set_power_l SetPower(OUT_AC,lp);   //遅い回転
 #define g_f set_power_h;OnFwd(OUT_AC);     //前進
 #define t_l0 set_power_l;OnFwd(OUT_C);Off(OUT_A);     //左折
 #define t_l1 set_power_l;OnFwd(OUT_C);OnRev(OUT_A);   //左旋回
 #define t_r0 set_power_l;OnFwd(OUT_A);Off(OUT_C);     //右折
 #define t_r1 set_power_l;OnFwd(OUT_A);OnRev(OUT_C);   //右旋回 
 #define t_r4 set_power_l;OnRev(OUT_C);Off(OUT_C);     //右タイヤを戻す
 #define time0 700   //⓪を進む時間
 #define time1 200   //,鮨覆犹間
 #define time2 650   //△鮨覆犹間
 #define time3 450   //を進む時間
 #define time4 500   //い鮨覆犹間
 #define time5 400   //イ鮨覆犹間
 #define time6 900   //Δ鮨覆犹間

ここまでで定義を定めた。

ここからロボットに動きを命令する。

 task main()
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);  //センサー2をセットした
  ClearTimer(0);                     // タイマーをリセットした
 

ここからコースの⓪の部分を命令する。
 PlaySound(SOUND_CLICK);                  //まず音を鳴らして⓪の動作になったことを確認
   while(FastTimer(0)<=time0){
       if (SENSOR_2<THRESHOLD-2){         //黒だったら右旋回
         t_r1; 
       }else if(SENSOR_2<THRESHOLD+1){    //少し黒かったら右折
         t_r0;
       }else if(SENSOR_2<THRESHOLD+7){    //線上なら直進
         g_f;
       }else if(SENSOR_2<THRESHOLD+10){   //少し白かったら左折
         t_l0;
       }else{
         t_l1;                            //他は左旋回
       }      
 }
       
ここからコースの,良分を命令する。
 PlaySound(SOUND_CLICK);          //,瞭虻遒砲覆辰燭海箸魍稜
    ClearTimer(0);                        //
       while(FastTimer(0)<=time1){
         if(SENSOR_2<THRESHOLD+1){        //少し黒かったら右折
           t_r0; 
         }else if(SENSOR_2<THRESHOLD+7){  //線上なら直進
           g_f;
         }else {                          //他は左折
           t_l0;      
         }                              
  }
       
ここからコースの△良分を命令する。

右タイヤを戻すことで急なカーブも曲がれるようにした。
 PlaySound(SOUND_CLICK);         //△瞭虻遒砲覆辰燭海箸魍稜
   ClearTimer(0);                        //タイマーをリセット
     while(FastTimer(0)<=time2){    
        if (SENSOR_2<THRESHOLD-2){       //黒かったら右タイヤを戻す
           t_r4;
        }else if(SENSOR_2<THRESHOLD+1){  //少し黒かったら右折
           t_r1;
        }else if(SENSOR_2<THRESHOLD+7){  //線上だったら直進
           g_f;
        }else if(SENSOR_2<THRESHOLD+10){ //少し白かったら左折
           t_l0;
        }else{                           //他は左旋回
           t_l1;
        }
  }

ここからコースのの部分を命令する。
  PlaySound(SOUND_CLICK);                //の動作になったことを確認
    ClearTimer(0);                       //タイマーをリセット
      while(FastTimer(0)<=time3){     
        if(SENSOR_2<THRESHOLD+1){        //少し黒かったら右折
         t_r0;
        }else if(SENSOR_2<THRESHOLD+7){  //線上だったら直進
         g_f;
        }else {                          //他は左折
         t_l0;
        }                       
  }
     
ここからコースのい良分を命令する。
  PlaySound(SOUND_CLICK);                //い瞭虻遒砲覆辰燭海箸魍稜
    ClearTimer(0);                       //タイマーをリセット
      while(FastTimer(0)<=time4){         
        if (SENSOR_2<THRESHOLD-2){       //黒かったら右旋回
          t_r1;         
        }else if(SENSOR_2<THRESHOLD+1){  //少し黒かったら右折
          t_r0;
        }else if(SENSOR_2<THRESHOLD+7){  //線上なら直進
               g_f;
        }else if(SENSOR_2<THRESHOLD+13){ //少し白かったら左折
          t_l0;
        }else{                           //他は左旋回
          t_l1;
        }                 
 }

ここからコースのイ良分を命令する。

カーブの直後の交差点なので交差点を渡らずに右折しやすい。

よって、右折をしないプログラムにして交差点を確実に渡れるようにした。
  PlaySound(SOUND_CLICK);                 //イ瞭虻遒砲覆辰燭海箸魍稜
    ClearTimer(0);                        //タイマーをリセット
      while(FastTimer(0)<=time5){        
       if(SENSOR_2<THRESHOLD+7){          //線上なら直進
         g_f;
       }else {                            //他は左折
         t_l0;            
       }                                
  }

ここからコースのΔ良分を命令する。
 PlaySound(SOUND_CLICK);                  //Δ瞭虻遒砲覆辰燭海箸魍稜
   ClearTimer(0);                         //タイマーをリセット
      while(FastTimer(0)<=time6){
       if (SENSOR_2<THRESHOLD-2){         //黒かったら右旋回
         t_r1;             
       }else if(SENSOR_2<THRESHOLD+1){    //少し黒かったら右折
         t_r0;
       }else if(SENSOR_2<THRESHOLD+7){    //線上なら直進
         g_f; 
       }else if(SENSOR_2<THRESHOLD+13){   //少し白かったら左折
         t_l0;
       }else{                             //他は左折
         t_l1;
       }          
  }


     Off(OUT_AC);                         //すべての動作の終了
  }


*まとめ [#i7c51d26]

 タイマーでプログラムをすることで交差点や急カーブの判断を書く必要がなかった。

しかし、電池の減り具合や到達時間の変化により、タイマーの値を細かく測定しなければならなくなった。


*考察 [#r0a49690]

交差点のたびにプログラムを変えていたのでプログラムが大きくなってしまった。対策として、サブルーチンなどを使って小さいプログラムを作ることが挙げられる。

 交差点の判断をタイマーで行ったので、交差点をロボット自身が判断してどんなコースでもロボットが交差点を渡れるプログラムが必要。対策として、タイマーとカウンターを組み合わせればそのような動きを実現可能と考えられる。

 ロボットの車体で光センサーと前輪が近づけばセンサーと車体とのギャップが少なくなるが、
今回はロボットのボディの変更がうまくいかなかった。次の課題では課題にあった車体づくりにも力を入れたい。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS