音楽を鳴らして光の方へ行くロボット

はじめに

メンバーチェンジして senoby キンニクマン シゲ の3人チームになった。前回メンバーチェンジをしなかったので、これが初めてのメンバーチェンジ。作業する日程を変更する必要があるなど、手間取ることもあったが、作業は問題なく進めれた。

プログラミング担当   「シゲ」「キンニクマン」 ホームページ/写真担当    「senoby」

今回3人では作業しずらいということから基本的に自分の担当の作業をしっかりし、担当外の作業は軽い補助をするに留まった。具体的にはシゲとキンニクマンのプログラミングに困ったときsenobyが案を出したり一緒にミスを探した。逆にシゲとキンニクマンがホームページの更新具合をチェックし、内容について「簡単な構造でも写真があったほうがいい/プログラムの解説も付けよう」など様々なアドバイスをしてくれた。

写真

今回はプログラムの変更前後でのロボットの改造はありませんでした。ずっとこの光センサー1個というシンプルな形です。後ろにも下にも付属品は何もついていません。

ロボットの写真

作成予定手順

1.以前作成した光の方へ向くロボットのプログラムと音楽を鳴らすプログラムを1つにまとめる。

2.光度を調べ、一番高い方を向くというプログラムに、向いた後前に進む&音楽を鳴らすというプログラムをつける。

というプログラムを最初はイメージしていた。基本的には2つの動作を同時に行ったり、組み合わせになっているだけなので簡単かと思われた。

発生した問題と改善

発生した問題 光の方を向かなかった。

改善にあたって (工夫した点) 最大採光量が常にmaxになるようになっていたため、光の方を向かなかった。これを直せば完成だったのだが、もっとわかりやすいプログラムを作成することにした。というのもタイマーを利用するプログラムを止めて、光の方向へ進み、光がないときは光を探すという設定に変更した。こうすることで簡単なプログラムで光を追いかけることができた。また、最初にdefineを使ってプログラムを簡略できるよう工夫した。

変更後の作成予定手順

1.普段は 光が50以上ならば前に進む         以下ならば光を探す  とプログラム

2.音楽を鳴らしながら旋回し、光を探す   とプログラム

3.作業1と2を繰り返す

プログラム

#define turn_right OnFwd(OUT_A);OnRev(OUT_C);
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);
#define stop_turning Off(OUT_A+OUT_C);
#define TURN_TIME 340
#define Do  523
#define Re  587
#define Mi  659
#define Fa  698
#define So  784
#define Ra  880
 
task play_music2()
{
      while(true)
  {
       PlayTone(Do,25); Wait(30); //きらきら星を演奏するタスク
                   PlayTone(Do,25); Wait(30);
                   PlayTone(So,25); Wait(30);
                   PlayTone(So,25); Wait(30);
                   PlayTone(Ra,25); Wait(30);
                   PlayTone(Ra,25); Wait(30);
                   PlayTone(So,25); Wait(45);
       
                   PlayTone(Fa,25); Wait(30);
                   PlayTone(Fa,25); Wait(30);
                   PlayTone(Mi,25); Wait(30);
                   PlayTone(Mi,25); Wait(30);
                   PlayTone(Re,25); Wait(30);
                   PlayTone(Re,25); Wait(30);
                   PlayTone(Do,25); Wait(45);
                                          } 
       }
task main(){ 
   SetSensor(SENSOR_2, SENSOR_LIGHT); 光センサー
 while(true){
   if(SENSOR_2>50){                     //光があれば
                   OnFwd(OUT_A+OUT_C);    //前に進む
                                  }else{  //なければ
                   start play_music2;    //音楽演奏
                   OnFwd(OUT_A);       //旋回
                   OnRev(OUT_C); 
                   until(SENSOR_2>50);   //光見つけたら
                   stop play_music2;    //演奏終了
                          }
 }
}	

発展編

探している間と光の方へ進むときの音楽を変えて、ロボットがどういう状況かを音で判断できるようにする

プログラム

#define turn_right OnFwd(OUT_A);OnRev(OUT_C);
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);
#define stop_turning Off(OUT_A+OUT_C);
#define TURN_TIME 340
#define Do  523
#define Re  587
#define Mi  659
#define Fa  698
#define So  784
#define Ra  880
 task play_music1()   // チャルメラを演奏するタスク 
{
   while (true)
   {
       PlayTone(Do,25); Wait(30);
       PlayTone(Re,25); Wait(30);
       PlayTone(Mi,45); Wait(50);
       PlayTone(Re,25); Wait(30);
       PlayTone(Do,20); Wait(35);
             
       PlayTone(Do,25); Wait(30);
       PlayTone(Re,25); Wait(25);
       PlayTone(Mi,25); Wait(30);
       PlayTone(Re,25); Wait(30);
       PlayTone(Do,25); Wait(30);
       PlayTone(Re,45); Wait(55);
                                                                 
}
                 }
  
task play_music2() //きらきら星を演奏するタスク
{
      while(true)
  {
       PlayTone(Do,25); Wait(30);
                   PlayTone(Do,25); Wait(30);
                   PlayTone(So,25); Wait(30);
                   PlayTone(So,25); Wait(30);
                   PlayTone(Ra,25); Wait(30);
                   PlayTone(Ra,25); Wait(30);
                   PlayTone(So,25); Wait(45);
       
                   PlayTone(Fa,25); Wait(30);
                   PlayTone(Fa,25); Wait(30);
                   PlayTone(Mi,25); Wait(30);
                   PlayTone(Mi,25); Wait(30);
                   PlayTone(Re,25); Wait(30);
                   PlayTone(Re,25); Wait(30);
                   PlayTone(Do,25); Wait(45);
                                          } 
       }
task main(){ 
   SetSensor(SENSOR_2, SENSOR_LIGHT);   光センサー
 while(true){
   if(SENSOR_2>50){                 //光があるときは
                   start play_music1;  //チャルメラを演奏
                   OnFwd(OUT_A+OUT_C); //進む
                   until(SENSOR_2<50); //見失ったら
                   stop play_music1;  //演奏終了
                }else{         //光がないときは
                   start play_music2;  //きらきら星演奏
                   OnFwd(OUT_A);    //旋回
                   OnRev(OUT_C); 
                   until(SENSOR_2>50);  //光をみつけたら
                   stop play_music2;  //演奏終了
                          }
 }
}	

つまりこのような場合分けです

   ある→チャルメラ演奏→進む→光を見失う→「光がない」へ

光が

   ない→きらきら星演奏→回転しながら光を探す→光を発見する→「光がある」へ

苦労した点

探しているときと、追いかけるときで音楽を変えるというプログラムはif,elseなど色々使わないといけなかったので複雑になり、難しかった。とくに発案する前はif else について理解が完全ではなかったため、ホームページをみて、復習するところから始めたので時間がかかった。しかしただ場合分けをしているだけで場面ごとの単純なプログラムがたくさん書いてあるだけだったと気づくと、複雑には見えなかった。場合分けは自体は簡単にできたが、プログラミングをするのには手間がかかった。

感想/反省

タイマーの使い方が今いちわからなかった。 タイヤかエンジンの調子が相変わらず悪かったが、作業に支障はでなかった。 defineをたくさん使うことでプログラムがすっきりした。定義の部分はいつもより長くなったが、行間をとることですっきりした。 何も組み立てる必要がなかったので、すぐプログラミングに移れた。 ホームページに目次をつけたため、少しは見やすくなった。 if elseなどの用法が完璧に理解でき、それをもとに自分達で新たなプログラミングができたことがよかった。そしてif elseは場合分け=ロボットによる状況判断ということがわかり大変便利だということにも気づいた。ロボコンでもタッチセンサーが作動したら、腕をとじて缶をつかむ など様々なことに使えると思う。

  • 苦労した点等を、もうちょっと具体的に書いてほしいです。どう複雑になって難しかったのか、どのような方法で問題を解決した(しようとした)のか、等を記述するとよりよくなると思いますよ。 -- ゆき(TA)? 2006-07-20 (木) 10:58:44


添付ファイル: filekadai3.JPG 225件 [詳細] fileDSC00112.JPG 124件 [詳細] fileDSC00145.jpg 91件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-07-27 (木) 16:10:04