#author("2020-01-06T14:20:15+09:00","minami","minami")
#contents
*課題2 [#j9c6ac10]
#ref(./S__17530895.jpg,600x400,コース);
1. A地点から出発~
2. B~
3. C (直進)~
4. D (一時停止の後、直進)~
5. E, F 通過~
6. G (一時停止の後、左折)~
7. H (一時停止の後、左折)~
8. I (ボール or キューボイドをつかんでUターン)~
9. H(直進)~
10.J (一時停止)~
11.A地点に入る(ゴール)~

*ロボットの説明 [#o297fb89]
#ref(./S__17530898.jpg,500x300,センサー);
光センサーはできるだけ地面に近づけ、周りの環境の影響を受けにくいように工夫した。~
超音波センサーは上から地面の方向につけた。~
初めは、前向きにつけていたがそれだと上手くボールを見つけることが出来なかった。~
*プログラミングの説明 [#nab36970]

**閾値と進行方向の設定 [#a65a5ec6]
 #define average 50                                         //基準の値
 #define go1 OnFwd(OUT_B,30);OnFwd(OUT_C,-20);              //go1の方向に進む(図参照)
 #define go2 OnFwd(OUT_B,20);OnFwd(OUT_C,-10);              //go2の方向に進む(図参照)
 #define go3 OnFwd(OUT_BC,30);                              //go3の方向に進む(図参照)
 #define go4 OnFwd(OUT_B,-10);OnFwd(OUT_C,30);              //go4の方向に進む(図参照)
 #define go5 OnFwd(OUT_B,-20);OnFwd(OUT_C,30);              //go5の方向に進む(図参照)
基準の値との差で進行方向を考えるプログラムを作ったので、他のコースでする場合でも基準の値を変えるだけでそれなりにライントトレースすることが出来る。

**右左折と直進の設定 [#ga091e3b]
左折~
当初、変数を用いなかったが左折する場面が数回ありそれぞれで微調整出来るように変数を用いた。
 #define left(s,t) OnFwd(OUT_B,s);Wait(t);Off(OUT_B);                                 //左折                               
右折も作ったが今回使うことはなかった。
 #define right(s,t) OnFwd(OUT_C,s);Wait(t);Off(OUT_C);                                //右折
直進~
左折と同様の理由で変数を用いた。
 #define straight(s_b,s_c,t) OnFwd(OUT_B,s_b);OnFwd(OUT_C,s_c);Wait(t);Off(OUT_BC);   //直進

直進プログラムの変数を変えることで右左折することが出来るが、メインプログラムを見たとき一目で分かりやすいようにあえて右左折それぞれ分けてみた
。
**Uターンとボールをとる動作の設定 [#d3e07315]
 #define uturn OnFwd(OUT_B,-75);OnFwd(OUT_C,70);Wait(700);Off(OUT_BC);      //Uターン
 #define ball OnFwd(OUT_A,-30);Wait(300);Off(OUT_A);                        //ボール

この2つを用いてロボットを動かすと、ボールをとりUターンすることが出来た。


**ライントレース [#q63fb666]
 sub LeftSide(int Stop_time)
 {
     long tL = CurrentTick();
     while (CurrentTick() -tL < Stop_time{
         if (SENSOR_1 < average-11){
             go1;
         }else if (SENSOR_1 < average-7){
             go2;
             tL = CurrentTick();
         }else if (SENSOR_1 < average+7){
             go3;
             tL = CurrentTick();
         }else if (SENSOR_1 < average+11){
             go4;
             tL = CurrentTick();
         }else{
             go5;
             tL = CurrentTick();
         }
     }
     Off(OUT_BC);
 }

*まとめ [#y99ee845]

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