[[2007b/A1]]
-----
CENTER:COLOR(darkgreen):&size(22){課題2:黒い線に沿って動くロボット};
CENTER:COLOR(darkgreen):&size(22){課題2:ライントレース};
-----

RIGHT:counter &counter(all);

目次
#contents

*目標 [#u61be3dc]
できる限り、''早く''・''正確''にライントレースをするロボットを作る。

***ライントレース(line Trace)とは [#z4643462]
ロボットが黒線(line)のある位置を認識し、その黒線を追跡(trace)すること。

*ルール [#j0683bfb]
-2箇所以上交差点のある周回コース(黒い線)をA0版の画用紙上描き、その自作のコースを3周するロボットを作成
-交差点で優先側を走っていない場合には一時停止し、もう一台のロボットが優先道路上にある場合には行き過ぎるのを待つ
-前方を進むもう一台のロボットに追いついて接触した時以下の動作をする
++3秒間停止して待つ
++その場で1回だけ360度旋回する
++180度旋回して5秒間コースを逆走し、再び180度旋回してもとの向きに走る

*目的 [#u61be3dc]

**ライントレースとは [#z4643462]
*コース [#bec4fe11]


**特徴 [#sfb210d4]
交差点3つ。



*ロボット [#ae09f3d7]

**特徴 [#h4927445]
+全体の構造としては三輪で、駆動輪には大径タイヤを用い比較的速く走れるようにし、
後部に可動式のタイヤをつける事によって緩やかに曲がれるようにした。
+タッチセンサーは押した時に最前部に設置してある光センサーと同位置になるようにし、
一時停止を厳密に守るようになっている。
+光センサーは2つのセンサーで挟み込む形にして、センサーの幅の上限を無くし、スムーズに
進めるようにした。

*ソースプログラム [#z2a7617e]
 #define THRESHOLD 40                                  //set Threshold
 #define RUN_TIME 3000
 #define SERCH_TIME 120
 #define DEFAULT_POWER 7
 
 sub turn_right(){
   OnRev(OUT_A); OnFwd(OUT_C);
   Wait(240);
   Off(OUT_A+OUT_C);
 }
 
 sub search(){
   ClearTimer(1);
   if(Timer(1)>SERCH_TIME){
      OnRev(OUT_A+OUT_C);
      Wait(Timer(1));
   }
 }
 
 sub one_stop_black(){
   until(SENSOR_1>THRESHOLD && SENSOR_3>THRESHOLD){
      OnFwd(OUT_A+OUT_C);
      //search();
   }
 }
 
 sub one_stop_white(){
   until(SENSOR_1<=THRESHOLD && SENSOR_3<=THRESHOLD){
      OnFwd(OUT_A+OUT_C);
      //search();
   }
 }
 
 task main()
 {
     int i,j,k;
     int a,b;
     
     i=0;
     j=0;
     k=0;
     a=0;
     b=0;
 
     SetSensor(SENSOR_1,SENSOR_LIGHT);                //センサ−1(右)を光センサーにセット
     SetSensor(SENSOR_3,SENSOR_LIGHT);                //センサ−3(左)を光センサーにセット
     SetSensor(SENSOR_2,SENSOR_TOUCH);                //センサ−2をタッチセンサーにセット
 
     while(true){   
         if(SENSOR_2==1){
             turn_right();
         }
         
         if(SENSOR_1>THRESHOLD && SENSOR_3>THRESHOLD){  //両方白ならまっすぐ進む    
             
             if(a==1){         //左に曲がった!
                 a=0;
                 k=0;
                 
                 j++;
                 SetPower(OUT_C,DEFAULT_POWER);          //右のモーターの強さをデフォルトに戻す
                 SetPower(OUT_A,DEFAULT_POWER-j);        //連続して曲がった回数だけより曲率の小さい左カーブを描く
             }
             if(b==1){                 //右に曲がった!
                 b=0;
                 j=0;
                 
                 k++;
                 SetPower(OUT_A,DEFAULT_POWER);          //左のモーターの強さをデフォルトに戻す
                 SetPower(OUT_C,DEFAULT_POWER-k);        //連続して曲がった回数だけより曲率の小さい右カーブを描く
                 }    
             OnFwd(OUT_A+OUT_C);
         }
         if(SENSOR_1>THRESHOLD && SENSOR_3<=THRESHOLD){     // センサ−3が黒なら左に曲がる
             a=1;
             Off(OUT_A);
             OnFwd(OUT_C);
             }
         if(SENSOR_1<=THRESHOLD && SENSOR_3>THRESHOLD){     // センサ−1が黒なら右に曲がる
             b=1;
             OnFwd(OUT_A);
             Off(OUT_C);
         }
         if(SENSOR_1<=THRESHOLD && SENSOR_3<=THRESHOLD){      //両方黒なら一時停止
             SetPower(OUT_A+OUT_C,DEFAULT_POWER);
             Off(OUT_A+OUT_C);
             Wait(50);
             one_stop_black();
             search();
             one_stop_white();
             search();
             one_stop_black();
             search();
             one_stop_white();
             search();
             one_stop_black();
             search();    
            }
         }         
 }


*結果 [#q2b95d97]
*課題2を終えて [#x6df88c8]

*コメント [#qa917600]
よろしければコメントお願いします。

#comment


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