[[2017b/Member]]
#define rightSENKAI OnFwd(OUT_A);OnRev(OUT_C);
#define rightMAGARU OnFwd(OUT_A);Off(OUT_C);
#define leftSENKAI OnFwd(OUT_C);OnRev(OUT_A);
#define leftMAGARU OnFwd(OUT_C);Off(OUT_A);
#define middle 41
#define carb 41
#define ch OnFwd(OUT_B);Wait(10);Off(OUT_B);
#define re OnRev(OUT_B);Wait(5);Off(OUT_B);
#define go(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);
#define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);
#define TURN_RIGHT OnFwd(OUT_A);OnRev(OUT_C);until(SENSOR_2<=40);Off(OUT_AC);
#define TURN_LEFT OnFwd(OUT_C);OnRev(OUT_A);until(SENSOR_2>=50);Off(OUT_AC);
#define cross_stop Off(OUT_AC);Wait(100);
#contents
*今回の課題 [#d8f15565]
**コース [#ib97dc57]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
#ref(2017b/Mission2/2017b-mission2.png,50%,課題2のコース)

sub r()
{
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 ClearTimer(0);
 while(FastTimer(0)<=21)
**ミッション [#i6f1e63b]

次のコースで黒い線に沿って動き、紙コップを移動させるロボットを製作せよ。
自分は以下の第1コースを担当した。 
+Aをスタート
+Bを直進
+Cを右折
+Fを直進
+Rを左折(一時停止)
+Pを直進
+X地点の紙コップを取得してコースに戻る
+Qを左折
+Sを直進(一時停止)
+Y地点に紙コップを置いてコースに戻る
+Sを直進(一時停止)
+Fを左折(一時停止)
+Cを右折(一時停止)
+D地点へ(ゴール)

* ロボット本体の説明 [#feff4d29]

コップをつかむアームを図のように作った。片方のアームにギアをつけてモーターにつなぐことで動かし、挟むようにした。
#ref(im2.jpg);
コップをつかむアーム部分を車体の前に出し、取りやすくした。
#ref(im1.jpg);
トレースのための光センサは車体とアームの間につけ、小回りが利くようにした。
#ref(im3.jpg);
トレースが安定する光センサの位置を探し、図の高さにつけることにした。
#ref(im4.jpg);










*プログラム[#sb3f8163]
   #define rightSENKAI OnFwd(OUT_A);OnRev(OUT_C);//右旋回
   #define rightMAGARU OnFwd(OUT_A);Off(OUT_C);//右折
   #define leftSENKAI OnFwd(OUT_C);OnRev(OUT_A);//左旋回
   #define leftMAGARU OnFwd(OUT_C);Off(OUT_A);//左折
   #define middle 41 //閾値                                
   #define ch OnFwd(OUT_B);Wait(10);Off(OUT_B);//コップをつかむ
   #define re OnRev(OUT_B);Wait(5);Off(OUT_B);//コップを放す
   #define go(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//t秒前進
   #define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);//t秒後退
   #define cross_stop Off(OUT_AC);Wait(100);//交差点停止
基本的なラインの右側トレースを以下のように定義した。また、左右を逆にしたものをl()として左側トレースも定義した。また、連続して黒線上の右旋回の経過時間を測定し、0.2以上になった時には交差点と判断させた。
  sub r()
 {
  if(SENSOR_2>middle+5)    
    SetSensor(SENSOR_2,SENSOR_LIGHT); //光センサを端子2にセット
    ClearTimer(0);       //タイマーリセット
    while(FastTimer(0)<=20)  //0.2秒以内黒の線を連続して感知した場合ループ、それ以上は次の動作へ
   {
    rightSENKAI
    ClearTimer(0);
   }
  else if(SENSOR_2>middle+3)    
      if(SENSOR_2>middle+5)      //閾値より5大きい時左旋回 
   {
    rightMAGARU
    ClearTimer(0);
      leftSENKAI
      ClearTimer(0);              
   }
  else if(SENSOR_2>middle)   
     else if(SENSOR_2>middle+3)    //閾値より3大きい時左折
   {
    OnFwd(OUT_AC);
    ClearTimer(0);
      leftMAGARU
      ClearTimer(0);       
   }
  else if(SENSOR_2>middle-3)    
     else if(SENSOR_2>middle)    //閾値の時直進
   {
    leftMAGARU
    ClearTimer(0);
      OnFwd(OUT_AC);
      ClearTimer(0);       
   }
  else    
     else if(SENSOR_2>middle-3)    //閾値より3小さい時右折
   {
    leftSENKAI
    }
  }
Off(OUT_AC);
}
sub l()
{
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 ClearTimer(0);
 while(FastTimer(0)<=21)
 {
  if(SENSOR_2>carb+5)    
   {
    leftSENKAI
    ClearTimer(0);
     rightMAGARU
     ClearTimer(0);      
   }
  else if(SENSOR_2>carb+3)    
     else    
   {
    leftMAGARU
    ClearTimer(0);
   }
  else if(SENSOR_2>carb)   
   {
    OnFwd(OUT_AC);
    ClearTimer(0);
   }
  else if(SENSOR_2>carb-3)    
   {
    rightMAGARU
    ClearTimer(0);
   }
  else    
   {
    rightSENKAI
    }
     rightSENKAI         //上記の条件以外の時右旋回
    }              //この時タイマーをリセットしていないので右旋回の時間が0.2以上で交差点と判断。
  }
Off(OUT_AC);
}
     Off(OUT_AC);         
 }



task main ()
{r();
 cross_stop;//B
 go(35);
 r();
 cross_stop;//C
 leftSENKAI;
 task main ()
 {r();     //AB間
 cross_stop;  //一時停止
 go(35);    //位置合わせ
 r();      //BC間
 cross_stop;  //一時停止
 leftSENKAI;  //位置合わせ
 Wait(30); 
 r();      //CF間
 cross_stop;  //一時停止
 go(35);    //位置合わせ
 r();      //FE間
 cross_stop;  //一時停止
 go(25);    //ラインの左側へ移動
 l();     //ER間
 cross_stop;  //一時停止
 rightSENKAI; //位置合わせ
 Wait(30);
 r();
 cross_stop;//F
 go(35);
 r();
 cross_stop;//2cb
 go(25);
 l();
 cross_stop;//R
 rightSENKAI;
 Wait(30);
 l();
 cross_stop;//P
 ch;
 go(25);
 l();//Q
 go(20);
 r();
 cross_stop;//S
 go(30);
 r();
 cross_stop;//S2
 go(50);
 rightSENKAI;
 l();      //RP間
 cross_stop;  //一時停止
 ch;     //コップをつかむ
 go(25);   //位置合わせ
 l();         //PQ間
 go(20);      //ラインの右側へ移動
 r();        //QS間
 cross_stop;  //一時停止
 go(30);      //位置合わせ
 r();         //円Yの外周
 cross_stop;  //一時停止
 go(50);      //位置合わせ
 leftSENKAI;  //ラインの左側へ移動
 Wait(65);
 l();
 cross_stop;//F
 ch;
 rightSENKAI;
 l();       //SF間
 cross_stop;  //一時停止
 ch;          //コップの持ち直し
 leftSENKAI;  //コップを円に入れる
 Wait(160);
 re;
 back(45);
 leftSENKAI;
 re;      //コップを放す
 back(45);   //後退
 rightSENKAI; //元に戻す
 Wait(160);
 r();
 cross_stop;//C
 leftSENKAI;
 r();     //FC間
 cross_stop;  //一時停止
 rightSENKAI; //Dに入るため回転
 Wait(90);
 go(90);
 go(90);   //ゴール
 
}
 }

*反省と結果 [#ic41d110]
ライントレースにおいて重要な役割を果たす光センサーの位置調整に苦労したが、本番ではうまくいった。アームの力が少し弱かったため何度かつかむプログラムを入れたが途中で放してしまって残念だった。ミッションを成功させることができてよかった。


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