↑
定義
#define THRESHOLD 35 //基準のしきい値 #define HIPOWER 7 #define LOWPOWER 1 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward1 set_power_H;OnFwd(OUT_AC); //前進(高速) #define go_forward2 set_power_L;OnFwd(OUT_AC); //前進(普通) #define turn_left1 set_power_L;\ OnFwd(OUT_C);OnRev(OUT_A); //左旋回 #define turn_left0 set_power_L;\ OnFwd(OUT_C);Off(OUT_A); //左回り #define turn_right0 set_power_L;\ OnFwd(OUT_A);Off(OUT_C); //右回り #define turn_right1 set_power_L;\ OnFwd(OUT_A);OnRev(OUT_C); //右旋回 #define moter set_power_L;OnFwd(OUT_B); //缶をつかむ #define STEP 1 #define nMAX 3 //交差点とカーブを見分けるカウンター #define short_break Off(OUT_AC);Wait(10); //小休憩 #define CROSS_TIME 30 //交差点を通過するための前進する時間 #define cross_line go_forward1;\ Wait(CROSS_TIME);short_break //交差点を通過 #define time0 400 #define time1 1800 #define time2 2200 #define time3 3300 #define time4 3700 #define time5 4600 #define time6 4900 #define time7 6000
普通のライントレースのサブルーチン
sub line_trace1() //普通のライントレース { if (SENSOR_2 < THRESHOLD -6) { turn_left0; } else if (SENSOR_2 < THRESHOLD -3) { turn_left1; } else if (SENSOR_2 < THRESHOLD +3) { go_forward1; } else if (SENSOR_2 < THRESHOLD +7) { turn_right0; } else { turn_right1; } Wait(STEP); }
急なカーブのライントレースのサブルーチン
sub line_trace2() //急なカーブのライントレース { if (SENSOR_2 < THRESHOLD -3) { turn_left1; } else if (SENSOR_2 < THRESHOLD +3) { turn_right1; } else { go_forward1; } Wait(STEP); }
交差点を通過するサブルーチン
sub line_cross() //交差点を通過 { int nOnline=0; while(nOnline < nMAX){ if (SENSOR_2 < THRESHOLD -6) { turn_left1; nOnline++; //カウンターをプラス } else { if (SENSOR_2 < THRESHOLD -3) { turn_left0; } else if (SENSOR_2 < THRESHOLD +3) { go_forward1; } else if (SENSOR_2 < THRESHOLD +7) { turn_right0; } else { turn_right1; } nOnline=0; //カウンターをリセット } Wait(STEP); } short_break; //小休憩 turn_right1;Wait(nMAX*STEP*10); //交差点と判断する間に左に旋回した分もとに戻る cross_line; //交差点を通過 nOnline=0; //カウンターをリセット }
コースを進む
task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); //タイマーを0にする
go_forward1;Wait(35); //前進 turn_left1;Wait(100); //最初の直角のカーブを曲がる
while(FastTimer(0) <= time0) { line_trace1(); //普通のライントレース } moter;Wait(50);
while(FastTimer(0) <= time1) { line_trace1(); //普通のライントレース } PlaySound(SOUND_UP);
while(FastTimer(0) <= time2) { line_cross(); //交差点を通過 } PlaySound(SOUND_UP);
while(FastTimer(0) <= time3) { line_trace2(); //急な回転のライントレース } PlaySound(SOUND_UP);
while(FastTimer(0) <= time4) { line_cross(); //交差点を通過 } PlaySound(SOUND_UP);
while(FastTimer(0) <= time5) { line_trace2(); //急な回転のライントレース } PlaySound(SOUND_UP);
while(FastTimer(0) <= time6) { line_cross(); //交差点を通過 } PlaySound(SOUND_UP);
while(FastTimer(0) <= time7) { line_trace1(); //普通のライントレース } PlaySound(SOUND_UP);
缶を置く
turn_right1;Wait(100); //缶を指定された位置に置き、缶に当たらないようにしながら続きのライントレースへ進む go_forward1;Wait(100); turn_left1;Wait(200); OnRev(OUT_B);Wait(50);Off(OUT_B); OnRev(OUT_AC);Wait(100); turn_right1;Wait(200);
while(true){ line_trace2(); } }