#contents
*今回の課題 [#d8f15565]
**コース [#ib97dc57]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
#ref(2017b/Mission2/2017b-mission2.png,50%,課題2のコース)

**ミッション [#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()として左側トレースも定義した。
  sub r()
 {
    SetSensor(SENSOR_2,SENSOR_LIGHT); //光センサを2にセット
    ClearTimer(0);
    while(FastTimer(0)<=20)  //0.2秒より小さければ以下をループ、それ以上で交差点と判断。
   {
      if(SENSOR_2>middle+5)   //閾値より大きい時左旋回 
      if(SENSOR_2>middle+5)      //閾値より大きい時左旋回 
   {
      leftSENKAI
      ClearTimer(0);
   }
     else if(SENSOR_2>middle+3)    
     else if(SENSOR_2>middle+3)    //閾値より少し大きい時左折
   {
      leftMAGARU
      ClearTimer(0);
   }
     else if(SENSOR_2>middle)   
     else if(SENSOR_2>middle)    //閾値の時直進
   {
      OnFwd(OUT_AC);
      ClearTimer(0);
   }
     else if(SENSOR_2>middle-3)    
     else if(SENSOR_2>middle-3)    //閾値より少し小さい時右折
   {
     rightMAGARU
     ClearTimer(0);
   }
     else    
   {
     rightSENKAI
     rightSENKAI         //閾値より小さい時右旋回
    }
  }
     Off(OUT_AC);
     Off(OUT_AC);         //0.2秒以上の時停止
 }



 task main ()
 {r();
 cross_stop;//B
 go(35);
 r();
 cross_stop;//C
 leftSENKAI;
 {r();     //AB間
 cross_stop;  //一時停止
 go(35);    //位置合わせ
 r();      //BC間
 cross_stop;  //一時停止
 leftSENKAI;  //位置合わせ
 Wait(30);
 r();
 cross_stop;//F
 go(35);
 r();
 cross_stop;//2cb
 go(25);
 l();
 cross_stop;//R
 rightSENKAI;
 r();     //CF間
 cross_stop;  //一時停止
 go(35);   //位置合わせ
 r();    //FE間
 cross_stop;//一時停止
 go(25);  //ラインの左側へ移動
 l();     //ER間
 cross_stop;// 一時停止
 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);   //ゴール
 
 }


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