2011a 目次

課題2 ライントレース

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

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

メンバー紹介 

  • 大丈V  近道担当
  • ばるす! 直角担当

ロボット紹介

  • お名前 美智子(道を走るから美智子)
  • FRONT
    032.JPG
  • SIDE
    033.JPG

プログラム紹介

  • 大丈V
#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);}
               }
}
  • ばるす!
    //逆走直角
    
    #define THRESHOLD 40   // 閾値
    
    #define Do  554       //[ド]の音楽
    #define Re  1175      //[レ]の音楽
    #define Mi  1319      //[ミ]の音楽
    #define Fa  1480      //[ファ]の音楽
    #define Sol 1568      //[ソ]の音楽
    #define Si 494        //[シ]の音楽
    SetSensor(SENSOR_1,SENSOR_LIGHT);   //センサーの定義
    SetSensor(SENSOR_3,SENSOR_LIGHT);   //センサーの定義
    int t = 0;           //回数の定義
    int u = 0;           //回数の定義
    int v = 0;           //回数の定義
    int w = 0;           //回数の定義
    int x = 0;           //回数の定義
    
    task play_music1()   // 音楽を演奏するタスク(ロータリーまでVer)
    {
      while (true)                
        {
           PlayTone(Re,10); Wait(15);
           PlayTone(Mi,10);Wait(15);
           PlayTone(Fa,25);Wait(30);
           PlayTone(Fa,25);Wait(30);
           PlayTone(Fa,25);Wait(30);
           PlayTone(Re,10); Wait(15);
           PlayTone(Mi,10);Wait(15);
           PlayTone(Fa,25);Wait(30);
           PlayTone(Fa,25);Wait(30);
           PlayTone(Fa,25);Wait(30);
           PlayTone(Re,10); Wait(15);
           PlayTone(Mi,10);Wait(15);
           PlayTone(Fa,25);Wait(30);
           PlayTone(Fa,25);Wait(30);
           PlayTone(Sol,55);Wait(70);
           PlayTone(Fa,10);Wait(15);
           PlayTone(Mi,45);Wait(90);
           PlayTone(Do,10);Wait(15);
           PlayTone(Re,10);Wait(15);
           PlayTone(Mi,25);Wait(30);
           PlayTone(Mi,25);Wait(30);
           PlayTone(Mi,25);Wait(30);
           PlayTone(Do,10);Wait(15);
           PlayTone(Re,10);Wait(15);
           PlayTone(Mi,25);Wait(30);
           PlayTone(Mi,25);Wait(30);
           PlayTone(Mi,25);Wait(30);
           PlayTone(Do,10);Wait(15);
           PlayTone(Re,10);Wait(15);
           PlayTone(Mi,25);Wait(30);
           PlayTone(Mi,25);Wait(30);
           PlayTone(Fa,15);Wait(15);
           PlayTone(Mi,15);Wait(15);
           PlayTone(Mi,15);Wait(15);
           PlayTone(Fa,15);Wait(15);
           PlayTone(Re,30);Wait(30);
    
         }
    }
     
    task main()                     //メインのプログラム
    {
     start play_music1 ;    // 演奏を開始
    while(t <= 2 ){                                    //tが2以下の間ループする
    
    
    
    
    if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD))  //もしも両方白線なら、
    {OnFwd(OUT_A+OUT_C);}                               //直進して
    if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD))  //もしも右が黒かったら、
    {OnFwd(OUT_A);OnRev(OUT_C);}                        //左を進め、
    if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD))  //もしも左が黒かったら、
    {OnFwd(OUT_C);OnRev(OUT_A);}                        //右を進める。
    if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD))  //で、両方黒線を踏んだら、
    {
    t = t+1;                                            //t+1
    
    Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C);Wait(100);}     //動作を止めて無条件に1秒進む
    
    
    
                 }
    stop play_music1 ;     // 演奏を停止
    Off(OUT_A+OUT_C);                                  //本体もとめる
    OnRev(OUT_A+OUT_C);Wait(50);
    Off(OUT_A+OUT_C);
    OnFwd(OUT_A);OnRev(OUT_C);Wait(100);
    while( u <= 1 ){                                    //ロータリー開始
    if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD))  //もしも両方白線なら、
    {OnFwd(OUT_A+OUT_C);}                               //直進して
    if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD))  //もしも右が黒かったら、
    {u = u+1;
    Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C);Wait(10);}                        //uを+1
    if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD))  //もしも左が黒かったら、
    {OnFwd(OUT_C);Off(OUT_A);}                        //右を進める。
    
    }
    Off(OUT_A+OUT_C);OnFwd(OUT_A);OnRev(OUT_C);Wait(100);  //ロータリー終わり
    
     
    
    
    
    while(v <= 0 ){                   //第一ロータリーから第二ロータリーの間の道(直角)
    
    
    
    
    if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD))  //もしも両方白線なら、
    {OnFwd(OUT_A+OUT_C);}                               //直進して
    if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD))  //もしも右が黒かったら、
    {OnFwd(OUT_A);OnRev(OUT_C);}                        //左を進め、
    if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD))  //もしも左が黒かったら、
    {OnFwd(OUT_C);OnRev(OUT_A);}                        //右を進める。
    if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD))  //で、両方黒線を踏んだら、
    {
    v = v+1;                                            //v+1
    
    Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C);Wait(100);}     //動作を止めて無条件に1秒進む
    
    
    
                  }
    Off(OUT_A+OUT_C);
    OnRev(OUT_A+OUT_C);Wait(50);
    Off(OUT_A+OUT_C);
    OnFwd(OUT_A);OnRev(OUT_C);Wait(100);
    while(w <= 2 ){
    
    
    
    
    if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD))  //もしも両方白線なら、
    {OnFwd(OUT_A+OUT_C);}                               //直進して
    if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD))  //もしも右が黒かったら、
    {OnFwd(OUT_A);OnRev(OUT_C);}                        //左を進め、
    if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD))  //もしも左が黒かったら、
    {OnFwd(OUT_C);OnRev(OUT_A);}                        //右を進める。
    if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD))  //で、両方黒線を踏んだら、
    {
    w = w+1;                                            //tを一つ加えて
    
    Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C);Wait(100);}     //動作を止めて無条件に1秒進む
    
    
    
                 }
    Off(OUT_A+OUT_C);
    OnRev(OUT_A+OUT_C);Wait(50);
    Off(OUT_A+OUT_C);
    OnFwd(OUT_A);OnRev(OUT_C);Wait(100);
    while( x <= 1 ){
    if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD))  //もしも両方白線なら、
    {OnFwd(OUT_A+OUT_C);}                               //直進して
    if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD))  //もしも右が黒かったら、
    {x = x+1;
    Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C);Wait(10);}                        //uを+1
    if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD))  //もしも左が黒かったら、
    {OnFwd(OUT_C);Off(OUT_A);}                          //右を進める。
    
    }
    Off(OUT_A+OUT_C);OnFwd(OUT_A);OnRev(OUT_C);Wait(100);} //ロータリー終わり

まとめ紹介

  • 今回はプログラムに重点を置いた。交差点を無視して進む方法やロータリー内の線の超え方を考えるのに苦労した。なるべくタイマーに頼らないようなプログラムを作ることができた。

コメントしてくらさい

  • コースを学校に忘れたからあとで写真載せます -- 大丈V? 2011-06-24 (金) 13:22:22
  • 終わったりー -- ばるす!? 2011-06-17 (金) 17:51:03
  • それぞれの変数の役割も説明してください。 -- 松本 2011-06-30 (木) 16:07:21
  • 終了! -- ばるす!? 2011-07-07 (木) 14:49:53


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

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