課題2の目次
#contents

*課題 [#if4d069e]
今回はライントレースをするロボットを作る課題だった。
今回は与えられたコースをライントレースするロボットを作る課題だった。

そのときPとQの間に置いたボールを取り、ゴールにシュートする。

また、交差点や三叉路では2秒静止する。


*ロボットについて [#qedc3bab]
最初は、初めに作ったロボットにペンを上下させるモーターを取り付けただけだったが、そのやり方では字を綺麗に書くのが大変だったので次に、前後移動するロボットにアームを付けたロボットを作ろうとした。
モーターはタイヤを動かすのに2つ、ボールをキャッチするアームを動かすのに1つ使用した。

モーターを回すとアームが下がりボールを押さえる仕組みになっている。

本体自体は基本のロボットをほぼそのまま使用したが、光センサーがなるべく本体に近くなるように改良した。

#ref(./Robot1.jpg,30%)
#ref(./Robot2.jpg,30%)

*プログラム [#f8ff16d5]

 #define THRESHOLD 46
 #define go_forward OnFwd(OUT_AC); // 直進
 #define turn_left OnFwd(OUT_C);OnRev(OUT_A);   // 左旋回
 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);  // 右旋回
 #define STEP 1   // 1回の判断で動作させる時間
 #define catch1 OnFwd(OUT_B);Wait(10);Off(OUT_B);
 #define shoot OnRev(OUT_B);Wait(10);Off(OUT_B);OnFwd(OUT_AC);Wait(120);Off(OUT_AC);
 task main()
 {
    SetSensor(SENSOR_2,SENSOR_LIGHT);
    int black=0; // 続けて黒になった回数 (カウンタ)
        while (black < 8)     
       {
            if (SENSOR_2 < THRESHOLD-6)      
             {
                   turn_right;
                   black++;        // カウンタを増やす   
             }
            else if (SENSOR_2 < THRESHOLD+3) {
                    go_forward;              }
            else {                 
                    turn_left;     
                    black=0;  // カウンタをリセット
                     }              
       }
        Off(OUT_AC);Wait(200);
        go_forward;
        Wait(30);           //交差点を渡る
        black=0;
       ClearTimer(0);
      while (FastTimer(0) < 210)
       {
           if (SENSOR_2 < THRESHOLD-6){      
             turn_right;              }
            else if (SENSOR_2 < THRESHOLD+3) {
                    go_forward;              }
            else {                 
                    turn_left;     
                     }              
       }
         Off(OUT_AC);Wait(100);
         catch1;
      while (black < 10)     
       {    
            if (SENSOR_2 < THRESHOLD-6)      
             {
                   turn_right;
                   black++;        // カウンタを増やす   
             }
            else if (SENSOR_2 < THRESHOLD+3) {
                    go_forward;           
                    black=0;                  }
            else {                 
                    turn_left;     
                    black=0;  // カウンタをリセット
                     }              
       }
   
        Off(OUT_AC);Wait(200);
        turn_right;
        Wait(20);         //位置修正
        black=0;  // カウンタをリセット
      while (black < 10)     
       {    
            if (SENSOR_2 < THRESHOLD-6)      
             {
                   turn_right;
                   black++;        // カウンタを増やす   
             }
            else if (SENSOR_2 < THRESHOLD+3) {
                    go_forward;             
                    black=0;                 }
            else {                 
                    turn_left;     
                    black=0;  // カウンタをリセット
                     }              
       }
       Off(OUT_AC);Wait(200);
       go_forward;
       Wait(30);              //交差点を渡る
       int white=0;           //続けて白になった回数 (カウンタ)
         while (white < 10)     
       {    
            if (SENSOR_2 > THRESHOLD+2)      
             {
             turn_left;
             white++;              // カウンタを増やす 
             }
            else if (SENSOR_2 > THRESHOLD-8) {
                    go_forward;
                    white=0;                 }
            else {                 
                    turn_right;     
                    white=0;      // カウンタをリセット
                     }              
       }
          Off(OUT_AC);Wait(100);
          shoot;      
 }

*工夫した点 [#s3c6b29f]
交差点を判断するために続けて黒や白になった回数を数え、それがある程度大きくなったらカーブではなく交差点だと判断するようにした。

続けて黒になった回数だけでなく白になった回数も数えたのは、ゴールした時に続けて白になることが分かったので、ある一定の回数以上続けて白になったらシュートするようにするとうまくいったため。

ボールをキャッチする時には時間を測る必要があったが、スタート地点からではなく一つ目の交差点から時間を測ることでズレを少なくし、安定してボールを取れるようにできた。

最初は線の左側をトレースしていたが、右側をトレースしたほうが交差点を判断しやすかったので右側をトレースするように変えた。

*反省 [#ieebad8d]
交差点ごとにwhileを使ったためプログラムが長くなってしまった。

また、シュートする時にアームでボールを弾くようにしたかったが、アームを上げると紙が曲がっているのでボールが転がってしまいうまくシュートできなかったのでロボットでそのまま押し込む形となってしまった。

明るさの判断をするのに3段階で分けたが、スピードを速くするためには5段階で判断した方が良かったかもしれない。

前回は最後まできちんとした字を書くことができなかったが、今回はシュートまで一応完成させられたためその点は良かったと思う。



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