目次
#contents
*課題2 [#gc17f0e3]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットの作成

** コース [#xdefe08a]
#ref(2017b/Mission2/2017b-mission2.png,80%,課題2のコース)

** ミッション [#k5f5fb77]
いずれかのコースで黒い線に沿って動き、紙コップを移動させるロボットの製作

*** 第1コース [#t9b63d30]
+ Aをスタート
+ Bを直進
+ Cを右折
+ Fを直進
+ Rを左折(一時停止)
+ Pを直進
+ X地点の紙コップを取得してコースに戻る
+ Qを左折
+ Sを直進(一時停止)
+ Y地点に紙コップを置いてコースに戻る
+ Sを直進(一時停止)
+ Fを左折(一時停止)
+ Cを右折(一時停止)
+ D地点へ(ゴール)

第1コースを走行するロボットを作成した。

*ロボット [#d61248a3]


*プログラム [#f3415e79]
**定義付け [#g94a355f]
 #define THRESHOLD 46 //閾値
 #define go(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC); //t秒前進
 #define back(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); //t秒後進
 #define roll_left OnFwd(OUT_C);OnRev(OUT_A); //左旋回
 #define turn_left OnRev(OUT_A);Off(OUT_C); //左折
 #define roll_right OnFwd(OUT_A);OnRev(OUT_C); //右旋回
 #define turn_right OnRev(OUT_C);Off(OUT_A); //右折
 #define roll_left2(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t); //t秒左旋回
 #define turn_left2(t) OnRev(OUT_A);Off(OUT_C);Wait(t); //t秒左折
 #define roll_right2(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t); //t秒右旋回
 #define turn_right2(t) OnRev(OUT_C);Off(OUT_A);Wait(t); //t秒右折
 #define roll_left3 OnRev(OUT_A);OnFwd(OUT_C);until(SENSOR_2<=43);Off(OUT_AC); //ラインを見つけるまで左旋回
 #define roll_right3 OnRev(OUT_C);OnFwd(OUT_A);until(SENSOR_2<=43);Off(OUT_AC); //ラインを見つけるまで右旋回
 #define close SetPower(OUT_B,1);OnFwd(OUT_B);Wait(50);Off(OUT_B);//アームを閉じる
 #define open SetPower(OUT_B,1);OnRev(OUT_B);Wait(70);Off(OUT_B);//アームを開ける
 #define cross_stop Off(OUT_AC);Wait(100); //交差点で1秒停止
 #define STEP 2  // 一回の判定で進む時間

あらかじめ右左折やアームの動きを用意した。また、用途に合わせて3種類の右左折を用意した。

**ライントレース [#r9d37718]
 sub LINE_R() //線の右側をトレース
 {
     SetSensor(SENSOR_2,SENSOR_LIGHT); //端子2に光センサーをセット
     ClearTimer(0);
     while(FastTimer(0)<=23) //0.23秒以内の場合はループ
       {
        if (SENSOR_2 > THRESHOLD +5) { //センサーが閾値+5の値を超えたら左旋回
           roll_left;
           ClearTimer(0);
         }else if (SENSOR_2 > THRESHOLD +3){ //センサーが閾値+3の値を超えたら左折
           turn_left;
           ClearTimer(0);
         }else if (SENSOR_2 > THRESHOLD){ //センサーが閾値を超えたら直進
           OnRev(OUT_AC);
           ClearTimer(0);
         }else if (SENSOR_2 > THRESHOLD -3){ //センサーが閾値−3の値を超えたら右折
           turn_right;
           ClearTimer(0);
         }else{ //上記のどの条件にも当てはまらないときに右旋回
           roll_right;
          }
        Wait(STEP);
       }
     Off(OUT_AC);
 }
 
 sub LINE_L() //線の左側をトレース
 {
     SetSensor(SENSOR_2,SENSOR_LIGHT); //端子2に光センサーをセット
     ClearTimer(0);
     while(FastTimer(0)<=21) //0.21秒以内の場合はループ
       {
        if (SENSOR_2 > THRESHOLD +5) { //センサーが閾値+5の値を超えたら右旋回
           roll_right;
           ClearTimer(0);
         }else if (SENSOR_2 > THRESHOLD +3){ //センサーが閾値+3の値を超えたら右折
           turn_right;
           ClearTimer(0);
         }else if (SENSOR_2 > THRESHOLD){ //センサーが閾値を超えたら直進
           OnRev(OUT_AC);
           ClearTimer(0);
         }else if (SENSOR_2 > THRESHOLD -3){ //センサーが閾値−3の値を超えたら左折
           turn_left;
           ClearTimer(0);
         }else{ //上記のどの条件にも当てはまらないときに右旋回
           roll_left;
          }
        Wait(STEP);
 
       }
     Off(OUT_AC);
 }
 
**コップをつかむ・はなす [#c013ec9a]
 sub CATCH() //コップをつかむ
 {
     roll_right2(70); //進行方向調整
     go(30); //コップに近づく
     close; //アームを閉じる
     roll_left2(80); //進行方向調整
     go(30); //ラインに近づく
     roll_right3; //ラインを見つけるまで右旋回
 }
 
 sub RELEASE() //コップをはなす
 { 
     roll_right2(90); //進行方向調整
     open; //アームを開く
     turn_left2(30); //進行方向調整
     back(100); //コップから離れる
     turn_right2(120); //ラインに近づく
 }
** [#rec2eafb]
 task main()
 {
     LINE_R();//A〜B
     go(20);
     roll_left3;
     LINE_R();//B〜C
     roll_right2(20);
     LINE_R();//C〜F
     go(25);
     roll_left3;
     LINE_R();//F〜第2ヘアピンカーブ
     go(25);
     LINE_L();//第2ヘアピンカーブ〜R
     cross_stop;//R
     roll_left2(20);
     LINE_L();//R〜P
     CATCH();
     LINE_L();//P〜Q
     go(30);
     LINE_R();//Q〜S
     cross_stop;//S
     go(15);
     LINE_R();//S〜S
     cross_stop;//S
     go(20);
     roll_left3;
     LINE_R();//S〜F
     cross_stop;//F
     RELEASE();
     LINE_R();
     cross_stop;//C
     roll_right2(50);//Dへ
     go(120);
 }

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