目次

課題2:黒い線上を動くロボット

次のような周回コース(黒い線)を動くロボットを作成せよ。

センサー、モーターはいくつ使ってもよい。プログラムは次の2つを作成すること。

1. 直角のコーナーを通る
2. 直角のコーナーを通らない(近道する)

ただし互いに逆方向に周回すること。

メンバー紹介

課題

コースについて

先生が例として挙げたコースとほとんど同じコースを作った。 コースの線の幅は15mmで統一した。

●コースの概要

course.jpg

以下は、メンバーのロボットがたどるコース。

●イシイ(近道担当)のコース

course_ishii.jpg

●ゆきち(直角コーナー担当)のコース

course_yukichi.JPG

ロボットについて

ロボットは四輪の車体に光センサーを取り付けたシンプルな作りになった。

●全体

trace_robot.JPG

●光センサー

シンプル、と言っても、光センサーの取り付け方には注意した。

sensor.JPG

3センチという幅は組み立ての際に偶然たどり着いた値だが、広すぎず狭すぎない幅だった。広すぎればラインに対する反応が遅れ、カーブを曲がりきれない。また、狭すぎればロボットがコースの曲線に過剰に反応してしまい、一周を回るのにかかる時間が長くなると予想できる。

もう一点、光センサーとロボットを旋回させたときの回転軸との距離に注意した。

trace_robot_side.JPG

この距離が長ければ、わずかに旋回しただけでも光センサーが大きく動くことになってしまい、急カーブでラインを追いかけることが難しくなると考えた。その点を意識してロボットを作った。

プログラム

イシイ

course_ishii.jpg
#define go(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);             //直進
#define turn_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);  //右旋回
#define turn_l(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C);  //左旋回
#define THRESHOLD 45                                                   //閾値

task main()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_3,SENSOR_LIGHT);
 
  ClearTimer(0);                     //タイマーをリセット
  while(FastTimer(0)<=500)           //5秒後まで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_1<THRESHOLD)
    {
      turn_l(10);                    //センサー1が反応したら0.1秒左旋回
    }
    if(SENSOR_3<THRESHOLD)
    {
      go(20);                        //センサー3が反応したら0.2秒直進
    }
  }
  ClearTimer(0);                     //タイマーをリセット
  while(FastTimer(0)<=800)           //8秒後まで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_3<THRESHOLD)
    {
      turn_r(10);                    //センサー3が反応したら0.1秒右旋回
    }
    if(SENSOR_1<THRESHOLD)
    {
      go(20);                        //センサー1が反応したら0.2秒直進
    }
  }
  ClearTimer(0);                     //タイマーをリセット
  while(FastTimer(0)<=150)           //1.5秒後まで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_3<THRESHOLD)
    {
      turn_r(10)                     //センサー3が反応したら0.1秒右旋回
    }
    if(SENSOR_1<THRESHOLD)
    {
      go(50);
      turn_r(70);                    //センサー1が反応したら0.5秒直進し、0.7秒右旋回
    }
  }
                                     //1回目のロータリー
  ClearTimer(0);                     //タイマーをリセット
  while(FastTimer(0)<=350)           //3.5秒後まで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_1<THRESHOLD)
    {
      turn_l(10)                     //センサー1が反応したら0.1秒左旋回
    }
  }
  ClearTimer(0);                     //タイマーをリセット
  while(FastTimer(0)<=250)           //2.5秒後まで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_1<THRESHOLD)
    {
      turn_l(10);                    //センサー1が反応したら0.1秒左旋回
    }
    if(SENSOR_3<THRESHOLD)
    {
      go(50)
      turn_r(60);                    //センサー3が反応したら0.5秒直進し、0.6秒右旋回
    }
  }
  ClearTimer(0);                     //タイマーをリセット
  while(FastTimer(0)<=550)           //5.5秒後まで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_3<THRESHOLD)
    {
      turn_r(20);                    センサー3が反応したら0.2秒右旋回
    }
  }
  ClearTimer(0);                     //タイマーをリセット
  while(FastTimer(0)<=300)           //3秒後まで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_3<=THRESHOLD)
    {
      turn_r(10);                    //センサー3が反応したら0.1秒右旋回
    }
    if(SENSOR_1<=THRESHOLD)
    {
      go(50);
      turn_r(80);                    //センサー1が反応したら0.5秒直進し、0.8秒右旋回
    }
  }
                                     //2回目のロータリー
  ClearTimer(0);                     //タイマーをリセット
  while(FastTimer(0)<=350)           //3.5秒後まで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_1<THRESHOLD)
    {
      turn_l(10)                     //センサー1が反応したら0.1秒左旋回
    }
  }
  ClearTimer(0);                     //タイマーをリセット
  while(FastTimer(0)<=250)           //2.5秒後まで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_1<THRESHOLD)
    {
      turn_l(10);                    //センサー1が反応したら0.1秒左旋回
    }
    if(SENSOR_3<THRESHOLD)
    {
      go(50)
      turn_r(100);                   //センサー3が反応したら0.5秒直進し、1秒右旋回
    }
  }
  ClearTimer(0);                     //タイマーをリセット
  while(FastTimer(0)<=400)           //4秒後まで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_3<=THRESHOLD)
    {
      turn_r(10);                    //センサー3が反応したら0.1秒右旋回
    }
    if(SENSOR_1<=THRESHOLD)
    {
      go(25);
      OnFwd(OUT_A);
      Wait(20);
      Off(OUT_A);                    センサー1が反応したら0.25秒直進し、0.2秒左車輪のみ前進
    }
  }
                                     //ヘアピンカーブ
  ClearTimer(0);                     //タイマーをリセット
  while(FastTimer(0)<=600)           //6秒後まで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_3<=THRESHOLD)
    {
      OnRev(OUT_A+OUT_C);
      Wait(10);
      Off(OUT_A+OUT_C);
      turn_r(20);                    //センサー3が反応したら0.1秒後退し、0.2秒右旋回
    }
  }
  ClearTimer(0);                     //タイマーをリセット
  while(FastTimer(0)<=400)           //4秒後まで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_1<THRESHOLD)
    {
      turn_l(10);                    //センサー1が反応したら0.1秒左旋回
    }
    if(SENSOR_3<THRESHOLD)
    {
      go(25);                        //センサー3が反応したら0.25秒直進
    }
  }
  while(SENSOR_3<THRESHOLD)          //センサー3が反応するまで繰り返し
  {
    OnFwd(OUT_A+OUT_C);              //前進
    if(SENSOR_1<THRESHOLD)
    {
      turn_l(10);                    //センサー1が反応したら0.1秒左旋回
    }
  }
  Off(OUT_A+OUT_C);
} 

ゆきち

course_yukichi.JPG

反省・感想

コメントをお願いします



添付ファイル: filetrace_robot_side.JPG 365件 [詳細] filesensor.JPG 351件 [詳細] filetrace_robot.JPG 378件 [詳細] file02.JPG 166件 [詳細] file01.JPG 185件 [詳細] filecourse_yukichi.JPG 335件 [詳細] filecourse_ishii.jpg 342件 [詳細] filecourse.jpg 299件 [詳細]

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