*課題2 [#d1ba60d2]
#ref(./2019a-mission2.png,50%,コース)
A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。

A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)

私は上のコースを選んだ。
*プログラムについて [#o3817c79]
 #define gray 41  //灰色の値
 #define turn_rightL OnFwd(OUT_A); OnRev(OUT_C);  //右旋回
 #define turn_leftL OnFwd(OUT_C); OnRev(OUT_A);  //左旋回
 #define go OnFwd(OUT_AC);  //直進
 #define turn_rightS OnFwd(OUT_A); Off(OUT_C);  //右折
 #define turn_leftS OnFwd(OUT_C); Off(OUT_A);  //左折
動きの定義の部分。明るさは中間値を決めてそれに足し引きをしていく。
 sub follow_line()
  {
     SetSensor(SENSOR_2,SENSOR_LIGHT);
     ClearTimer(0);
     while(FastTimer(0)<24){               //時間が24以内の時にループする
         if (SENSOR_2 > gray +5){     //色が白の時右旋回
             turn_rightL; ClearTimer(0);
         } else if (SENSOR_2 > gray +3){   //白灰の時右折
             turn_rightS; ClearTimer(0);
         } else if (SENSOR_2 > gray){   //灰色の時直進
             go; ClearTimer(0);
         } else if (SENSOR_2 > gray -2){   //黒灰の時左折
             turn_leftS; ClearTimer(0);
         } else {
             turn_leftL          //黒の時左旋回をして、ループを抜ける
          }
     }
     Off(OUT_AC);
     Wait(50);
  }
一番多用するライントレースのサブルーチン。
 sub follow_lineB()
  {
     SetSensor(SENSOR_2,SENSOR_LIGHT);
     ClearTimer(0);
     while(FastTimer(0)<24){
         if (SENSOR_2 > gray +5){
             turn_leftL; ClearTimer(0);     
         } else if (SENSOR_2 > gray +3){
             turn_leftS; ClearTimer(0);
         } else if (SENSOR_2 > gray){
             go; ClearTimer(0);
         } else if (SENSOR_2 > gray -2){
             turn_rightS; ClearTimer(0);
         } else {
             turn_rightL
          }
     }
     Off(OUT_AC);
     Wait(50);
  }
1つ目のライントレースのルーチンとは曲がる方向を逆にしたサブルーチン。もとのライントレースではうまく線を探すことができなかったため、主にGからJまでのサークルに沿って動くときに使っています。
 sub follow_line1()
 {
     SetSensor(SENSOR_2,SENSOR_LIGHT);
     ClearTimer(0);
     while(FastTimer(0)<20){       //1つ目のものよりも時間の条件を短くした
         if (SENSOR_2 > gray +6){
             turn_rightL; ClearTimer(0);
         } else if (SENSOR_2 > gray +3){
             turn_rightS; ClearTimer(0);
         } else if (SENSOR_2 > gray){
             go; ClearTimer(0);
         } else if (SENSOR_2 > gray -2){
             turn_leftS; ClearTimer(0);
         } else {
             turn_leftL
          }
     }
     Off(OUT_AC);
     Wait(50);
  }
円の部分の交差点を判別するためのサブルーチン。直角交差点よりも黒の時間が短くても判別するようにしている。
 sub cross_line()
  {
     OnRev(OUT_C); Off(OUT_A);  //傾いた車体を線と平行にする
     Wait(40); 
     Off(OUT_C);
     OnFwd(OUT_AC);       //線を越える
     Wait(50);
     Off(OUT_AC);
  }
交差点を越えるためのサブルーチン。
 sub cross_line2()
  {
     OnRev(OUT_A); Off(OUT_C);
     Wait(40); 
     Off(OUT_A);
     OnFwd(OUT_AC);
     Wait(50);
     Off(OUT_AC);
  }
円の中の交差点を越えるためのルーチン。元のものとは車体の角度の調整を逆にしている。
 sub ball_tukamu()
  {
     OnRev(OUT_B);   //アームを開く
     Wait(20);
     Off(OUT_B);
     OnFwd(OUT_AC);  //車体を前進させてアーム内に玉を入れる
     Wait(70);
     Off(OUT_AC);
     OnFwd(OUT_B);   //アームを閉じる
     Wait(20);
     Off(OUT_B);
  }
玉を掴む動き。
 task main()
 {
    follow_line();    //AからDの手前まで移動
    cross_line();     //Dの交差点を越える
    follow_line();  //DからFまで
    follow_line1();   //FからGまで
    OnRev(OUT_C);   //ここから、Gを左折する部分
    Wait(30);
    Off(OUT_C);
    turn_rightS;    
    Wait(70);
    Off(OUT_A);       //ここまで
    follow_lineB();   //GからHまで
    cross_line2();    //Hを越える
    follow_lineB();   //HからI
    cross_line2();  //Iを越える
    follow_lineB();  //IからKまで移動
    turn_leftS;       //ここから、Kを左折
    Wait(70);
    Off(OUT_C);    //ここまで
    ball_tukamu();    //玉を掴む
    follow_line();  //掴んでからMまで移動
    cross_line();     //車体の向きを真っ直ぐにする
    OnRev(OUT_B);   //アームを開く
    Wait(20);
    OnFwd(OUT_AC);  //車体で玉を押してシュート
    Wait(30);
    Off(OUT_AC);
 } 
動き全体のプログラム.
**交差点の判断方法 [#h022c7a8]
#ref(./image1 (1).jpeg,50%,kousaten)
このロボットでは交差点に差し掛かった時に,線に沿って曲がろうとする.上の図ではライン上でのロボットの動きを簡単に表している.直進ではすぐに黒線を抜けるため連続して黒である時間は短いが,交差点では矢印のように動くため黒を連続して認識する時間が長い.このため連続して黒を認識する時間を計り,ここでは主に0.24秒を超えたときに一時停止するようにしている.

「一番多用するライントレースのプログラム」と書いたところを見てほしい.最初にClearTimer(0)として,ここでタイマーをリセットし測定を始める.そしてロボットが行動をした後にタイマーをリセットし再び同じ色が連続して続く時間を測定するということを繰り返す.そして黒を連続して黒を認識する時間が0.24秒を超えたときに「while」のループを抜けることで交差点で一時停止させている.
プログラムについての中の「一番多用するライントレースのプログラム」と書いたプログラムを見てほしい.最初にClearTimer(0)として,ここでタイマーをリセットし測定を始める.そしてロボットが行動をした後にタイマーをリセットし再び同じ色が連続して続く時間を測定するということを繰り返す.交差点では同じ動きが繰り返されるためタイマーがリセットされず値が増え続け,それが0,24秒を超えると「while」のループを抜けることで交差点で一時停止させている.
*ロボットについて [#x39489af]
ロボット全体の写真.冊子に書いてあるものを少し改良して,車体の幅を狭くした.前方にはピンポン玉をつかむためのアームと光センサーを取り付けている.
#ref(./image1.jpeg,50%,ロボット全体)
アーム部分を拡大した画像.歯車を3つかみ合わせてモーターとの距離をとることで光センサーの邪魔をしないようにした.また,ある程度車体の向きがずれても玉をつかめるように支えを取り付けた.
#ref(./image2.jpeg,50%,アーム部分)
*まとめ [#ie3f8401]
時間の条件がなかなか丁度いいものにならず、意図しない場所で止まったり、止まってほしいところでとまらないということが何度もあり非常に苦労した。FからGに移動して止まらせることができず、その部分だけクリアすることができなかった。その問題を解決するためには、Fで一度止まって、時間の条件を短くしたルーチンに変更すれば良かったかもしれないと思った。また、ライントレース後の車体の向きによって次の動きがうまくいくときと、いかない時があった。

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