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

黒い線に沿って動くロボットを作成せよ。そして一つの周回コースを2台のロボットが走行すること想定し、以下の2種類のプログラムを作成せよ。

1.前方のロボットに接触したら反転して進む

2.前方のロボットに接触したらそのロボットを右側から追い抜いて(あるいは避けて通り)、再びライン上に戻って進む

ただし、スピードと確実性をできる限り両立させること。自由課題1も参考に。光センサは2つ使用してよい。

説明:ロボットの構成

プログラム

6月9日(一つのセンサーVer);製作者:ゆず・t5

#define THRESHOLD 40   // 閾値
task main ()
{
   SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1が光センサーと宣言
    while (true) {
       if (SENSOR_1 < THRESHOLD) {   // モーター1が黒線上にいるとき
           OnFwd(OUT_A);             //モーターAを正回転
           Off(OUT_C);               //モーターCを停止 
       } else {                      // モーター1が黒線から外れたとき
           Off(OUT_A);       //モーターAを停止  
           OnFwd(OUT_C);      //モーターCを正回転 
       }    //以上繰り返す
   }
}

(二つのセンサーVer);製作者:シュート・アップル

task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1が光センサーと宣言
SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2が光センサーと宣言
while(true)
{
if (SENSOR_1> 40)         //光センサー1が黒線から 外れているとき
{
OnFwd(OUT_A);            //モーターAを正回転
Off(OUT_C);            //モーターCを静止
}
else                //光センサー1が黒線上に あるとき
{
OnFwd(OUT_C);           //モーターCを正回転
Off(OUT_A);            //モーターAを静止
} 
if (SENSOR_2>40)          //光センサー2が黒線から 外れているとき
{
OnFwd(OUT_C);           //モーターCを正回転
Off(OUT_A);            //モーターAを静止
}
else                //光センサー2が黒線上に あるとき
{
OnFwd(OUT_A);           //モーターAを正回転
Off(OUT_C);            //モーターCを静止
}        //以上繰り返す
}
}
}

<考察・工夫した点>

とりあえず黒い線に沿って進むだけのプログラムです。一つセンサーの場合は、何も考えずにスムーズにプログラミング出来ました。 
時々コースアウトするときはあったけれども、、、。それと違ってセンサー二つの場合、ロボットの光センサーの位置が悪かったのか、
きついカーブはうまく曲がることができませんでした。センサーをくっつけて装着させると黒いラインを両側に挟むことが出来ず失敗しました。
また二つ離して装備させても簡単にはうまくいかず、普通のカーブでも黒いラインにセンサーが入る角度によっては、センサーが 反応しきれずに
曲がりきれないことがありました。何度も調節して(ブロック一つ分ずつズラしていき、耐久性も考えた)自分たちの作ったコースは制覇しました。(ロボットは下に添付)

6月16日

前方のロボットに接触したら反転するプログラム

task main()
{ 
  SetSensor(SENSOR_1,SENSOR_LIGHT);   //センサー1が光センサーと宣言
  SetSensor(SENSOR_2,SENSOR_LIGHT);   //センサー2が光センサーと宣言
  SetSensor(SENSOR_3,SENSOR_TOUCH);   //センサー3がタッチセンサーと宣言
  
  #define THRESHOLD 40   // 閾値
   
 while(true){
                   if (SENSOR_1 > THRESHOLD) 
                   {OnFwd(OUT_C);}      //モーターCを正回転
                    else {Off(OUT_C);} //センサー1が黒い線を認識したらモーターCをとめる                    
                   if (SENSOR_2 > THRESHOLD) 
                   {OnFwd(OUT_A);}     //モーターAを正回転
                    else {Off(OUT_A);}  //センサー2が黒い線を認識したらモーターAをとめる                
                  if(SENSOR_3==1)
                    {OnFwd(OUT_A);OnRev(OUT_C);Wait(170);} //前のロボットに接触したら反転する  
             }       //以上繰り返し
}

<考察・工夫した点>

きつい曲がりでは失敗するときもあったが、ほとんどうまくいきました。ただ、タッチセンサーをテキスト?通りに装着したが
それではもう一つのロボットと接触するとき巧く反応しませんでした。接触面積を広く、少し高めに装着すればよかったと思いました。
また、カーブで二台のロボットのタイヤなどが接触して黒いラインから外れないようにロボット自体はコンパクトに(基本の形)しました。
衝突したら追い越すロボットの作成は、課題に追われて作ることが出来ませんでした。頭の中では、ラインを速く辿るロボット(例えば、黒いラインがまっすぐのときに蛇行せずに
進む、つまり二つのセンサーが光を感知しているときはモーター二つを前進させるなど)が追い越す側になることをイメージしていました。

完成ロボット

タッチセンサーの接触面積を広くするために、黄色のバーに縦にバーをつけることを考えました。装着後の写真がないので見せれませんが、巧く機能しました。

完成ロボット

反省点・感想

  1. 早い内に、ラインを書く用紙を用意すればよかったです。生協で買おうとしたら売り切れでした。
  2. 黒いペンで線を書くのもいいが、黒い紙テープを貼る方が線の太さが均等になり、手間が省けたと思う。
  3. 光センサーを利用した基礎的なプログラムを学んだことによって、違う動作に応用できるようになった。
  4. 光センサーの取り付け位置は結構重要だと思いました。2〜3cmずらすだけで、マシンが違う動きをしてしまう。

添付ファイル: filedscn2599_Medium.jpg 271件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-07-28 (金) 13:35:07