[[2019a/Member]]
#contents
*課題について[#yff595ab]
**コース [#w093d212]
下の図のようなコースを各チームで作成し、「ミッション」を遂行せよ。
#ref(./IMG_5614.PNG,50%)

**ミッション [#ocb1991b]
A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する 

A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール)

*ロボットについて [#t7f18d81]

#ref(./IMG_5626.JPG,25%) 

車体を比較的コンパクトになるようにした。
#ref(./IMG_5627.JPG,50%)
ボールをキャッチするためにアームを取り付け、アームの反対側にボールストッパーを取り付けた。

*プログラムについて [#ob2dffc3]

**#defineの設定  [#d09d188f]
 #define Turn_RightL OnFwd(OUT_A); OnRev(OUT_C);
 #define Turn_LeftL OnFwd(OUT_C); OnRev(OUT_A);
 #define Go OnFwd(OUT_AC);
 #define Turn_RightS OnFwd(OUT_A); Off(OUT_C);
 #define Turn_LeftS OnFwd(OUT_C); Off(OUT_A);
 #define Catch  OnRev(OUT_B);          Wait(30);Off(OUT_B);OnFwd(OUT_AC);Wait(50);Off(OUT_AC);OnFwd(OUT_B);Wait(30);Off(OUT_B);
 #define Shoot OnRev(OUT_B);Wait(30);Off(OUT_B);OnFwd(OUT_AC);Wait(30);Off(OUT_AC);
まず上から右旋回、左旋回、直進、右折、左折、ボールを掴む、ボールを放すといった動作を定義した。

**サブルーチンの設定 [#hf2e683e]
 sub follow_lineL()
   {
      SetSensor(SENSOR_2,SENSOR_LIGHT);
      ClearTimer(0);
      while(FastTimer(0)<27){
           if (SENSOR_2 > 49){
               Turn_RightL; ClearTimer(0);
           } else if (SENSOR_2 > 45){
               Turn_RightS; ClearTimer(0);
           } else if (SENSOR_2 >42){
               Go; ClearTimer(0);
           } else if (SENSOR_2 > 37){
               Turn_LeftS; ClearTimer(0);
           } else {
               Turn_LeftL
            } 
     }
     Off(OUT_AC);
     Wait(100);
     ClearTimer(0);
   }
    
 sub follow_lineS()
   {
      SetSensor(SENSOR_2,SENSOR_LIGHT);
      ClearTimer(0);
      while(FastTimer(0)<20){
           if (SENSOR_2 > 49){
               Turn_RightL; ClearTimer(0);
           } else if (SENSOR_2 > 45){
               Turn_RightS; ClearTimer(0);
           } else if (SENSOR_2 >42){
               Go; ClearTimer(0);
           } else if (SENSOR_2 > 37){
               Turn_LeftS; ClearTimer(0);
           } else {
               Turn_LeftL
            } 
     }
     Off(OUT_AC);
     Wait(100);
     ClearTimer(0);
   }
 
 sub follow_lineT()
   {
      SetSensor(SENSOR_2,SENSOR_LIGHT);
      ClearTimer(0);
      while(FastTimer(0)<18){
           if (SENSOR_2 > 49){
               Turn_RightL; ClearTimer(0);
           } else if (SENSOR_2 > 45){
               Turn_RightS; ClearTimer(0);
           } else if (SENSOR_2 >42){
               Go; ClearTimer(0);
           } else if (SENSOR_2 > 37){
               Turn_LeftS; ClearTimer(0);
           } else {
               Turn_LeftL
            } 
     }
     Off(OUT_AC);
     Wait(100);
     ClearTimer(0);
   }
ひとつのサブルーチンでは全ての曲がり角に対応できないので、秒数を変えた3つのサブルーチンを使って使い分けるようにした

 sub cross_lineL()
  {
   OnRev(OUT_C);
   Off(OUT_A);
   Wait(50);
   OnFwd(OUT_AC);
   Wait(70);
   Off(OUT_AC);
  }
曲がり角で止まったときに直進するためのサブルーチンを上のようにした。

 sub cross_lineS()
  {
   OnRev(OUT_C);
   Off(OUT_A);
   Wait(90);
   OnFwd(OUT_AC);
   Wait(40);
   Off(OUT_AC);
  }
Hの地点で上のサブルーチンではうまく行かないことが多かったので少し変えたサブルーチンを作った。

 sub cross_lineT()
  {
    OnFwd(OUT_C);
   Off(OUT_A);
   Wait(120);
   Off(OUT_AC);
 }
Jの地点で曲がるためのサブルーチンを作った。  

**全体のプログラム [#i1b8d558]
 task main()
  { 
     follow_lineL();
M→Kまで
     cross_lineL();
Kを直進
     Catch;
ボールを掴む
     OnRev(OUT_AC);
     Wait(100);
     Off(OUT_AC);
     OnFwd(OUT_C);
     OnRev(OUT_A);
     Wait(50);
     Off(OUT_AC);
Kまで戻って旋回
     OnFwd(OUT_AC);
     Wait(30);
     Off(OUT_AC);
     follow_lineS();
直進してライントレースに戻る
     cross_lineT();
     follow_lineT();
J→Iまで
     cross_lineL();
     follow_lineS();
I→Hまで
     cross_lineS();
     follow_lineL();
H→Fまで
     OnFwd(OUT_C);
     OnRev(OUT_A);
     Wait(80);
     Off(OUT_AC);
Fで直角に曲がる
     follow_lineL();
F→Eまで
     OnFwd(OUT_C);
     OnRev(OUT_A);
     Wait(80);
     Off(OUT_AC);
Eで直角に曲がる
     follow_lineS();
E→Dまで
     OnFwd(OUT_AC);
     Wait(30);
     Off(OUT_AC);
Dを直進
     follow_lineL();
D→Cまで
     OnFwd(OUT_AC);
     Wait(30);
     Off(OUT_AC);
Cを直進
     follow_lineL();
C→Bまで
     cross_lineL();
Bで向きを直す
     Shoot;
   }
ボールをシュート

 

*まとめ [#v7159aa7]
一通り成功することはできたが、K地点で止まることとボールを掴むところは何回かに一回成功するという感じだったので完成したとは言いがたかった。FastTimarをうまく使いこなせばうまく行けたのかもしれない。しかし、他の部分はサブルーチンを使い分けることで比較的スムーズにいったのでよかった。

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