2007a/MemberOnly/進行状況A

メンバー紹介

●新井田 宏

●荒川 舞

以上2名です。

課題

ライン・トレース

紙の上に書かれた2〜3cmのライン上を走るロボットの作成。
A7R班との合同作業で、1つのコース上を2台のロボットが走り、ロボット同士がぶつかった場合は後ろのロボットが一時停止をする仕様に。
また、コースには優先道路を作るのが決まりで、優先道路を横切る際には一時停止をしなければいけない仕組みになっています。

ロボットのこと

完成品。今回はシンプルに収まりました。

  ↓横から                            ↓上から                    ↓正面から
all-parts.JPG all-parts-above.JPG all-parts2.JPG
車体前方の青いパーツが''光センサー''。
黒い触覚のようなパーツに触れるとその奥にある(光センサーとこのパーツの間辺り)、''タッチセンサー''が作動します。

ローラー

テキストに載っていた、最初のタイヤの構造をそのまま利用しています。
同じサイズのギアを2つずつと、小さいギアをいつずつ組み合わせて、タイヤを動かしています。
写真では解りづらいですが、前後でサイズの違うタイヤを使っているので、少し前のめりになっています。

no-parts.JPG

  • 工夫・苦労した点

最初はスピード重視にしようと、大車輪を付けたロボットを作成しました。
しかし、大車輪を付けた際にスピードが出すぎてしまい、ロボットのコントロールやセンサーの調整が難しくなってしまったので、
元のロボットに戻すことにしました。

タッチセンサー

テキストに載っているシングルバンパーとほぼ同様の仕様です。
全面の黒いパーツに何か触れると、白い輪ゴムの部分が奥へと動き、
黄色い輪ゴムの奥にあるタッチセンサーを押すようになっています。

  ↓センサーのみ                           ↓装着
touch.JPG no-light.JPG

  • 工夫・苦労した点

2台のロボットをコース上で走らせるため、あまりロボットを大きくすると走る際に変な接触を起こしやすいのではないかと思いました。
そこで、シングルバンパーの最後のバンパー部分を小さいサイズに変更して、ロボットを少しでも小型化させることにしました。

また、実は車体が少し斜めに傾いていることで、障害物に当たった際のセンサーの反応が悪いことがわかりました。
これは、センサーとの接触部分に輪ゴムを巻くことで、センサーとの接触をよくすることで改善することができました。

光センサー


何かを挟むように2つ着いているパーツが光センサーです。
タッチセンサーと本体の接合部の少し前を挟むようにして置きました。

light.JPG

  • 工夫・苦労した点
  • 光センサーを1つ使うか2つ使うか
    色々考えた結果、センサー1つでは課題であるプログラムを組んで実行するには大変そうであるということと、
    センサー2つを使ったプログラムでの方向性が見えてきたことから、2つ使うということで決定しました。
  • 光センサーをロボットのどの位置に付けるか
    ロボットの前に付けるという構造はすぐに作ることができました。
    その後どの様に付けるかとなった際、バンパーの一部に取り付けることができそうな場所を発見し、
    そこを少し改造することで上手く取り付けることができました。
  • 2つの光センサーの幅をどれくらいにするか
    コースに書かれたラインの幅が2〜3cmでしたので、センサーの幅はそれより大きくしなければいけませんでした。
    しかし、大きすぎてもラインを正確に辿れなくなり、逆に小さくても移動がスムーズにいきません。
    そこで、調整がしやすい仕組みでセンサーを固定し、何度も調整を重ねた結果今の形になりました。

プログラム

1人目

#define go_straight OnFwd(OUT_A+OUT_C);    //直進
#define turn_right OnFwd(OUT_A);Off(OUT_C);  //右回転
#define turn_left OnFwd(OUT_C);Off(OUT_A);   //左回転
#define back(t) OnRev(OUT_A+OUT_C);Wait(t);  //t秒間後退
#define stay(t) Off(OUT_A+OUT_C);Wait(t);   //t秒間停止
#define light 40
sub line_check()    //優先道路を横断した後、ラインをチェックさせる
{
ClearFastTimer(0);
OnFwd(OUT_C);
OnRev(OUT_A);
until((FastTimer(0)=>50) || (SENSOR_1<light) || (SENSOR_3<light));
  if(SENSOR_1<light){      //左側にラインがあった場合
    OnFwd(OUT_C);        //ラインを挟む
    OnRev(OUT_A);
    until(SENSOR_1>light);
    Off(OUT_A+OUT_C);
  }
  if(SENSOR_3<light){      //きちんとラインを挟んでいた場合
    OnFwd(OUT_A);        //方向を修正する
    OnRev(OUT_C);
    Wait(10);
    Off(OUT_A+OUT_C);
  }
  if(FastTimer(0)=>50){     //右側にラインがある場合
    OnFwd(OUT_A);        //ラインを挟む
    OnRev(OUT_C);
    until(SENSOR_1<light)
    OnFwd(OUT_C);        //方向を修正する
    OnRev(OUT_A);
    Wait(10);
    ClearFastTimer(0);
  }
}      
task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_2,SENSOR_TOUCH);
   SetSensor(SENSOR_3,SENSOR_LIGHT);

   while(true){
      if((SENSOR_1>light)&&(SENSOR_3>light)){  //ラインを正常に挟んでいる場合
         go_straight;
      }
      if(SENSOR_1<light){            //右寄りになった場合
         turn_left;
      }
      if(SENSOR_3<light){            //左寄りになった場合
         turn_right;
      }
      if(SENSOR_2==1){              //接触があった場合
         back(50);
         stay(200);
      }
      if((SENSOR_1<light)&&(SENSOR_3<light)){   //優先道路を横断する場合
         stay(200);
         go_straight;
         Wait(70);
         line_check();                //ラインをチェックさせる
      }
   }
}
  • 工夫・苦労した点
    • できるだけスピードを落とさないように、ライントレースをするプログラムということで、カーブをトレースする際のプログラムに悩まされました。
    • 優先道路を横断した際に、ラインから外れるのを防ぐためにラインをチェックするプログラムを作成してみました。
      その際タイマーの使用にも挑戦してみました。

2人目

//黒い線でない部分をトレースする。

#define THRESHOLD 40          //光センサーの閾値を設定

task main ()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT);   //センサー1:光センサー1
  SetSensor(SENSOR_2,SENSOR_TOUCH);      //センサー2:タッチセンサー
  SetSensor(SENSOR_3,SENSOR_LIGHT);      //センサー3:光センサー2
  while(true){
     if(SENSOR_2 == 1){                  //(A),タッチセンサーが作動した時
        OnRev(OUT_A+OUT_C);Wait(50);     //後退
        Off(OUT_A+OUT_C);Wait(500);
        }
     else{                               //(A),タッチセンサーが作動しない時          
       if(SENSOR_1> THRESHOLD){          //(B),光センサー1が黒線上でない時
            if(SENSOR_3 > THRESHOLD){    //(C),光センサー2が黒線上でない時
                 OnFwd(OUT_C);           //前進
                 OnFwd(OUT_A);
                 }
            else{                  //(C),光センサー2が黒線上の時
                 Off(OUT_A+OUT_C);       //左に曲がる
                 OnFwd(OUT_A);Wait(1);
                 }
       }
       else{               //(B),光センサー1が黒線上の時
            if(SENSOR_3> THRESHOLD){     //(D),光センサー2が黒線上でない時
                 Off(OUT_A+OUT_C);       //右に曲がる 
                 OnFwd(OUT_C);Wait(1);

                 }
            else{                        //(D),光センサー2が黒線上の時
                 Off(OUT_A+OUT_C);Wait(100);   //一時停止して前進
                 OnFwd(OUT_A+OUT_C);Wait(30);
                 }
           }
       }
   } 
}

  • 工夫・苦労した点 「if」「else」の繰り返しでプログラムを作成しました。
    以前の書道ロボットと違い、プログラム作成もスムーズにいきました。
    優先道路の一時停止と、もう一つのロボットとぶつかった時の行動が
    もう少し細かくプログラムすると、どんな状況にも対応できるようになるかな、と思いました。

コース

コース画像

line.jpg

コースの説明

最初に一直線のストレートがあり、その後右回転、左回転、右回転を行い元の位置に戻ってくるコース。(※逆向きに走ると左右反対になります。)
優先道路の位置はちょうど半回転したポジションで、回転の切れ間に位置することになります。

追記


今回の課題の手順として、
「プログラムの構想→トレースするラインの作成」という形をとりました。
プログラムの事をある程度考えながら、ラインを書いていたということです。
ほぼ完成した後で先生に言われたのですが、
「本当ならラインを何も考えず先に書いて欲しかった。」とのことでした。
先にラインを書いてしまったら、
「いろいろと問題が出てきて、そのためにプログラムにいろいろと工夫を入れなくてはならなくなる」だからだそうです。
それが大変そうでこういった手順をとったわけですが、そういわれると何も考えず先にラインを書くのも良かったかもしれません。

そういったエピソードもありました。

感想

 '' ●新井田 宏''
今回はロボット作成の方を主に担当して、プログラムの方の調整は荒川さんにやってもらう形になりました。
ロボット作成にはA7R班の藤田君と共同でやりました。
「ロボットの構想→組み立て→テスト→問題点を改善」 といった作業を何度も繰り返して、やっとロボットを作ることができました。
藤田君の想像力やロボット作成技術はとても高く、今回は彼に助けてもらってばかりでした。 次回には自分でももっと色々なアイディアを出し、独自のロボットを作り上げられるようになりたいです。

またプログラムの方でも、今回は色々な条件分けやタイマーを使って書くことになりました。まだまだ未熟な部分もありますが、もっと色々な書き方を覚えて使いこなせるようになりたいです。

 '' ●荒川 舞''
「if」をはじめて使い、これはとても便利だなと思いました。
今までも便利だなと思ったものは色々とありましたが、
今回のifは利用の幅が広くてとても実用的なので、とくにそう思いました。
これを使えば、色々と難しい条件の行動も、ロボットにさせることができる気がします。

コメントをどうぞ

  • 2人目のプログラムの解説、コメント等をつけてください。 -- まいける(TA) 2007-06-21 (木) 10:14:13
  • 上と同じくですが、光センサーの苦労・工夫した点の説明は良いと思います。 -- ヒロヤ? 2007-06-21 (木) 13:22:50


添付ファイル: fileall-parts2.JPG 194件 [詳細] fileno-light.JPG 224件 [詳細] fileline.jpg 207件 [詳細] filetouch.JPG 203件 [詳細] fileno-parts.JPG 222件 [詳細] filelight.JPG 204件 [詳細] fileall-parts-above.JPG 218件 [詳細] fileall-parts.JPG 252件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-07-04 (水) 16:51:59 (4430d)