2006a/C3/課題3左

#define Do 523
#define Re 587
#define Mi 659
#define Fa 698
#define So 784
#define Ra 880 
task play_music()
{
   while (true)
   {
       PlayTone(Do,30); Wait(40);
       PlayTone(Do,30); Wait(40);
       PlayTone(So,30); Wait(40);
       PlayTone(So,30); Wait(40);
       PlayTone(Ra,30); Wait(40);
       PlayTone(Ra,30); Wait(40);
       PlayTone(So,70); Wait(80);
       PlayTone(Fa,30); Wait(40);
       PlayTone(Fa,30); Wait(40);
       PlayTone(Mi,30); Wait(40);
       PlayTone(Mi,30); Wait(40);
       PlayTone(Re,30); Wait(40);
       PlayTone(Re,30); Wait(40);
       PlayTone(Do,70); Wait(80);        
   }
} 
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);    //右回りを定義
#define turn_left OnRev(OUT_A);OnFwd(OUT_C);    //左回りを定義
#define go_straight OnFwd(OUT_A+OUT_C);Wait(10);  //0,1秒の直進を定義
task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT);        //センサー1は光センサー
   SetSensor(SENSOR_3,SENSOR_LIGHT);        //センサー3は光センサー
   while(true){
      if(SENSOR_1>=40&&SENSOR_3>=40){        //センサー1、3の値が共に40以上のとき
          stop play_music;                          //曲の停止
          go_straight;               //直進する
          }
      if(SENSOR_1<40&&SENSOR_3>=40&&SENSOR_1<SENSOR_3){  //センサー1が40より小さく、センサー3が40以上かつセンサー1がセンサー3より小さいとき
          stop play_music;             //曲の停止
          turn_right;               //右に旋回
          }
      if(SENSOR_1>=40&&SENSOR_3<40&&SENSOR_1>SENSOR_3){  //センサー1が40以上、センサー3が40より小さく、センサー1がセンサー3より大きいとき
          stop play_music;            //曲の停止
          turn_left;               //左に旋回
          }
      if(SENSOR_1<40&&SENSOR_3<40){        //センサー1,3共に40より小さいとき
          turn_right;               //右に旋回
          start play_music;            //曲の開始
          }    
   }    
}
}

問題点:start play_music;を組み込むと、ドの音しかならず、また光を再度見つけても鳴り止まない。

#define Do 523           //ドを定義
#define Re 587           //レを定義
#define Mi 659           //ミを定義
#define Fa 698           //ファを定義
#define So 784           //ソを定義
#define Ra 880           //ラを定義
task play_music()
{
   while (true)
   {
       PlayTone(Do,30); Wait(40);  //ドを0,3秒鳴らし、次の音にいくまで0,4秒待つ
       PlayTone(Do,30); Wait(40);  //ド
       PlayTone(So,30); Wait(40);    //ソ 
       PlayTone(So,30); Wait(40);    //ソ 
       PlayTone(Ra,30); Wait(40);    //ラ
       PlayTone(Ra,30); Wait(40);    //ラ
       PlayTone(So,70); Wait(80);    //ソを0,7秒鳴らし、次の音に行くまで0,8秒待つ
       PlayTone(Fa,30); Wait(40);    //ファ 
       PlayTone(Fa,30); Wait(40);    //ファ
       PlayTone(Mi,30); Wait(40);    //ミ
       PlayTone(Mi,30); Wait(40);    //ミ 
       PlayTone(Re,30); Wait(40);    //レ
       PlayTone(Re,30); Wait(40);    //レ
       PlayTone(Do,70); Wait(80);    //ド     
   }
} 

失敗プログラム1

#define turn_right OnFwd(OUT_A);OnRev(OUT_C);     //右回りを定義
#define turn_left OnRev(OUT_A);OnFwd(OUT_C);     //左回りを定義
#define Stop_turning Off(OUT_A+OUT_C);        //旋回の停止を定義
#define TURN_TIME 50                 //旋回する時間を0,5秒に設定
#define go_straight OnFwd(OUT_A+OUT_C);Wait(30);Off(OUT_A+OUT_C);Wait(50);    //直進を定義
sub serch_light()     //光を探す
{
   ClearTimer(1);
   while(FastTimer(1)<400){
      if(SENSOR_2>=light_max){
          light_max=SENSOR_2;
          time_max=FastTimer(1);
          }
     }
     Stop_turning;Wait(50);
     turn_left;     
     Wait(TURN_TIME-time_max);
     Stop_turning;
     go_straight;          
}
task main()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT);    //センサー2は光センサー
   int light_max=30,time_max=0;      //光の最大値を30、最大値を観測した時間を0と置く
   while(true){ 
   turn_left;Wait(25);Off(OUT_A+OUT_C);Wait(10);   //左に0,25秒回り、0,1秒待つ
   turn_right;              //右に回る
   ClearTimer(0);
   while(FastTimer(0)<TURN_TIME){
      if(SENSOR_2>=light_max){      //センサー2の値が30以上のとき
          light_max=SENSOR_2;       //センサー2の値を光の最大値に置き換え
          time_max=FastTimer(0);     
          }
     }
     Stop_turning;Wait(50);        //旋回停止、0,5秒待つ
     turn_left;              //左に回る     
     Wait(TURN_TIME-time_max);       //旋回した時間−最大値を観測した時間
     Stop_turning;            //旋回停止
     go_straight;                //直進
      if(SENSOR_2<light_max){       //センサー2の値が30より小さいとき
          start play_music;        //曲の演奏を開始
          search_light();         //光を探す
          stop play_music;               //曲の演奏を停止
         }
     light_max=30;            //光の最大値を30に置き換え
     time_max=0;
     }
}

問題点:サブルーチンの中身がエラーになってしまった。

失敗プログラム2

#define turn_right OnFwd(OUT_A);OnRev(OUT_C); 
#define turn_left OnRev(OUT_A);OnFwd(OUT_C);
#define Stop_turning Off(OUT_A+OUT_C);
#define TURN_TIME 50
#define go_straight OnFwd(OUT_A+OUT_C);Wait(30);Off(OUT_A+OUT_C);Wait(50);
task main()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   int light_max=0,time_max=0;
   while(true){ 
   turn_left;Wait(25);Off(OUT_A+OUT_C);Wait(10);
   turn_right;
   ClearTimer(0);
   while(FastTimer(0)<TURN_TIME){
      if(SENSOR_2>=light_max){
          light_max=SENSOR_2;
          time_max=FastTimer(0);
          }
     }
      if(SENSOR_2<light_max){
         ClearTimer(1);
   while(FastTimer(1)<400){
      if(SENSOR_2>=light_max){
          light_max=SENSOR_2;
          time_max=FastTimer(1);
          }
     }
     }
     Stop_turning;Wait(50);
     turn_left;     
     Wait(TURN_TIME-time_max);
     Stop_turning;
     go_straight;  
     light_max=30;
     time_max=0;
     }
}      

問題点:光の大きさを感知してくれなくなってしまった。

失敗プログラム3

#define turn_right OnFwd(OUT_A);OnRev(OUT_C); 
#define turn_left OnRev(OUT_A);OnFwd(OUT_C);
#define go_straight OnFwd(OUT_A+OUT_C);
task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT);      //センサー1は光センサー
   SetSensor(SENSOR_3,SENSOR_LIGHT);   //センサー2は光センサー
   while(true){
      if(SENSOR_1>=30&&SENSOR_3>=30){   //センサー1、センサー3の値が共に30以上のとき
          go_straight;         //直進する
          }
      if(SENSOR_1<30&&SENSOR_3>=30){    //センサー1の値が30より小さく、センサー3の値が30以上のとき
          turn_right;          //右に旋回
          }
      if(SENSOR_1>=30&&SENSOR_3<30){  //センサー1の値が30以上、センサー3の値が30より大きいとき
          turn_left;          //左に旋回
          }
      if(SENSOR_1<30&&SENSOR_3<30){   //センサー1、センサー3が共に30より小さいとき
          start play_music;       //曲の演奏を始める
          turn_right;          //右に旋回
          stop play_music;        //曲の演奏を止める
          }
   }    
}

問題点:光センサーの値を決めてしまったために、ちょっとした光の大きさの変化で動作が変わってしまい、ロボットが困っていた。

それぞれの解決策をただいま模索中です・・・。 


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