[[2017a/Member]]
*目次 [#w7af98f7]
#contents

*課題 [#a7799950]
 下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
#ref(./2017a-mission2.png,50%,2)
**コース [#pfd9f5c6]
 黒線の幅は20mmでなるべく均等な濃さにすること。なお図の中の寸法の単位はcmで、黒線についてはその真ん中からの距離である。

**ミッション [#w7c81dd9]
 次の経路を黒い線に沿って動くロボットを作成する。

   ○E地点直進コース~
   ・Aスタート~
   ・E直進~
   ・F(SOUND_UP)~
   ・Q一時停止(SOUND_DOWN)&左折~
   ・R直進(SOUND_UP)~
   ・S左折(SOUND_UP)~
   ・G(SOUND_UP)~
   ・H(SOUND_UP)~
   ・T一時停止(SOUND_DOWN)&直進~
   ・T一時停止(SOUND_DOWN)&直進~
   ・R一時停止(SOUND_DOWN)&左折~
   ・S直進(SOUND_UP)~
   ・P左折(SOUND_UP)~
   ・E一時停止(SOUND_DOWN)&左折~
   ・A停止(SOUND_DOWN)~

 ただし、~
  ・なるべく速く正確に動くロボットになるように工夫すること。~
  ・一時停止の交差点および丁字路ではSOUND_DOWNを鳴らした後、1秒間停止すること。~
  ・直角コーナーおよび一時停止が不要は丁字路ではSOUND_UPを鳴らし、停止しないで進むこと。~
  ・ロボットはサイズは、幅15cm長さ18cm以内とする(高さは無制限)。~
  ・交差点、丁字路、直角コーナーについては、差し掛かった時点で判別するものとし、予め設定した走行時間のみで判定したり、走行距離のみで判定してはならない。~

*ロボットの説明[#v7b0127f]

タイヤとセンサーの位置をなるべく近づけるためにコンパクトにした。
#ref(./image4.JPG,50%,2)
二輪にした時に安定性がなくなってしまったので後ろにロボットの動きとは関係のない支えになるようなものをつけた。
#ref(./image3.JPG,50%,2)
センサーの感度を上げるために、極力光センサーを地面に近づけた。

#ref(./image5.JPG,50%,2)
*プログラムの説明 [#t6c5253d]
**ライントレースについて [#oa9cd56e]
私はロボットが黒線の左側をなぞるプログラムを考えた。よってロボットは

  白     :右旋回~
  少し白   :右に曲がる~
  白と黒の中間:直進~
  少し黒   :左に曲がる~
  黒     :左旋回~

といったように動くようにした。

**交差点判断 [#p09615c9]
白と黒の中間色より白が0・17秒以上続く場合に、交差点と判断させるようにした。

**定義付け [#i7bdb5b7]
task mainやサブルーチンで使用するものを以下のように定義した。

int t=0;//t(時間)を0に定義

 #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 go OnFwd(OUT_AC); //直進
 #define WHITE 54 //白
 #define L_WHITE 50 //少し白
 #define middle 44 //白と黒の中間
 #define L_BLACK 41 //少し黒
 #define TMAX 17 //0・17秒
 #define LEFT OnFwd(OUT_C);Off(OUT_A);Wait(t);Off(OUT_C); //交差点で左に曲がる(時間設定可)
 #define go_line OnFwd(OUT_AC);Wait(17); //ラインを超える
 #define go_last OnFwd(OUT_AC); Wait(180); Off(OUT_AC); //ラストの車庫入れ

**サブルーチン [#aed73a3b]
task mainで使用するサブルーチンを以下のようにした。

 sub line1()//ライントレースをして、交差点になったらSOUND_UPをする
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT);//センサー2を光センサーとする
   ClearTimer(0);//時間をクリアー
   while(FastTimer(0) <= TMAX)//時間がTMAX以下の時に以下の動作をする
    {
     if(SENSOR_2 > WHITE)//センサーの位置が白にある時
      {
        rightSENKAI;
      }
     else if(SENSOR_2 > L_WHITE)//センサーの位置が少し白にある時
      {
        rightMAGARU;
      }
     else if(SENSOR_2 > middle)//センサーの位置が白と黒の中間にある時
      {
        go;
      }
     else if(SENSOR_2 > L_BLACK)//センサーの位置が少し黒にあるとき
      {
         leftMAGARU;
       }
     else//センサーの位置が黒にあるとき
      {
         leftSENKAI;
      }
     if(SENSOR_2 > middle)//センサーの位置が黒と白の中間色より白にある時
     {
       ClearTimer(0);//時間をクリアー
     }
   }
   PlaySound(SOUND_UP);//SOUND_UPを鳴らす
 }

 sub line2()//ライントレースをして、交差点になったらSOUND_DOWNをして1秒一時停止する
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   ClearTimer(0);
   while(FastTimer(0) <= TMAX)
    {
     if(SENSOR_2 > WHITE)
      {
        rightSENKAI;
      }
     else if(SENSOR_2 > L_WHITE)
      {
        rightMAGARU;
      }
     else if(SENSOR_2 > middle)
      {
        go;
      }
     else if(SENSOR_2 > L_BLACK)
      {
         leftMAGARU;
       }
     else
      {
         leftSENKAI;
      }
     if(SENSOR_2 > middle)
     {
       ClearTimer(0);
     }
   }
   PlaySound(SOUND_DOWN);//SOUND_DOWNを鳴らす
   Off(OUT_AC);//止まる
   Wait(100);//1秒停止
 }

 sub line3()//ライントレース10秒間する
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   ClearTimer(0);
   while(FastTimer(0) <= 1000)//10秒間以下の動作をする
    {
     if(SENSOR_2 > WHITE)
      {
        rightSENKAI;
      }
     else if(SENSOR_2 > L_WHITE)
      {
        rightMAGARU;
      }
     else if(SENSOR_2 > middle)
      {
        go;
      }
     else if(SENSOR_2 > L_BLACK)
      {
         leftMAGARU;
       }
     else
      {
         leftSENKAI;
      }
     
   }
 }

 sub line4()//ライントレースをして車庫入れをして、最後にSOUND_DOWNをする
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  ClearTimer(0);
  while(FastTimer(0) <= TMAX)
   {
    if(SENSOR_2 > WHITE)
     {
       rightSENKAI;
     }
    else if(SENSOR_2 > L_WHITE)
     {
       rightMAGARU;
     }
    else if(SENSOR_2 > middle)
     {
       go;
     }
    else if(SENSOR_2 > L_BLACK)
     {
        leftMAGARU;
      }
    else
     {
        leftSENKAI;
     }
    if(SENSOR_2 > middle)
    {
      ClearTimer(0);
    }
  }
  go_last;
  PlaySound(SOUND_DOWN);
 }

**task mainのプログラム [#xaa64022]
 task main()
 {//Aスタート
    line1();//A-F間
    t=100; LEFT;
    line2();//F-Q間
    t=70; LEFT;
    line1();//Q-R間
    go_line;
    line1();//R-S間
    t=70; LEFT;
    line1();//S-G間
    t=120; LEFT;
    line3();//G-H途中まで
    line1();//G途中から-H
    t=120; LEFT;
    line2();//H-T
    go_line;
    line2();//T-T
    go_line;
    line2();//T-R
    t=70; LEFT;
    line1();//R-S
    go_line;
    line1();//S-P
    t=70; LEFT;
    line2();/P-E
    t=100; LEFT;
    line4();//E-A
 }

最初からコースやルートが決まっていたためできたプログラムだった。

*感想と反省 [#nf48be9b]
最初、本体を四輪でやろうとしていたため、動きの制御が難しく、急カーブでライントレースをすることができなかった。車輪を小さくして、二輪にしたことで解決することができた。また、はじめは黒と白と中間色の3色で進めようと思っていたがなかなかうまく行かないことがあって、5色展開にした。5色にしたらしたで、場所によったり、光の具合によって数値に差が生じるので、間隔を設定するのが難しかった。センサーを地面に近づけることによって安定させることに成功した。プログラミングについてはコースがはじめから決まっていたためどうにかなったが、思いもよらないところで交差点と判断してしまったり、一回成功しても成功しなかったりで大変だった。数値を細かく設定できるようにしたり、何度も測ったりして、成功させた。反省点としては、時間内に終わらなかったことや、カウントをうまく使用できず、メインプログラムが大きくなってしまったことである。また、左折の時にライントレースが少し雑になってしまったことである。前回とは比べ物にならないくらい大変で、苦労させられた。次回が最後なので、今までのことをうまく使って、いいプログラムを作っていきたいと思う。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS