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)

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



添付ファイル: file090619_180914.jpg 655件 [詳細] file090617_201415.JPG 499件 [詳細] file090617_201342.jpg 478件 [詳細] file090625_205730.jpg 531件 [詳細] file090625_205710.jpg 535件 [詳細] file090625_205755.jpg 463件 [詳細] file090619_180927~000.jpg 499件 [詳細]

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