2006a/A1

 

課題3:光を追いかけるロボット

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

  1. 光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す
  2. 光源を見失った時には明るさに比例した周波数の音を出しながら旋回して光源を探す
  3. 光源を見失っていないときにはある曲を演奏し、見失った時には別の曲警を演奏しながら光源を探す
  4. 上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する

ただし支給されているモータ、光センサ、タッチセンサはいくつ使ってもよい。

完成までの道のり

1. 光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す

4. 上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する

を、含めたプログラムを作成することに決定。

プログラム

基礎プログラム

・光を追うプログラム

(製作者:シュート・アップル)
#define front OnFwd(OUT_A+OUT_C);   
#define right OnRev(OUT_C);OnFwd(OUT_A);   
#define left OnRev(OUT_A);OnFwd(OUT_C);  //マクロ定義
#define minus 15    //定数定義

int light_max;   
int time_max;  //変数定義

task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT);   //センサ定義
   light_max=SENSOR_1;                      
   time_max=Timer(0);      //値の代入
   ClearTimer(0);        
              
   while(Timer(0)<=14)    //一周右回転する
   {
       right;                     
       if(SENSOR_1>light_max)     //センサの値と変数を比較
         {
          ClearTimer(1);      //タイマのクリア
          light_max =SENSOR_1 ;     //変数に値を代入     
         }
       else     //等しいもしくは小さい場合       
         {
          light_max = light_max;    //変数はそのまま
          time_max =Timer(1);     //変数に値を代入
         }
  }
  ClearTimer(1);                       
  while(Timer(1)<= time_max)     //タイマ1の時刻まで左回転           
  {left;}                         
  while(true)
  {
       if(SENSOR_1>= light_max-minus)   //センサの値が大きければ直進。
         {front;}                 
       if(SENSOR_1< light_max-minus)    //小さければ右回転。 
         {
          right;                   
          ClearTimer(2);               
       until((SENSOR_1>= light_max-minus)||(Timer(2)==5));  //大きい値を約半回転探す。
         }
       if(SENSOR_1< light_max-minus)   //見つからなければ、左回転。
         {
          left;                   
          until(SENSOR_1>= light_max-minus);  
         }
  }
}

<コメント>
右旋回して最も明るい所を探し、そこまでにかかる時間を記憶。
whileを使用して、その点まで左旋回します。
以後、光源を通り過ぎるまで直進。
過ぎてしまったら、右に半回転→見つからなければ左に回転と探します。

初期プログラム Ver.メリーさんの羊

1. 光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す

(製作者:シュート・アップル)
#define front OnFwd(OUT_A+OUT_C);   
#define right OnRev(OUT_C);OnFwd(OUT_A);    //行動マクロ
#define TURN_TIME 360
#define Do 1047            
#define Re 1175            
#define Mi 1319            
#define Fa 1397            
#define So 784             
#define Ra 880             
#define Si 988       //音のマクロ

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

int Light=0;
int turn_time=360;   //変数定義

task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);  //センサを定義
 ClearTimer(0);   //タイマーをクリア
 while(Timer(0)<=turn_time)  //一周右回転して探す

    {
       if(SENSOR_1>Light)  //センサの値が大きければ
         {
             Light=SENSOR_1;  //値を代入
         }
      right
    }
     
         right
  start play_music;                   
  until(SENSOR_1>=Light);   //演奏しながら右回転

 while(true)
    {
       if(SENSOR_1<Light)    //変数の方が大きければ
         {
             right
             until(SENSOR_1>=Light);   //右に回転して探す
         }
      else   //センサの値が大きければ
         {
             front
             stop play_music;          
             until(SENSOR_1<Light);  //光源を通り過ぎるまで直進
         }  
     } 
}

<コメント>
曲の紹介にあった『メリーさんの羊』を使用しました。
光源探索のルーチンは、基礎プログラムとほぼ同じなので割愛します。

初期プログラム Ver.きらきら星

(製作者:ゆず)

#define  Do  523  //音の定義
#define  Re   584
#define  Mi    659
#define  Fa   698 
#define  Sol  784
#define  Ra   880
#define  Si    988
 
 task play_music()    //曲演奏のマクロ
 {
    while (true)
    {
 
       PlayTone(Do, 10); Wait(15);  
       PlayTone(Do,10); Wait(15);  
       PlayTone(Sol,10); Wait(15);
       PlayTone(Sol,10); Wait(15);
       PlayTone(Ra,10); Wait(15);     
       PlayTone(Ra,10); Wait(15);
       PlayTone(Sol,20); Wait(25);
       PlayTone(Fa,10); Wait(15);
       PlayTone(Fa,10); Wait(15);
       PlayTone(Mi,10); Wait(15);
       PlayTone(Mi,10); Wait(15);
       PlayTone(Re,10); Wait(15);
       PlayTone(Re,10); Wait(15);
       PlayTone(Do,15); Wait(20);
      
      
    }
 }

 task main()
 {
     SetSensor(SENSOR_1, SENSOR_TOUCH);  //タッチセンサ定義
 
     start play_music ;    
     OnFwd(OUT_A+OUT_B);   //曲を演奏しながら直進
 
     until (SENSOR_1 == 1);
     stop play_music ;     
     Off(OUT_A+OUT_B);     //タッチセンサが触れたら、曲を止めて停止
 }

<コメント>
簡単な曲でごめんなさい。

初期プログラム 機能追加版

4. 上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する

(製作者:シュート・アップル)
#define front OnFwd(OUT_A+OUT_C);   
#define right OnRev(OUT_C);OnFwd(OUT_A);   //行動マクロ
#define TURN_TIME 360 //一周の秒数定義
#define Do 1047            
#define Re 1175            
#define Mi 1319            
#define Fa 1397            
#define So 784             
#define Ra 880             
#define Si 988             //音の定義

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(So,15); Wait(20);
       PlayTone(So,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);
   }
}

int Light=0;
int turn_time=360;  //変数定義
 
task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);  //センサを定義
 ClearTimer(0);   //タイマーをクリア
 while(Timer(0)<=turn_time)  //一周右回転して探す

    {
       if(SENSOR_1>Light)  //センサの値が大きければ
         {
             Light=SENSOR_1;  //値を代入
         }
      right
    }
     
         right
  start play_music;                   
  until(SENSOR_1>=Light);   //演奏しながら右回転

 while(true)
    {
       if(SENSOR_1<Light)    //変数の方が大きければ
         {
             right
             until(SENSOR_1>=Light);   //右に回転して探す
         }
        if(SENSOR_1>=75)   //光源に近づきすぎたら *1
        {
            Off(OUT_A+OUT_C); //モータを停止
         }
      else   //センサの値が大きければ
         {
             front
             stop play_music;          
             until(SENSOR_1<Light);  //光が弱くなるまで直進
         }  
     } 
}

<コメント>
1)のプログラムに*1部分を追加。
光源に近づきすぎたら、モータを停止して止まります。
しかし、これだと光源が動かないとずっと停止したまま?

ロボット

初号機

01.JPG
03.JPG

課題が課題なだけに、マシンとしては簡素な作り。
工夫点として、光を追いかけやすいようにと、 光センサーを機体の先端にななめ上向きに取り付けました。

反省・感想

プログラム

全体的にスムーズに出来てよかった。
しかし、曲を作るのに時間がかかった。

ロボット

これと言って特殊な機構は必要なかったため、
非常に簡素な作りにして、マシンとしてのバグを少なくした。
結果として、光センサーをつけただけの簡単なものだったのでよかったと思う。


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



添付ファイル: file03.JPG 221件 [詳細] file02.JPG 116件 [詳細] file01.JPG 212件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-08-25 (金) 18:07:09 (4745d)