【メニュー】

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

課題の内容

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

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

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

(期限:7月6日)

ロボット完成までの課程

与えられた課題をクリアするために…

両方一時に完成する事は難しいので、一つ一つのプログラムから作成していく事にした。

  1. 光を追いかけるロボットの作成
  2. 曲を演奏するロボットの作成(課題の1と4)

1.光を追いかけるロボットの作成

  • 光を追いかけるロボット 光センサーロボット

ロボットの特徴

  • 今回は、プログラムが少し複雑だったためロボット自体をシンプルにした。

光を追いかけるロボットのプログラム

作成者:イケス・カツヤ・ウメ・カトゥ
日時:7月6日(木)
#define go_straight OnFwd(OUT_A+OUT_C);       //直進
#define turn_right OnFwd(OUT_A);OnRev(OUT_C); //右旋回
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);  //左旋回
#define minus 15                              //マイナス

int max;   //maxを定義
int time;  //timeを定義
task main()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT);   //センサー2:光センサー
   max=SENSOR_2;                       //センサー2をmaxに指定
   time=Timer(0);                      //timeをタイマー0に指定
   ClearTimer(0);                      //タイマー0をリセット
   while(Timer(0)<=14)                 //タイマー0が14以下の時
   {
       turn_right                      //右旋回
       if(SENSOR_2>max)                //センサー2が最大値以上なら
         {
          ClearTimer(1);               //タイマー1をリセット
          max=SENSOR_2 ;               //センサー2を最大値に指定
         }
       else                            //そうでなければ
         {
          max=max;                     //maxをそのまま
          time=Timer(1);               //timeをタイマー1に指定
         }
  }
  ClearTimer(1);                       //タイマー1をリセット
  while(Timer(1)<=time)                //timeがタイマー以下の時
  {turn_left}                          //左旋回
  while(true)
  {
       if(SENSOR_2>=max-minus)         //センサー2が最大値?マイナス以上の時
         {go_straight}                 //直進
       if(SENSOR_2<max-minus)          //センサー2が最大値?マイナス未満の時
         {
          turn_right                   //右旋回
          ClearTimer(2);               //タイマー2をリセット
          until((SENSOR_2>=max-minus)||(Timer(2)==5));  //センサー2が最大値?マイナス以上、またはタイマー2が5まで
         }
       if(SENSOR_2<max-minus)          //まだセンサー2が最大値?マイナス未満の時
         {
          turn_left                    //左旋回
          until(SENSOR_2>=max-minus);  //センサー2が最大値?マイナス以上まで
         }
   }
}
  • 昨年度のページなどを参考にしてみたのだが、書かれているプログラムの意味を理解するのに多くの時間がかかってしまった。しかも、まだわからないところもノ。最後の課題であるロボコンでは、プログラムの意味をしっかりと理解した上で臨みたい。

2.曲を演奏するロボットの作成

演奏曲

『プログラム』

作成者:イケス・カトゥ
#define Mi  330
#define Fa  349
#define So  392
#define Ra  440
#define Si  494
#define Do  523
#define Re  587
#define mi  659


task play_music()  
{
   while (true)
   {
   PlayTone(Ra,30); Wait(35);
   PlayTone(Si,30); Wait(35);
   PlayTone(Si,30); Wait(35);
   PlayTone(Do,120); Wait(150);
   PlayTone(Do,30); Wait(35);
   PlayTone(Re,30); Wait(35);
   PlayTone(Do,30); Wait(35);
   PlayTone(Do,30); Wait(35);
   PlayTone(Si,120); Wait(150);
   PlayTone(Si,30); Wait(35);
   PlayTone(Do,30); Wait(35);
   PlayTone(Si,30); Wait(35);
   PlayTone(Si,30); Wait(35);
   PlayTone(Ra,120); Wait(150);
   PlayTone(Ra,30); Wait(35);
   PlayTone(Do,30); Wait(35);
   PlayTone(Ra,30); Wait(35);
   PlayTone(Si,30); Wait(35);
   PlayTone(Do,90); Wait(120);
   
   PlayTone(Ra,30); Wait(35);
   PlayTone(Si,30); Wait(35);
   PlayTone(Si,30); Wait(35);
   PlayTone(Do,120); Wait(150);
   PlayTone(Do,30); Wait(35);
   PlayTone(Re,30); Wait(35);
   PlayTone(Do,30); Wait(35);
   PlayTone(Do,30); Wait(35);
   PlayTone(Si,120); Wait(150);
   PlayTone(Si,30); Wait(35);
   PlayTone(Do,30); Wait(35);
   PlayTone(Si,30); Wait(35);
   PlayTone(Si,30); Wait(35);
   PlayTone(Ra,120); Wait(150);
   PlayTone(Mi,30); Wait(35);
   PlayTone(Fa,30); Wait(35);
   PlayTone(Mi,30); Wait(35);
   PlayTone(Mi,30); Wait(35);
   PlayTone(Ra,90); Wait(120);
  
   PlayTone(Ra,30); Wait(35);
   PlayTone(Do,30); Wait(35);
   PlayTone(mi,60); Wait(70);
   PlayTone(Do,30); Wait(35);
   PlayTone(Ra,30); Wait(35);
   PlayTone(Fa,60); Wait(70);
   PlayTone(Ra,60); Wait(65);
   PlayTone(Si,60); Wait(65);
   PlayTone(Do,30); Wait(35);
   PlayTone(Ra,90); Wait(120);
   PlayTone(Si,60); Wait(65);
   PlayTone(Do,30); Wait(35);
   PlayTone(Ra,90); Wait(120);
   PlayTone(Si,60); Wait(65);
   PlayTone(Do,30); Wait(35);
   PlayTone(Ra,60); Wait(70);
   PlayTone(Fa,30); Wait(35);
   PlayTone(Ra,30); Wait(35);
   PlayTone(Do,30); Wait(35);
   PlayTone(mi,60); Wait(65);
   PlayTone(Do,30); Wait(35);
   PlayTone(Do,30); Wait(35);
   PlayTone(Ra,30); Wait(35);
   PlayTone(Fa,60); Wait(70);
   PlayTone(Ra,60); Wait(65);
   PlayTone(Si,60); Wait(65);
   PlayTone(Do,30); Wait(35);
   PlayTone(Ra,90); Wait(120);
   PlayTone(Ra,90); Wait(95);
   PlayTone(Ra,90); Wait(95);
   PlayTone(So,60); Wait(65);
   PlayTone(Ra,120); Wait(125);
   Wait(50);
  }
  }
  task main()
  {
     SetSensor(SENSOR_1, SENSOR_TOUCH);                //センサ−1:タッチセンサー
     
     start play_music ;                                //音楽を演奏
     OnFwd(OUT_A+OUT_B);                               //直進
     
     until (SENSOR_1==1);                              //タッチセンサーが反応したとき
     stop play_music ;                                 //音楽の演奏を停止
     Off(OUT_A+OUT_B);                                 //停止
     }

  • 「青空」という曲。

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

『プログラム』

作成者:
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);
#define go_straight OnFwd(OUT_A+OUT_C);
#define Mi  330
#define Fa  349
#define So  392
#define Ra  440
#define Si  494
#define Do  523
#define Re  587
#define mi  659
task play_music()  
{
  while (true)
  {
  PlayTone(Ra,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Do,120); Wait(150);
  PlayTone(Do,30); Wait(35);
  PlayTone(Re,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Si,120); Wait(150);
  PlayTone(Si,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Ra,120); Wait(150);
  PlayTone(Ra,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Do,90); Wait(120);
  
  PlayTone(Ra,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Do,120); Wait(150);
  PlayTone(Do,30); Wait(35);
  PlayTone(Re,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Si,120); Wait(150);
  PlayTone(Si,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Ra,120); Wait(150);
  PlayTone(Mi,30); Wait(35);
  PlayTone(Fa,30); Wait(35);
  PlayTone(Mi,30); Wait(35);
  PlayTone(Mi,30); Wait(35);
  PlayTone(Ra,90); Wait(120);
 
  PlayTone(Ra,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(mi,60); Wait(70);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,30); Wait(35);
  PlayTone(Fa,60); Wait(70);
  PlayTone(Ra,60); Wait(65);
  PlayTone(Si,60); Wait(65);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,90); Wait(120);
  PlayTone(Si,60); Wait(65);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,90); Wait(120);
  PlayTone(Si,60); Wait(65);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,60); Wait(70);
  PlayTone(Fa,30); Wait(35);
  PlayTone(Ra,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(mi,60); Wait(65);
  PlayTone(Do,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,30); Wait(35);
  PlayTone(Fa,60); Wait(70);
  PlayTone(Ra,60); Wait(65);
  PlayTone(Si,60); Wait(65);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,90); Wait(120);
  PlayTone(Ra,90); Wait(95);
  PlayTone(Ra,90); Wait(95);
  PlayTone(So,60); Wait(65);
  PlayTone(Ra,120); Wait(125);
  Wait(50);
 }
 }
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);       //センサー2:光センサー
  while(true)
 {
    start play_music;              //音楽を演奏
    while(SENSOR_2<60)              //明るさが60より小さいとき
   {
    go_straight;                  //直進
   }
    while(SENSOR_2>60)              //明るさが60より大きいとき 
   { 
    stop play_music;               //音楽の演奏を停止
    turn_left;                    //左旋回
   }
 }
}

その4【『光源に近づき過ぎると停止する』という機能を追加する】

『プログラム』

作成者:カツヤ・ウメ
#define THRESHOLD 100  
#define Mi  330
#define Fa  349
#define So  392
#define Ra  440
#define Si  494
#define Do  523
#define Re  587
#define mi  659
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);
#define go_straight OnFwd(OUT_A+OUT_C);
task play_music()  
{
  while (true)
  {
  PlayTone(Ra,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Do,120); Wait(150);
  PlayTone(Do,30); Wait(35);
  PlayTone(Re,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Si,120); Wait(150);
  PlayTone(Si,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Ra,120); Wait(150);
  PlayTone(Ra,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Do,90); Wait(120);
  
  PlayTone(Ra,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Do,120); Wait(150);
  PlayTone(Do,30); Wait(35);
  PlayTone(Re,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Si,120); Wait(150);
  PlayTone(Si,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Si,30); Wait(35);
  PlayTone(Ra,120); Wait(150);
  PlayTone(Mi,30); Wait(35);
  PlayTone(Fa,30); Wait(35);
  PlayTone(Mi,30); Wait(35);
  PlayTone(Mi,30); Wait(35);
  PlayTone(Ra,90); Wait(120);
 
  PlayTone(Ra,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(mi,60); Wait(70);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,30); Wait(35);
  PlayTone(Fa,60); Wait(70);
  PlayTone(Ra,60); Wait(65);
  PlayTone(Si,60); Wait(65);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,90); Wait(120);
  PlayTone(Si,60); Wait(65);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,90); Wait(120);
  PlayTone(Si,60); Wait(65);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,60); Wait(70);
  PlayTone(Fa,30); Wait(35);
  PlayTone(Ra,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(mi,60); Wait(65);
  PlayTone(Do,30); Wait(35);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,30); Wait(35);
  PlayTone(Fa,60); Wait(70);
  PlayTone(Ra,60); Wait(65);
  PlayTone(Si,60); Wait(65);
  PlayTone(Do,30); Wait(35);
  PlayTone(Ra,90); Wait(120);
  PlayTone(Ra,90); Wait(95);
  PlayTone(Ra,90); Wait(95);
  PlayTone(So,60); Wait(65);
  PlayTone(Ra,120); Wait(125);
  Wait(50);
  }
      }
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);     //センサー1:光センサー
   while(true) 
   {
   start play_music;            //音楽を演奏
   while(SENSOR_1<60)            //明るさが60以下のとき
  {
   go_straight;               //直進
  }
   while(SENSOR_1>60)            //明るさが60より大きいとき   
  {
   if(SENSOR_1==THRESHOLD)         //明るさが100のとき
    {
    Off(OUT_A+OUT_C);            //停止
    }
    else{stop play_music;          //明るさが60より大きく100より小さいとき
   turn_left;                 //左旋回  
    }
    }
    }
    }
  • 演奏曲は先ほどのと同じ。

反省点

  • 時間があまり取れなくて少し課題が遅れてしまった。

工夫した点

  • 演奏曲に力を入れた。
  • 最初から光センサーと曲のプログラムを一緒に作るのが大変だったので光センサーと曲のプログラムを別々に作った。
  • プログラムを作ることに重点を置いたためキットのデザインはシンプルにした。

苦労した点

  • 曲と光センサーのプログラムをセットにすることが難しかった。
  • 光を追うロボットのプログラムが難しすぎたため、昨年度のプログラムを参考にさせてもらった。
  • 光源に近付きすぎると停止するプログラムを追加するときに、停止するようになったら光源を追いかけなくなったり、追いかけるけど止まらずにモーターがゆっくり動いてしまって止まらないなどいろいろな失敗があった。

今後の課題

  • ロボコンまでにもう少し複雑なプログラムを使えるようになっておきたい。
  • ロボコンに向けてプログラムにあったキットを作れるようになっておきたい。

A6へのアドバイス

アドバイスお願いします!



添付ファイル: filegetmsg.jpg 265件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-07-26 (水) 00:40:31 (4778d)