課題2:黒い線に沿って動くロボット

自作のコースで黒い線に沿って動くロボットを作成せよ。ただし、

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

ロボットの構造

ロボットに光センサーを取り付けることでライントレースをさせる。さらに、課題にある‘もう一台のロボットに接触した時に止まる’という問題を解決するために、タッチセンサーを使って停止させるための機構を考えた。

光センサーを取り付ける

  • 光センサは地面の明るさを判断する。
  • 2つの光センサを用いてコースの黒い線を挟み、ロボットに「白」を認識させる。つまり両方のセンサーが反応したら進んで、片方が反応したらそれと逆側に曲がるという仕組みである。
    NO.1.JPG
NO.5.JPG

黒い線を挟んでいる

NO.6.JPG

カーブでは片方のセンサーが反応

タッチセンサーを取り付ける

  • 課題にある“前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと”という問題を解決するために、光センサの上にタッチセンサであるバンパーを取り付けた。
    NO.4.JPG

ロボット完成

  • 下の写真のようになった。
    NO.2.JPG

コースの紹介

  • 緩やかなカーブをメインにしたシンプルなコースを作成。
    NO.7.JPG

プログラム

プログラムを作っている中で問題点が二つ出てきた。

  • 三周した後止まるプログラムをどう作るか
  • 交差点で二回止まってしまう

試行錯誤した結果次のようなプログラムになった  

#define THRESHOLD 40   // 閾値
task main ()
{
    SetSensor(SENSOR_1, SENSOR_LIGHT);
    SetSensor(SENSOR_3, SENSOR_LIGHT);
    SetSensor(SENSOR_2, SENSOR_TOUCH);
    int n;                       //交差点を通った回数
     n = 0;         //スタートする前なので交差点を通った回数は0回、この後のプログラムで交差点を通るたびに通った回数を1つずつ増やしていく
    while ( n <  6)  {     //交差点を通った回数が5回までなら繰り返す     
       if ((SENSOR_1> THRESHOLD)&&(SENSOR_3 > THRESHOLD)){   //黒い線に触れなければ前進
           OnFwd(OUT_A+OUT_C);
       }
        if ((SENSOR_1 < THRESHOLD)){                              //黒い線を左の光センサーが感知したら、つまり右にコースアウトしそうなら左に曲がる
           Off(OUT_A);
           OnFwd(OUT_C);
       }
       if((SENSOR_3 < THRESHOLD)){ OnFwd(OUT_A);       //黒い線を右の光センサーが感知したら、つまり左にコースアウトしそうなら右に曲がる
           OnRev(OUT_C);
         } 
        if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)){  //黒い線を両方の光センサーが感知したら、つまり交差点まできたら一時停止後進む                    
            Off(OUT_A+OUT_C)  ;       
            Wait(150);                
            OnFwd(OUT_A+OUT_C) ;   
            Wait(150);
             n=n+1;             //交差点を通った回数に1を足す
             }
              
        if((SENSOR_2==1 )){                     //タッチセンサーが何かに触れたら後進した後前進
            Rev(OUT_A+OUT_C);                    
            Wait(70);
            Off(OUT_A+OUT_C);
            Wait(150);
            OnFwd(OUT_A+OUT_C);                                           
         }
}
Float(OUT_A+OUT_C);          //交差点を通ったのが6回だと止まる
}

苦労・工夫した点

  • 課題の一つである“コースを3周したら自動的に止まること”というプログラムを作るのに苦戦した。始めは、タイマーにしようかという話をしていたが、もう一台のロボットに接触したときのタイムロスを考えなければいかず、その都度止まる位置が変わってしまった。そこで、交差点で止まる回数を数え、何回目の交差点で3周したというようなプログラムに変更した。そのことによって、毎回同じ場所で止まるようになった。

感想

  • ロボットをコースで3周させて止まらせるというプログラムがうまくいかず大変だった。なんとか止まった時はとてもうれしかった。
  • 二人で協力して進められたので、思いのほか早く終えることができた。

コメントをお願いします



添付ファイル: fileNO.7.JPG 203件 [詳細] fileNO.6.JPG 210件 [詳細] fileNO.5.JPG 210件 [詳細] fileNO.4.JPG 194件 [詳細] fileNO.3.JPG 104件 [詳細] fileNO.2.JPG 191件 [詳細] fileNO.1.JPG 199件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-06-19 (木) 16:50:34