2006a/B7

光を追っかけるロボット

今回の課題

懐中電灯の光を追いかけて進むロボットを製作し、以下の中から2種類以上のプログラムを作成せよ。

1,光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す
2,光源を見失った時には明るさに比例した周波数の音を出しながら旋回して光源を探す
3,光源を見失っていないときにはある曲を演奏し、見失った時には別の曲を演奏しながら光源を探す
4,上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する
ただし支給されているモータ、光センサ、タッチセンサはいくつ使ってもよい。

今回のメンバー

・音案
主にプログラム・HP担当、あとロボットもちょこっと
・滝沢クリステル
ロボット担当
・たいよう
音楽制作担当

今回のロボット

プロトタイプ

ロボット ロボット

光センサーを一つ使用。今回は何のオプションも無く少しつまらない・・・。
プログラムを組んでいくうちにセンサー一つでの限界を知る。というわけでセンサー2つを使ったロボットを作成。

改造型

ロボット ロボット

そんでできたのがこれ。
プロトタイプに補助の光センサーを一個斜め方向に加えただけのロボット。
センサー一つ加えただけでこんなに性能が違うとは・・・。しかし左右対称じゃないので少し不評。

使った光源、音楽

光源

何の変哲の無い懐中電灯(光量最大110)

音楽

とりあえず著作権に触れない程度に・・・
1曲目・・・エリーゼのために(ベートヴェン作曲)
2曲目・・・主よ人の望みの喜びよ(バッハ作曲)

光を追っかけるプログラム

これがないと始まらない。というわけでまず始めに光を追うプログラムを作成。
「光源が近づきすぎると停止するプログラム」も搭載

 #define lightmin 50 //センサーが感知する最低光量を50に設定
 #define lightmax 90 //センサーが感知する最高光量を90に設定
 
 task main()
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT); //センサ−2が光センサーであることを宣言
   
   while(true)
   {
       OnFwd(OUT_A+OUT_C); //センサーに反応が無いときは前進
       if(SENSOR_2<lightmin) //センサー2が最低光量より小さいときは
       {
           OnFwd(OUT_A);  //右回転
           OnRev(OUT_C);
           until(SENSOR_2>lightmin); //センサー2が最低光量を上回るまで。
       }
       if(SENSOR_2>lightmax) //センサー2が最高光量を超えた時
       {
           Off(OUT_A+OUT_C); //動作停止
           until(SENSOR_2<lightmax); //センサー2が最高光量を下回るまで
       }
   }
 }

課題のプログラム

私たちが選択した課題は次の二つです
3,光源を見失っていないときにはある曲を演奏し、見失った時には別の曲を演奏しながら光源を探す
4,上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する

プロトタイプ(光センサーを一つ使用したもの)

最初に音楽をインプットする。

 
  
 #define Dod 262   //音階を設定
 #define Red 294
 #define Mid 330
 #define Fad 349
 #define Fadsha 370
 #define Sold 392
 #define Sodsha 415
 #define Lad 440
 #define  Ladsha 466
 #define Shid 494
 #define Do  523
 #define Re  587
 #define Resha 622
 #define Mi  659
 #define  Fa 698
 #define Fasha 740
 #define Sol 784
 #define La 880
    
 task play_music1()  //music1に「エリーゼのために」をインプット
 {
   while (true)
   {
 
    PlayTone(Mi,15);Wait(20);
    PlayTone(Resha,15);Wait(20);
    PlayTone(Mi,15);Wait(20);
    PlayTone(Resha,15);Wait(20);
    PlayTone(Mi,15);Wait(20);
    PlayTone(Shid,15);Wait(20);
    PlayTone(Re,15);Wait(20);
    PlayTone(Do,15) ;Wait(20);
    PlayTone(Lad,45);Wait(50);
    PlayTone(Dod,15);Wait(20);
    PlayTone(Mid,15);Wait(20);
    PlayTone(Lad,15);Wait(20);
    PlayTone(Shid,45);Wait(50);
    PlayTone(Mid,15);Wait(20);
    PlayTone(Sodsha,15);Wait(20);
    PlayTone(Shid,15);Wait(20);
    PlayTone(Do,45);Wait(50);
    PlayTone(Mid,15);Wait(20);
    PlayTone(Mi,15);Wait(20);
    PlayTone(Resha,15);Wait(20);
    PlayTone(Mi,15);Wait(20);
    PlayTone(Resha,15);Wait(20);
    PlayTone(Mi,15);Wait(20);
    PlayTone(Shid,15);Wait(20);
    PlayTone(Re,15);Wait(20);
    PlayTone(Do,15) ;Wait(20);
    PlayTone(Lad,45);Wait(50);
    PlayTone(Dod,15);Wait(20);
    PlayTone(Mid,15);Wait(20);
    PlayTone(Lad,15);Wait(20);
    PlayTone(Shid,45);Wait(50);
    PlayTone(Mid,15);Wait(20);
    PlayTone(Do,15);Wait(20);
    PlayTone(Shid,15);Wait(20);
    PlayTone(Lad,135);Wait(140);
    Wait(60);
    }
 }
 
 
 task play_music2() // music2に「主よ人の望みの喜びよ」をインプット
 {
   while (true)
   {
   PlayTone(Sold,35); Wait(40); 
   PlayTone(Lad,35);Wait(40);
   PlayTone(Shid,35);Wait(40);
   PlayTone(Re,35);Wait(40);
   PlayTone(Do,35);Wait(40);
   PlayTone(Do,35);Wait(40);
   PlayTone(Mi,35);Wait(40);
   PlayTone(Re,35);Wait(40);
   PlayTone(Re,35);Wait(40);
   PlayTone(Sol,35);Wait(40);
   PlayTone(Fasha,35);Wait(40);
   PlayTone(Sol,35);Wait(40);
   PlayTone(Re,35);Wait(40);
   PlayTone(Shid,35);Wait(40);
   PlayTone(Sold,35); Wait(40); 
   PlayTone(Lad,35);Wait(40);
   PlayTone(Shid,35);Wait(40);
   PlayTone(Do,35);Wait(40);
   PlayTone(Re,35);Wait(40);
   PlayTone(Mi,35);Wait(40);
   PlayTone(Re,35);Wait(40);
   PlayTone(Do,35);Wait(40);
   PlayTone(Shid,35); Wait(40); 
   PlayTone(Lad,35);Wait(40);
   PlayTone(Shid,35);Wait(40);
   PlayTone(Sold,35); Wait(40); 
   PlayTone(Fadsha,35);Wait(40);
   PlayTone(Sold,35); Wait(40); 
   PlayTone(Lad,35);Wait(40);
   PlayTone(Red,35);Wait(40);
   PlayTone(Fadsha,35);Wait(40);
   PlayTone(Lad,35);Wait(40);
   PlayTone(Do,35);Wait(40);
   PlayTone(Shid,35);Wait(40);
   PlayTone(Lad,35);Wait(40);
   Wait(60);
     
  }
 }

次にこのプログラムに上で作った光を追っかけるプログラムを追加

 #define lightmin 50 //センサーが感知する最低光量を50に設定
 #define lightmax 90 //センサーが感知する最高光量を90に設定
 
 task main()
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT); //センサ−2が光センサーであることを宣言
   
   while(true)
   {
       OnFwd(OUT_A+OUT_C); //センサーに反応が無いときは前進
       start play_music2 //「主よ人の望みの喜びよ」を演奏
       stop play_music1
       if(SENSOR_2<lightmin) //センサー2が最低光量より小さいときは
       {
           OnFwd(OUT_A);  //右回転
           OnRev(OUT_C);
           start play_music1 //「エリーゼのために」を演奏 
           stop play_music2
           until(SENSOR_2>lightmin); //センサー2が最低光量を上回るまで。
       }
       if(SENSOR_2>lightmax) //センサー2が最高光量を超えた時
       {
           Off(OUT_A+OUT_C); //動作停止
           stop play_music1
           stop play_music2
           until(SENSOR_2<lightmax); //センサー2が最高光量を下回るまで
       }
   }
 }

しかしここで問題が発生。 このプログラムだとwhile内のプログラムが繰り返されるため、 センサーに何の反応なし→前進+「エリーゼのために」を演奏→センサーに何の反応なし→・・・の繰り返しをしているときに音楽がリセットされてしまい前進しているときはずっと「エリーゼのために」の最初の音であるミの音がずっと流れ続けてしまう。
そこで次のようにプログラムを書き換えた

 task main()
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2が光センサーであると宣言
   
   while(true)
   {
       Off(OUT_A+OUT_C);  //センサーに反応が無い場合はすべての動作を停止
       stop play_music1; 
       stop play_music2;
       if(SENSOR_2<lightmin) //センサー2が最低光量より少ないときは
       {
           start play_music1; //「エリーゼのために」を演奏
           stop play_music2;
           OnFwd(OUT_A); //右回転
           OnRev(OUT_C);
           until(SENSOR_2>lightmin); //センサー2が最低光量を上回るまで
       }
       if((SENSOR_2<lightmax)&&(SENSOR_2>lightmin)) //センサー2が最低光量を上回り、最高光量より少ないときは
       {
           stop play_music1; //「主よ人の望みの喜びよ」を演奏
           start play_music2;
           OnFwd(OUT_A+OUT_C); //前進
           until((SENSOR_2>lightmax)||(SENSOR_2<lightmin));//センサー2が最低光量より少なくなるかまたは最高光量を上回るまで
       }
   }
 }

センサーに何の反応がないときは動作を停止という風に書き換えることによりにこの問題は解決した。
しかしまだまだ問題点があった。それは光源が左方向に逃げた時、右回りしかできないので無駄に回転しすぎて光を見失ってしまう点だ。

改造版(光センサーを二つ使用した場合)

そこで今まで使っていたセンサーの横に補助センサーをつけて次のようなプログラムを修正

 #define lightmin 50 //センサーが感知する最低光量を50に設定
 #define lightmax 90 //センサーが感知する最高光量を90に設定
 
    
 task main()
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2が光センサーであると宣言
   SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1が光センサーであると宣言
   
   while(true)
   {
       Off(OUT_A+OUT_C); //センサーに反応が無いときは動作を停止
       stop play_music1;
       stop play_music2;
       if((SENSOR_2<lightmin)&&(SENSOR_1<lightmin)) //センサー1、2が共に最低光量を下回っているときは
       {
           start play_music1;「エリーゼのために」を演奏
           stop play_music2;
           OnFwd(OUT_A); //右回転
           OnRev(OUT_C);
           until((SENSOR_2>lightmin)||(SENSOR_1>lightmin)); //センサー1、2のどちらかが最低光量を上回るまで
       }
       if((SENSOR_2<lightmin)&&(SENSOR_1>lightmin)) //センサー1が最低光量を上回り、センサー2が最低光量を下回った場合
       {
           start play_music1;「エリーゼのために」を演奏
           stop play_music2;
           OnRev(OUT_A); //3秒間左回転
           OnFwd(OUT_C);
           Wait(30);
           until((SENSOR_2>lightmin)||(SENSOR_1<lightmin));センサー1が最低光量を下回るかセンサー2が最低光量を上回るまで
       }
       if((SENSOR_2<lightmax)&&(SENSOR_2>lightmin)) //センサー2が最低光量を上回り、最高光量より少ないときは
       {
           stop play_music1; //「主よ人の望みの喜びよ」を演奏
           start play_music2;
           OnFwd(OUT_A+OUT_C); //前進
           until((SENSOR_2>lightmax)||(SENSOR_2<lightmin));//センサー2が最低光量より少なくなるかまたは最高光量を上回るまで
   }
 }

このプログラムにより光源が左に逃げたとしても補助センサーが反応して左回転するように命令を加える。

完成形

それで完成形のプログラムがこれです↓

 
 #define lightmin 50 //センサーが感知する最低光量を50に設定
 #define lightmax 90 //センサーが感知する最高光量を90に設定
 
 #define Dod 262   //音階を設定
 #define Red 294
 #define Mid 330
 #define Fad 349
 #define Fadsha 370
 #define Sold 392
 #define Sodsha 415
 #define Lad 440
 #define  Ladsha 466
 #define Shid 494
 #define Do  523
 #define Re  587
 #define Resha 622
 #define Mi  659
 #define  Fa 698
 #define Fasha 740
 #define Sol 784
 #define La 880
    
 task play_music1()  //music1に「エリーゼのために」をインプット
 {
   while (true)
   {
 
    PlayTone(Mi,15);Wait(20);
    PlayTone(Resha,15);Wait(20);
    PlayTone(Mi,15);Wait(20);
    PlayTone(Resha,15);Wait(20);
    PlayTone(Mi,15);Wait(20);
    PlayTone(Shid,15);Wait(20);
    PlayTone(Re,15);Wait(20);
    PlayTone(Do,15) ;Wait(20);
    PlayTone(Lad,45);Wait(50);
    PlayTone(Dod,15);Wait(20);
    PlayTone(Mid,15);Wait(20);
    PlayTone(Lad,15);Wait(20);
    PlayTone(Shid,45);Wait(50);
    PlayTone(Mid,15);Wait(20);
    PlayTone(Sodsha,15);Wait(20);
    PlayTone(Shid,15);Wait(20);
    PlayTone(Do,45);Wait(50);
    PlayTone(Mid,15);Wait(20);
    PlayTone(Mi,15);Wait(20);
    PlayTone(Resha,15);Wait(20);
    PlayTone(Mi,15);Wait(20);
    PlayTone(Resha,15);Wait(20);
    PlayTone(Mi,15);Wait(20);
    PlayTone(Shid,15);Wait(20);
    PlayTone(Re,15);Wait(20);
    PlayTone(Do,15) ;Wait(20);
    PlayTone(Lad,45);Wait(50);
    PlayTone(Dod,15);Wait(20);
    PlayTone(Mid,15);Wait(20);
    PlayTone(Lad,15);Wait(20);
    PlayTone(Shid,45);Wait(50);
    PlayTone(Mid,15);Wait(20);
    PlayTone(Do,15);Wait(20);
    PlayTone(Shid,15);Wait(20);
    PlayTone(Lad,135);Wait(140);
    Wait(60);
    }
 }
 
 
 task play_music2() // music2に「主よ人の望みの喜びよ」をインプット
 {
   while (true)
   {
   PlayTone(Sold,35); Wait(40); 
   PlayTone(Lad,35);Wait(40);
   PlayTone(Shid,35);Wait(40);
   PlayTone(Re,35);Wait(40);
   PlayTone(Do,35);Wait(40);
   PlayTone(Do,35);Wait(40);
   PlayTone(Mi,35);Wait(40);
   PlayTone(Re,35);Wait(40);
   PlayTone(Re,35);Wait(40);
   PlayTone(Sol,35);Wait(40);
   PlayTone(Fasha,35);Wait(40);
   PlayTone(Sol,35);Wait(40);
   PlayTone(Re,35);Wait(40);
   PlayTone(Shid,35);Wait(40);
   PlayTone(Sold,35); Wait(40); 
   PlayTone(Lad,35);Wait(40);
   PlayTone(Shid,35);Wait(40);
   PlayTone(Do,35);Wait(40);
   PlayTone(Re,35);Wait(40);
   PlayTone(Mi,35);Wait(40);
   PlayTone(Re,35);Wait(40);
   PlayTone(Do,35);Wait(40);
   PlayTone(Shid,35); Wait(40); 
   PlayTone(Lad,35);Wait(40);
   PlayTone(Shid,35);Wait(40);
   PlayTone(Sold,35); Wait(40); 
   PlayTone(Fadsha,35);Wait(40);
   PlayTone(Sold,35); Wait(40); 
   PlayTone(Lad,35);Wait(40);
   PlayTone(Red,35);Wait(40);
   PlayTone(Fadsha,35);Wait(40);
   PlayTone(Lad,35);Wait(40);
   PlayTone(Do,35);Wait(40);
   PlayTone(Shid,35);Wait(40);
   PlayTone(Lad,35);Wait(40);
   Wait(60);
     
  }
 }
 
 
    
 task main()
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2が光センサーであると宣言
   SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1が光センサーであると宣言
   
   while(true)
   {
       Off(OUT_A+OUT_C); //センサーに反応が無いときは動作を停止
       stop play_music1;
       stop play_music2;
       if((SENSOR_2<lightmin)&&(SENSOR_1<lightmin)) //センサー1、2が共に最低光量を下回っているときは
       {
           start play_music1;「エリーゼのために」を演奏
           stop play_music2;
           OnFwd(OUT_A); //右回転
           OnRev(OUT_C);
           until((SENSOR_2>lightmin)||(SENSOR_1>lightmin)); //センサー1、2のどちらかが最低光量を上回るまで
       }
       if((SENSOR_2<lightmin)&&(SENSOR_1>lightmin)) //センサー1が最低光量を上回り、センサー2が最低光量を下回った場合
       {
           start play_music1;「エリーゼのために」を演奏
           stop play_music2;
           OnRev(OUT_A); //3秒間左回転
           OnFwd(OUT_C);
           Wait(30);
           until((SENSOR_2>lightmin)||(SENSOR_1<lightmin));センサー1が最低光量を下回るかセンサー2が最低光量を上回るまで
       }
       if((SENSOR_2<lightmax)&&(SENSOR_2>lightmin)) //センサー2が最低光量を上回り、最高光量より少ないときは
       {
           stop play_music1; //「主よ人の望みの喜びよ」を演奏
           start play_music2;
           OnFwd(OUT_A+OUT_C); //前進
           until((SENSOR_2>lightmax)||(SENSOR_2<lightmin));//センサー2が最低光量より少なくなるかまたは最高光量を上回るまで
   }
 }

工夫した点

・補助の光センサーを加えることにより光をより早く追いかけられるようにした点
・センサーに反応がないときに音楽を流すように命令するとその音楽の最初の音しか流れないということを防ぐためにセンサーに反応が無いときは「動作停止」という命令をプログラムした点

苦労した点

・正面の光センサーと補助の光センサーを近づけすぎると誤作動を起こし、遠すぎると不可解な動きをしてしまうため二つのセンサーの間隔には苦労した。
・音楽を組み込む際になかなか音楽が流れてくれなかった点。

コメントをどうぞ



トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-07-14 (金) 15:07:02