[[2011a]]
目次
#contents

*課題2 ライントレース [#fdc5bc96]

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

    * 通常の交差点が2箇所以上ある
    * ロータリー型の交差点が1箇所以上ある (ロータリーでは反時計まわりに進む)
    * 直角に曲がるコーナーおよびそのコーナーをショートカットするコース(点線)が存在する
    * 急なヘアピンカーブが1箇所以上ある
    * スタート地点に目印がある
    * 黒い線の幅は15〜20mm程度
*メンバー紹介 [#mabcf438]
-大丈V  近道担当
-ばるす! 直角担当
*ロボット紹介 [#u61f190a]
-お名前
美智子(道を走るから美智子)

-FRONT
#ref(032.JPG)

-SIDE
#ref(033.JPG)
*プログラム紹介 [#q090dbb2]
-大丈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);} //ロータリー終わり
*まとめ紹介 [#v21ef617]
-今回はプログラムに重点を置いた。交差点を無視して進む方法やロータリー内の線の超え方を考えるのに苦労した。なるべくタイマーに頼らないようなプログラムを作ることができた。

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

#comment


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