2009a/A2/課題2左?

目次

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

各チームで作成したコースを3周するロボットを製作せよ。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)

1,紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい)

2,紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む

3,最初の交差点では左折、次の交差点では右折、その次は左折、というように交差点一つごとに左折・右折を繰り替えして進む (紙パックはコース外に押し出してよい)

ただし、速さと正確さを追求すること コースを3周したら自動的に止まること

コースについて

↓↓最初のコース

090619_180927~000.jpg

交差点が直角じゃないとうまくライントレースできないと思い... コース変更!

090619_180914.jpg

うまくライントレースするようになりました。

ロボットについて

まずは光センサーについて

ななめから...

090625_205755.jpg

この位置に光センサーを付けました。

正面から...

090625_205710.jpg

1個ではなく、2個でラインを挟むように付けました。

下からの図...

090625_205730.jpg

うまくライントレースできます。

次はタッチセンサーについて

まずは斜めから...

090617_201342.jpg

紙パックをつかむようにしたのですがうまくいかず、単純に押すようにしました。

正面から...

090617_201415.JPG

この長さが、ちょうど紙パックに反応する長さだった。これ以上長くすると、走っているときに振動でタッチセンサーが発動してしまいます。

プログラムの説明

Fahimのプログラム

 #define gofront(t) OnFwd(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C);
 #define goback(t) OnRev(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C);
 #define gostraight OnFwd(OUT_A+OUT_C);
 #define close OnRev(OUT_B);Wait(40);Off(OUT_B);
 #define open OnFwd(OUT_B);Wait(40);Off(OUT_B);
 #define THRESHOLD 40
 int x = 0;

task main()
{
   SetSensor(SENSOR_2,SENSOR_TOUCH);
   SetSensor(SENSOR_1, SENSOR_LIGHT);
   SetSensor(SENSOR_3, SENSOR_LIGHT);     
   SetPower(OUT_A,5);
   SetPower(OUT_C,5);
    while (true) {
   gostraight
   OnFwd(OUT_B);
       if (SENSOR_1 < THRESHOLD) {  //左の光センサー黒い線の上にあるとき
           OnRev(OUT_A);
           Wait(3);
           OnFwd(OUT_A);
       } else if (SENSOR_3 < THRESHOLD) {  //右のセンサー黒い線のにあるとき
           OnRev(OUT_C);
            Wait(3);
           OnFwd(OUT_C);
       } else if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) {   //交差点のにあるとき
           gofront(20)
       x = x + 1;
       }else if (SENSOR_2 == 1) {   //牛乳パックにぶつかったとき
                   ClearTimer(0);
               goback(110)
               gofront(70)  
       } else if (( Timer(0) <= 55) && (SENSOR_2 == 1)) {
           Float(OUT_A+OUT_C+OUT_B);
           close
           OnRev(OUT_B);
       gofront(120)
       OnFwd(OUT_C);OnRev(OUT_A);
       Wait(200);
       Float(OUT_A+OUT_C);
       Off(OUT_B);
       open
       goback(70);
       OnFwd(OUT_A);OnRev(OUT_C);
       Wait(130);

       } else if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD) && (x ==2)){
          Float(OUT_A+OUT_C);
          break;
      }
       }
 }

naotoのプログラム

#define THRESHOLD 45 //しきい値を決める
int flag = 0; //ループを抜け出すためのフラグ用変数
task main ()
{
   SetSensor (SENSOR_1, SENSOR_LIGHT ); //センサー1を光センサーに
   SetSensor (SENSOR_2, SENSOR_TOUCH ); //センサー2をタッチセンサーに
   SetSensor (SENSOR_3, SENSOR_LIGHT ); //センサー3を光センサーに
   While ( flag < 19 ){ //交差点を19回通ったら停止(3周なので)
            if ( SENSOR_2 == 1 ){ //タッチセンサーが発動したら
             OnRev(OUT_A+OUT_C);
             Wait(100);
             OnFwd(OUT_A);
             OnRev(OUT_C);
             Wait(50);
             OnFwd(OUT_A+OUT_C);
             Wait(250);
             OnRev(OUT_A);
             OnFwd(OUT_C);
             Wait(100);
             OnFwd(OUT_A+OUT_C);
             Wait(250);
             OnFwd(OUT_A);
             OnRev(OUT_C);
             Wait(50);           //紙パックを避けるプログラム
            }
            else{ //タッチセンサーが発動してない場合
                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 ){  //左センサーは白なら、
                                Off(OUT_A);
                                OnFwd(OUT_C);  //右のほうに曲がる
                        }
                        else {  //左センサーも黒なら
                                OnFwd(OUT_A+OUT_C);直進
                                flag++;  //交差点カウンター+1
                        }
                }
          }
  }
  Off(OUT_A+OUT_C);  //終わり!!

感想・反省

ちょうど3周したときに止まるにはどうすればいいかをすごく悩みましたが、交差点を通った数にするようにしました。ロボットも工夫したので、見てほしいです。(naoto)

コメント欄(ご自由にどうぞ)

  • 更新しました。 -- naoto? 2009-08-09 (日) 14:01:33
  • 全体として必要なことはかけていると思います。Fahimさんのプログラムの中でタイマーや変数xがどんな働きをしているのかが良くわかりませんので説明をしていただきたいです。 -- こさか? 2009-08-09 (日) 21:59:09


添付ファイル: file090619_180914.jpg 482件 [詳細] file090617_201415.JPG 290件 [詳細] file090617_201342.jpg 294件 [詳細] file090625_205730.jpg 338件 [詳細] file090625_205710.jpg 314件 [詳細] file090625_205755.jpg 302件 [詳細] file090619_180927~000.jpg 318件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-08-10 (月) 17:16:46 (3661d)