[[2017b/Member]]
#contents
*課題 [#r5d17a4d]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
**コース [#cf37af2e]
#ref(2017b-mission2.png)
**ミッション [#f647d2cb]
次のコースで黒い線に沿って動き、紙コップを移動させるロボットを製作せよ。(自分は第2コース)
#br
第2コース
+Dをスタート
+Cを直進
+Bを左折
+Pを左折(一時停止)
+Qを直進
+Rを左折
+Fを左折
+Sを直進(一時停止)
+Y地点の紙コップを取得してコースに戻る
+Sを直進(一時停止)
+Qを左折(一時停止)
+Rを直進
+X地点に紙コップを置いてコースに戻る
+Pを左折
+Bを左折(一時停止)
+A地点へ(ゴール)

*機体説明 [#i0bb4723]
#ref(Image_72337c2.jpg)
向かって右にある黄色の部分を動かすことで紙コップを挟み込み移動させるようにした。
#ref(Image_36990f0.jpg)
センサーの位置でトレースが変わるので一番安定性のある所を探した。
#ref(Image_f47d051.jpg)
紙コップをつかむためのモーターを置くところがなかったので前に突き出すことにした。
#ref(Image_6373412.jpg)
最初は2つの黄色のパーツを動かそうとしたが複雑になるので片方だけにした。歯車がない方は動かないように固定した。


*プログラム [#hc8a0a55]
 #define right_dai OnFwd(OUT_C);OnRev(OUT_A);                                 //右に小回り
 #define right_syou OnFwd(OUT_C);Off(OUT_A);                                  //右に大回り
 #define left_dai OnFwd(OUT_A);OnRev(OUT_C);                                  //左に小回り
 #define left_syou OnFwd(OUT_A);Off(OUT_C);                                   //左に大回り
 #define middle 40                                                            //閾値
 #define go(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);                             //t秒間前進
 #define TURN_RIGHT OnFwd(OUT_C);OnRev(OUT_A);until(SENSOR_2<=40);Off(OUT_AC);//ラインを見つけるまで右に小回り
 #define TURN__RIGHT(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);                    //t秒間右に小回り
 #define TURN_LEFT(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);                      //t秒間左に小回り
 #define stop Off(OUT_AC);Wait(150);                                          //停止
 #define back  OnRev(OUT_AC);Wait(60);                                        //バック
 #define tukamu OnFwd(OUT_B);Wait(10);Off(OUT_B);                             //アームを閉じる
 #define hanasu OnRev(OUT_B);Wait(5);Off(OUT_B);                              //アームを開く

 sub line()                                                                   //EF間以外
 sub line()                                    //EF間以外
 {
 SetSensor(SENSOR_2,SENSOR_LIGHT);                                            //センサーを端子2に接続
 SetSensor(SENSOR_2,SENSOR_LIGHT);             //センサーを端子2に接続
 ClearTimer(0);
 while(FastTimer(0)<20){                                                      //0.2秒未満ならループ、超えると交差点判定
  if(SENSOR_2>middle+5)                                                     //閾値+5より大きいとき右小回り
 while(FastTimer(0)<20){                       //0.2秒未満ならループ、超えると交差点判定
  if(SENSOR_2>middle+5)                      //閾値+5より大きいとき右小回り
   {
    right_dai
    ClearTimer(0);                                                        //タイマーリセット
    ClearTimer(0);                         //タイマーリセット
   }
  else if(SENSOR_2>middle+3)                                                 //閾値+3より大きく+5未満のとき右大回り
  else if(SENSOR_2>middle+3)                  //閾値+3より大きく+5未満のとき右大回り
   {
    right_syou
    ClearTimer(0);
   }
  else if(SENSOR_2>middle)                                                  //閾値のとき前進
  else if(SENSOR_2>middle)                   //閾値のとき前進
   {
    OnFwd(OUT_AC);
    ClearTimer(0);
   }
  else if(SENSOR_2>middle-3)                                                //閾値-3より大きく±0までのとき左大回り
  else if(SENSOR_2>middle-3)                 //閾値-3より大きく±0までのとき左大回り
   {
    left_syou
    ClearTimer(0);
   }
  else                                                                   //閾値が-3以下のとき左小回り
  else                                    //閾値が-3以下のとき左小回り
   {
    left_dai;                                                              //ここでタイマーをリセットしていないので左小回りの時間で交差点を判断する
    left_dai;                               //ここでタイマーをリセットしていないので左小回りの時間で交差点を判断する
    }
  }
   Off(OUT_AC);
 }

 sub s()                                                                    //EF間
 sub s()                                     //EF間
 {
  SetSensor(SENSOR_1, SENSOR_TOUCH);
  ClearTimer(0);
  while(FastTimer(0)<1500){                                                 //15秒間実行する
  if(SENSOR_2>middle+5)                                                   //閾値+5より大きいとき右小回り    
  while(FastTimer(0)<1500){                  //15秒間実行する
  if(SENSOR_2>middle+5)                    //閾値+5より大きいとき右小回り    
  {
   right_dai
  }
  else if(SENSOR_2>middle+3)                                                 //閾値+3より大きく+5未満のとき右大回り  
  else if(SENSOR_2>middle+3)                  //閾値+3より大きく+5未満のとき右大回り  
  {
   right_syou
  }
  else if(SENSOR_2>middle)                                                  //閾値のとき前進   
  else if(SENSOR_2>middle)                   //閾値のとき前進   
  {
   OnFwd(OUT_AC);
  }
  else if(SENSOR_2>middle-3)                                                 //閾値-3より大きく±0までのとき左大回り    
  else if(SENSOR_2>middle-3)                  //閾値-3より大きく±0までのとき左大回り    
  {
   left_syou          
  }
  else                                                                   //閾値が-3以下のとき左小回り
  else                                    //閾値が-3以下のとき左小回り
  {
   left_dai;
   }
  }
   Off(OUT_AC);
 }

EF間のヘアピンカーブは交差点と認識されてしまうので上のプログラムを作った。

 task main()
 {
  line();                                                          //D〜C
  line();                          //D〜C
  stop;
  PlaySound(SOUND_CLICK);                                                      //音
  go(30);                                                                      //Cの交差点を進行方向に飛び出す     
  TURN_RIGHT;                                                                  //方向調整
  line();                                                                      //C〜B
  PlaySound(SOUND_CLICK);                      //音
  go(30);                                      //Cの交差点を進行方向に飛び出す     
  TURN_RIGHT;                                  //角度調整
  line();                                      //C〜B
  stop;
  PlaySound(SOUND_CLICK);
  go(20);                                                                      //角度調整
  TURN_LEFT(50);                                                               //角度調整
  line();                                                                      //B〜P
  TURN_RIGHT;                                                                  //方向調整
  line();                                                                      //B〜P
  go(20);                                      //角度調整
  TURN_LEFT(50);                               //角度調整
  line();                                      //B〜P
  TURN_RIGHT;                                  //角度調整
  line();                                      //B〜P
  stop;
  PlaySound(SOUND_CLICK);
  TURN_LEFT(30);                                                               //方向調整
  go(20);                                                                      //角度調整
  line();                                                                      //P〜Q
  go(30);                                                                      //交差点判断したQを突き抜ける
  TURN_RIGHT;                                                                  //方向調整
  TURN_LEFT(30);                               //角度調整
  go(20);                                      //角度調整
  line();                                      //P〜Q
  go(30);                                      //交差点判断したQを突き抜ける
  TURN_RIGHT;                                  //角度調整
  PlaySound(SOUND_CLICK);
  line();                                                                      //Q〜R
  line();                                      //Q〜R
  PlaySound(SOUND_CLICK);
  line();                                                                      //R〜E
  line();                                      //R〜E
  PlaySound(SOUND_CLICK);
  s();                                                                         //E〜Fの最後のカーブを曲がったぐらい
  line();                                                                      //s()の時間が経ってからFまで
  s();                                         //E〜Fの最後のカーブを曲がったぐらい
  line();                                      //s()の時間が経ってからFまで
  PlaySound(SOUND_CLICK);
  go(20);                                                                      //角度調整
  TURN_LEFT(70);                                                               //角度調整
  line();                                                                      //F〜S
  go(20);                                      //角度調整
  TURN_LEFT(70);                               //角度調整
  line();                                      //F〜S
  PlaySound(SOUND_CLICK);
  stop;
  TURN__RIGHT(80);                                                             //つかむための位置調整
  go(60);                                                                      //つかむための位置調整2
  tukamu;                                                                      //つかむ
  TURN_LEFT(100);                                                              //方向調整
  go(100);                                                                     //位置調整
  line();                                                                      //S〜S右側の円
  TURN__RIGHT(80);                             //つかむための位置調整
  go(60);                                      //つかむための位置調整2
  tukamu;                                      //つかむ
  TURN_LEFT(100);                              //角度調整
  go(100);                                     //位置調整
  line();                                      //S〜S右側の円
  PlaySound(SOUND_CLICK);
  go(20);                                                                      //交差点Sを直進
  line();                                                                      //S〜Q
  go(20);                                      //交差点Sを直進
  line();                                      //S〜Q
  PlaySound(SOUND_CLICK);
  stop;
  TURN_LEFT(30);                                                               //角度調整
  go(20);                                                                      //角度調整
  line();                                                                      //Q〜R
  TURN_LEFT(30);                               //角度調整
  go(20);                                      //角度調整
  line();                                      //Q〜R
  PlaySound(SOUND_CLICK);
  TURN__RIGHT(150);                                                            //紙コップを離す方向に車体を向ける
  hanasu;                                                                      //紙コップを離す
  back(100);                                                                   //バック
  TURN_LEFT(70);                                                               //方向調整
  go(120);                                                                     //位置調整
  line();                                                                      //R〜P
  TURN__RIGHT(150);                            //紙コップを離す方向に車体を向ける
  hanasu;                                      //紙コップを離す
  back(100);                                   //バック
  TURN_LEFT(70);                               //角度調整
  go(120);                                     //位置調整
  line();                                      //R〜P
  PlaySound(SOUND_CLICK);
  line();                                                                      //P〜B
  line();                                      //P〜B
  stop;
  PlaySound(SOUND_CLICK);
  line();                                                                      //B〜A
  go(50);                                                                      //GOAL
  line();                                      //B〜A
  go(50);                                      //GOAL
 }
*感想・反省 [#b15e76db]
3回に1回しか成功しないというかなしいものができあがってしまった。確実に成功させるには角度調整をもっとたくさん入れればよかったのだろうか。コメントアウトを知ったことで、できたところはコメントアウトをすることで作業効率がかなり上がった。


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