[[2013b/Member]] *ロボット本体の改造点 [#j5e47c63] ホイールベースの横幅をなるべく狭く取るため、モータの軸を進行方向に対して平行にし、傘歯車で回転の伝達方向を変更した点 *プログラム [#u8665364] 数値やマクロの定義文 #define THRESHOLD 45 #define HP 7 #define MP 4 #define LP 2 #define turn_left2 SetPower(OUT_C,HP);SetPower(OUT_A,LP);OnFwd(OUT_C);OnRev(OUT_A);//左回転マクロ #define turn_right2 SetPower(OUT_A,HP);SetPower(OUT_C,LP);OnFwd(OUT_A);OnRev(OUT_C);//右回転マクロ #define turn_left1 SetPower(OUT_C,HP);OnFwd(OUT_C);Off(OUT_A);//左折マクロ #define turn_right1 SetPower(OUT_A,HP);OnFwd(OUT_A);Off(OUT_C);//右折マクロ #define go_forward SetPower(OUT_AC,HP);OnFwd(OUT_AC);//直進マクロ #define turn_left0 SetPower(OUT_C,MP);SetPower(OUT_A,LP);OnFwd(OUT_C);OnRev(OUT_A);//左回転マクロ(小回り) #define turn_right0 SetPower(OUT_A,MP);SetPower(OUT_C,LP);OnFwd(OUT_A);OnRev(OUT_C);//右回転マクロ(小回り) #define short_break Off(OUT_AC);Wait(200);//交差点前での一時停止マクロ #define CROS_TIME 800//光センサが交点を横断するのに必要な時間 #define crossing SetPower(OUT_AC,HP);OnFwd(OUT_AC);Wait(CROS_TIME);//交差点横断マクロ #define STEP1 3//一回の判断で待つ時間 #define STEP2 1 #define B_CT 5//黒が続く回数の基準 #define W_CT 5//白が続く回数の基準 #define TIMER0 800//切替時間 2種類の音を鳴らすサブルーチンを組み込む task play_tone_timer-on ()//直角右折地点を認識した際に音を鳴らすサブルーチン(同時にtimer(0)をスタート) {PlayTone(392,12); Wait(13); PlayTone(659,12); Wait(25); PlayTone(440,13); } task play_tone_sp ()//より細かくライントレースするモードに切り替わっているときに音を鳴らすサブルーチン { while(true) { PlayTone(659,40); Wait(10); PlayTone(523,90); Wait(10); } } 本体のプログラム 1.交差点を渡る際の白や黒が連続で何回続いたかを数えるカウンタを定義する task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); int N=0; int Nbk=0;//黒連続回数を計るカウンタ int Nwh=0;//白連続回数を計るカウンタ int Ncros=0;//交差点を通った回数を数えるカウンタ 2.以下を繰り返す 2-1.基本的なライントレース while(true) { while(N=0)//標準(緩やかなカーブに対応) { if (SENSOR_2>THRESHOLD+3){ turn_right2; Nwh++; if(Nwh>W_CT){ start play_tone_timer-on; ClearTimer(0); } }else{ Nwh=0; if(SENSOR_2>THRESHOLD){ turn_right1; }else if(SENSOR_2>THRESHOLD-3){ go_forward; }else if(SENSOR_2>THRESHOLD-8){ turn_left1; }else{ turn_left2; } } Wait(STEP1); } 2-2.より感度の高いライントレース(交差点を渡る部分もこれに組み込む) while (FastTimer(0)>TIMER0)//特殊(急なカーブにも対応) { N=1; start play_tone_sp; while(Nbk<B_CT) { if(SENSOR_2<THRESHOLD-8){ turn_left0; Nbk++; }else{ if(SENSOR_2<THRESHOLD-3){ trun_left1; }else if(SENSOR_2<THRESHOLD+3){ turn_right1; }else{ turn_right0; } Nbk=0; } Wait(STEP2); } short_break; turn_right-1; Wait(B_CT*STEP2); crossing; Nbk=0; Ncros++; if(Ncros=2){ TIMER0= 200; Cleartimer(0); N=0; stop play_tone_sp; } } } } **問題点 [#l037c556] 以上のプログラムをNQCに送ると[task"main"is not defined]と表示されてしまう。 どうやらプログラムの長さの問題では無いようで、以下のようにごく短いライントレースプログラムを転送しようとしても同様のエラーが出ることが分かっている。 #define THRESHOLD 43 #define HP 7 #define turn_left2 SetPower(OUT_C,HP);OnFwd(OUT_C); #define turn_right2 SetPower(OUT_A,HP);OnFwd(OUT_A); #define STEP1 3 task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); while(true){ if(SENSOR_2>THRESHOLD){turn_right2;} else{turn_left2;} Wait(STEP1); } }