2008b

課題 ライントレースロボットの作成

内容

チームで作成したコースに沿って動くロボットを作成

注意点

  • 速さと正確さを追求すること
  • 交差点で優先側を走っていない場合には、一時停止すること
  • 前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと
  • コースを2周したら自動的に止まること

目次

コース

コースは変則的にカーブを織り交ぜ、交差点が4つあるコースを作った。

コース

特に考えずに書いてみたら交差点のうち3つが一か所に集中してしまったので難易度が高くなった。

ロボット製作

IMGP0155.JPG

今回のロボットで重要なのはセンサーだ。製作面では特に苦労する部分もなくロボ自体は割と簡単に作ることができた。なのでシンプルなロボができた。

ベース製作

今回のベースはドライブベースをもとに製作した。

製作当初からコースに大きなカーブが多くタイヤの摩擦が大きいことが考えられたので、 四輪ではなく三輪で制作することに決定した。

IMGP0154.JPG

最初は中くらいのタイヤを使用していたが、もう一つのチームが大きなタイヤを使っていて速度に差が生じたので、こちらも大きなタイヤを使うことにした。

センサー取り付け

光センサーは二つ取り付けた。二つの光センサーでコースの黒線を挟むようにして進めることにした。

その光センサーの前方にタッチセンサーを取り付けた。

IMGP0153.JPG

タッチセンサーは相手のロボのどこにぶつかっても反応できるようにバンパーを二重にし、その間に相手のロボが入り込まないように補強を施した。

キャスター

キャスターは十分に動くスペースを確保し、車体が傾かないように高さを調節した。

IMGP0156.JPG

さらに相手のバンパーがぶつかっても問題のないようにブロックを積んで高くした。

プログラム

このロボットはコースの黒線を光センサーが挟むように作られているのでセンサーが黒線を感知した時に方向修正するプログラムを作った。 具体的には、右のセンサーが黒を感知したら右へ、左なら左へ方向修正できるようにした。

今回のプログラム

#define THRESHOLD 40                        //閾値
#define RUN_TIME   5
int move_count;                     //変数
task main()
 {
SetSensor(SENSOR_1, SENSOR_LIGHT);            //センサ−1は光センサー
SetSensor(SENSOR_2, SENSOR_TOUCH);            //センサ−2はタッチセンサー
SetSensor(SENSOR_3, SENSOR_LIGHT);            //センサ−3は光センサー
move_count = 0;                               //変数に0を代入
while(move_count <= 8)                        //値が8以下の間
{
 if(SENSOR_2==0)                              //値が0なら
  {
  if((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD))  //光センサーが二つとも白の上にある場合直進する。
    {
      OnFwd(OUT_A+OUT_C);
      }
  if(SENSOR_3 < THRESHOLD)                //右のセンサーが黒の上にある場合タイマー0をリセット・スタート。
                              タイマー0が0.05秒以下なら左タイヤのみで曲がる。
                              タイマー0が0.05秒を超えたら右タイヤも後転させて曲がる。
    {ClearTimer(0);
       while(FastTimer(0) <= RUN_TIME)
       {
        (SENSOR_3 < THRESHOLD);
          Off(OUT_C);
          OnFwd(OUT_A);}
       OnRev(OUT_C);OnFwd(OUT_A);}
  if (SENSOR_1 < THRESHOLD)               //左のセンサーが黒の上にある場合タイマー1をリセット・スタート。
                              タイマー1が0.05秒以下なら右タイヤのみで曲がる。
                              タイマー1が0.05秒を超えたら左タイヤも後転させて曲がる。
     {ClearTimer(1);
        while(FastTimer(1) <= RUN_TIME)
        {
         (SENSOR_1 < THRESHOLD);   
           Off(OUT_A);
           OnFwd(OUT_C);}
        OnRev(OUT_A);OnFwd(OUT_C);}
  if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD))  //センサーが二つとも黒の上にある場合2秒停止。その後0.7秒直進。このとき変数の値を+1する。
     {
       Off(OUT_A+OUT_C);Wait(200);
       OnFwd(OUT_A+OUT_C);Wait(70);(move_count);
             move_count = move_count +1;
      }}
 if(SENSOR_2==1)                     //タッチセンサーに何かが触れた場合0.8秒後進。
                               0.5待機し、0.8秒前進し、元の位置に戻る。
 {
   OnRev(OUT_A+OUT_C);Wait(80);
   Off(OUT_A+OUT_C);Wait(50);
   OnFwd(OUT_A+OUT_C);Wait(80);
  }     
 }Off(OUT_A+OUT_C);                   //変数の値が8を超えた場合停止する。
}

プログラムの工夫点

最初はセンサーが黒を感知したら片方のタイヤをとめ、もう片方のタイヤを前転させることでカーブを曲がっていた。しかしこのプログラムだと、少しカーブが急になると曲がり切れずに脱線してしまうことがわかった。そこで、正確にカーブを曲がりきるためにタイマーを用いた。もし0.05秒以上センサーが黒を感知したら、つまり曲がり切るのに時間がかかったら、止めていたタイヤを後転させて曲がるスピードを上げた。

ロボを二周で止めるのには変数を使用した。交差点で一時停止するように黒線を横に引いた。ロボが二つのセンサーで黒を感知、つまり黒の横線の上に着いたら、変数の値を+1して、値が8を超えると停止するように設定した。

発表を終えて

最初は何度ロボを走らせても必ず失敗していて、全く完走しなかった。しかし、コースを逆に走らせてみると、とてもすんなりと完走することができた。発表の時はうまく相手のロボをよけてくれるかが心配だったが、なんとか成功することができた。しかしその後、別のことを試しているときにロボが机から落ちて大破するという事件が起こってしまった。しかし基本的には大きなミスもなく、グループのロボが二台とも完走できたのでよかった。

コメントをどうぞ

  • なかなか工夫されていてよいプログラムだと思います -- なかむら? 2009-02-06 (金) 11:11:33

カーブを曲がる際の工夫はとても面白いと思います。 FI


添付ファイル: fileIMGP0145.JPG 256件 [詳細] fileIMGP0156.JPG 240件 [詳細] fileIMGP0155.JPG 244件 [詳細] fileIMGP0154.JPG 256件 [詳細] fileIMGP0153.JPG 285件 [詳細] fileIMGP0152.JPG 149件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-02-06 (金) 11:11:33 (3852d)