2011a 目次

課題2 ライントレース

次のような周回コース(黒い線)を動くロボットを作成せよ。

   * 通常の交差点が2箇所以上ある
   * ロータリー型の交差点が1箇所以上ある (ロータリーでは反時計まわりに進む)
   * 直角に曲がるコーナーおよびそのコーナーをショートカットするコース(点線)が存在する
   * 急なヘアピンカーブが1箇所以上ある
   * スタート地点に目印がある
   * 黒い線の幅は15〜20mm程度

メンバー紹介 

ロボット紹介

プログラム紹介

#define go OnFwd(OUT_A+OUT_C);         //前進
#define back(bt) OnRev(OUT_A+OUT_C);Wait(bt);Off(OUT_A+OUT_C);    //後退
#define turn_l OnRev(OUT_A);OnFwd(OUT_C);    //左回り
#define turn_r OnFwd(OUT_A);OnRev(OUT_C);    //右回り

task main()
{SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_LIGHT); 


int t = 0;    //tは1回目のロータリーまでの交差点の回避に使用した


while( t <= 2 ){if((SENSOR_1 > 40) && (SENSOR_3 > 40))    //もし両方白だったら前進
                {go;}

                if((SENSOR_1 > 40) && (SENSOR_3 < 40))    //もしセンサー3が黒だったら右回転
                {turn_r;}
                    
                if((SENSOR_1 < 40) && (SENSOR_3 > 40))    //もしセンサー1が黒だったら左回転
                {turn_l;}
          
                if((SENSOR_1 < 40) && (SENSOR_3 < 40))    //もし両方黒だったら0.5秒前進(この動作を2回行ったらwhile内は終了)
                {t = t+1;
                 Off(OUT_A+OUT_C);go;Wait(50);Off(OUT_A+OUT_C);}
               }
back(30);                          //ちょっと後退

turn_r;Wait(60);                      //右回転(ロータリー開始)

int u = 0;                         //uはロータリー内の分岐点の回避に使用した

while( u <= 1 ){if((SENSOR_1 > 40) && (SENSOR_3 > 40))
                {go;}

                if((SENSOR_1 > 40) && (SENSOR_3 < 40))
                {u = u+1;Off(OUT_A+OUT_C);go;Wait(10);}
                    
                if((SENSOR_1 < 40) && (SENSOR_3 > 40))
                {turn_l;}
               }

turn_r;Wait(60);                      //右回転(ロータリー終わり)

ClearTimer(0);

while(Timer(0) <= 44){if((SENSOR_1 > 40) && (SENSOR_3 > 40))    //近道まではタイマーを使う
                      {go;}

                      if((SENSOR_1 > 40) && (SENSOR_3 < 40))
                      {turn_r;}
                    
                      if((SENSOR_1 < 40) && (SENSOR_3 > 40))
                      {turn_l;}
                     }

turn_l;Wait(65);                        //近道に進入

go;Wait(200);Off(OUT_A+OUT_C);                 //近道を進む

turn_l;until(SENSOR_3 < 40);                  //左に回る

int s = 0;                           //sは2回目のロータリー前までの交差点の回避に使用した
while( s <= 0 ){if((SENSOR_1 > 40) && (SENSOR_3 > 40))     //トレース開始
                {go;}

                if((SENSOR_1 > 40) && (SENSOR_3 < 40))
                {turn_r;}
                    
                if((SENSOR_1 < 40) && (SENSOR_3 > 40))
                {turn_l;}
          
                if((SENSOR_1 < 40) && (SENSOR_3 < 40))
                {s = s+1;
                 Off(OUT_A+OUT_C);go;Wait(50);Off(OUT_A+OUT_C);}
               }

back(30);                             //ロータリーに進入して少しバックする    

turn_r;Wait(60);                         //右に回って                

int r = 0;                            //rは2回目のロータリー内の分岐点の回避に使用した

while( r <= 1 ){if((SENSOR_1 > 40) && (SENSOR_3 > 40))     //ロータリーを進む
                {go;}

                if((SENSOR_1 > 40) && (SENSOR_3 < 40))     //もし外側が黒になったら少し前進
                {r = r+1;Off(OUT_A+OUT_C);go;Wait(5);}
                    
                if((SENSOR_1 < 40) && (SENSOR_3 > 40))
                {turn_l;}
               }

turn_r;Wait(60);

int p = 0;                           //pはゴールまでの交差点の回避に使用した

while( p <= 2 ){if((SENSOR_1 > 40) && (SENSOR_3 > 40))     //ゴールまでトレース
                {go;}

                if((SENSOR_1 > 40) && (SENSOR_3 < 40))
                {turn_r;}
                    
                if((SENSOR_1 < 40) && (SENSOR_3 > 40))
                {turn_l;}
          
                if((SENSOR_1 < 40) && (SENSOR_3 < 40))
                {p = p+1;
                 Off(OUT_A+OUT_C);go;Wait(50);Off(OUT_A+OUT_C);}
               }
}

まとめ紹介

コメントしてくらさい



添付ファイル: file033.JPG 286件 [詳細] file032.JPG 278件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-07-11 (月) 22:16:32