*ロボットの紹介 [#ka0eb18a]

私たちのロボットは、できるだけコンパクトなものになるように工夫しました。
例えば、車体の前にある空き缶をつかむ部分です。空き缶をつかむアームの部分は、どうしても長くなるのでそこの下にできるスペースでタッチセンサーと光センサーを近くにつけました。しかし、こうすることでタッチセンサーの反応が悪く効率が良くないのでタイマーを使うことによってより正確になりました。
光センサーが斜めに付いているので、しきい値の設定が他とは違って工夫できたかと思います。一つのモーターで2つのアームを動かすのでアームの噛み合い具合にとても気を使いました。アームに付いた歯車は空回りできるようにしてモーターの故障を防ぎました。
#ref(2013a/Member/Sho/Mission1/1373524663100.jpg,70%)
#ref(2013a/Member/Sho/Mission1/1373524685053.jpg,70%)
#ref(2013a/Member/Sho/Mission1/1373524701220.jpg,70%)

*コース攻略 [#w3a23940]

#ref(2013a/Member/Sho/Mission1/robotics-2013a-mission1.jpg,100%)
-円を回るときに右回りが難しかったので、曲がるときは極力スピードを下げました。
-交差点では、nMAXの値によって通過できるかできないか大きく別れたのでここの調整を意識しました。
-ライントレースのとき、しきい値がとても大きく影響したので入念に調べました。具体的には、黒ラインのしきい値が33〜35で、その他の白の部分は52〜55でした。なぜかは分かりませんが、ロボットをライントレースさせるたびに最適なしきい値が変わりました。
-回り方に関しては、始めに右に曲がるか左に曲がるかでプログラムを組んで、曲がり次第ライントレースをスタートさせるようにしました。
-音をある間隔ごとに出すことによって、タイマーによる時間がどのぐらい経過しているのかをわかりやすくしました。

*プログラム説明 [#ce91a882]
 #define  THRESHOLD  35
 #define  HIPOWER  7
 #define  LOWPOWER  1
 #define  set_power_H  SetPower(OUT_AC,HIPOWER);
 #define  set_power_L  SetPower(OUT_AC,LOWPOWER);
 #define  go_forward1  set_power_H;OnFwd(OUT_AC);
 #define  go_forward2  set_power_L;OnFwd(OUT_AC); 
 #define  turn_left1  set_power_L;\
   OnFwd(OUT_C);OnRev(OUT_A);  //左旋回
 #define turn_left0  set_power_L;\
   OnFwd(OUT_C);Off(OUT_A);  //左回り
 #define turn_right0  set_power_L;\
   OnFwd(OUT_A);Off(OUT_C);  //右回り
 #define turn_right1   set_power_L;\
   OnFwd(OUT_A);OnRev(OUT_C);  //右旋回
 #define moter set_power_L;OnFwd(OUT_B)
 #define STEP  1
 #define nMAX  3
 #define short_break  Off(OUT_AC);Wait(10);
 #define CROSS_TIME  30
 #define cross_line  go_forward1;\
   Wait(CROSS_TIME);short_break
 #define time0  500
 #define time1  1500
 #define time2  1900
 #define time3  2700
 #define time4  2900
 #define time5  4000
 #define time6  4300
 #define time7  5000
-ここまでがこのプログラムにおける定義
 sub line_trace1()  //普通のライントレース
 {     
         if (SENSOR_2 < THRESHOLD -6) {
        turn_left0;
       } else 
        if (SENSOR_2 < THRESHOLD -3) {
         turn_left1;
       } else if (SENSOR_2 < THRESHOLD +3) {
          go_forward1;
       } else if (SENSOR_2 < THRESHOLD +7) {
          turn_right0;
       } else {
          turn_right1;
         }
          Wait(STEP);
   }
  
 sub line_trace2()  //急な回転のライントレース
 {      
         if (SENSOR_2 < THRESHOLD -1) {
        turn_left1;
       } else 
        if (SENSOR_2 < THRESHOLD +3) {
         turn_right1;
       } else {
          go_forward1;
         }
          Wait(STEP);
   }
-急カーブをする場合には、スピードを落とさないとまがり切れません。普通のカーブとプログラムを分けたのは、普通のカーブまで急カーブ用でやると動きがスムーズにいかず、もたついた動きになるからです。
 sub line_cross()  //交差点を通過
 {       
        int nOnline=0;
         while(nOnline < nMAX){
          if (SENSOR_2 < THRESHOLD -6) {
        turn_left1;
        nOnline++;
       } else {
        if (SENSOR_2 < THRESHOLD -3) {
         turn_left0;
       } else if (SENSOR_2 < THRESHOLD +3) {
          go_forward1;
       } else if (SENSOR_2 < THRESHOLD +7) {
          turn_right0;
       } else {
          turn_right1;
        }
      nOnline=0;
        }
        Wait(STEP);
      }
        short_break;
        turn_right1;Wait(nMAX*STEP*10);
        cross_line; 
        nOnline=0;
 }

      task main()
 {
        SetSensor(SENSOR_2,SENSOR_LIGHT);
           ClearTimer(0);

         go_forward1;Wait(35);
         turn_left1;Wait(100);
 
         while(FastTimer(0) <= time0) {
           line_trace1();
  }
         OnFwd(OUT_B);Wait(50);Off(OUT_B);

         while(FastTimer(0) <= time1) {
           line_trace1();        
  }
         while(FastTimer(0) <= time2) {
           line_cross();
  }
         while(FastTimer(0) <= time3) {
           line_trace2();
  }
        
         while(FastTimer(0) <= time5) {
           line_trace2();
  }
         while(FastTimer(0) <= time6) {
           line_cross();
  }
         while(FastTimer(0) <= time7) {
           line_trace2();
  }
           turn_right1;Wait(100);  //缶を放す動作
             go_forward1;Wait(100);
             turn_left1;Wait(200);
             OnRev(OUT_B);Wait(50);Off(OUT_B);
             OnRev(OUT_AC);Wait(100);
            while(true){
             line_trace2();
     }
 }
-缶を置くところを通り過ぎてから180度ターンしてから缶を放して、ゴールに向かう。
*まとめ [#ze9cfd38]
プログラムするときに急カーブがとても苦労しました。特に右回りは、黒ラインの外に出ると逆にターンしてしまい修正が大変でした。ロボットは、自分が想像していたよりもかなり思い通りに動かなくなることが多くありました。そして、プログラムを作るときはしっかりと明白なものにすることが大切だと感じました。
プログラムの管理を時間制にするかセンサーにするかで大きく違ったプログラムができることも分かりました。
空き缶を置くところでは、ロボットが旋回するときに空き缶が倒れてしまってうまくいかなかったので残念でした。
この課題の大切なところは、ロボットを動かして動かしながらプログラムを改善していくことだと思いました。


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