2007a/MemberOnly/進行状況A

光を追いかけるロボット

  1. 懐中電灯の光を探し求め、見つけたらブロックを投げます。光は動きません。 (担当者:たまちゃん)
  2. ゆっくり動く懐中電灯の光を追いかけます。 (担当者:座敷童)
  3. ゆっくり動く懐中電灯の光を追いかけて、懐中電灯の動きが止まるとブロックを投げます。 (担当者:座敷童)
  • モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。
  • 投げるブロックは一番太いホイール。

【メンバー紹介】

  • 座敷童
  • たまちゃん

【ロボット紹介】

【試作機】

 今回の試作機です。課題のヒントを参考に前回同様、まず作ってみました。

試作機2.jpg

 しかし、ギアが空回りするという問題が出てきました。問題のギアはモーターに直接付いていた小さなギアでした。NQC本体が乗ることにより重さが増し、更にタイヤの摩擦による抵抗で、ギアが空回りしたと考えられます。 そこで、問題となるモーターに直接付けるギアを、今回の機構に入る一番大きなギアに取り換えました。

ギアの選択.jpg

【完成型】 

 そして、以下に出てくる投石台を設置するためにタイヤを替え、写真が今回の完成型です。

完成型2.jpg

変更点

  • タイヤの大きさ
  • ほとんどのギアの大きさ
  • 前進する方向を変え、前に投石台、光センサを設置できるようにする

【Multi-action with one motor】

  • 今回のロボットでは、モーター、光センサ、タッチセンサをそれぞれ2個ずつしか使えないので、前進、右左折をモーターを1つで行わなければ、ブロック(今回の課題ではホイール)を投げることが難しくなってしまいます。そこで今回の要となる部品【DIFFERENTIAL-GEAR】です。
    ディファレンシャルギア.jpg
  • この部品により、例えば、左側のタイヤを動かなくした状態でモーターを正回転すると右側のタイヤだけ動きます。また逆に右側のタイヤを動かなくして、モーターを逆回転すると左側のタイヤだけ動きます。これによって、右左折はもちろんのこと、前進にはタイヤを左右交互に動かすことにより前に進ませることが出来ます。(※後退はできません)
    前進.jpg
  • また、モーターが回転しているときに、片方のタイヤは止めなくてはいけません。そこでストッパーを使います。更に、そのストッパーを外れないようにするためのストッパーもつけます。
    ストッパー1.jpg

【投石台】

 ブロックを投げるための投石台です。

投石台.jpg
投石台2.jpg
  • ギアが回転することにより、ブロックを置く『手』の部分を後方に押し、ゴムの力で戻ります。ゴムの力を利用し投げます。
    投石台3.jpg

【光センサの設置】

 最後に光センサを設置します。

光センサの設置.jpg

【プログラム】

【課題の1】    担当者:たまちゃん

  • 懐中電灯の光を探し求め、見つけたらブロックを投げます。光は動きません。
#define THRESHOLD  60           //闘値を設定
task main ()

 

{
      SetSensor(SENSOR_1,SENSOR_LIGHT);               //センサ1が光センサであることを定義
      SetSensor(SENSOR_3,SENSOR_LIGHT);               //センサ3が光センサであることを定義

   

      while(true){
      if(SENSOR_1 > THRESHOLD){
                 if(SENSOR_3 > THRESHOLD){
                       Off(OUT_B);         //  2つの光センサが両方ともに明るさを感知すると
                       Wait(50);          // 一度停止します
                       OnFwd(OUT_A);        
                       Wait(80);          // ここでブロックを投げます
                       Off(OUT_A);
                    } else {
                       OnFwd(OUT_B);                //  右の光センサが明るさを感知すると、少し右に曲がります。
                        }
                    } else {
                       if(SENSOR_3 > THRESHOLD){                      
                       OnRev(OUT_B);         // 左の光センサが明るさを感知すると、少し左に曲がります。
                          }else{
          OnFwd(OUT_B);                     //  基本的に光センサが反応していない時は、その場で回転します。
                               }                     
                   }
           }
}

【課題の2】    担当者:座敷童

  • ゆっくり動く懐中電灯の光を追いかけます。
  #define THRESHOLD  45          // 闘値を設定
task main ()
 {
       SetSensor(SENSOR_1,SENSOR_LIGHT);               // センサ1が光センサであることを定義します
       SetSensor(SENSOR_3,SENSOR_LIGHT);               // センサ3が光センサであることを定義します
       SetPower(OUT_B,5);                              //  Bに繋がれたモーターの出力を決めます
       while(true){
          if(SENSOR_1 > THRESHOLD){
                      if(SENSOR_3 > THRESHOLD){
                            OnFwd(OUT_B);             // 2つの光センサが両方とも明るさを感知したら
                            Wait(30);         // 右、左と本体を交互に動かし、前進します
                            OnRev(OUT_B);
                            Wait(65);                 // 
                     } else {
                        OnRev(OUT_B);                 // 右の光センサが明るさを感知すると、右に少し曲がります
                         }
                     } else {
                        if(SENSOR_3 > THRESHOLD){    
                        OnFwd(OUT_B);                 // 左の光センサが明るさを感知すると、左に少し曲がります 
                           }else{
                               Off(OUT_B);            // 光センサが反応していない時は、基本的に停止しています
                          } 
                    }
               }
}

【課題の3】    担当者:座敷童

  • ゆっくり動く懐中電灯の光を追いかけて、懐中電灯の動きが止まるとブロックを投げます。
#define THRESHOLD  45            // 闘値を設定
#define RUN_TIME  600            //  RUN_TIME を600と定義します
task play_music()
 {
     while(true){
        PlaySound(SOUND_FAST_UP); // ブロックを投げる時の、警告音です
      }
 }
 task main ()
  {
       SetSensor(SENSOR_1,SENSOR_LIGHT);               // センサ1が光センサであることを定義します
       SetSensor(SENSOR_3,SENSOR_LIGHT);               // センサ3が光センサであることを定義します
       SetPower(OUT_A,5);               //  Aに繋がれたモーターへの出力を決めます
       SetPower(OUT_B,7);               // Bに繋がれたモーターへの出力を決めます
 ClearTimer(0);                                 //  タイマーをリセットします
    while(FastTimer(0) <= RUN_TIME){                // タイマーが6秒以下の時は
         if(SENSOR_1 > THRESHOLD){
                      if(SENSOR_3 > THRESHOLD){
                            OnFwd(OUT_B);        // 光センサが両方ともに光を感知した時は
                            Wait(30);        //  右、左と本体を交互に動かし、前進します
                            OnRev(OUT_B);
                            Wait(65);        
                     } else {
                        OnFwd(OUT_B);         // 右の光センサが反応した時は、右に少し曲がります
                          }
                     } else {
                        if(SENSOR_3 > THRESHOLD){ 
                        OnRev(OUT_B);           // 左の光センサが反応した時は、左に少し曲がります
                           }else{
                               Off(OUT_B);        // 光センサが反応していない時は、基本的に停止しています
                          }                    
                   }
       }
               start play_music ;                    // 警告音を鳴らします。以下はブロックを投げるためのプログラムです
               Off(OUT_B);              //
               Wait(100);                            // 一度停止します
               OnFwd(OUT_A);
               Wait(80);                // ブロックを投げます
               Off(OUT_A);
               stop play_music ;                     // 警告音を止めます
}

【課題の3・カウント編】

  • このプログラムはタイマーが、繰り返している範囲を通過する時に、6秒以上かかるとブロックを投げるプログラムに移ります。以下に書くプログラムはタイマーを回数に変え、3回前進の動作をするとブロックを投げるように設定します。今回の課題発表ではこちらを使います。
    #define THRESHOLD  60            // 闘値を設定
int mode_count;                  // mode_countという変数を使うことを宣言
task play_music()
 {
       while(true){
     PlaySound(SOUND_FAST_UP);             // ブロックを投げる時の、警告音です
       }
 }
 task main ()
  {
       SetSensor(SENSOR_1,SENSOR_LIGHT);               // センサ1が光センサであることを定義します
       SetSensor(SENSOR_3,SENSOR_LIGHT);               // センサ3が光センサであることを定義します
       SetPower(OUT_A,5);               //  Aに繋がれたモーターへの出力を決めます
       SetPower(OUT_B,7);               // Bに繋がれたモーターへの出力を決めます
    mode_count = 0 ;                              //  mode_countを0にセット
    while(mode_count <= 3){                //  mode_count が3以下の時は以下を繰り返します。
         if(SENSOR_1 > THRESHOLD){
                      if(SENSOR_3 > THRESHOLD){
                            OnFwd(OUT_B);        // 光センサが両方ともに光を感知した時は
                            Wait(30);        //  右、左と本体を交互に動かし、前進します
                            OnRev(OUT_B);
                            Wait(65);        
                            mode_count += 1;         //  mode_countの数値に1をプラス
                     } else {
                        OnFwd(OUT_B);         // 右の光センサが反応した時は、右に少し曲がります
                            mode_count  = 0;         // mode_countを0にリセット
                           }
                     } else {
                        if(SENSOR_3 > THRESHOLD){ 
                        OnRev(OUT_B);           // 左の光センサが反応した時は、左に少し曲がります
                           }else{
                               Off(OUT_B);        // 光センサが反応していない時は、基本的に停止しています
                               mode_count = 0;       //  mode_countを0にリセット
                           }
                   }
       }
               start play_music ;                    // 警告音を鳴らします。以下はブロックを投げるためのプログラムです
               Off(OUT_B);              //
               Wait(100);                            // 一度停止します
               OnFwd(OUT_A);
               Wait(80);                // ブロックを投げます
               Off(OUT_A);
               stop play_music ;                     // 警告音を止めます
}

【音楽のプログラム】

  • 課題とは直接関係はありませんが、授業で習ったのにためさないわけにはいきません。
#define Do  523              // ドを定義します
#define re  587              // レを定義します
#define mi  659              // ミを定義します
#define so  392              // 1オクターブ下の、ソを定義します
#define ra  440              // 1オクターブ下の、ラを定義します
#define shi 494              // 1オクターブ下の、シを定義します
task play_music()   // 音楽を演奏するタスクです
{
   while (true)
   {
   PlayTone(ra,30); Wait(35);      
       PlayTone(Do,30); Wait(35);  
       PlayTone(re,30); Wait(35);   
       PlayTone(Do,15); Wait(20);
       PlayTone(re,15); Wait(20);
       
       PlayTone(mi,30); Wait(35);
       PlayTone(so,30); Wait(35);
       PlayTone(ra,30); Wait(35);
       PlayTone(ra,15); Wait(20);
       PlayTone(so,15); Wait(20);
       
       PlayTone(ra,30); Wait(35);
       PlayTone(Do,30); Wait(35);
       PlayTone(re,30); Wait(35);
       PlayTone(Do,15); Wait(20);
       PlayTone(re,15); Wait8(20);
       
       PlayTone(mi,60); Wait(65);
       PlayTone(re,60); Wait(65);
       
       PlayTone(ra,30); Wait(35);
       PlayTone(Do,30); Wait(35);
       PlayTone(re,30); Wait(35);
       PlayTone(Do,15); Wait(20);
       PlayTone(re,15); Wait(20);
       
       PlayTone(mi,30); Wait(35);
       PlayTone(so,30); Wait(35);
       PlayTone(ra,30); Wait(35);
       PlayTone(ra,15); Wait(20);  
       PlayTone(so,15); Wait(20);  
       
       PlayTone(ra,30); Wait(35);   
       PlayTone(Do,30); Wait(35);
       PlayTone(re,30); Wait(35);
       PlayTone(Do,15); Wait(20);
       PlayTone(re,15); Wait(20);
       
       PlayTone(ra,90); Wait(95);
       Wait(20);
   }
}
task main()
{
   start play_music ;    // 演奏を開始
}

【工夫した点・努力した点】

  • 1つのモーターで右左折、左右に動きながらの前進をするという点。
  • ギアの調節。大きいギアを使うことにより、抵抗を少なくし、また回転数を上げ行動を大きくしました。
  • 投石台。ゴムを使用することにより、モーターの力だけの場合よりも強く投げることができるようになりました。

【今後の課題・反省】

  • 車体が前に傾いているため、光センサが下を向いてしまいました。後ろの車輪を小さくすることにより車体を平行にしようと考えましたが、その場合は逆に上を向いてしまいます。どのようなセンサでも設置場所には今後気をつけて全体を作っていきたいです。今回は投石台を作り終えて最後に、光センサの設置場所を考えていました。
  • 歯車が噛み合うからという理由でギアを選び、組んでいくだけでなく、そのギアにかかる抵抗や設置理由(例えば、タイヤを早く回したいならば、大きなギアにする)を深く考えていかなければいけないと感じました。

【感想】

  • 今回はプログラム、ロボット組み立てと両方とも難しく感じ溜め息が出ましたが、このレポートが完成してみると、今は達成感で一杯です。後は課題発表に向け、ロボットの調整をしっかりしていきたいです。(座敷童)
  • プログラムが難しく、友達の助けを借りながら何とか完成できました。音楽のプログラミングでは、私の音楽の知識が生かせたので良かったと思います。(たまちゃん)

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

  • 投石台についての説明など、とてもわかりやすくてよいと思います。 -- ヒロヤ? 2007-07-14 (土) 22:38:28


添付ファイル: file前進.jpg 217件 [詳細] file完成型2.jpg 217件 [詳細] file投石台2.jpg 228件 [詳細] fileストッパー1.jpg 246件 [詳細] fileディファレンシャルギア.jpg 202件 [詳細] file投石台3.jpg 225件 [詳細] file投石台.jpg 220件 [詳細] file光センサの設置.jpg 221件 [詳細] fileプログラム1.jpg 113件 [詳細] file完成型.jpg 105件 [詳細] fileギアの選択.jpg 228件 [詳細] file試作機2.jpg 219件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-07-14 (土) 22:38:28