[[2004/C1/練習問題]]

担当:後藤

&color(#0000ff){&size(20){'''ライントレースロボット'''};};

プログラム作成ー>後藤

&color(#dfeeff,#5566bb){工夫した点};
-ロボットの回転を関数化して、左右の回転を引数で操作できるようにした。
-トレースに時間がかかると、次のコーナーで反対側からトレースするようにした。
-ヘアピンに対応して、逆走しないようにした。

ソース
 #define RIGHT -1
 #define LEFT  1
 #define TURN_L OnFwd(OUT_C);OnRev(OUT_A);
 #define TURN_R OnFwd(OUT_A);OnRev(OUT_C);
 #define White SENSOR_2 > 40
 #define Black SENSOR_2 < 40
 #define GO OnFwd(OUT_A+OUT_C);
 #define TURN_mR OnFwd(OUT_A);
 #define TURN_mL OnFwd(OUT_C);
 
 //===================HENSU_TEIGI=============================
 int tim=0;
 int no=-1;
 int change=0;
 int check=0; int separate=1;
 int turn=0;
 int find=1;
 
 //==================MAIN=====================================
 task main()
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  
 while(true){//while1
  ClearTimer(1);
   
   while(change < 5){//while2
   GO;
   until(White);
 
   trace(no);

   }//while2
   
 if((change >= 5) || (FastTimer(1)/5) < 1000){
  SecondTrace(); 
 }
 change = 0;
 
 }//while1
 }//main

 //============================-functions==================================
 void trace(int no){
 ClearTimer(0);
 if(separate != 0){
  check = FastTimer(1);
 }
 TURN(no);
 until((Black) || (FastTimer(0) > 80));
 tim = FastTimer(0);
 
 fast(no);
 CourseChange(no);
 }

 void TURN(int i){
  if(i == RIGHT){
   TURN_R;
  }else if(i == LEFT){
   TURN_L;
  }
 }
  
 void CourseChange(int i){
 if(tim >= 80){//if5
   ClearTimer(0);
   TURN(-i); until(Black);

   if(FastTimer(0) > (140 + tim)){//if-c
    TURN(-i); until(White);
    TURN(-i); until((Black) || (FastTimer(0) > 300));
     if(FastTimer(0) > 300){//if-b
     Search();
     if(find == -1){//if-a
         Off(OUT_A+OUT_C);
     }//if-a
 }//if-b
   }//if-c
   no *= -1; change++;
 }//if5
 }//void

 void fast(int i){
  if(tim < 40){//if2
  separate++;
  if((separate >= 3) && ((FastTimer(1) - check) < 120)){//if3
   ClearTimer(3);
   
   TURN(-i); until((FastTimer(3) > 40) || (White));

   if(White){
    TURN(-i); until(Black);
   }
  }else{//if3
   separate = 0;
  }//if3
  }//if2
 }

 //=======================SECOND-TRACE==============================
 sub SecondTrace(){
 int tim;
 while(true){
 ClearTimer(1);
 TURN_mR;
 until((White) || (FastTimer(1) > 40);
 tim = FastTimer(1);
 if(tim > 40){
 Search();
 if(find = -1){
 break;
 }
 }
 
 TURN_mL;
 until((Black) || ((FastTimer(1) - tim) > 40));
 if((FastTimer(1)-tim) > 40)
 Search();
 if(find = -1){
 break;
 }
 }
 }//while
 }
 
 //=======================Search==============================
 sub Search()
 {
 int i=1;
 int tim;
 
 while(i <= 5){
  ClearTimer(1);
 
  repeat(2){
  GO;
  until((FastTimer(1) > (i*100)) || (Black));
  if(Black){
   find = 1; break;
  }
  tim = FastTimer(1);
  TURN(RIGHT);
  until(((FastTimer(1)-tim) > 80) || (Black));
  if(Black){
   find = 1; break;
  }
  }//repeat
 
 i++;
 }//while
 find = -1;
 //return(find);
 }


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