[[2011a]]
目次
#contents

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

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

    * 通常の交差点が2箇所以上ある
    * ロータリー型の交差点が1箇所以上ある (ロータリーでは反時計まわりに進む)
    * 直角に曲がるコーナーおよびそのコーナーをショートカットするコース(点線)が存在する
    * 急なヘアピンカーブが1箇所以上ある
    * スタート地点に目印がある
    * 黒い線の幅は15〜20mm程度
*メンバー紹介 [#mabcf438]
-大丈V
-ばるす!
*コース紹介 [#l6bc2e3b]
こんな感じ
*ロボット紹介 [#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;
 
 
 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;
 
 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;
 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;
 
 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;
 
 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 
 
 task play_music1()   // 音楽を演奏するタスク
 task play_music1()   // 音楽を演奏するタスク(ロータリーまでVer)
 {
    while (true)                //ロータリーまで音楽
    while (true)                
    {
        PlayTone(Re,10); Wait(15);  // Wait の時間の方を少し長くして
        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);  // Wait の時間の方を少し長くして
        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);  // Wait の時間の方を少し長くして
        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()
 {
 
 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;
 
 start play_music1 ;    // 演奏を開始
 while(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を一つ加えて
 
 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);  //Ρっ足りーO輪リー
 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を一つ加えて
 
 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);}                        //右を進める。

 {OnFwd(OUT_C);Off(OUT_A);}                          //右を進める。
 
 }
 Off(OUT_A+OUT_C);OnFwd(OUT_A);OnRev(OUT_C);Wait(100);  //Ρっ足りーO輪リー
 }
 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};

#comment


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