目次
#contents

*課題2:黒い線上を動くロボット [#s2a9e895]
次のような周回コース(黒い線)を動くロボットを作成せよ。

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

センサー、モーターはいくつ使ってもよい。プログラムは次の2つを作成すること。

 1. 直角のコーナーを通る
 2. 直角のコーナーを通らない(近道する)

ただし互いに逆方向に周回すること。

*メンバー紹介 [#qf933802]
-イシイ(近道担当)
-ゆきち(直角コーナー担当)

*課題 [#q735ffe3]
**コースについて [#e3f78d38]
**ロボットについて [#ic2a75be]
**問題点について [#t0bab1b1]

*プログラム [#o770212f]
**イシイ [#d645274a]
 #define go(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);             //直進
 #define turn_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);  //右旋回
 #define turn_l(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C);  //左旋回
 #define THRESHOLD 45                                                   //閾値
 
 task main()
 {
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_3,SENSOR_LIGHT);
  
   ClearTimer(0);
   while(FastTimer(0)<=500)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_1<THRESHOLD)
     {
       turn_l(10);
     }
     if(SENSOR_3<THRESHOLD)
     {
       go(20);
     }
   }
   ClearTimer(0);
   while(FastTimer(0)<=800)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_3<THRESHOLD)
     {
       turn_r(10);
     }
     if(SENSOR_1<THRESHOLD)
     {
       go(20);
     }
   }
   ClearTimer(0);
   while(FastTimer(0)<=150)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_3<THRESHOLD)
     {
       turn_r(10)
     }
     if(SENSOR_1<THRESHOLD)
     {
       go(50);
       turn_r(70);
     }
   }
   ClearTimer(0);
   while(FastTimer(0)<=350)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_1<THRESHOLD)
     {
       turn_l(10)
     }
   }
   ClearTimer(0);
   while(FastTimer(0)<=250)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_1<THRESHOLD)
     {
       turn_l(10);
     }
     if(SENSOR_3<THRESHOLD)
     {
       go(50)
       turn_r(60);
     }
   }
   ClearTimer(0);
   while(FastTimer(0)<=550)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_3<THRESHOLD)
     {
       turn_r(20);
     }
   }
   ClearTimer(0);
   while(FastTimer(0)<=300)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_3<=THRESHOLD)
     {
       turn_r(10);
     }
     if(SENSOR_1<=THRESHOLD)
     {
       go(50);
       turn_r(80);
     }
   }
   ClearTimer(0);
   while(FastTimer(0)<=350)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_1<THRESHOLD)
     {
       turn_l(10)
     }
   }
   ClearTimer(0);
   while(FastTimer(0)<=250)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_1<THRESHOLD)
     {
       turn_l(10);
     }
     if(SENSOR_3<THRESHOLD)
     {
       go(50)
       turn_r(100);
     }
   }
   ClearTimer(0);
   while(FastTimer(0)<=400)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_3<=THRESHOLD)
     {
       turn_r(10);
     }
     if(SENSOR_1<=THRESHOLD)
     {
       go(25);
       OnFwd(OUT_A);
       Wait(20);
       Off(OUT_A);
     }
   }
   ClearTimer(0);
   while(FastTimer(0)<=600)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_3<=THRESHOLD)
     {
       OnRev(OUT_A+OUT_C);
       Wait(10);
       Off(OUT_A+OUT_C);
       turn_r(20);
     }
   }
   ClearTimer(0);
   while(FastTimer(0)<=400)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_1<THRESHOLD)
     {
       turn_l(10);
     }
     if(SENSOR_3<THRESHOLD)
     {
       go(25);
     }
   }
   while(SENSOR_3<THRESHOLD)
   {
     OnFwd(OUT_A+OUT_C);
     if(SENSOR_1<THRESHOLD)
     {
       turn_l(10);
     }
   }
   Off(OUT_A+OUT_C);
 } 


**ゆきち [#i0f9386d]
 #define GO(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //前にt秒進む
 #define THRESHOLD 45  //閾値
 
 
 sub RIGHT_CURVE()
   {
         if (SENSOR_3>THRESHOLD)
           {
             OnFwd(OUT_A+OUT_C);
           }
         if (SENSOR_3<THRESHOLD)
           {
             Off(OUT_C);
             OnFwd(OUT_A);
           }
    }
 sub LEFT_CURVE()
   {
         if (SENSOR_1>THRESHOLD)
           {
             OnFwd(OUT_A+OUT_C);
           }
         if (SENSOR_1<THRESHOLD)
           {
             Off(OUT_A);
             OnFwd(OUT_C);
           }
   }
 
 
 task main()
 {
     SetSensor(SENSOR_1,SENSOR_LIGHT);
     SetSensor(SENSOR_3,SENSOR_LIGHT);
 
     ClearTimer(0);
 
    while(FastTimer(0)<=330)
       {
          RIGHT_CURVE();
        }
 
    while(FastTimer(0)<=850)
        {
         if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))
           {
             OnFwd(OUT_A+OUT_C);
           }
         if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))
           {
             OnRev(OUT_A);
             OnFwd(OUT_C);
           }
        }
 
    while(FastTimer(0)<=1100)
       {
             LEFT_CURVE();
     }
 
   while(SENSOR_3>THRESHOLD)
      {
            LEFT_CURVE();
          }
 
    Off(OUT_A+OUT_C);Wait(50);GO(35);
    OnFwd(OUT_A);OnRev(OUT_C);Wait(20);
    
   while(SENSOR_1>THRESHOLD)
      {
    OnFwd(OUT_A);
    OnRev(OUT_C);
          } 
     Off(OUT_A+OUT_C);
 
     OnFwd(OUT_A+OUT_C);
   while(SENSOR_3>THRESHOLD)
     {
            LEFT_CURVE();
     }
 
   Off(OUT_A);OnFwd(OUT_C);Wait(15);
 
   while(SENSOR_3>THRESHOLD)
     {
             LEFT_CURVE();
     } 
 
    Off(OUT_A+OUT_C);Wait(50);GO(35);
    OnFwd(OUT_A);OnRev(OUT_C);Wait(20);
    
   while(SENSOR_1>THRESHOLD)
      {
    OnFwd(OUT_A);OnRev(OUT_C);
          } 
 
    ClearTimer(0);
 
   while(FastTimer(0)<300)
     {
        LEFT_CURVE();
     }
 
   GO(50);
 
   while(FastTimer(0)<700||SENSOR_1>THRESHOLD||SENSOR_3>THRESHOLD)
     {
        if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))
          {
            OnFwd(OUT_A+OUT_C);
          }
        if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))
          {
            OnRev(OUT_A);
            OnFwd(OUT_C);
          }
    }
 
    Off(OUT_A+OUT_C);Wait(50);GO(35);
    OnFwd(OUT_A);OnRev(OUT_C);Wait(20);
    
   while(SENSOR_1>THRESHOLD)
      {
    OnFwd(OUT_A);
    OnRev(OUT_C);
          } 
     Off(OUT_A+OUT_C);
 
     OnFwd(OUT_A+OUT_C);
   while(SENSOR_3>THRESHOLD)
     {
            LEFT_CURVE();
     }
 
   Off(OUT_A);OnFwd(OUT_C);Wait(15);
 
   while(SENSOR_3>THRESHOLD)
     {
             LEFT_CURVE();
     } 
 
    Off(OUT_A+OUT_C);Wait(50);GO(35);
    OnFwd(OUT_A);OnRev(OUT_C);Wait(20);
    
   while(SENSOR_1>THRESHOLD)
      {
    OnFwd(OUT_A);OnRev(OUT_C);
          } 
 
 
    OnFwd(OUT_A+OUT_C);
 
     ClearTimer(0);
 
   while(SENSOR_1>THRESHOLD||SENSOR_3>THRESHOLD)
     {
            LEFT_CURVE();    
     }
 
   GO(15);
 
   while(SENSOR_1>THRESHOLD||SENSOR_3>THRESHOLD)
     {
            LEFT_CURVE();    
     }
 
   GO(10);
 
   while(SENSOR_1>THRESHOLD||SENSOR_3>THRESHOLD)
     {
        if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))
       Off(OUT_A);OnFwd(OUT_C);   {
            OnFwd(OUT_A+OUT_C);
          }
        if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))
          {
            OnRev(OUT_A);OnFwd(OUT_C);
          } 
        if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD))
          {
            OnRev(OUT_C);OnFwd(OUT_A);
          } 
     } 
   Off(OUT_A+OUT_C);
 }

*感想 [#m39f9cd2]
-イシイ~

タイマーを上手く利用して動かすことができたが、時間の調整がとても大変だった。
-ゆきち~


*コメントをどうぞ [#d155cfe7]
#comment


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