[[2013b/Member]]
*ロボットの紹介 [#c17bbfd1]
以前のモデルでは半径が1.5cmのカーブがスムーズに曲がり切れなかったため、小回りの利く三輪のモデルに改良しました。前輪の中点を軸として回転するためセンサーライトが左右にふられて線を見失ってしまう事がなくなりました。
*プログラム [#x2919ef6]
決められたコースを一周するプログラムです。
 #define turn_left  OnFwd(OUT_C);Off(OUT_A);           ]-|   動作の種類
 #define turn_right OnFwd(OUT_A);Off(OUT_C);             | 上から、左回り・右回り
 #define go         OnFwd(OUT_AC);                       | 直進・左小回り・右小回り
 #define tu_le      OnFwd(OUT_C);OnRev(OUT_A);           |
 #define tu_ri      OnFwd(OUT_A);OnRev(OUT_C);         ]-|
 #define black 38  //51~34
 #define white 46  //交差点後13s                        
 #define conr_1     780                ]-|  交差点近くになる     
 #define conr_2     800                 |  それぞれの時間 
 #define conr_3     109                 |     
 #define conr_4                       ]-|            
 #define conrring    tu_le;\       
 #define conr_4     400                 ]-|            
 #define conrring    PlaySound(SOUND_CLICK);\
                     tu_le;\       
                     Wait(32);\
                     Off(OUT_AC);\ ・・・・・・・・交差点での動作    
                     go;\
                     Wait(40);\
                     conr_times=0;\
                     ClearTimer(0);
  
 
  task main()
  {
   int conr_times;
   conr_times=0;
   int order;
   order=0;
   int order;  ・・・・・・・・・交差点ごとに特定のプログラムだけが動くのに使います     order=0;
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   ClearTimer(0);
 
   while(true)
   {
     
 
     if     ((conr_times>2)&&(FastTimer(0)>conr_2)&&(order==1))
                        {conrring;order++;PlaySound(SOUND_CLICK);}
     if     ((conr_times>2)&&(FastTimer(0)>conr_4)&&(order==3))
                       {conrring;order++;}   
     else if((conr_times>2)&&(FastTimer(0)>conr_3)&&(order==2))
                       {conrring;order++;}
     else if((conr_times>2)&&(FastTimer(0)>conr_2)&&(order==1))
                        {conrring;order++;}
     else if((conr_times>2)&&(FastTimer(0)>conr_1))
                        {conrring;order++;PlaySound(SOUND_CLICK);}
                        {conrring;order++;}
     else if     (SENSOR_1>white+1){tu_le;conr_times--;}      ]-|  ノーマルトレース
     else if(SENSOR_1<black-1){tu_ri;conr_times++;}           |  線の縁をたどって
     else if(SENSOR_1>=white){turn_left;conr_times--;}        |  行きます
     else if(SENSOR_1<=black){turn_right;conr_times++;}        |    
     else {go;}                             ]-|
     else {go;}                            ]-|
   }
  } 

プログラムの説明
-交差点で特定の動きをさせるプログラムの作り方が思いつかなかったのですべての動作をif文に入れて()内の条件を厳しくすることで交差点でのみ特定の動きをするようにした。
-プログラムは上から順に動いていくためif文では個々の条件の順序を考える必要があったが変数orderを入れることで他のプログラムが動かないようにした。

       交差点判断一回目。交差点で黒だった回数(conr_times)が2回以上で,且つ
       交差点に接近するまでは条件外で動きません。
            ((conr_times>2)&&(FastTimer(0)>conr_1))
                       {conrring;order++;}
       交差点を一回渡ったことで初めてorderが1増え二回目の交差点判断の
       プログラムしか動きません。     
            ((conr_times>2)&&(FastTimer(0)>conr_2)&&(order==1))
                       {conrring;order++;}
       三回目ーーー。
            ((conr_times>2)&&(FastTimer(0)>conr_3)&&(order==2))
                       {conrring;order++;}
       四回目ーーー。
            ((conr_times>2)&&((FastTimer(0)>conr_4)&&(order==3))
                       {conrring;order++;}
*課題 [#m06816f8]
 確実に交差点を渡るため4つのプログラムを用意。しかし交差点を渡るプログラムは、交差点に近づくまでの時間が違うだけでほとんど同じプログラム‥。プログラムが見にくく、長くなる原因となった。一つのプログラムで多くの場合に対応できるようにしたい。
*感想 [#mafe0526]
 今回のライントレースでは交差点を超えて一周することが出来なかった。問題としてthresholdの値がうまく決まらず一番初めの直角が曲がれなかった事が大きかった。交差点への侵入角度によってあらぬ方向へ行く事もあった。今度からは確実性も高めていきたい。
 はじめに説明書に書いてあるとうりに作った四輪のロボットでは、二つ目の交差点を横切るところまではうまくいったが、ロボットを二輪に改良してからセンサーライトの感受性が変わり一番初めの直角が曲がれなくなった。一時は自分の影でセンサーライトの値が変わっていることに気づかずプログラムを書き換えてしまい無駄な時間を使ってしまった。


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