2009a

目次

課題2  黒線に沿って動くロボットを作れ

黒い線の上に沿って動き交差点にある牛乳パックを運ぶ、避けるプログラム、交差点ごとに右左折を変えるプログラムを作る。

コースです。 200906191625000.jpg

ロボットの工夫

・アームで牛乳パックをはさみ、掴んでもっていくロボット...んなむちゃな...でも、あえてそこを行く。

.織奪船札鵐機爾肇◆璽爐領称 ⊇顛缶簑蠅硫魴茵´アームの固定 が課題

〆能蕕魯◆璽爐肇札鵐気鯤漫垢砲弔っていたが、うま組み合なかった

そこで、

200906261752000.jpg

アームとセンサーを一つのユニットにして制作。アームにセンサーとモーターを取り付ける形に(かなり頑丈です)

⊇鼎ぅ罐縫奪箸鮴橘未房茲衂佞...ようとしたが、重心が前すぎてガクガクし、センサーが誤作動

そこで、

200906261751001.jpg

本体ユニットを後方へ移動、重心をロボットの中心へ

アームの固定は実はもっとも難しい課題(アームが重すぎる)

そこで、

200906261751000.jpg

下と上にの2カ所で固定し、アームを垂直に保持

プログラムの工夫

・黒線を2つのセンサーではさみ、センサーが黒線の上に来たらモーターを調節して軌道を直します。

牛乳パックを次の交差点まで運ぶプログラム(はやぶさ)

 int turn_n ;//交差点を横切った回数の変数を定義
 task main()
      {
            turn_n == 0 ;
            SetSensor(SENSOR_2,SENSOR_TOUCH);
            SetSensor(SENSOR_1, SENSOR_LIGHT);
            SetSensor(SENSOR_3, SENSOR_LIGHT);
            
            while(turn_n < 7 )//交差点を横切った回数が7回より少ない間繰り返す
                       {
                            if ((SENSOR_1 < 50 ) && (SENSOR_3 > 50 ))//左のみ黒い場合右に回転
                               {
                                     OnRev(OUT_A);
                                     OnFwd(OUT_C);
                               }
                            if ((SENSOR_3 < 50 ) && (SENSOR_1 > 50 ))//右のみ黒い場合左に回転
                               {
                                     OnFwd(OUT_A);
                                     OnRev(OUT_C);
                               }
                            if ((SENSOR_1 > 50 ) && (SENSOR_3 > 50 ))//両方白い場合前進
                               {
                                     OnFwd(OUT_A+OUT_C);
                               }
                            if ((SENSOR_1 < 50 ) && (SENSOR_3 < 50 ))//両方黒い場合0.5秒間前進し交差点を横切った回数を一回増やす
                               {
                                     OnFwd(OUT_A+OUT_C);
                                     Wait(50);
                                     turn_n += 1 ;
                               }
                            if (SENSOR_2 == 1 )//タッチセンサが反応しました
                               {
                                                  Off(OUT_A+OUT_C);//一度停止
                                                  OnRev(OUT_B);//パックをつかむ
                                                  Wait(100);
                                                  OnFwd(OUT_A+OUT_C);//交差点を通り過ぎる
                                                  Wait(100);
                                                  while ((SENSOR_1 > 50 ) || (SENSOR_3 > 50 ))//次の交差点までの間再びライントレース
                                                    {
                                                        if ((SENSOR_1 < 50 ) && (SENSOR_3 > 50 ))
                                                           {
                                                            OnRev(OUT_A);
                                                            OnFwd(OUT_C);
                                                           }
                                                        if ((SENSOR_3 < 50 ) && (SENSOR_1 > 50 ))
                                                           {
                                                            OnFwd(OUT_A);
                                                            OnRev(OUT_C);
                                                           }
                                                        if ((SENSOR_1 > 50 ) && (SENSOR_3 > 50 ))
                                                           {
                                                            OnFwd(OUT_A+OUT_C);
                                                           }
                                                    }
                                                  OnFwd(OUT_A+OUT_C);//まずは少し通り過ぎる
                                                  Wait(200);
                                                  OnFwd(OUT_A);//回転して後ろを向く
                                                  OnRev(OUT_C);
                                                  Wait(150);
                                                  Off(OUT_A+OUT_C);
                                                  OnFwd(OUT_B);//パックを放す
                                                  Wait(100);
                                                  Off(OUT_B);
                                                  Wait(100);
                                                  OnRev(OUT_A+OUT_C);//少し下がる
                                                  Wait(100);
                                                  OnFwd(OUT_A);//再び前を向く
                                                  OnRev(OUT_C);
                                                  Wait(150);
                                                  OnRev(OUT_A+OUT_C);//少し下がる
                                                  Wait(100);
                                                  turn_n += 1 ;//交差点を横切った回数に1加える
                               }
                       }
              Off(OUT_A+OUT_B+OUT_C);//全停止
      }

牛乳パックを避けて進むプログラム(スガ)

#define THRESHOLD 40
int count;                //センサーが両方黒を通ったらカウントすることを定義する
task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);     //センサ−1は光センサー
 SetSensor(SENSOR_3,SENSOR_LIGHT);     //センサ−3は光センサー
 SetSensor(SENSOR_2,SENSOR_TOUCH);     //センサ−2はタッチセンサー
 count = 0;
 while (count>13)              //13回黒線を通ったら(三周したら)止まる  
  {
   if ((SENSOR_1>THRESHOLD) && (SENSOR_3>THRESHOLD))
    {
     OnFwd(OUT_A+OUT_C);            //2つのセンサーが白なら直進
     until((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD));
     }

    if ((SENSOR_1<THRESHOLD) && (SENSOR_3<THRESHOLD))
    {
     count = count+1;              //カウントを一回増やす
     OnFwd(OUT_A+OUT_C);           //2つのセンサーが黒なら直進
     until((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD));
     }
  
 
    if (SENSOR_1<THRESHOLD)
     {         //センサー1が黒の時は左に修正
      OnFwd(OUT_C);
      Off(OUT_A);
      Wait(1); 
      }

    if (SENSOR_3<THRESHOLD)
     {         //センサー3が黒の時は右に修正
      OnFwd(OUT_A);
      Off(OUT_C); 
      Wait(1);
      }
    if (SENSOR_2==1) 
     {                  //障害物にあたったら迂回して障害物を避ける
      OnRev(OUT_A+OUT_C);      //バックします
      Wait(200);
            OnFwd(OUT_A);OnRev(OUT_C);       //方向転換します
      Wait(100);
      OnFwd(OUT_A+OUT_C);
      Wait(150);
            OnFwd(OUT_A);OnRev(OUT_C);       //方向転換します
      Wait(100);
      OnFwd(OUT_A+OUT_C);
      Wait(200);
            OnFwd(OUT_A);OnRev(OUT_C);       //方向転換します
            Wait(100);
      OnFwd(OUT_A+OUT_C);
            Wait(150);
            OnFwd(OUT_A);OnRev(OUT_C);       //コース上に戻りました
            Wait(100);
      }    
  }
}

交差点ごとに右左折を変えるプログラム(松)

#define RUN_TIME 1200                    //2分動きます
  
task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT);   //センサ−1はライト
   SetSensor(SENSOR_3,SENSOR_LIGHT);   //センサ−3もライト
   SetSensor(SENSOR_2,SENSOR_TOUCH);   //センサー2はタッチ
   
   while(true)   //メインのプログラム
   {
       start follow_line;
       until((SENSOR_1>=40)&&(SENSOR_3<=30))
       stop follow_line;
       start turn_right;
       stop turn_right;
       start follow_line;
       until((SENSOR_1<=30)&&(SENSOR_3>=40))
       start turn_left;
       stop turn_left;
   }
   
}
task follow_line()   //ライントレースのプログラム
{
   while(true)
   {
   if((SENSOR_1>=40)&&(SENSOR_3>=40))   //センサー1、3が白なら前進
       {
       OnFwd(OUT_A+OUT_C);
       }
   else if((SENSOR_1>=40)&&(SENSOR_3<=30))   //センサー3が黒なら右へ
       {
       OnFwd(OUT_A); OnRev(OUT_C);
       }
   else if((SENSOR_1<=30)&&(SENSOR_3>=40))   //センサー1が黒なら左へ
       {
       OnRev(OUT_A); OnFwd(OUT_C);
       }
       Wait(1);
   }                
} 
task turn_right()   //右回りのプログラム
{
   OnFwd(OUT_A);
   OnRev(OUT_C);
   Wait(60);
Wait(1);    
} 
task turn_left()   //左回りのプログラム
{
   OnFwd(OUT_C);
   OnRev(OUT_A);
   Wait(60);
Wait(1);
}

感想

難しかったです。 コースのカーブがきつい時にコースから外れることもしばしばありました。

交差点で、回りすぎることもしばしばありました。タイムの妥協点を見つけるのが大変でした。

コメント

コメントをお願いします。

  • (写真いれて)に写真を入れてください(笑)。プログラムに、インデント(ifなどの階層ごとに行う字下げ、左右折の方には入っています)を入れてもらうと、見やすいです。また、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- こさか? 2009-07-02 (木) 22:57:02
  • 写真とプログラム載せました。 -- はやぶさ? 2009-07-03 (金) 17:44:08
  • やはり写真とインデントは重要です。入れ子が深くなってしまう場合は、インデントを2文字か4文字程度にしておいたほうが見やすいでしょう。また、下のお二人には3周したら止まるのをどう制御しているかの説明をしていただきたいです。 -- こさか? 2009-07-10 (金) 12:21:53
  • 松さんのプログラムについて、「#define RUN_TIME 1200 //2分動きます」とのことですが、この時間で止まるように指示している部分が見当たらないような気がします…どこなのでしょう? -- こさか? 2009-07-23 (木) 22:40:44
  • すっきりとまとめていると思います。ただ、一つ目のプログラムではライントレースのマクロなどを作った方がいいし、3つ目のは止まらない気がします。 -- FI? 2009-07-26 (日) 07:40:50


添付ファイル: file200906191625000.jpg 265件 [詳細] file200906261752000.jpg 311件 [詳細] file200906261751001.jpg 282件 [詳細] file200906261751000.jpg 287件 [詳細] filehayabusa01.jpg 198件 [詳細] filematsu01.jpg 156件 [詳細] filesuga01.jpg 161件 [詳細]

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