課題2の目次
#contents

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

そのとき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 hold OnFwd(OUT_B);Wait(20);Off(OUT_B); //ボールをつかむ
 #define shoot OnRev(OUT_B);Wait(20);Off(OUT_B);//シュートする
 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);
     hold;                    //ボールをキャッチする
     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(20);         //交差点を渡る
     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;  //ボールをシュートする
     Off(OUT_ABC);     
 }

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

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

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

最初は線の左側をトレースしていたが、右側をトレースしたほうが交差点を判断しやすかったので右側をトレースするように変えた。また、シュートもボールを押し込むだけだったのを勢いよくシュートできるように変えた。

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

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

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


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