[[2004/A5]]

#define  forwards(t)   OnFwd(OUT_A+OUT_C);Wait(t);
#define  backwards(t)  OnRev(OUT_A+OUT_C);Wait(t);
#define  turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);
#define  turn_left(t)  OnRev(OUT_A);OnFwd(OUT_C);Wait(t);
task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_TOUCH);
 start wall;
 forwards(200);            //台から降りる動作
 PlayTone(523,50);
 start search;
}


task search()
{
 while(true)    
 {
  if(SENSOR_1 > 35)        //緑又は黒のパックが見つかるまで
  {
   repeat(3)
   { 
    forwards(200);
    turn_left(35);
    turn_right(70);
    turn_left(35);
   }
   turn_left(120);         //パックを探しながら往復
  }
  else                     //パックを見つけた場合
  {
   forwards(300);          //パックに向かって前進
   start check_sensors;
  }
 }
}


task check_sensors()
{
 Off(OUT_A+OUT_C);
 while(true)
 {
  if(SENSOR_1 < 30)      //黒の場合
  {
   PlaySound(4);Wait(50);
   backwards(200); 
   turn_left(60);
   stop check_sensors;   //パックを放して45度旋回
  }
  else                   //緑の場合
  {
   PlayTone(587,50);
   turn_left(60);
   OnFwd(OUT_A+OUT_C);until(SENSOR_2 < 35);
   PlayTone(659,50);
   start comeback;
  }
   }
} 


task comeback()
{
 ClearTimer(0);
 do
 { 
 stop search;
 ClearMessage();
 SendMessage();
 until(Message() != 0); 
 if(Message() == ){PlaySound(1);Wait(100);SendMessage();Wait(100);}
 if(Message() == ){PlaySound(5);Wait(100);forwards(500);backwards(200);turn_left(120);}
 Off(OUT_A+OUT_C);
 } 
 until  (Timer(0) < 150);
 turn_left(40);
 start search;
}


task wall()
{
 while(true)
 {
  if(SENSOR_3 == 1)
  {
   stop search;
   PlaySound(4);Wait(50); 
   backwards(100);
   turn_left(120);
   start search;
  }
 }
}


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