2006a/B5

光を追いかけるロボット

機体

今回は前回の機体をベースに、前のほうに光センサーを取り付けました。ただ、光をこまめに動かして、機体がちょこまか動くと、後輪が外れてしまうことがあります。

余談:今回は光センサーの都合上、毎回恒例の鼻はつけれませんでした(笑)。

D1000020.JPG

プログラム

今回は光を探すときに音楽を流すパターンと、光を探すときとそうではないときの音楽をかえるプログラムを作りました。

  • 音楽を流すパターン(プログラム1)
制作者:たかち
int light_max=0,time_max=0; //light_maxとtime_maxを定義します。
#define TURN_TIME 360 //旋回時間を定義します。
#define Do  523 //「ド」の音を定義します。
#define Re  587 //「レ」の音を定義します。
#define Mi  659 //「ミ」の音を定義します。
#define Fa  698 //「ファ」の音を定義します。
#define Sol 784 //「ソ」の音を定義します。
task play_music() //音楽を流すプログラムです。(メリーさんの羊)
{
 while (true) //音楽のメロディーを設定します。(以下は歌詞に沿って説明)
   {
       PlayTone(Mi,25); Wait(30); //めー  
       PlayTone(Re, 5); Wait(10); //り  
       PlayTone(Do,15); Wait(20); //さん 
       PlayTone(Re,15); Wait(20); //の
       PlayTone(Mi,15); Wait(20); //ひ 
       PlayTone(Mi,15); Wait(20); //つ
       PlayTone(Mi,35); Wait(40); //じー 
       PlayTone(Re,15); Wait(20); //ひ
       PlayTone(Re,15); Wait(20); //つ
       PlayTone(Re,35); Wait(40); //じー
       PlayTone(Mi,15); Wait(20); //ひ
       PlayTone(Sol,15); Wait(20); //つ
       PlayTone(Sol,35); Wait(40); //じー
       PlayTone(Mi,25); Wait(30); //めー
       PlayTone(Re, 5); Wait(10); //り
       PlayTone(Do,15); Wait(20); //さん
       PlayTone(Re,15); Wait(20); //の
       PlayTone(Mi,15); Wait(20); //ひ
       PlayTone(Mi,15); Wait(20); //つ
       PlayTone(Mi,35); Wait(40); //じー
       PlayTone(Re,15); Wait(20); //まっ
       PlayTone(Re,15); Wait(20); //し
       PlayTone(Mi,25); Wait(30); //ー
       PlayTone(Re, 5); Wait(10); //ろ
       PlayTone(Do,55); Wait(60); //けー
       Wait(20);
     }
}
task main() //メインプログラムです。
{
  SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1をライトセンサーに設定します。
  ClearTimer(0); //タイマーを初期化します。
  OnFwd(OUT_A);OnRev(OUT_C); //旋回します。
  start play_music; //音楽を流し始めます。
  while(FastTimer(0)<TURN_TIME){ //旋回中の行動を設定します。
     if(SENSOR_1>light_max){ //light_maxの値よりライトセンサーの値が高いときの行動を設定します。
        light_max=SENSOR_1; //現在のライトセンサーの値をlight_maxに設定します。
        time_max=FastTimer(0); //それまでの旋回時間をtime_maxに設定します。
        } 
  }
  Off(OUT_A+OUT_C); //旋回をやめます。
  stop play_music; //音楽をとめます。
  Wait(100); //少し止まっています。
  OnFwd(OUT_C);OnRev(OUT_A); //さっきと逆方向に旋回します。
  Wait(TURN_TIME-time_max); //最も明るいところまで旋回します。
  Off(OUT_A+OUT_C); //止まります。
  while(true){ //その後の行動を設定します。
     if(SENSOR_1>=light_max){ //ライトセンサーの値がlight_maxより大きいか同じときの行動を設定します。
        OnFwd(OUT_A+OUT_C); //前進します。
     }else{ //光を見失ったときの行動を設定します。 
        start play_music;音楽を流し始めます。
        OnFwd(OUT_A);OnRev(OUT_C); //旋回して光を探します。
        until(SENSOR_1>=light_max); //光を見つけるまで続けます。
        stop play_music; //音楽をとめます。
        }
     }
  }
  • 音楽をかえるパターン(プログラム2)
    制作者:たか
    int light_max=0,time_max=0; //光を追うための値を定義します。
    #define TURN_TIME 360 //旋回時間を定義します。
    #define Do  523 //「ド」の音を定義します。
    #define Re  587 //「レ」の音を定義します。
    #define Mi  659 //「ミ」の音を定義します。
    #define Fa  698 //「ファ」の音を定義します。
    #define Sol 784 //「ソ」の音を定義します。
    #define Ra 880 //「ら」の音を定義します。
    task play_music1() //一つ目の音楽を流すプログラムです。(メリーさんの羊)
    {
     while (true) //音楽のメロディーを設定します。(以下は歌詞に沿って説明)
        {   
           PlayTone(Mi,25); Wait(30); //めー 
           PlayTone(Re, 5); Wait(10); //り 
           PlayTone(Do,15); Wait(20); //さ 
           PlayTone(Re,15); Wait(20); //の
           PlayTone(Mi,15); Wait(20); //ひ
           PlayTone(Mi,15); Wait(20); //つ
           PlayTone(Mi,35); Wait(40); //じー
           PlayTone(Re,15); Wait(20); //ひ
           PlayTone(Re,15); Wait(20); //つ
           PlayTone(Re,35); Wait(40); //じー
           PlayTone(Mi,15); Wait(20); //ひ
           PlayTone(Sol,15); Wait(20); //つ
           PlayTone(Sol,35); Wait(40); //じー
           PlayTone(Mi,25); Wait(30); //めー
           PlayTone(Re, 5); Wait(10); //り
           PlayTone(Do,15); Wait(20); //さん
           PlayTone(Re,15); Wait(20); //の
           PlayTone(Mi,15); Wait(20); //ひ
           PlayTone(Mi,15); Wait(20); //つ
           PlayTone(Mi,35); Wait(40); //じー
           PlayTone(Re,15); Wait(20); //ま
           PlayTone(Re,15); Wait(20); //っ
           PlayTone(Mi,25); Wait(30); //しー 
           PlayTone(Re, 5); Wait(10); //ろ
           PlayTone(Do,55); Wait(60); //けー
           Wait(20); 
          } 
     }
    task play_music2() //2つ目の音楽のプログラムです。(カエルのうた)
    {
      while(true) //音楽のメロディーを設定します。(以下は歌詞に沿って説明)
      {
       PlayTone(Do,15); Wait(20); //かー
       PlayTone(Re,15); Wait(20); //えー
       PlayTone(Mi,15); Wait(20); //るー
       PlayTone(Fa,15); Wait(20); //のー
       PlayTone(Mi,15); Wait(20); //うー
       PlayTone(Re,15); Wait(20); //たー
       PlayTone(Do,30); Wait(35); //がー
       PlayTone(Mi,15); Wait(20); //きー
       PlayTone(Fa,15); Wait(20); //こー
       PlayTone(Sol,15); Wait(20); //えー
       PlayTone(Ra,15); Wait(20); //てー
       PlayTone(Sol,15); Wait(20); //くー
       PlayTone(Fa,15); Wait(20); //るー
       PlayTone(Mi,30); Wait(35); //よー
       PlayTone(Do,15); Wait(50); //ぐぁ
       PlayTone(Do,15); Wait(50); //ぐぁ
       PlayTone(Do,15); Wait(50); //ぐぁ
       PlayTone(Do,15); Wait(50); //ぐぁ
       PlayTone(Do,10); Wait(15); //げ
       PlayTone(Do,10); Wait(15); //ろ
       PlayTone(Re,10); Wait(15); //げ
       PlayTone(Re,10); Wait(15); //ろ
       PlayTone(Mi,10); Wait(15); //げ 
       PlayTone(Mi,10); Wait(15); //ろ
       PlayTone(Fa,10); Wait(15); //げ
       PlayTone(Fa,10); Wait(15); //ろ
       PlayTone(Mi,15); Wait(20); //ぐぁ
       PlayTone(Re,15); Wait(20); //ぐぁ
       PlayTone(Do,30); Wait(35); //ぐぁ 
     }
    }
    task main() //メインプログラムです。
    {
       SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーに設定します。
       ClearTimer(0); //タイマーを初期化します。
       OnFwd(OUT_A);OnRev(OUT_C); //旋回します。
       start play_music1; //音楽を流します。
       while(FastTimer(0)<TURN_TIME){ //旋回している間の行動を定めます。
          if(SENSOR_1>light_max){ //センサーの値がlight_maxより高いときのことを定めます。
             light_max=SENSOR_1; //センサー1の値をlight_maxに設定します。
             time_max=FastTimer(0); //この時間をtime_maxに設定します。
             }
       }
       Off(OUT_A+OUT_C); //停止します。
       stop play_music1; //音楽をとめます。
       Wait(100); //1秒間静止します。
       OnFwd(OUT_C);OnRev(OUT_A); //さっきと反対周りに旋回します。
       Wait(TURN_TIME-time_max); //先ほどまでの旋回時間から最も光の強かったところまでの
                    時間を引いただけ旋回します。
       Off(OUT_A+OUT_C); //止まります。
       while(true){ //光を追尾する行動を設定します。
          if(SENSOR_1>=light_max){ //センサー1がlight_maxより大きいか、同じときの行動を設定します。
          start play_music1; //1つ目の音楽を流します。   
          OnFwd(OUT_A+OUT_C); //前進します。
          until(SENSOR_1>=light_max); //光を見失うまで続けます。
          stop play_music1; //音楽を止めます。
          }else{ //光を見失ったときの行動を設定します。
             start play_music2; //2つ目の音楽を流します。
             OnFwd(OUT_A);OnRev(OUT_C); //旋回します。
             until(SENSOR_1>=light_max); //光を見つけるまで続けます。
             stop play_music2; //音楽を止めます。
             }
          }
       }
  • こっちの班もフローチャートはじめました。
    チャート.JPG

工夫した点

  • 二つのプログラムで光を探す部分を共通のものにすることで、作業を簡略化しました。(手抜き!?)
  • 前回の機体をほとんどそのまま使用して、作業の量を少なくしました。(また手抜き!?)

苦労した点

  • 最後の、光を探すプログラムが少し手こずりました。結局、光を探すところは効率が悪いものしかできませんでした。(旋回する方向と反対に移動すると、わざわざ遠回りして探してしまうため。)
  • カエルの歌のテンポを調整するのが大変でした。特に、ラストの「げろげろ・・・」の辺りが他とテンポが違ったので手こずりました。

改善できなかった点・もっと工夫したかった点

  • タイヤが取れやすいところをもっと補強したかったです。
  • 光を探すところを、光センサーを増やして、反対方向に光が移動したときに反対にも探せるようにしたかったです。

反省・感想

今回はみんなで集まってやることができたのでよかったです。機体のほうにはあまり工夫を凝らすかとができなかったので残念でした。次回のロボコンではみんなをアッと驚かすようなロボットを作成したいと思います。

コメント

何かあったらお願いします。

  • 「明るさの最大値を探す」という部分をサブルーチンにして、光を追跡していく途中で光を見失った場合にもその都度(つまり最初だけでなく)そのサブルーチンを呼び出すようにしてもいいと思います。 -- 松本(教員)? 2006-07-24 (月) 12:33:15
  • 光を探すプログラムについてもう少し、どのようにすればよかったとか、このようにしたかったとか、など書いてみるといいでしょう。 -- まいける(TA) 2006-07-25 (火) 19:11:40


添付ファイル: fileチャート.JPG 188件 [詳細] fileD1000020.JPG 202件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-08-19 (土) 00:52:48