目次

課題 黒い線をトレースするプログラム 

ロボットの構造の工夫

このロボットの雛形は、マインドストームの四輪駆動型ロボットです

200906191624000.jpg

・黒線を太くすることで、センサーの感度を実質的に引き上げました。

・また、前輪と後輪を入れ替えることで機動力を得ます。

・両端にある光センサーの幅を狭くすることで、左右にぶれることを少なくしました。

200906191624001.jpg
200906191625000.jpg

これが我が『ザ宅配』が行く道です。

ロボットの基本的なプログラム

・光センサーを利用してライントレースのプログラムを書く。

・タッチセンサーを利用した牛乳パックの回避。牛乳パックを運ぶためのプログラムを作る。

・完成。

それぞれのプログラム

これがハるのプログラムです。

    #define THRESHOLD 40  #define RUN_TIME 1800

まずは基本のライントレースを。

task main() {

   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_3,SENSOR_LIGHT);
   SetSensor(SENSOR_2,SENSOR_TOUCH);
   ClearTimer(0);
       while(Timer(0)<=RUN_TIME){
       if(SENSOR_1>THRESHOLD){
                if(SENSOR_3>THRESHOLD){
                             OnFwd(OUT_A+OUT_C);
                                                }
                else{
                             OnFwd(OUT_A);
                             Off(OUT_C);
                          }
                                    }
        else{
                if(SENSOR_3>THRESHOLD){
                             OnFwd(OUT_C);
                             Off(OUT_A);
                                                }
               }
        

センサーが反応すると・・      if (SENSOR_2 == 1)

           {
        OnRev(OUT_A+OUT_C); いったん後退。
        Wait(50);
        Off(OUT_A+OUT_C);
        OnRev(OUT_B);  アームを下します。
        Wait(50);
        Off(OUT_B);
        OnFwd(OUT_A+OUT_C);  定位置まで進んだら・・
        Wait(220);
        Off(OUT_A+OUT_C);
        OnFwd(OUT_A);  180度旋回し、
        OnRev(OUT_C);
        Wait(150);
        Off(OUT_A+OUT_C);
        OnFwd(OUT_B);  アームを揚げ、牛乳パックをパージ。
        Wait(50);
        Off(OUT_B);
        OnRev(OUT_A);
        OnFwd(OUT_C);
        Wait(100);
        Off(OUT_A+OUT_C);  180度のある位置まで旋回したら、
        OnRev(OUT_A);  ラインをサーチするためにその場で旋回。
        OnFwd(OUT_C);
        until ((SENSOR_1 <= THRESHOLD) || (SENSOR_3 <= THRESHOLD));
        Off(OUT_A+OUT_C);
           }                   }
    }

これがかおりんのプログラムです。

 牛乳パックを避けて線に沿って走るプログラム  #define THRESHOLD 40  void turn_left() 左に曲がることを定義する  {

     OnRev(OUT_A);
     OnFwd(OUT_C);
     Wait(100);

 }  void turn_right()             右に曲がることを定義する  {

      OnRev(OUT_C);
      OnFwd(OUT_A);
      Wait(90);

 }  int tomaru;                タッチセンサーに当たったら止まるこ                       とを定義する  task main()  {

    SetSensor(SENSOR_1,SENSOR_LIGHT);
    SetSensor(SENSOR_3,SENSOR_LIGHT);
    SetSensor(SENSOR_2,SENSOR_TOUCH);
    tomaru=0;
    while(tomaru<3){           3回タッチセンサーが反応したら止まるよ

                      うに定義します

        if(SENSOR_1>THRESHOLD){          左の光センサーが白紙上
                 if(SENSOR_3>THRESHOLD){      右の光センサーが白紙上の時
                              OnFwd(OUT_A+OUT_C);  直進
                                                 }
                 else{               右の光センサーが黒線上の時
                              OnFwd(OUT_A);     右に曲がる
                              Off(OUT_C);
                           }
                                     }
         else{                   左の光センサーが黒線上
                 if(SENSOR_3>THRESHOLD){      右の光センサーが白線上の時
                              OnFwd(OUT_C);     左に曲がる
                              Off(OUT_A);
                                                 }
                }
         if (SENSOR_2 == 1)       タッチセンサーが反応する時
            {
         OnRev(OUT_A+OUT_C);       バックする
         Wait(50);
         turn_left();             牛乳パックを避けるため左に曲がる   
         OnFwd(OUT_A);          直進する
         Wait(130);
         turn_right();         牛乳パックを避けるため右に曲がる
         OnFwd(OUT_C);          直進する
         Wait(320);
         turn_right();         牛乳パックを避けるため右に曲がる
         OnFwd(OUT_C);          直進する
         Wait(130);
         turn_left();         牛乳パックを避けるため左に曲がる
         OnRev(OUT_A+OUT_C);      線に戻るようにするためバックする
         Wait(80);
         tomaru=tomaru+1;         
            }
                   }
     Off(OUT_A+OUT_C);

 }

感想

ハる

家に持って帰ったのは今回が初めてでした。牛乳パックをホールドするアームの設計は、かなり考えた末に現在のような形になりました。 また、周回を記録するプログラミングは、変数を記録するプログラムがまだわからなかったので断念し、タイマーを利用することになりました。

今回、NQCを自分のパソコンでも使えるようになったので、今後の課題はもっと楽になると思います。

発表中の電源落ちにより、大変不本意な結果になってしまいました。電池を交換することによる挙動の変化を防ぐためにあえて電池を交換しなかったのですが、よりによってテスト中に落ちてしまいました。

次回からは、常に電圧を一定に保てるように努力しようと思います。

また、高電圧タイプのプログラムに更新してありますのでよろしくお願いします。

かおりん

今回は本当に苦労しました。工夫したところは上記にもありますが、光センサーの幅を狭くしてどの角度から牛乳パックに当たっても正面で当たるようにしたところです。プログラミングに関しては牛乳パックを避けるにあたって、移動距離を最小限に収めたところです。プログラミングの最後のバックする動作は交差後の黒線がすぐに曲がっているため、バックして黒線上に光センサーがくるようにしたところです。 はじめは、1周が60秒だったので、タイマーをセットして、60秒後に止まるようにしたのですが、多少の誤差が進むと同時に生じてきてしまうのでタッチセンサーのふれた回数を使ってロボットを止まるように工夫しました。

  • ホームページ完成しました。見てください -- カヲル? 2009-06-19 (金) 17:38:45
  • 電池切れにより前のような挙動ができなくなりましたが、電力MAXの時用のプログラムに調整しました。 完成したので見てください。 -- ハる? 2009-06-26 (金) 17:25:35
  • 名前をカヲルから元のかおりんに戻します -- かおりん? 2009-06-26 (金) 17:37:51
  • プログラムの説明が詳しくて良いです(ただ、レイアウトが崩れてしまっているので直してください)。 -- こさか? 2009-07-02 (木) 22:53:04
  • また、プログラムについて、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- こさか? 2009-07-02 (木) 22:53:29
  • シンプルですがポイントを押さえてまとめてあります。あとは、ページの整形を直して、内容を充実させてください -- FI? 2009-07-03 (金) 05:57:21


添付ファイル: file200906191625000.jpg 247件 [詳細] file200906191624001.jpg 275件 [詳細] file200906191624000.jpg 275件 [詳細]

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