2007b/A1


size(22){課題3:光を追いかけブロックを投げるロボ};

訪れてくれた人の数 1469
メニュー

懐中電灯の光を追い、その方向へブロックを投げるロボットの作成。

課題

インストの「top secret」を参考にして、ブロック(一番太いホイール)を投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。
(重複しないように一人一つ以上のプログラムを作成すること)

テーマ1、全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。
テーマ2、懐中電灯をゆっくり動かしたとき懐中電灯に向かって進む。
テーマ3、懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。

ただし、モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。懐中電灯の代わりに携帯のライトなどを利用してもよい。

ロボ紹介

全体

Image297.jpg

カッコいいでしょ!! 無駄なパーツ??そんなものはありません!!(笑)

今回目指したのは、コンパクトな動力部とロボのインパクトの強さです。

駆動部分

Image293.jpg
  • モーターが2個までしか使えないため、1つをタイヤにもう1つを投擲部に使いました。 そのためタイヤにはディファレンシャルギアを採用!!1つのモーターで左右への転回を実現。
  • モーターが1つのためギアやブロックを必要最小限に抑え、よりコンパクトなボディに進化しました。

ラチェット部分

Image292-2.jpg

ギアの回転の逆流を防ぐため、ラチェットを付けました。 これでロボは後ろに下がらなくなります。

キャスター部分

Image304.jpg

キャスターの奥光センサーの青いブロックが見えますか? このロボは光センサーを下に付けているんです。 タイヤは大きくジグザグを描くように大きい物を使用。 キャスター、タイヤ共に摩擦を減らすためゴムを除きました。

投石部分

Image302.jpg

後ろの尻尾に接続されたモーターを動かすと・・・

Image301-2.jpg

発射!! かなりのスピードです。

プログラム

テーマ1、

斎木

task main() 
{  SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_2,SENSOR_TOUCH);
   SetSensor(SENSOR_3,SENSOR_LIGHT);
   while(true)
      {Off(OUT_B);
         while(SENSOR_3>SENSOR_1)      //センサー1よりセンサー3が明るい間
         {OnRev(OUT_B);Wait(10);    //右に曲がる
         }
         while(SENSOR_3<SENSOR_1)      //センサー3よりセンサ−1が明るい間
         {OnFwd(OUT_B);Wait(10);    //左に曲がる
         }
         if((SENSOR_1>50)&&(SENSOR_3>50))//2つのセンサーが光源を発見したとき         
             OnRev(OUT_C);Wait(15);   //ブロックを投げる動作
             OnFwd(OUT_C);Wait(15);   //アームを戻す
             Off(OUT_C);}Wait(100);      //停止
            
        }
    }
}

杉本

#define THRESHOLD 40     //光の規定値を40に設定
task main()
  {
  SetSensor(SENSOR_1,SENSOR_LIGHT);     //センサー1は光センサー
  SetSensor(SENSOR_3,SENSOR_LIGHT);      //センサー3は光センサー
  while(true)     //無限に繰り返す
     {
     if(SENSOR_1 > THRESHOLD)
        {
        if(SENSOR_3 > THRESHOLD)     //センサー1、2が規定値以上の場合
           {
           Off(OUT_B);Wait(300);     //止まる
           if(SENSOR_1+SENSOR_3 > THRESHOLD)     //更に確認
              { 
              OnRev(OUT_C);Wait(15);     //ブロックを投げる
              OnFwd(OUT_C);Wait(1);     //アームを戻す
              Off(OUT_C);Wait(100);
              }
           }
        if(SENSOR_3 < THRESHOLD)     //センサー1が規定値以上、3が以下の場合
           {
           OnFwd(OUT_B);Wait(15);     //左へ旋回
           Off(OUT_B);
           }
        }
     if(SENSOR_1 < THRESHOLD)
        {
        if(SENSOR_3 > THRESHOLD)     //センサー1が規定値以下、3が以上の場合
           {
           OnRev(OUT_B);Wait(15);     //右へ旋回
           Off(OUT_B);
           }
        if(SENSOR_3 < THRESHOLD)     //センサー1、3が規定値以下の場合
           {
           OnRev(OUT_B);Wait(15);     //右へ旋回
           Off(OUT_B);
           }
        }
     }
  }

テーマ2、

斎木

task main()
{SetSensor(SENSOR_1, SENSOR_LIGHT);
 SetSensor(SENSOR_3, SENSOR_LIGHT);
 while(true)
  {if(SENSOR_1<=30&&SENSOR_3<=30)     //センサーが光源を発見できないとき
     {OnFwd(OUT_A); Wait(100);        //左に旋回
     }
   else if((SENSOR_1>50)&&(SENSOR_3>50))//光源を発見したとき
     {OnFwd(OUT_A); Wait(50);         //左に進む
      OnRev(OUT_A); Wait(50);         //右に進む つまり前進
      Off(OUT_A);                     //停止
     }
      else if((SENSOR_1>50)&&(SENSOR_3<50))//センサー3よりセンサ−1が明るいとき
         {OnFwd(OUT_B);Wait(40);    //左に曲がる
         }      
      else((SENSOR_3>50)&&(SENSOR_1<50))//センサ−1よいセンサー3が明るいとき
         {OnRev(OUT_A); Wait(40);     //右に曲がる
          Off(OUT_A);                 //停止
         }
     }
   }
}

杉本

#define THRESHOLD 40     //光の規定値を40に設定
task main()
  {
  SetSensor(SENSOR_1,SENSOR_LIGHT);     //センサー1は光センサー
  SetSensor(SENSOR_3,SENSOR_LIGHT);     //センサー3は光センサー
    
  while(true)     //無限に繰り返す
     {
     if(SENSOR_1 > THRESHOLD)
        {
        if(SENSOR_3 > THRESHOLD)     //センサー1、3が規定値以上の場合
           {
           Off(OUT_B);Wait(300);     //しばらく待つ
           if(SENSOR_1+SENSOR_3 > THRESHOLD)     //再確認
              {
              Off(OUT_B);Wait(300);     //しばらく待つ
              while(SENSOR_1+SENSOR_3 < THRESHOLD)     //更に、センサー1、3が規定値以下の場合
                 {
                 OnFwd(OUT_B);Wait(15);
                 OnRev(OUT_B);Wait(15);     //ジグザグに前進
                 }
              Off(OUT_B);
              }
           }
        if(SENSOR_3 < THRESHOLD)     センサー1が規定値以上、3が以下の場合
           {
           OnFwd(OUT_B);Wait(15);     //左へ旋回
           Off(OUT_B);
           }
        }
     if(SENSOR_1 < THRESHOLD)
        {
        if(SENSOR_3 > THRESHOLD)     //センサー1が規定値以下、3が以上の場合
           {
           OnRev(OUT_B);Wait(15);     //右へ旋回
           Off(OUT_B);
           }
        if(SENSOR_3 < THRESHOLD)     //センサー1、3が規定値以下の場合
           {
           OnRev(OUT_B);Wait(15);    //右へ旋回 
           Off(OUT_B);
           }
        }
     }
  }

テーマ3、

斎木

 task main()
 {SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_3,SENSOR_LIGHT);
  while(true)
    {if(SENSOR_1 > 30)                //センサー1が白
       {if(SENSOR_3 > 30)             //センサ−3も白のとき
          {Off(OUT_B);Wait(300);      //3秒待ち
           if((SENSOR_1> 30)&&(SENSOR_3 > 30)) //まだ白なら
              {OnFwd(OUT_B);Wait(15);    
               OnRev(OUT_B);Wait(15);    //前進し
                 if((SENSOR_1>30)&&(SENSOR_3>30)) //まだ白なら
                   {OnRev(OUT_C);Wait(15);    //ブロックを投げる
                    OnFwd(OUT_C);Wait(10);    //アームを戻す
                    Off(OUT_C);Wait(100);     //停止
                   }
                }
             } 
           }
         if(SENSOR_3 < 30)            //センサー1は明るいのにセンサー3が暗いとき
           {OnFwd(OUT_B);Wait(15);    //左に回る
            Off(OUT_B);               //停止
           }
        }
      if(SENSOR_1 < 30)               //センサー1が暗く
        {if(SENSOR_3 > 30)            //センサー3が明るいとき
           {OnRev(OUT_B);Wait(15);    //右に回る
            Off(OUT_B);               //停止
           }
         if(SENSOR_3 < 30)            //両方とも暗いとき
           {OnRev(OUT_B);Wait(15);    //右に回り光を探す
            Off(OUT_B);               //停止
           } 
        }
    }
}

杉本

#define THRESHOLD 40
task main()
  {
  SetSensor(SENSOR_1,SENSOR_LIGHT);     //センサー1は光センサー
  SetSensor(SENSOR_3,SENSOR_LIGHT);     //センサー3は光センサー
  while(true)     //無限に繰り返す
     {
     if(SENSOR_1 > THRESHOLD)
        {
        if(SENSOR_3 > THRESHOLD)     //センサー1、3が規定値以上の場合
           {
           Off(OUT_B);Wait(300);     //しばらく待つ
           if(SENSOR_1+SENSOR_3 > THRESHOLD)     //再確認
              {
              Off(OUT_B);Wait(300);     //しばらく待つ
              while(true)     //無限に繰り返す
                 {
                 while(SENSOR_1+SENSOR_3 < THRESHOLD)     //センサー1、3が規定値以下の間繰り返す
                    {
                    OnFwd(OUT_B);Wait(15);
                    OnRev(OUT_B);Wait(15);     //左右にジグザグに前進
                    }
                 Off(OUT_C);Wait(100);
                 if(SENSOR_1+SENSOR_3 > THRESHOLD)  //センサー1、3が規定値以上の場合
                    {
                    OnRev(OUT_C);Wait(15);     //ブロックを投げる
                    OnFwd(OUT_C);Wait(1);     //アームをもとに戻す
                    Off(OUT_C);Wait(100);
                    }
                 }
              }
           }
        if(SENSOR_3 < THRESHOLD)     //センサー1が規定値以上、3が以下の場合
           {
           OnFwd(OUT_B);Wait(15);     //左へ旋回
           Off(OUT_B);
           }
        }
     if(SENSOR_1 < THRESHOLD)
        {
        if(SENSOR_3 > THRESHOLD)     //センサー1が規定値以下、3が以上の場合
           {
           OnRev(OUT_B);Wait(15);     //右へ旋回
           Off(OUT_B);
           }
        if(SENSOR_3 < THRESHOLD)     //センサー1、3が規定値以下
           {
           OnRev(OUT_B);Wait(15);     //右へ旋回
           Off(OUT_B);
           }
        }
     }
  }

結果

改善した点

  • キャスターを若干高めに作り重心を後ろにしました。
  • 最初はロボが一向に進みませんでした。そこで地面との摩擦を減らすためにタイヤを外しホイールのみで動かせたところ見事動き出しました。
  • 車体を安定させるために後部にチューブを取り付け安定させた。

感想

  • 1つのモーターで左右の動きができる事に感動。ジグザグ走行がヨチヨチ歩きみたいでかわいかった!
  • 光の追いかけと、ブロックを投げる事の両立が難しく感じました。
  • 1つのモーターでロボを動かすには馬力が足りず、苦労しました。

コメント

よろしければコメントをお願いします



添付ファイル: fileImage301-2.jpg 184件 [詳細] fileImage292-2.jpg 195件 [詳細] fileImage301-2.psd 101件 [詳細] fileImage292-2.psd 93件 [詳細] fileImage304.jpg 192件 [詳細] fileImage297.jpg 188件 [詳細] fileImage298.jpg 96件 [詳細] fileImage302.jpg 186件 [詳細] fileImage301.jpg 90件 [詳細] fileImage294.jpg 88件 [詳細] fileImage293.jpg 250件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-02-07 (木) 17:38:36 (4218d)