2017b/Member

課題

下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。

コース

2017b-mission2.png

ミッション

次のコースで黒い線に沿って動き、紙コップを移動させるロボットを製作せよ。(自分は第2コース)

 

第2コース

  1. Dをスタート
  2. Cを直進
  3. Bを左折
  4. Pを左折(一時停止)
  5. Qを直進
  6. Rを左折
  7. Fを左折
  8. Sを直進(一時停止)
  9. Y地点の紙コップを取得してコースに戻る
  10. Sを直進(一時停止)
  11. Qを左折(一時停止)
  12. Rを直進
  13. X地点に紙コップを置いてコースに戻る
  14. Pを左折
  15. Bを左折(一時停止)
  16. A地点へ(ゴール)

機体説明

Image_72337c2.jpg

向かって右にある黄色の部分を動かすことで紙コップを挟み込み移動させるようにした。

Image_36990f0.jpg

センサーの位置でトレースが変わるので一番安定性のある所を探した。

Image_f47d051.jpg

紙コップをつかむためのモーターを置くところがなかったので前に突き出すことにした。

Image_6373412.jpg

最初は2つの黄色のパーツを動かそうとしたが複雑になるので片方だけにした。歯車がない方は動かないように固定した。

プログラム

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

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

task main()
{
 line();                          //D〜C
 stop;
 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
 stop;
 PlaySound(SOUND_CLICK);
 TURN_LEFT(30);                               //角度調整
 go(20);                                      //角度調整
 line();                                      //P〜Q
 go(30);                                      //交差点判断したQを突き抜ける
 TURN_RIGHT;                                  //角度調整
 PlaySound(SOUND_CLICK);
 line();                                      //Q〜R
 PlaySound(SOUND_CLICK);
 line();                                      //R〜E
 PlaySound(SOUND_CLICK);
 s();                                         //E〜Fの最後のカーブを曲がったぐらい
 line();                                      //s()の時間が経ってからFまで
 PlaySound(SOUND_CLICK);
 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右側の円
 PlaySound(SOUND_CLICK);
 go(20);                                      //交差点Sを直進
 line();                                      //S〜Q
 PlaySound(SOUND_CLICK);
 stop;
 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
 PlaySound(SOUND_CLICK);
 line();                                      //P〜B
 stop;
 PlaySound(SOUND_CLICK);
 line();                                      //B〜A
 go(50);                                      //GOAL
}

感想・反省

3回に1回しか成功しないというかなしいものができあがってしまった。確実に成功させるには角度調整をもっとたくさん入れればよかったのだろうか。コメントアウトを知ったことで、できたところはコメントアウトをすることで作業効率がかなり上がった。


添付ファイル: fileImage_f47d051.jpg 67件 [詳細] fileImage_6373412.jpg 48件 [詳細] fileImage_72337c2.jpg 54件 [詳細] fileImage_36990f0.jpg 58件 [詳細] file2017b-mission2.png 57件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-01-17 (水) 16:58:51