2006a/A1

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

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

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

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

ロボット

今回はロボットの写真を撮れなかったので、写真が載せられませんでした。

完成ロボット

工夫した点

  • 小回りがきくように、タイヤを2つにしたこと。
  • より精度の高い判定の為に、光センサを二つ用いたこと。
  • 去年の先輩方のプログラムを参考にして更にわかりやすいように努めた。

課題点

  • 時間がなくて、ロボットを完成させることができなかったのが残念でした。
  • 光センサのプログラムは難しいので、先生方に聞いてノートなどとり、光センサの利用方法を多様化するべきでした。

プログラム

xxxバージョン

#define left(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C);
#define front(j) OnFwd(OUT_A+OUT_C);Wait(j);Off(OUT_A+OUT_C);
#define back(j) OnRev(OUT_A+OUT_C);Wait(j);Off(OUT_A+OUT_C);
#define right(j) OnRev(OUT_C);OnFwd(OUT_A);Wait(j);Off(OUT_A+OUT_C);
#define turntime 200    //マクロ定義

int lightmax=0;
int timemax=0;    //変数定義

task main()
{   while(true)
  {
   SetSensor(SENSOR_1,SENSOR_LIGHT);    //センサ定義
   ClearTimer(0);    //タイマクリア
   
  OnRev(OUT_C);OnFwd(OUT_A);    //左旋回
   
   while(FastTimer(0) < turntime)    //定義した時間まで
   {
       if(SENSOR_1 > lightmax)    //センサの値の方が大きければ
       {lightmax=SENSOR_1;    //センサの値と時間を代入
        timemax=FastTimer(0);}
   }
   
   left(200 - timemax);    //最大値の点まで戻る
   
   front(100);
   }
}

僕バージョン

作成者/僕
作成日/7月12日
光源を見失っていないときにはある曲を演奏し、見失った時には別の曲警を演奏しながら光源を探す。
+近づきすぎると停止する。
#define C  523 // ドの音
#define C# 554 //
#define D  587 // レの音
#define D# 622 //
#define E  659 // ミの音
#define F  698 // ファの音
#define F# 740 //
#define G  784 // ソの音
#define G# 831 //
#define A  440 // ラの音
#define A# 446 //
#define B  494 // シの音

task play_music1()      // 音楽を演奏するタスク
                        // 曲名:チェリー
{
       while(true)
    {
       PlayTone(E,50);Wait(40);
       PlayTone(D,25);Wait(15);
       PlayTone(C,25);Wait(15);  

       PlayTone(C,75);Wait(65);
       PlayTone(C,25);Wait(15);
       PlayTone(G,50);Wait(40);
       PlayTone(A,50);Wait(40);
       PlayTone(G,33);Wait(23);
       PlayTone(F,33);Wait(23); 
       PlayTone(G,33);Wait(23); 

       PlayTone(E,50);Wait(40);
       PlayTone(D,25);Wait(15);
       PlayTone(C,25);Wait(15);
       PlayTone(C,75);Wait(65);
       PlayTone(E,25);Wait(15);
       PlayTone(G,50);Wait(40); 
       PlayTone(F,33);Wait(23);
       PlayTone(E,33);Wait(23);
       PlayTone(F,33);Wait(23);
       PlayTone(E,50);Wait(40); 

       PlayTone(E,50);Wait(40);
       PlayTone(D,25);Wait(15);
       PlayTone(C,25);Wait(15);  

       PlayTone(C,75);Wait(65);
       PlayTone(C,25);Wait(15);
       PlayTone(G,50);Wait(40);
       PlayTone(A,50);Wait(40);
       PlayTone(G,33);Wait(23);
       PlayTone(F,33);Wait(23); 
       PlayTone(G,33);Wait(23); 
 
       PlayTone(E,50);Wait(40);
       PlayTone(D,25);Wait(15);
       PlayTone(C,25);Wait(15);
       PlayTone(C,75);Wait(65);
       PlayTone(E,25);Wait(15);
       PlayTone(G,50);Wait(40); 
       PlayTone(F,33);Wait(23);
       PlayTone(E,33);Wait(23);
       PlayTone(D,33);Wait(23);
       PlayTone(C,100);Wait(90);
       Wait(50);
     }
} 
#define C 523
#define D 587
#define E 659
#define F 698
#define G 784
#define A 440
#define B 494 

task play_music2() // 音楽を演奏するタスク     
                   // 第六の幸運をもたらす宿
{
  while(true)
    {
       PlayTone(G,25);Wait(30);
       PlayTone(E,25);Wait(30);
       PlayTone(G,50);Wait(55);
       PlayTone(G,25);Wait(30);
       PlayTone(E,25);Wait(30);
       PlayTone(G,50);Wait(55);
       PlayTone(A,25);Wait(30); 
       PlayTone(G,25);Wait(30);
       PlayTone(F,25);Wait(30);
       PlayTone(E,25);Wait(30);
       PlayTone(D,25);Wait(80);
       PlayTone(E,25);Wait(30);
       PlayTone(F,50);Wait(55);
       PlayTone(G,25);Wait(30); 
       PlayTone(C,25);Wait(30);
       PlayTone(C,25);Wait(30);
       PlayTone(C,25);Wait(30);
       PlayTone(C,12);Wait(17);
       PlayTone(D,12);Wait(17);
       PlayTone(E,12);Wait(17);
       PlayTone(F,12);Wait(17);
       PlayTone(G,50);Wait(55);
       PlayTone(G,25);Wait(30);
       PlayTone(D,25);Wait(30);
       PlayTone(D,25);Wait(30);
       PlayTone(F,25);Wait(30);
       PlayTone(E,25);Wait(30);
       PlayTone(D,25);Wait(30);
       PlayTone(C,50);Wait(55);
       Wait(20);
    }
}
 
#define TURN_TIME 600
#define right(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);
#define left(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);
#define front OnFwd?(OUT_A+OUT_C); 

task main () 
{
  int light_max=0; 
  int time_max=0;
  SetSensor(SENSOR_1,SENSOR_LIGHT);  //センサー1=ライト
  SetSensor(SENSOR_3,SENSOR_LIGHT);  //センサー3=ライト

  light_max=SENSOR_1;            //センサー1が最大
  ClearTimer(0);                 //タイマーを0
  OnFwd(OUT_A);OnRev(OUT_C);     //光を探す左回転 

  while(time_max<TURN_TIME){     //タイマーは6秒以内
      stop play_music1;
      start play_music2;         //第六
      if(SENSOR_1>light_max)        //もし1が最大なら
      {
          light_max=SENSOR_1;//最大値を更新
          time_max=FastTimer(0);
      }
     left(600-time_max);     //一周から時間を差し引い
      front;
  }
      stop play_music1;
      start play_music2;     //チェリー
  while(true)
  {
      if((SENSOR_1>=light_max)&&(SENSOR_3>=light_max))     //センサの値が大きければ直進
      {
          front;
      }
      if((SENSOR_1<=light_max)&&(SENSOR_3>=light_max))     //センサに偏りが出たら、旋回して修正
      {
          OnRev(OUT_A);OnFwd(OUT_C);
          until((SENSOR_1>=light_max)&&(SENSOR_3>=light_max)); 
      }
      if((SENSOR_1>=light_max)&&(SENSOR_3<=light_max))     //上に同じ
      {
          OnFwd(OUT_A);OnRev(OUT_C);
          until((SENSOR_1>=light_max)&& (SENSOR_3>=light_max));
      }
      if((SENSOR_1>=THRESHOLD)&&(SENSOR_3>=THRESHOLD))     //近づきすぎたら停止
      {
         Off(OUT_A+OUT_C);
      }
  }
} 

コメント

光源を探して追いかけるまでがうまく出来なくて大変だった。
あと、音楽がなって欲しい部分で鳴らすのに手間取った。
工夫した点は、センサーを二つつけて、光の明るさの差を明確にした部分です。
今回はプログラムがつらつらと長くなってしまい、すっきりとまとめることが出来なかった点が欠点でした。 

感想

音楽をプログラミングする時、音の長さや、次の音とつながってしまわないように、音と音の間隔を
設定するのが大変でした。今回の課題では、音楽を鳴らすという新しいプログラミングが
あったので苦労しましたが、ちゃんとプログラムを完成させるこ とができたので良かったです。
また、これからロボコン用のロボットの作成に入りますが、今回の経験を生かして、
余裕があったら音楽を鳴らすプログラムも入れてみたいと思います。

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



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-08-30 (水) 17:11:47 (4742d)