課題3
#contents
*課題内容 [#ob7e69df]
 懐中電灯の光を追いかけて進むロボットを製作し、以下の中から2種類以上のプログラムを作成せよ。
 
 光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す
 光源を見失った時には明るさに比例した周波数の音を出しながら旋回して光源を探す
 光源を見失っていないときにはある曲を演奏し、見失った時には別の曲を演奏しながら光源を探す
 上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する
 ただし支給されているモータ、光センサ、タッチセンサはいくつ使ってもよい。
 全てメソ、アナクスナムゥンによる製作


*プログラム1 [#ud194d51]
 #define top OnFwd(OUT_A+OUT_C);                     //top 直進
 #define right OnRev(OUT_C);OnFwd(OUT_A);        //right 右旋回
 #define left OnRev(OUT_A);OnFwd(OUT_C);          //left 左旋回 
*ロボットの説明 [#s3321e54]
 写真はないけど、ロボットの前方に光センサーを一つ装備。
 本体は最初に作った本に書いてあったものがベースになっている。
*曲のプログラム1(マリオのテーマ) [#ad58949e]
 #define minus 15                               
 #define Do    523                      //ド
 #define Re    587                      //レ
 #define Mi    659                      //ミ
 #define Fa    698                      //ファ
 #define So    784                      //ソ
 #define La    880                      //ラ
 #define Si    988                      //シ
 #define So_   392                      //ソ(低)
     PlayTone(Mi,25); Wait(35);                             
     PlayTone(Mi,25); Wait(50); 
     PlayTone(Mi,25); Wait(50); 
     PlayTone(Do,25); Wait(30); 
     PlayTone(Mi,40); Wait(45); 
     PlayTone(So,50); Wait(100);
     PlayTone(So_,50); Wait(100);
*曲のプログラム2(チューリップ) [#a7f4f4fd]
 #define minus 15                               
 #define Do    523                       //ド
 #define Re    587                       //レ
 #define Mi    659                       //ミ
 #define Fa    698                       //ファ
 #define So    784                       //ソ
 #define La    880                       //ラ
 #define Si    988                       //シ
 #define So_   392                       //ソ(低)
     PlayTone(Do,25); Wait(30);
     PlayTone(Re,25); Wait(50);  
     PlayTone(Mi,25); Wait(50); 
     PlayTone(Do,25); Wait(30); 
     PlayTone(Re,25); Wait(50); 
     PlayTone(Mi,25); Wait(50);
     PlayTone(So,50); Wait(100); 
     PlayTone(Mi,25); Wait(50); 
     PlayTone(Re,25); Wait(50);  
     PlayTone(Do,25); Wait(30);
     PlayTone(Re,25); Wait(50);  
     PlayTone(Mi,25); Wait(50);
     PlayTone(Re,25); Wait(50);  
     PlayTone(Do,25); Wait(30);
     PlayTone(Re,25); Wait(50); 
     PlayTone(Mi,25); Wait(50);  
     PlayTone(Do,25); Wait(30); 
     PlayTone(Re,25); Wait(50); 
     PlayTone(Mi,25); Wait(50);
     PlayTone(So,50); Wait(100);
     PlayTone(Mi,25); Wait(50);
     PlayTone(Re,25); Wait(50);   
     PlayTone(Do,25); Wait(30);
     PlayTone(Re,25); Wait(50); 
     PlayTone(Mi,25); Wait(50);  
     PlayTone(Do,25); Wait(30); 
*プログラム1 ( 光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す)[#ud194d51]
 #define top OnFwd(OUT_A+OUT_C);                     //top =直進
 #define right OnRev(OUT_C);OnFwd(OUT_A);        //right =右旋回
 #define left OnRev(OUT_A);OnFwd(OUT_C);          //left =左旋回 
 #define minus 15                               
 #define Do  523
 #define Re  587
 #define Mi  659
 #define Fa  698
 #define So 784
 #define La    880	
 #define Si   988
 #define So_ 392
 
 int light_max;                                                        //light_maxを定義
 int time_max;                                                        //time_maxを定義
 
 task main()
  {
    SetSensor(SENSOR_2,SENSOR_LIGHT);                 //センサー2を光センサーとする
      light_max=SENSOR_2;                                      //センサ−2をlight_maxに指定
      time_max=Timer(0);                                        //time_maxをTimer(0)に指定
    ClearTimer(0);                                                   //Timer(0)をリセット
     while(Timer(0)<=14)                                        //Timer(0)が14以下のとき
    {
        right;                                                             //右旋回
       if(SENSOR_2>light_max)                                 センサ−2が最大値より大きければ       
      {
         ClearTimer(1);                                              //Timer(1)をリセット
         light_max =SENSOR_2 ;                                //センサ−2を最大値に指定
      }
       else                                                                //そうじゃなければ
      {
         light_max = light_max;                                //light_maxをそのままで
         time_max =Timer(1);                                   //time_maxをTimer(1)に指定
      }
    }
    ClearTimer(1);                                                   //Timer(1)をリセット      
     while(Timer(1)<= time_max)                            //Timer(1)がtime_max以下の時
    {
      left;                                                                 //左旋回
    }                         
     while(true)                                                        
    {
       if(SENSOR_2>= light_max-minus)                  //センサー2が最大値以上のとき
      {
        top;                                                               //演奏しながら直進
        PlayTone(Mi,25); Wait(35);                             
     PlayTone(Mi,25); Wait(50); 
     PlayTone(Mi,25); Wait(50); 
     PlayTone(Do,25); Wait(30); 
     PlayTone(Mi,40); Wait(45); 
     PlayTone(So,50); Wait(100);
     PlayTone(So_,50); Wait(100);
      }                 
       if(SENSOR_2< light_max-minus)                     //センサ−2が最大値より小さいとき
      {
        right;                                                             //右旋回
          ClearTimer(2);                                              //Timer(2)をリセット
       until((SENSOR_2>= light_max-minus)||(Timer(2)==5));  //センサ−2が最大値以上、またはTimer(2)が5まで
         }
       if(SENSOR_2< light_max-minus)                     //センサ−2が最大値-マイナスより小さいとき
         {
          left;                                                              //左旋回
          until(SENSOR_2>= light_max-minus);          //センサ−2が最大値-マイナスまで
         }
   }
 }
*プログラム2(光源を見失っていないときにはある曲を演奏し、見失った時には別の曲を演奏しながら光源を探す )[#w39cc7fb]
 #define light_min 50 //最低光を40
 #define light_max 90 //最高光を80
 task main(){
  SetSensor(SENSOR_2,SENSOR_LIGHT); //光センサーをセンサー2とする
  
  while(true)
  {
      Off(OUT_A+OUT_C);  //センサーが反応しないとき停止
      stop play_music1;  //マリオ
      stop play_music2; //チューリップ
      if(SENSOR_2<light_min) //センサー2が最低光値を下回るとき
      {
          start play_music1; //マリオ演奏
          stop play_music2; //チューリップはまだ
          OnFwd(OUT_A); //右に旋回
          OnRev(OUT_C);
          until(SENSOR_2>light_min); //センサー2が最低光値を上回るまで
      }
      if((SENSOR_2<light_max)&&(SENSOR_2>light_min)) //センサー2が最低光値を上回り最高光値を下回るとき
      {
          stop play_music1; //マリオ止まる
          start play_music2;//チューリップ演奏
          OnFwd(OUT_A+OUT_C); //前進
          until((SENSOR_2>light_max)||(SENSOR_2<light_min));//センサー2が最低光値を下回る、
      }                           //または最高値を上回るまで
  }
 }
*工夫したところ [#q864e74a]
 マリオの音をリズミカルにするのを頑張った!!やはり光を追いかけるのが難しく
 時間を費やしたけれど、時間をかけてプログラムを作った。←工夫じゃねぇ(笑)
*苦労したところ [#u561818c]
 課題3に関しては、どのようにすれば思った通りに動くのか全く見当がつかなく、先輩のプログラムとかを見て考え理解する事に一番時間を費やした。
 あと、アパート(アナクスナムゥン家)のネットが使えなくなるというアクシデントが発生して、わざわざ毎回教室まで行ってやっていた・・。
 さらに大変なのは、メンバーの1人が失踪・・(右班も1人いなくなったらしいけど)。こんなことでやってけるんか、、と心配したけどなんとか頑張れた。
*反省点 [#j2ca8008]
 センサー2個でやろうとして、なかなかできなくて1個でやってしまった。
 実際めっちゃむずくてうまくいかなかったので、もっとしっかり説明を聞けば良かった。
 しかし、最終的には理解でき、ロボットも思うように動いたので良かったと思う。
 この課題の内容もふまえて、次にやるロボコンに挑みたい。
*アドバイス等コメント [#s01c40f5]
-授業中にも説明しましたが、プログラムを張り付ける前に、製作したのはどのようなロボットなのか、それをまず説明してください。 -- [[松本(教員)]] &new{2006-08-18 (金) 11:06:24};
-プログラム中のコメント文について。例えば『light_maxを定義』というのはプログラムを見ればすぐにわかることなので、それよりも light_max というのはどんな変数なのか、という説明をコメント文としてちゃんと書いておきましょう。 -- [[松本(教員)]] &new{2006-08-18 (金) 11:08:26};

*反省点 [#j2ca8008]
 センサー2個でやろうとして、結局できなくて1個でやってしまった。
#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS