目次
#contents

*ロボットの説明 [#n4ecc57c]
**機能 [#w8e12f76]
-軽量化重視
-しっかりと空き缶をつかむためのループ搭載
-しっかりと空き缶をつかむためのループ搭載()
-左右の重心を整えてある
#ref(a1.jpg)
#ref(a2.jpg)
#ref(a3.jpg)

*攻略 [#n4ecc57c]
-開始→T字路→空き缶をどかす→交差点→交差点→交差点→急カーブ→交差点→ヘアピン→T字路→終了 この順番で各課題をこなして、こなしたら次の課題を行うようにした。

*プログラムの説明 [#kf9b3bd3]
 #define VERY_WHITE THRESHOLD+7
 #define WHITE THRESHOLD+3
 #define THRESHOLD 53
 #define BLACK THRESHOLD-2
 #define VERY_BLACK THRESHOLD-8
 #define SPEED_H 35
 #define SPEED_L 25
 #define OnRL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_C,speedL);
 #define go_foward OnRL(SPEED_H,SPEED_H);
 #define go_forward OnRL(SPEED_H,SPEED_H);
 #define spin_left1 OnRL(SPEED_L+10,-SPEED_L);
 #define turn_left0 OnRL(SPEED_L,0);
 #define turn_right0 OnRL(0,SPEED_L);
 #define spin_right1 OnRL(-SPEED_L,SPEED_L+10);
 #define STEP 1
 #define nMAX 240 //Time on black
 #define short_break Off(OUT_AC);Wait(100);
 #define CROSS_TIME 800 //Time to cross the line
 #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
 #define start_time 8000 //Time to finish the T cross
 #define swiching_time 5000 //Time to switch the side of the line
 #define after_cross 7000 //Time to wait after crossing the third cross
 #define Can_Move_Time 15000
 #define Grave_Can Off(OUT_AC);OnFwd(OUT_B,40);Wait(500);Off(OUT_B);Wait(100);
 #define Release_Can OnRev(OUT_B,40);Wait(500);Off(OUT_B);Wait(100);
 #define U_Turn OnRL(30,-30);Wait(2800);Off(OUT_AC);Wait(100);
 #define Rev_U_Turn OnRL(-30,30);Wait(800);
 #define Can_Move_Time 15000
 #define Grave_Can Off(OUT_AC);OnFwd(OUT_B,40);Wait(500);Off(OUT_B);Wait(100);
 #define Release_Can OnRev(OUT_B,40);Wait(500);Off(OUT_B);Wait(100);
 #define U_Turn OnRL(30,-30);Wait(2800);Off(OUT_AC);Wait(100);
 #define Rev_U_Turn OnRL(-30,30);Wait(800); 


 task main()
 {//1
   SetSensorLight(S3);
   int RUN=0;//main while() program
   int nOnline=0;//Black counter
   int CrossCount=0;//Counts of crossed lines
   int FinalSwitch=0;//Kill cross searching program
   long t0,t1,t2,t3 = CurrentTick();
  
-発信後は白と黒の境界線を"starting_time"だけなぞって進む。
      t1=CurrentTick();//Set t1
      while(CurrentTick()-t1<start_time){//2
					 //While start_time
      if(SENSOR_3<VERY_BLACK){//1'
       spin_left1;PlayTone(DO,1);
           }//1'
      while(CurrentTick()-t1<start_time){//While start_time
        if(SENSOR_3<VERY_BLACK){
        spin_left1;
        }
     else {//2'
        if(SENSOR_3<BLACK){//3'
          turn_left0;PlayTone(DO,1);
        }//3'
        else if(SENSOR_3<WHITE){//4'
          go_foward;PlayTone(RE,1);
        }//4'
        else if(SENSOR_3<VERY_WHITE){//5'
          turn_right0;PlayTone(MI,1);
        }//5'
        else {//6'
          spin_right1;PlayTone(FA,1);
        }//6'
       }//2'
     }//2
      //End of "While start_time"

-空き缶を探すプログラムを始動
	while(SensorUS(S1)>10){//0    
  if(SENSOR_3<VERY_BLACK){//1'
       spin_left1;
           }//1'
     else {//2'
        if(SENSOR_3<BLACK){//3'
        if(SENSOR_3<BLACK){
          turn_left0;
        }//3'
        else if(SENSOR_3<WHITE){//4'
          }
        else if(SENSOR_3<WHITE){
          go_foward;
        }//4'
        else if(SENSOR_3<VERY_WHITE){//5'
          }
        else if(SENSOR_3<VERY_WHITE){
          turn_right0;
        }//5'
        else {//6'
          }
        else {
          spin_right1;
        }//6'
       }//2'
	}//0
          }
        }
      }//End of "While start_time"

-空き缶を探すプログラムを始動
 while(SensorUS(S1)>10){    
   if(SENSOR_3<VERY_BLACK){
     spin_left1;
     }
   else {
     if(SENSOR_3<BLACK){
       turn_left0;
       }
     else if(SENSOR_3<WHITE){
       go_forward;
       }/
     else if(SENSOR_3<VERY_WHITE){
       turn_right0;
       }
     else {
       spin_right1;
       }
     }
   }

-空き缶をつかんである程度黒線をだどってから180°回転して空き缶を放し、再び180°回転する。
	Grave_Can; 
	t4=CurrentTick();//Set t4
	 while(CurrentTick()-t4<Can_Move_Time){//7' Trace line for "Can_Move_Time"
	      if(SENSOR_3<VERY_BLACK){//1'
       spin_left1 OnRL(SPEED_L+5,-SPEED_L);Wait(1);
           }//1'
     else {//2'
        if(SENSOR_3<BLACK){//3'
          OnRL(SPEED_L-5,0);Wait(1);
        }//3'
        else if(SENSOR_3<WHITE){//4'
          OnRL(SPEED_H-10,SPEED_H-10);Wait(1);
        }//4'
        else if(SENSOR_3<VERY_WHITE){//5'
          OnRL(0,SPEED_L-5);Wait(1);
        }//5'
        else {//6'
          OnRL(-SPEED_L,SPEED_L+5);Wait(1);
        }//6'
       }//2'
       }//7' END &#128;OF "Trace line for "Can_Move_Time""
       U_Turn;
       Release_Can;
       OnRev(OUT_AC,SPEED_H);Wait(500);Off(OUT_AC);Wait(100);
       Rev_U_Turn;
          }//2
 Grave_Can; 
 t4=CurrentTick();//Set t4
 while(CurrentTick()-t4<Can_Move_Time){//Trace line for "Can_Move_Time"
   if(SENSOR_3<VERY_BLACK){
     spin_left1 OnRL(SPEED_L+5,-SPEED_L);Wait(1);
     }
   else {
     if(SENSOR_3<BLACK){
       OnRL(SPEED_L-5,0);Wait(1);
       }
     else if(SENSOR_3<WHITE){
       OnRL(SPEED_H-10,SPEED_H-10);Wait(1);
       }
     else if(SENSOR_3<VERY_WHITE){
       OnRL(0,SPEED_L-5);Wait(1);
        }
     else {
       OnRL(-SPEED_L,SPEED_L+5);Wait(1);
       }
     }
   }//END &#128;OF "Trace line for "Can_Move_Time""
   U_Turn;
   Release_Can;
   OnRev(OUT_AC,SPEED_H);Wait(500);Off(OUT_AC);Wait(100);//Set back for a moment
   Rev_U_Turn;//U turn
 }

	
-ここからは交差点を意識して進行する。
  while(RUN==0){//3
                //Main Program
    while(nOnline<nMAX){//4
			//Basic cross finding
      if(SENSOR_3<VERY_BLACK){//5
        spin_left1;PlayTone(DO,1);
        nOnline++;
      }//5
     else {//6
        if(SENSOR_3<BLACK){//7
          turn_left0;PlayTone(DO,1);
        }//7
        else if(SENSOR_3<WHITE){//8
          go_foward;PlayTone(RE,1);
        }//8
        else if(SENSOR_3<VERY_WHITE){//9
          turn_right0;PlayTone(MI,1);
        }//9
        else {//10
          spin_right1;PlayTone(FA,1);
        }//10
-ここからは交差点を意識して進行する。ちなみに"RUN"とは通常のライン・トレイスの間は0として、ライン・トレイスを終えるときに"RUN"が1となる。
 while(RUN==0){//Main Program
   while(nOnline<nMAX){//Basic cross finding
     if(SENSOR_3<VERY_BLACK){
       spin_left1;
       nOnline++;
       }
     else {
       if(SENSOR_3<BLACK){
         turn_left0;
         }
       else if(SENSOR_3<WHITE){
         go_forward;
       }
       else if(SENSOR_3<VERY_WHITE){
         turn_right0;
       }
       else {
         spin_right1;
       }
	nOnline=0;
       }//6  
     }//4
      //End of Basic cross finding
   short_break;PlaySound(SOUND_CLICK);
   spin_right1;Wait(nMAX*STEP/2);
   cross_line;
   PlaySound(SOUND_UP);
   CrossCount +=1;
   nOnline=0;

-交差点を2つ通過した後、黒線の反対側の境界線をなぞるようにする。これは3つ目から4つ目の交差点の間の急なカーブを交差点と反応させないためである。
   while(CrossCount==2){//1'' Hit second cross line
    turn_right0;PlayTone(RE,1);Wait(1000);
    while(nOnline<nMAX){//4
			//Backwards cross finding
      if(SENSOR_3<VERY_BLACK){//5
        spin_right1;PlayTone(DO,1);
   turn_right0;PlayTone(RE,1);Wait(1000);
   while(nOnline<nMAX){//Backwards cross finding
      if(SENSOR_3<VERY_BLACK){
        spin_right1;
        nOnline++;
      }//5
     else {//6
        if(SENSOR_3<BLACK){//7
          turn_right0;PlayTone(DO,1);
        }//7
        else if(SENSOR_3<WHITE){//8
          go_foward;PlayTone(RE,1);
        }//8
        else if(SENSOR_3<VERY_WHITE){//9
          turn_left0;PlayTone(MI,1);
        }//9
        else {//10
          spin_left1;PlayTone(FA,1);
        }//10
        }
      else {
        if(SENSOR_3<BLACK){
          turn_right0;
          }
        else if(SENSOR_3<WHITE){
          go_foward;
          }
        else if(SENSOR_3<VERY_WHITE){
          turn_left0;
          }
        else {
          spin_left1;
          }
	nOnline=0;
       }//6  
     }//4
      //End of Backwards cross finding
        }
     }//End of Backwards cross finding
   short_break;PlaySound(SOUND_CLICK);
   spin_left1;Wait(nMAX*STEP/2);
   cross_line;
   PlaySound(SOUND_UP);
   CrossCount +=1;
   nOnline=0;
       }//1'' end of Hit second cross line
 }//End of Hit second cross line

-交差点を3つ目通過
   while(CrossCount==3){//1'' Hit third cross line
    while(nOnline<nMAX){//4
			//Backwards cross finding
      if(SENSOR_3<VERY_BLACK){//5
        spin_right1;PlayTone(DO,1);
        nOnline++;
      }//5
     else {//6
        if(SENSOR_3<BLACK){//7
          turn_right0;PlayTone(DO,1);
        }//7
        else if(SENSOR_3<WHITE){//8
          go_foward;PlayTone(RE,1);
        }//8
        else if(SENSOR_3<VERY_WHITE){//9
          turn_left0;PlayTone(MI,1);
        }//9
        else {//10
          spin_left1;PlayTone(FA,1);
        }//10
	nOnline=0;
       }//6  
     }//4
      //End of Backwards cross finding
   short_break;PlaySound(SOUND_CLICK);
   spin_left1;Wait(nMAX*STEP/2);
   cross_line;
   PlaySound(SOUND_UP);
   FinalSwitch +=1;
   CrossCount +=5;
   RUN +=1;
   nOnline=0;
       }//1'' end of Hit third cross line
   }//3 End of Main Program
   while(CrossCount==3){// Hit third cross line
     while(nOnline<nMAX){//Backwards cross finding
       if(SENSOR_3<VERY_BLACK){
         spin_right1;
         nOnline++;
         }
       else {
         if(SENSOR_3<BLACK){
           turn_right0;
           }
         else if(SENSOR_3<WHITE){
           go_forward;
           }
         else if(SENSOR_3<VERY_WHITE){
           turn_left0;
           }
         else {
           spin_left1;
           }
	 nOnline=0;
         } 
       }//End of Backwards cross finding
     short_break;PlaySound(SOUND_CLICK);
     spin_left1;Wait(nMAX*STEP/2);
     cross_line;
     PlaySound(SOUND_UP);
     FinalSwitch +=1;
     CrossCount +=5;
     RUN +=1;
     nOnline=0;
     }//End of Hit third cross line
   }//End of Main Program

-4つ目の交差点を通過。switch_time後にたどる黒の境界線を逆にする。
   while(FinalSwitch==1){//1'''' Hits final line
      PlaySound(SOUND_UP);
      t2=CurrentTick();
      while(CurrentTick()-t2<swiching_time){//2''''
      if(SENSOR_3<VERY_BLACK){//3''''
        spin_right1;PlayTone(DO,1);
      }//3''''
     else {//4''''
        if(SENSOR_3<BLACK){//5''''
          turn_right0;PlayTone(DO,1);
        }//5''''
        else if(SENSOR_3<WHITE){//6''''
          go_foward;PlayTone(RE,1);
        }//6''''
        else if(SENSOR_3<VERY_WHITE){//7''''
          turn_left0;PlayTone(MI,1);
        }//7''''
        else {//8''''
          spin_left1;PlayTone(FA,1);
        }//8''''
     }//4''''
     }//2''''
    spin_left1;PlayTone(DO,1);Wait(400);
   while(FinalSwitch==1){//Hits final line
     PlaySound(SOUND_UP);
     t2=CurrentTick();
      while(CurrentTick()-t2<switching_time){//Ignore the cross program for "switching_time"
        if(SENSOR_3<VERY_BLACK){
          spin_right1;
          }
        else {
          if(SENSOR_3<BLACK){
            turn_right0;
            }
          else if(SENSOR_3<WHITE){
            go_forward;
            }
          else if(SENSOR_3<VERY_WHITE){
            turn_left0;
            }
          else {
         spin_left1;
         }
       }
     }
    spin_left1;Wait(400);
    nOnline=0;
      t3=CurrentTick();
      while(CurrentTick()-t3<after_cross){//2
					 //While after_cross
      if(SENSOR_3<VERY_BLACK){//1'
       spin_left1;PlayTone(DO,1);
           }//1'
     else {//2'
        if(SENSOR_3<BLACK){//3'
          turn_left0;PlayTone(DO,1);
        }//3'
        else if(SENSOR_3<WHITE){//4'
          go_foward;PlayTone(RE,1);
        }//4'
        else if(SENSOR_3<VERY_WHITE){//5'
          turn_right0;PlayTone(MI,1);
        }//5'
        else {//6'
          spin_right1;PlayTone(FA,1);
        }//6'
       }//2'
     }//2
      //End of "While after_cross"
    t3=CurrentTick();
    while(CurrentTick()-t3<after_cross){//While the "after_cross"
      if(SENSOR_3<VERY_BLACK){
        spin_left1;
        }
      else {
        if(SENSOR_3<BLACK){
          turn_left0;
          }
        else if(SENSOR_3<WHITE){
          go_forward;
          }
        else if(SENSOR_3<VERY_WHITE){
          turn_right0;
          }
        else {
          spin_right1;
          }
        }
      }//End of "While after_cross"

-T字を意識した進行。
    while(fOnline<nMAX){//4
			//Final cross finding
      if(SENSOR_3<VERY_BLACK){//5
        spin_left1;PlayTone(DO,1);
        fOnline++;
      }//5
     else {//6
        if(SENSOR_3<BLACK){//7
          turn_left0;PlayTone(DO,1);
        }//7
        else if(SENSOR_3<WHITE){//8
          go_foward;PlayTone(RE,1);
         }//8
         else if(SENSOR_3<VERY_WHITE){//9
           turn_right0;PlayTone(MI,1);
         }//9
         else {//10
           spin_right1;PlayTone(FA,1);
         }//10
	 fOnline=0;
        }//6  
      }//4
       //End of Final cross finding
      PlaySound(SOUND_UP);
      FinalSwitch +=1;
      }//1'''' End of Hits final line
    while(nOnline<nMAX){//Final cross finding
      if(SENSOR_3<VERY_BLACK){
        spin_left1;
        nOnline++;
        }
      else {
        if(SENSOR_3<BLACK){
          turn_left0;
          }
        else if(SENSOR_3<WHITE){
          go_forward;
          }
         else if(SENSOR_3<VERY_WHITE){
           turn_right0;
           }
         else {
           spin_right1;
           }
	 nOnline=0;
         }  
       }//End of "Final cross finding"
       PlaySound(SOUND_UP);
       FinalSwitch +=1;
       }//End of "Hits final line"
 
-T字路にぶつかった後、スタート地点に戻る。
 go_foward;PlayTone(RE,1);Wait(400);
 go_forward;Wait(400);
 spin_left1;Wait(400);
 go_foward;Wait(400);
 go_forward;Wait(400);
 spin_left1;Wait(3000);
 PlaySound(SOUND_DOWN);
 Off(OUT_AC);
 }//1

*課題を振り返って [#n4ecc57c]
プログラムを書き込むにつれて、いくつかの原因がよくわからなかったバグに直面した。プログラムを何度も何度も見返して、時間のロスがどんどん大きくなってしまいました(中にはバッテリー残量が30%だけで止まってしまうものもありました)。そのため、空き缶を一つしかどかせず、マイナーな調整が必要であって完璧な走りを実現できませんでした。


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