目次
#contents

*ロボットの説明 [#n4ecc57c]
**機能 [#w8e12f76]
-軽量化重視で、サーボモーターX2だけ
-空き缶を動かすときの手の大きさを簡単調整
#ref(2013b/Member/tydn1212/Mission1/nxt.jpg,100%,ロボット)

*攻略 [#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 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
 #define short_break Off(OUT_AC);Wait(100);
 #define CROSS_TIME 800
 #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
 #define stuck_time 3000
 #define DO 523
 #define RE 587
 #define MI 659
 #define FA 698
 #define curve_time 29000
 #define start_time 20000
 #define swiching_time 5000
 #define after_cross 7000

 task main()
 {//1
   SetSensorLight(S3);
   int RUN=0;//main while() program
   int nOnline=0;//Black counter
   int fOnline=0;
   int CrossCount=0;//Counts of crossed lines
   int FinalSwitch=0;
   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'
     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"

-starting_time後は交差点を意識して進行する。
  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
	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);
        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);
   CrossCount +=1;
   nOnline=0;
       }//1'' 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

-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);
    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"

-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
 
-T字路にぶつかった後、スタート地点に戻る。
 go_foward;PlayTone(RE,1);Wait(400);
 spin_left1;Wait(400);
 go_foward;Wait(400);
 spin_left1;Wait(3000);
 PlaySound(SOUND_DOWN);
 Off(OUT_AC);
 }//1

*課題を振り返って [#n4ecc57c]
プログラムを書き込むにつれて、いくつかの原因がよくわからなかったバグに直面した。プログラムを何度も何度も見返して、時間のロスがどんどん大きくなってしまいました(中にはバッテリー残量が30%だけで止まってしまうものもありました)。そのため、一周させようとするだけで時間が来てしまい、空き缶をどかすことに手を回せず、悔しい思いでいっぱいです。

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