2016a/Member

ロボティクス入門ゼミ 課題2

課題の説明

?plugin=attach&refer=2016a%2FMission2&openfile=2016a-mission2.png

幅2cmの黒い線をなぞります。今回はB地点からC地点までのコースに挑戦しました。

概要

黒の線をライントレースします。光センサーを使って白と黒を認識させ、プログラム通りに動かします。
主にこのプログラムは交差点を認識させるのがミソになっていると思います。
やり方は大きく2つあり、時間を測ってやるやり方と、回数を測ってやるやり方です。

ro1.jpg

逆さになってしまいましたが、、、、

ro2.jpg

プログラム

  • 定義
    #define THRESHOLD 45
    #define go_forward  OnFwd(OUT_AC);
    #define turn_left1  OnFwd(OUT_C); OnRev(OUT_A);
    #define turn_left0  OnFwd(OUT_C); Off(OUT_A);
    #define turn_right0 OnFwd(OUT_A); Off(OUT_C);
    #define turn_right1  OnFwd(OUT_A); OnRev(OUT_C);
    #define STEP1
  • 交差点の判別
    subを使っての交差点判断は大きく分けて、時間による判断と回数による判断があります。
    自分は回数で定義しました。
    左右それぞれに大きく旋回する場合と、小さく旋回する場合とでライントレースする線の明るさ
    によって区別されています。今回は10回未満の場合としました。
    定義した明るさに対して右折の場合、左折の場合でそれぞれ回数が足されていき、定義された数
    までいくとそれぞれのほうに曲がります。
  • 前進するサブルーチン
    sub cross_fwd()
    {
      SetSensor(SENSOR_2,SENSOR_LIGHT);
      {
         if (SENSOR_2 < THRESHOLD -8) {
           turn_left1; 
         } else if (SENSOR_2 < THRESHOLD -3) {
           turn_left0; 
         } else if (SENSOR_2 < THRESHOLD +3) {
          turn_right1;   
         } else if (SENSOR_2 < THRESHOLD +8) {
           turn_right0; 
          }
       }
        Off(OUT_AC); Wait(100); go_forward;
    }
  • 交差点で右折するサブルーチン
sub cross_right()
{
 SetSensor(SENSOR_2,SENSOR_LIGHT);
   int n=0;
   while (n<10) {
     if (SENSOR_2 < THRESHOLD -8) {
       turn_left1; n=0;
     } else if (SENSOR_2 < THRESHOLD -3) {
       turn_left0; n=0;
     } else if (SENSOR_2 < THRESHOLD +3) {
       turn_right1; n++;   
     } else if (SENSOR_2 < THRESHOLD +8) {
       turn_right0; n++;
      }
   } 
    Off(OUT_AC); Wait(100); turn_right1;
}
  • 交差点で左折するサブルーチン
sub cross_left()
{
  SetSensor(SENSOR_2,SENSOR_LIGHT);
   int n=0;
   while (n<10) {
     if (SENSOR_2 < THRESHOLD -8) {
       turn_left1; n++;
     } else if (SENSOR_2 < THRESHOLD -3) {
       turn_left0; n++;
     } else if (SENSOR_2 < THRESHOLD +3) {
       turn_right1; n=0;   
     } else if (SENSOR_2 < THRESHOLD +8) {
       turn_right0; n=0;
      }
   }
    Off(OUT_AC); Wait(100); turn_left1;
}
  • 最終的に止まるサブルーチン
sub cross_stop()
{
 SetSensor(SENSOR_2,SENSOR_LIGHT);
  {
     if (SENSOR_2 < THRESHOLD -8) {
       turn_left1; 
     } else if (SENSOR_2 < THRESHOLD -3) {
       turn_left0; 
     } else if (SENSOR_2 < THRESHOLD +3) {
       turn_right1;   
     } else if (SENSOR_2 < THRESHOLD +8) {
       turn_right0; 
      }
   }
   Off(OUT_AC); 
}
  • 時間を決めてライントレースするインライン関数
void line_follow(int t)
{
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  ClearTimer(0);
 
  while (Timer(0)<t) {
  if (SENSOR_2<THRESHOLD -8){turn_left1;}
  else if (SENSOR_2<THRESHOLD -3){turn_left0;}
  else if (SENSOR_2<THRESHOLD +3){turn_right1;}
  else if (SENSOR_2<THRESHOLD +8){turn_right0;}
  Wait(100);
  }
 Off(OUT_AC);
}
  • 本文
task main()
{
  line_follow(30);  //BからRまで
  cross_right();    //R
  line_follow(800); //RからQ
  cross_fwd();      //Q
  line_follow(150); //QからQ
  cross_fwd();      //Q
  line_follow(800); //QからP
  cross_right();    //P
  line_follow(800);  //PからSまで
  cross_right();    //S 
  line_follow(400);  //SからCまで
  cross_stop();      //停止
}

感想

交差点を認識させるのが難しく、思ったとおりに動いてくれないのが残念でした。
時間をかけて作ったつもりですが、毎回やるたびに違うタイミングでコースを走るので、
時間を指定したりする時、とても苦労しました。
最終的にちゃんと動いてくれなかったのですが、友達に教えてもらったりして、
ある程度の形ではプログラムを作ることが出来ました。
小さい頃遊んだ自分にとって親しみ深いレゴにこんなに苦戦するとは思っても見ませんでした。
いろいろ失敗して、原因も自分でわかったものもありますが、ほとんど周りの人に教えて
もらって作りました。チームの友達や周りで助けてくれた人にはとても感謝しています。


添付ファイル: filero1.jpg 105件 [詳細] filero2.jpg 101件 [詳細] filero2 60件 [詳細] filero1 75件 [詳細]

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