2019a/Member/Nove/Mission2
#contents
*課題について [#u98283e0]
指定されたコースを進み、ミッションを遂行するロボットの作成。
交差点では一秒停止し、T字路では直角に侵入するときのみ一時停止すること。

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

*ロボット本体の説明 [#j9fb7d00]
小回りがきくよう基本のロボットのサイズを小さくした。その写真を載せる。

#ref(2019a/Member/Nove/Mission2/s_IMG_1.jpg)
ピンポン玉を掴むバンパーを付けた。バンパーと光センサーの部品で玉を固定し持ち運ぶ。その写真を載せる。

#ref(2019a/Member/Nove/Mission2/s_IMG_2.jpg)

*プログラムの説明 [#g4641d93]

**defineについて [#f719bc92]
RUN_TIMEはそれぞれ以下で示すsubルーチンの中で使われている。
交差点、T字路時に曲がるので旋回の定義も加えた。

 #define RUN_TIME1 800
 #define RUN_TIME2 500
 #define RUN_TIME1 50
 #define RUN_TIME_GHIJ 480
 #define RUN_TIME_LM 1500
 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);
 #define turn_left OnFwd(OUT_C);OnRev(OUT_A);

**subルーチンについて [#h2c0d192]

今回交差点判断をするにあたり、0.5秒以上黒を検知したときに停止するようにした。通常のライントレース時で車体の向きを交互に変えるまでの時間を測り、RUN_TIMEの時間を決めた。
D地点までのプログラム

 sub line_trace1()  //Dの交差点で止まるまでライントレースし続けるプログラム
  { SetSensor(SENSOR_2,SENSOR_LIGHT);
  ClearTimer(0);
  while(FastTimer(0)<=RUN_TIME1){
      if(40<SENSOR_2){
         OnFwd(OUT_A);Off(OUT_C);ClearTimer(0);
      }else if(35<SENSOR_2<40){
         Off(OUT_A);OnFwd(OUT_C);
      }else{
         OnRev(OUT_A);OnFwd(OUT_C);
       }
    }
   Off(OUT_AC);Wait(100);
 }

 sub line_trace2()  //DからG(交差点)までライントレースするプログラム
  { SetSensor(SENSOR_2,SENSOR_LIGHT);
   ClearTimer(0);
   while(FastTimer(0)<=RUN_TIME2){
   while(FastTimer(0)<=RUN_TIME1){
      if(40<SENSOR_2){
         OnFwd(OUT_A);Off(OUT_C);ClearTimer(0);
      }else if(35<SENSOR_2<40){
         Off(OUT_A);OnFwd(OUT_C);
      }else{
         OnRev(OUT_A);OnFwd(OUT_C);
       }
    }
   Off(OUT_AC);Wait(100);
 }


 sub line_trace_GHIJ()  //GHIJ間のライントレース(内側)
   {SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0);
        while(FastTimer(0)<=RUN_TIME_GHIJ){
          if(40<SENSOR_2){
             OnFwd(OUT_A);Off(OUT_C);
          }else if(35<SENSOR_2<40){
             Off(OUT_A);OnFwd(OUT_C);
          }else{
             OnRev(OUT_A);OnFwd(OUT_C);
            }
   }
       Off(OUT_AC);Wait(100);
 }

 sub line_trace_LM()  //LM間のライントレース
   {SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0);
        while(FastTimer(0)<=RUN_TIME_LM){
          if(40<SENSOR_2){
             OnFwd(OUT_A);Off(OUT_C);
          }else if(35<SENSOR_2<40){
             Off(OUT_A);OnFwd(OUT_C);
          }else{
             OnRev(OUT_A);OnFwd(OUT_C);
            }
   }
 }

**task main について [#rde24ec5]

 task main(){
  OnFwd(OUT_AC);Wait(100);//Aからライン上(外側)まで動かす
  line_trace1();//D地点の交差点までライントレース
  turn_right;Wait(45);OnFwd(OUT_AC);Wait(15);//停止後、右に旋回して位置調整し、少し前に進んで次のライントレースに備える
  line_trace2();//DEFGのライントレース
  turn_right;Wait(45);OnFwd(OUT_AC);Wait(25);//内側をライントレースするために位置調整
  line_trace_GHIJ();//
  turn_right;Wait(100);OnFwd(OUT_AC);Wait(15);//J点で右に90度旋回し、まっすぐ進んで黒線を超える
  line_trace2();//交差点用ライントレース
  OnFwd(OUT_AC);Wait(15);//外側を通りたいので、少しまっすぐ動く
  turn_left;Wait(70);OnFwd(OUT_AC);Wait(100);//左に旋回しKLのセント車体を平行に、その後L地点まで移動
  OnFwd(OUT_B);Wait(15);//バンパーを閉じ、たまをキャッチ
  turn_right;Wait(200);//180度旋回
  line_trace_LM();//
  turn_right(15);Off(OUT_AC);//車体を真っ直ぐにし、停止
  OnRev(OUT_B);Wait(15);//バンパーを開く
  OnRev(OUT_AC);Wait(300);//車体を後ろに下げる
  OnFwd(OUT_B);Wait(15);//バンパーを閉じる
  OnFwd(OUT_AC);Wait(300);//直進してたまをシュートする
 }
*まとめ [#w31b85e4]
交差点判断に当たり、うまく作動するときとしないときがあった。最後うまく行ったが、何故判断をせずにライントレースをし続けてしまうことがあったのかわからなかった。時間が足らず、その点の改善等が十分にできなかった。
プログラムに関してだが、今回自分は決めた区間内をトレースするのにかかる時間を測り、subルーチンをつくった。そのためsubルーチンの個数が多くなってしまった。これを一個で済ませられるようなプログラムにできないかを考えてみようと思う。



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