2006b/A3

課題2

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

  1. 相手のロボットに接触したら反転して進む。
  2. 相手のロボットに接触したらそのロボットを右側から避けて通り、再びライン上に戻って進む。

ロボットの作成に関して

今回のロボットは光センサーとタッチセンサーを組み込むロボットです。最初は2つの光センサーで線上を走らせようとしたが線が細いためうまくとらえることができなかったため、線を光センサーで挟み込んで進むようにセンサーを設置しました。タッチセンサーは教科書に載っているシングルバンパーを搭載させました。比較的簡単にできました。

苦労した点 +工夫した点

1. プログラムができ、いざ走らせてみるとあまり線の上を走ってくれなかった。何度もコースをはみ出してしまい悩む一方だった。始めはカーブを曲がるとき片方のタイヤを止めもう片方のタイヤだけまわしていたが、後に両方をまわすようにして急カーブを乗りきることができた。

2. ロボットが反転して進む場合反転しても線を挟むことができなかったため回転している最中に光センサーが線を認知するまで回転するようプログラムすることが大変だった。

3. 先生のご指摘により、光センサ−が離れすぎているため、急カーブのところがうまく回ることができないと判明した。よって光センサーが線を挟む間隔を小さくした。これによりうまく曲がれるようになった。先生に感謝!!

プログラム

まず、相手に接触したときに反転して進むプログラムです。

task main()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT); 光センサーをセット
  SetSensor(SENSOR_3,SENSOR_LIGHT);     〃
  SetSensor(SENSOR_2,SENSOR_TOUCH); タッチセンサーをセット
               
   while(true)
   
      OnFwd(OUT_A+OUT_C); //線を挟んでいれば直進
      if (SENSOR_1<40)  //もし左のセンサーが線を感知すると
      {                 
         OnFwd(OUT_C);  //少し左に急回転
         OnRev(OUT_A);
       }
      if (SENSOR_3<40)  //右のセンサーが線を感知すると
      {
         OnFwd(OUT_A);  //少し右に急回転
         OnRev(OUT_C);
       }
      if (SENSOR_2==1)  //タッチセンサーに当たると
      {
         OnRev(OUT_A+OUT_C); Wait(50);  //少し下がって
         OnFwd(OUT_A); Wait(200);     //右回で後ろに向く
         while (SENSOR_3<40)
         {    
            OnFwd(OUT_C);  //線をとらえたら線に沿って進む
          }
                             
       }
    }
}

次に相手のロボットを右から避けて通るためのプログラムです。

task main()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT); //光センサーをセット
  SetSensor(SENSOR_3,SENSOR_LIGHT); //   〃
  SetSensor(SENSOR_2,SENSOR_TOUCH);  //タッチセンサーをセット
               
while(true)
{
   OnFwd(OUT_A+OUT_C);   //線を挟んでいれば直進
   if (SENSOR_1<40)   //もし左のセンサーが線を感知したら
   {
      OnFwd(OUT_C);   //少し右へ急回転
      OnRev(OUT_A);
    }
   if (SENSOR_3<40)   //もし右のセンサーが線を感知したら
   {
      OnFwd(OUT_A);   //少し左へ急回転
      OnRev(OUT_C);
    }
    if (SENSOR_2==1)   //タッチセンサーが当たったら
    {
      OnRev(OUT_A+OUT_C);Wait(50); //少し戻る
      OnFwd(OUT_A); Wait(77);  //右へ90°回転
      OnFwd(OUT_C); Wait(90);  //少し前進
      OnRev(OUT_A); Wait(77);  //左へ90°回転
      OnFwd(OUT_A); Wait(100);  //少し前進
      OnRev(OUT_A); Wait(77);  //左へ90°回転
      OnFwd(OUT_A); Wait(100);  //少し前進 
      OnRev(OUT_C); Wait(87);  //右へ回転
      while (SENSOR_1<40)  //左のセンサーが線を感知したら
      {
         OnFwd(OUT_C);   //線に沿って前進
      }
     }
  }
}

感想

とにかくプログラミングが大変だった!!ロボットは前回に比べれば割と簡単に出来たが、もう少し改良したかった。改良点は、小回りを出来るようにすることと、速度を落とすようなギアチェンジがすればよかったかな、、、、。

コメント

このプログラムやホームページに関するコメントをお願いします。

  • プログラム内で、そこで何をしているのかを説明するコメントを付けると、後で見たときにわかりやすくなりますよ。 -- ゆき(TA)? 2006-12-15 (金) 13:13:28


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-02-11 (日) 12:50:26