[[2016a/Member]]

目次
#contents

*課題内容 [#p0f7e55d]
 今回の課題は、ロボットに取り付けたセンサーを用いて下図のコースのB地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点へと動かすものでした。

#ref(2016a/Member/jake57/Mission2/miti.png,50%,コース図)

*ロボット [#i40d038b]
 今回、この班で作成したロボットはこちらです。~
 今回のロボットは冊子に掲載されていた簡単な型を利用しました。

#ref(2016a/Member/jake57/Mission2/20160701_165041a.jpg,20%,ロボット)

 試行を重ねていくと、センサーがロボット本体の中心にあるわけではないので調整するのが大変でした。~

また、タイヤの数が多いとロボットの安定感は増しますが曲がる時に大きく回ってしまって円になっているところを回りきれなかったので以下の図のような改良を加えました。


#ref(2016a/Member/jake57/Mission2/20160701_165103a.jpg,30%,ロボットの裏)

 このように改良したことによって摩擦を抑えられ小回りもできるようになりました。

*プログラム [#fd85da0e]
今回のプログラムはサブルーチンを用いてメインのプログラムを簡単にして見やすくつくりました。~
プログラムを作成する際に、サブルーチンのところで何回もエラーが出てしまって直すのが非常に大変でした。







 #define THRESHOLD 38
 #define  go_forward OnFwd(OUT_AC);  // 直進を追加
 #define turn_left1 OnRev(OUT_A); OnFwd(OUT_C);    // 左旋回
 #define turn_right1 OnFwd(OUT_A); OnRev(OUT_C);   // 右旋回
 #define turn_left2 Off(OUT_A); OnFwd(OUT_C);
 #define turn_right2 OnFwd(OUT_A); Off(OUT_C);
 #define STEP 1        // 1回の判断で動作させる時間
 #define short_break Off(OUT_AC); Wait(100);
 #define nMAX 6
 #define turn_time 40


・交差点の判断方法~
上記にあるように「THRESHOLD 38」という値を黒と白の間の値とし、この値より小さいときは黒、大きいときは白と区別しました。~
そして、下記の「line_follow()」を行っているときの黒と白を認識する回数のカウント数が6を超えた時に交差点と認識するようにしました。 





 sub line_follow()                      //黒線上を進む
 {
     SetSensor(SENSOR_2, SENSOR_LIGHT);
     int nOnline=0;
     
     
 
       while (nOnline < nMAX) {                        //カウント数が6を超えるまで続ける
    
      if (SENSOR_2 < THRESHOLD-4) {             //センサーが黒と認識したとき
      turn_right1; 
        nOnline++;                  
      } else {
      if (SENSOR_2 < THRESHOLD-2) { 
          turn_right2;            
      } else if (SENSOR_2 < THRESHOLD+4) {           
          go_forward;                  
      } else if (SENSOR_2 < THRESHOLD+7) {
       turn_left2; 
      }  else {
           turn_left1;
         }
             nOnline=0;
         }
          Wait(STEP);
        }
          short_break;
           PlaySound(SOUND_DOUBLE_BEEP);
          nOnline=0;
     
      }




 sub go_straight()                   //交差点にさしかかったときに真っ直ぐに進む
 {
     while (SENSOR_2 < THRESHOLD+4) {
         turn_left2;
         }
      short_break;
     turn_left2(turn_time);
       go_forward;
       Wait(20);
 }


  sub turn_right()                     //交差点にさしかかった時に右に曲がる
 {
     while (SENSOR_2 < THRESHOLD-2) {
         turn_right1;
                 }
     if(SENSOR_2 < THRESHOLD-2){
         Off(OUT_AC);
         short_break;
         turn_right1;
         Wait(STEP);
         
     SetSensor(SENSOR_2, SENSOR_LIGHT);
     int nOnline=0;
     
     
 
       while (nOnline < nMAX) {
    
      if (SENSOR_2 < THRESHOLD-4) {       
      turn_right1; 
        nOnline++;                  
      } else {
      if (SENSOR_2 < THRESHOLD-2) { 
          turn_right2;            
      } else if (SENSOR_2 < THRESHOLD+3) {           
          go_forward;                  
      } else if (SENSOR_2 < THRESHOLD+5) {
       turn_right2; 
      }  else {
           turn_right1;
         }
             nOnline=0;
         }
          Wait(STEP);
        }
          short_break;
           PlaySound(SOUND_DOUBLE_BEEP);
          nOnline=0;
     
         }else{
         turn_right1;
         }
 }


 task main()
 {
       line_follow();               //ライントレース
     turn_right();
     line_follow();
     go_straight();
     line_follow();
     go_straight();
     line_follow();
     turn_right();
     line_follow();
     turn_right();
     line_follow();
       line_follow();               //ライントレース(B→R)
     turn_right();                 //R地点を右折
     line_follow();                //ライントレース(R→Q)
     go_straight();                //Q地点を直進
     line_follow();                //ライントレース(Q→Q)  
     go_straight();                //Q地点を再び直進
     line_follow();                //ライントレース(Q→P) 
     turn_right();                 //P地点を右折
     line_follow();                //ライントレース(P→S)
     turn_right();                 //S地点を右折
     line_follow();                //ライントレース(S→C) 
        Off(OUT_AC);    
      go_forward;
      go_forward;                 //Cの枠内に入る
     Wait(100);
     Off(OUT_AC);
     PlaySound(SOUND_DOUBLE_BEEP);
 } 
       

*【結果】 [#kae11a10]
 課題のコースを完走するのにかかった時間は42秒ほどでした。

*感想・考察 [#tc524f59]
 今回の課題は前回とは異なり途中までは上手くいっていました。~
 しかし、交差点を超えて真っ直ぐに進むという今回の一番の難題をクリアするのに時間がかかって~
自分では解決できなかったので班員の知恵をかりることによって何とか解決できました。~

考察としては、交差点を認識させるために今回は回数を用いて課題に取り組んだため、黒線上を進む時に~
カクカクしてしまってタイムロスをしてしまっている様だったので、回数ではなく時間を用いればより短い時間でコースを完走できたかもしれないと思いました。

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