4.光を追うロボット

がるーだDX2006_0113画像0038.JPG

  • センサーがまっすぐ前を向いていると光を感知しにくいため,斜め上をむかせた。 また、小回りが利くように車体をコンパクトにした。

プログラム1

#define straight OnFwd(OUT_A+OUT_C);       
#define left OnFwd(OUT_A);OnRev(OUT_C);   
#define right OnFwd(OUT_C);OnRev(OUT_A);  
#define minous 15             
int light_max=0;              
int i=0,i_max;
task main()
{
    SetSensor(SENSOR_1, SENSOR_LIGHT);
    SetSensor(SENSOR_3, SENSOR_LIGHT);
    for(i=0;i<35;i++){
                 right       //右に1秒旋回して0.5秒止まる動作をする度に、iに1プラスしてiが35になるまで繰り返す。
		  Wait(10);Off(OUT_C+OUT_A);Wait(5);  
		  
		  if(SENSOR_1>light_max){     
		  light_max=SENSOR_1;     //センサー1の値を明るさの最大値にする。  
		  i_max=i;          //その時のiの値を最大値にする。
		  PlaySound(0);       //確認のため音を出させる。
		  }
	       }
   while(SENSOR_1<light_max){left} 明かりのあるところまで左旋回する。
     
   while(true)
   {
      if((SENSOR_1>=light_max-minous)==(SENSOR_3>=light_max-minous)) 
         {
	  straight          //光が両方のセンサーに当たっていれば、直進。
	  
	  }
        if(SENSOR_1<(light_max-minous))         
         {
          left              //右のセンサーに当たる光が弱くなると光が当たるところまで左に回る。                  
          until(SENSOR_1>=(light_max-minous));  
         }
       if(SENSOR_3<(light_max-minous)) 
         {
          right      //左のセンサーに当たる光が弱くなると光が当たるところまで右に回る。
          until(SENSOR_3>=(light_max-minous));
         }
   }
}
  • はじめの方のプログラムは前に作った「1周して1番明るかった所に戻って止まるロボット」のプログラムをそのまま使った。light_maxをそのまま使うと少しでも暗くなると すぐ左右に動くので、minousの値分引いて少し条件を緩めるとうまくいった。

プログラム2

#define straight OnFwd(OUT_A+OUT_C);       
#define left OnFwd(OUT_A);OnRev(OUT_C); 
#define right OnFwd(OUT_C);OnRev(OUT_A);
#define minous 20
int light_max=0;
int i=0,i_max;
task main()
{
    SetSensor(SENSOR_1, SENSOR_LIGHT);
    SetSensor(SENSOR_3, SENSOR_LIGHT);
    for(i=0;i<35;i++){
                 right
		  Wait(10);Off(OUT_C+OUT_A);Wait(5);
		  
		  if(SENSOR_2>light_max){
		  light_max=SENSOR_2;
		  i_max=i;
		  PlaySound(0);
		  }
	       }
     left
     
    start go_straight;
    start turn_right;
    start turn_left;    
}
task go_straight()
{    
   while(true)
   {
      if((SENSOR_1>=light_max-minous)==(SENSOR_3>=light_max-minous)) 
         {
	  straight
	  }
   }
}
task turn_left()
{
   while(true)
   {
        if(SENSOR_1<(light_max-minous))         
         {
          left                                 
          until(SENSOR_1>=(light_max-minous));  
         }
   }
}
task turn_right()
{
   while(true)
   {
        if(SENSOR_3<(light_max-minous)) 
         {
          right 
          until(SENSOR_3>=(light_max-minous));
         }
   }
}
  • プログラム1はうまくいったはずだが、プログラム2は使ってやった記憶もない。ただ、直進、左旋回、右旋回を別のタスクに分けただけでほぼプログラム1と同じです。 

コメントどうぞ



添付ファイル: file2006_0113画像0038.JPG 152件 [詳細] file2006_0113画像0035.JPG 146件 [詳細]

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