[[2007b/A1]]

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

RIGHT:訪れてくれた人の数 &counter(all);

LEFT:メニュー
#contents

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

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

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

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

*ロボ紹介 [#va7c6a65]
** 全体 [#edc93fae]
#ref(Image297.jpg)
カッコいいでしょ!!
無駄なパーツ??そんなものはありません!!(笑)

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

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

** ラチェット部分 [#u5a8604b]
#ref(Image292-2.jpg)
ギアの回転の逆流を防ぐため、ラチェットを付けました。
これでロボは後ろに下がらなくなります。
** キャスター部分 [#fa815519]
#ref(Image304.jpg)
キャスターの奥光センサーの青いブロックが見えますか?
このロボは光センサーを下に付けているんです。
タイヤは大きくジグザグを描くように大きい物を使用。
キャスター、タイヤ共に摩擦を減らすためゴムを除きました。
** 投石部分 [#i0fb60b0]
#ref(Image302.jpg)
後ろの尻尾に接続されたモーターを動かすと・・・
#ref(Image301-2.jpg)
発射!!
かなりのスピードです。
* プログラム [#j0d5c156]
** テーマ1、 [#u94b7269]

*斎木[#tf88a431]

 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);      //停止
             
         }
     }
 }

*杉本 [#k7f286ac]

 #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、 [#uc9eab7c]

*斎木[#n53fb021]

 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);                 //停止
          }
      }
    }
 }

*杉本 [#bf917c89]

 #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、 [#a2ef2433]

*a [#fab526a7]
*斎木 [#fab526a7]
  task main()
   {
   SetSensor(SENSOR_1,SENSOR_LIGHT);
  {SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_3,SENSOR_LIGHT);
   while(true)
      {
      if(SENSOR_1 > 30)
         {
         if(SENSOR_3 > 30)
            {Off(OUT_B);Wait(300);
            if(SENSOR_1+SENSOR_3 > 30)
            {Off(OUT_B);Wait(300);
            while(true)
               {while(SENSOR_1+SENSOR_3 < 30)
                  {OnFwd(OUT_B);Wait(15);
                   OnRev(OUT_B);Wait(15);
                  }
                Off(OUT_C);Wait(100);
                if(SENSOR_1+SENSOR_3 > 30)
                   {OnRev(OUT_C);Wait(15);
                    OnFwd(OUT_C);Wait(1);
                    Off(OUT_C);Wait(100);
                   }
                }
     {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_3 < 30)
         {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);               //停止
            } 
         }
      }
      if(SENSOR_1 < 30)
      {if(SENSOR_3 > 30)
         {OnRev(OUT_B);Wait(15);
          Off(OUT_B);
         }
      if(SENSOR_3 < 30)
      {OnRev(OUT_B);Wait(15);
       Off(OUT_B);
      }
    }
  }
}
     }
 }



*杉本 [#w87cba5d]

 #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);
            }
         }
      }
   }

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

** [#c6845256]
*感想 [#qe14f300]
まだプログラムが未完成です。
-1つのモーターで左右の動きができる事に感動。ジグザグ走行がヨチヨチ歩きみたいでかわいかった!
-光の追いかけと、ブロックを投げる事の両立が難しく感じました。
-1つのモーターでロボを動かすには馬力が足りず、苦労しました。
*コメント [#f2eb1b1f]
よろしければコメントをお願いします

#comment



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS