2016a/Member

課題2

目次

ロボットの説明

今回も説明書通りのシンプルな構造にしました。

本体.jpg

プログラムの説明

定義について

#define THRESHOLD 55      //閾値
#define SPEED_H 50        //早めのスピード
#define SPEED_H2 45    //やや早めのスピード
#define SPEED_L 25    //遅めのスピード
#define OnRL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_C,speedL);
#define go_forward OnRL(SPEED_H,SPEED_H);     //前進
#define turn_left1 OnRL(SPEED_L,-SPEED_L);         //左折1
#define turn_left0 OnRL(SPEED_L,0);                //左折0
#define turn_left2 OnRL(SPEED_H2,0);               //左折2
#define turn_right0 OnRL(0,SPEED_L);               //右折0
#define turn_right1 OnRL(-SPEED_L,SPEED_L);        //右折1
#define turn_right2 OnRL(0,SPEED_H2);              //右折2
#define cross_right1 turn_right2;Wait(600);Off(OUT_AC);       //右折2を0.6秒間
#define cross_left  turn_left2;Wait(500);Off(OUT_AC);     //左折2を0.5秒間
#define find_line turn_right1;until(SENSOR_1 < THRESHOLD);Off(OUT_AC);   //黒線を見つけるまで右に旋回する
#define cross_right2 turn_right2;Wait(250);Off(OUT_AC);    //右折2を0.25秒間
}

サブルーチンついて

   sub CROSS1()                      //C地点からS左折まで
   {
    SetSensorLight(S1);
   int n    ;            //カウント数をnとおく
   
     while(n < 1400)         //nが1400までの間は下の動きをする
     {
 ★   if(SENSOR_1<THRESHOLD-15)    //閾値-15より低いとき左折1(このときnのカウントを増やす)
       {
      turn_left1;
       n++;
       }
       else if(SENSOR_1<THRESHOLD-7) //閾値-7より低いとき左折0
       {
           turn_left0;
       }
       else if(SENSOR_1<THRESHOLD+7)  //閾値+7より低いとき前進
       {
       go_forward;
       }
       else if(SENSOR_1<THRESHOLD+15)  //閾値+15より低いとき右折0
       {
       turn_right0;
       }
       else              //その他は右折1
       {
       turn_right1;
       }
     }
   Float(OUT_AC);           //慣性力で車体を動かす
★ PlaySound(SOUND_UP);        //交差点で音を鳴らす
   Wait(400);             //停止
   n=0;                //カウントを0に戻す
   }

以降、★〜★の間の行はどのサブルーチンでも同じなのでコメント文は省略します

   sub CROSS2()                //S左折からP左折まで
   {
    SetSensorLight(S1);
   int j    ;                 //カウント数をjとおく
   
     while(j < 4700)              //カウント数が4700までの間
     {
  ★   if(SENSOR_1<THRESHOLD-15)
       {
             turn_left1;
          j++;
       }
        else if(SENSOR_1<THRESHOLD-7)
          {
                turn_left0;
          }
           else if(SENSOR_1<THRESHOLD+7)
             {
              go_forward;
             }
              else if(SENSOR_1<THRESHOLD+15)
                  {
                   turn_right0;
                   }
                    else
                        {
                         turn_right1;
                        }
     }
   Float(OUT_AC);
   PlaySound(SOUND_UP);
★ Wait(400);
   j=0;                                 //カウント数をリセット
  }
   sub CROSS3()             //P左折からQ直進
   {
    SetSensorLight(S1);
   int k    ;              //カウント数をkとおく
   
     while(k < 6950)          //カウント数が6950までの間
     {
  ★  if(SENSOR_1<THRESHOLD-15)
       {
      turn_left1;
       k++;
       }
       else if(SENSOR_1<THRESHOLD-7)
       {
           turn_left0;
       }
       else if(SENSOR_1<THRESHOLD+7)
       {
       go_forward;
       }
       else if(SENSOR_1<THRESHOLD+15)
       {
       turn_right0;
       }
       else
       {
       turn_right1;
       }
     }
   Float(OUT_AC);
   PlaySound(SOUND_UP);
★ Wait(2000);
   cross_right2;                                 //右旋回
   find_line;                  //黒い線を見つけるまで右に旋回
   k=0;                     //カウント数を0に戻す
   }
   
   sub CROSS4()                    //Q直進からQ直進
   {
    SetSensorLight(S1);
   int n    ;                     //カウント数をnとおく
   
     while(n < 14100)                 //カウント数が14100までの間
     {
  ★  if(SENSOR_1<THRESHOLD-15)
       {
      turn_left1;
       n++;
       }
       else if(SENSOR_1<THRESHOLD-7)
       {
           turn_left0;
       }
       else if(SENSOR_1<THRESHOLD+7)
       {
       go_forward;
       }
       else if(SENSOR_1<THRESHOLD+15)
       {
       turn_right0;
       }
       else
       {
       turn_right1;
       }
     }
   Float(OUT_AC);
   PlaySound(SOUND_UP);
★ Wait(400);
   cross_right2;                           //右旋回
   find_line;               //黒い線を見つけるまで右旋回
   n=0;                  //カウント数をリセット
  }
   sub CROSS5()              //Q直進からR右折
   {
    SetSensorLight(S1);
   int n    ;               //カウント数をnとおく
   
     while(n < 4100)            //カウント数が4100までの間
     {
  ★  if(SENSOR_1<THRESHOLD-15)
       {
      turn_left1;
       n++;
       }
       else if(SENSOR_1<THRESHOLD-7)
       {
           turn_left0;
       }
       else if(SENSOR_1<THRESHOLD+7)
       {
       go_forward;
       }
       else if(SENSOR_1<THRESHOLD+15)
       {
       turn_right0;
       }
       else
       {
       turn_right1;
       }
     }
   Float(OUT_AC);
   PlaySound(SOUND_UP);
★ Wait(400);
   cross_right1;                          //少しだけ右旋回
   find_line;               //黒い線まで右旋回
   n=0;                  //カウント数を0にする
   }
   sub CROSS6()             //R左折からP左折
   {
    SetSensorLight(S1);
   int n    ;              //カウント数をnとおく
   
     while(n < 920)           //カウント数が920までの間
     {
  ★  if(SENSOR_1<THRESHOLD-15)
       {
      turn_left1;
       n++;
       }
       else if(SENSOR_1<THRESHOLD-7)
       {
           turn_left0;
       }
       else if(SENSOR_1<THRESHOLD+7)
       {
       go_forward;
       }
       else if(SENSOR_1<THRESHOLD+15)
       {
       turn_right0;
       }
       else
       {
       turn_right1;
       }
     }
   Float(OUT_AC);
   PlaySound(SOUND_UP);
★ Wait(400);
   n=0;                         //カウント数を0に戻す
   }
   sub CROSS7()             //P左折からA地点まで
   {
    SetSensorLight(S1);
   int n    ;              //カウント数をnとする
   
     while(n < 10000)          //カウント数が10000までの間
     {
 ★    if(SENSOR_1<THRESHOLD-15)
       {
      turn_left1;
       n++;
       }
       else if(SENSOR_1<THRESHOLD-7)
       {
           turn_left0;
       }
       else if(SENSOR_1<THRESHOLD+7)
       {
       go_forward;
       }
       else if(SENSOR_1<THRESHOLD+15)
       {
       turn_right0;
       }
       else
       {
       turn_right1;
       }
     }
   Float(OUT_AC);
   PlaySound(SOUND_UP);
   Wait(400);
   go_forward;
★ Wait(700);
   n=0;                //カウント数を0に戻す
   }

カウント数について

カウント数とは交差点から交差点の間で、黒い部分を通った回数を表しています。 そのカウント数が一定数に達すると、次の動作に移るようにしました。

交差点の判断について

交差点の判断はカウント数を利用して判断させました。それぞれの区間にそれぞれのカウント数を決めて、交差点にさしかかる所でカウント数が一定数に達するようにしました。 定めたカウント数に達すると一時停止をし、直進や右左折をするようにしました。

プログラム

task main()
    {
      CROSS1();
     Wait(1000);
     CROSS2();
     Wait(1000);
     CROSS3(); 
     Wait(1000);
     CROSS4(); 
     Wait(1000);
     CROSS5();
     Wait(1000);
     CROSS6();
     Wait(1000);
     CROSS7();
     Float(OUT_AC);
   
   }

直進と右左折の仕方

黒い線の左側を走らせることでカウント数を増やしているため、左折は特別なことをせずに攻略できます。 直進は下の写真のような状況から、cross_right1をし、find_lineをして2枚目の写真のように直進のコースに移動させます。

修正前.jpg
修正後.jpg

右折は直進と違って、cross_right2をして、さらに右側のコースに移動できるようにさせます。

考察・気づいた点

・電池を交換するとロボットの動きが良くなるので、カウントはさらに減る。
・カウントは右カーブより左カーブの方が増えやすい。カーブが急なほど、カウントも多くなりました。
・もしスタート地点がずれていたら、すべての動作がずれてしまうのが欠点。
・カウントを設定した値より約200増やしても交差点の攻略はできました。
・カウントを蓄積して交差点を攻略するという方法をやってしまったので、カウントが一回の動作で、ある一定数に達したらそこは交差点だというような判断方法にすべきだった
(交差点は直線やカーブよりも黒い部分が長く続くことを利用する)。

感想

交差点で停止するようにカウント数を調整することがとても時間がかかって大変でした。メンバーみんなで助け合って完成させることができました。


添付ファイル: file修正後.jpg 115件 [詳細] file修正前.jpg 131件 [詳細] file本体.jpg 140件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-06 (土) 16:49:39 (1112d)