[[2015b/Member]]

目次
#contents

*課題内容 [#rfff7a71]
ライントレースカーの作成

#ref(2015b/Member/nakami/Mission2/2015b-mission2.png);

上の図が課題のコースです。
私は次のような順路でライントレースしました。

A→P直進→Q直進→Q右折→P右折→Q左折→P左折→B

また、課された条件は

・光センサーの使用は一つ

・交差点では1秒間停止する

というものでした。二つ目の条件はロボットが交差点を判断しているかを明確にするためのものです。

*ロボット本体 [#ga13556e]
次の写真がロボットの全体です。

&ref(2015b/Member/nakami/Mission2/image1.JPG,10%);写真1→
&ref(2015b/Member/nakami/Mission2/image1(6).JPG,10%);写真2
&ref(2015b/Member/nakami/Mission2/image2(1).JPG,10%);写真3

ドライブベースのロボットでは動作は左折、右折など進行方向を変えるものから成るため、ロボットの車体の重さで大きなブレが出てしまい、ラインから脱線してしまうことがありました。

そのことを踏まえ、ブレを最小限にするために車体をできる限り軽く簡素に仕上げました。(1のロボット)

1のロボットでも身軽である自信あったのですが、先生のアドバイスにより、後輪をも取り払うことにしました。(2のロボット)そして車体と地面との摩擦を少なくするために、写真3のような部品を取り付けました。この改良により、一層身軽になりました。

*プログラム [#tbb7a2d5]
ライン上を進む、交差点を{直進or右折or左折}するの4つの動きからなるので、サブルーチンと定義を使いました。

定義、サブルーチンのプログラム

 #define THRESHOLD 40
 #define straight OnFwd(OUT_AC);Wait(40);Off(OUT_AC);
 #define light OnFwd(OUT_A);OnRev(OUT_C);Wait(50);Off(OUT_AC);Wait(100);OnFwd(OUT_AC);Wait(40);Off(OUT_AC);
 #define left OnFwd(OUT_C);Off(OUT_A);Wait(50);Off(OUT_AC);
 int tmax=20;
 
 sub line()
 { 
    ClearTimer(0);
    while(FastTimer(0)<=tmax)
     { 
      if (SENSOR_2>49){   //migi旋回
           OnFwd(OUT_A);
           OnRev(OUT_C);
           ClearTimer(0); 
      } else if(SENSOR_2>46){    //migi折
           OnFwd(OUT_A);
           Off(OUT_C);
           ClearTimer(0);
      } else if(SENSOR_2>43){    //中間
           OnFwd(OUT_AC);
           ClearTimer(0);
      } else if(SENSOR_2>39){    //hidari折
           OnFwd(OUT_C);
           Off(OUT_A);
           ClearTimer(0);
      } else {         //hidari旋回
           OnFwd(OUT_C);
           OnRev(OUT_A);
       }
    }//whileカッコ閉
   Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(100);
 }

 

交差点における右折について、左旋回にかかる秒数で交差点かどうかを判断しているために、交差点にて右折したい場合もロボットは必ず左折方向を向いて静止するので、一度その場で右旋回をしてから○○秒間直進する、というプログラムにしました。

また、ライントレースは進行方向の道に対して左側をトレースするために、右折の際には道を横断しなければならないことにも注意しました。

定義、サブルーチンにより、メインタスクは以下のようにシンプルなものになりました。

メインタスクのプログラム

 task main()
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  line();
  straight;   //��
  line();
  straight;  //��
  line();
  light;   //��
  line();
  light;   //��
  line();
  left;   //��
  line();
  tmax=20;
  left;   //��
  line();
  straight;   //��
 }

以上のようなプログラムでは�イ鮓鮑硬世犯獣任垢襪海箸�できませんでした。ラインの構造上、交差点判断のタイマーを短くしなくてはなりませんでした。しかし、TMAXを15、16、17で試したところ、普通のライントレース上でも交差点と誤って感知してしまいました。そこで先生のアドバイスのもと、交差点の数をカウントしていき、�イ砲�ける交差点だけ判断する時間を短くするプログラムにしました。

それは

 int cross=0;

を使い、ライントレースが1区画のライントレースが終わるたびに交差点を数えるプログラムを使いました。

sub line() の最後に

 cross++;

を付け加えます。交差点を4つ通過したあと、�イ慮鮑硬世鯒�知するために�ぁ銑イ里△い世�TMAXをTMAX=15に設定しました。

 if(cross=4){tmax=15};

これで交差点�イ鯣獣任垢襪海箸發任�ました。

*反省、感想 [#ed1a2225]
今回の課題はプログラミングに重点が置かれており、非常に苦手意識を持ちました。先生にたくさんのアドバイスをいただき、やっと完成することができました。時間がかかった分、このプログラム、ロボット本体にすごく愛着を感じています。ありがとうございました。

写真の向きはどうも修正できませんでした。編集したら取り込めないファイルになってしまったり。


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS