目次 #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%だけで止まってしまうものもありました)。そのため、一周させようとするだけで時間が来てしまい、空き缶をどかすことに手を回せず、悔しい思いでいっぱいです。