#define THRESHOLD 45 // しきい値を設定した #define HIPOWER 7 // モーターを強く回す時のパワーの大きさ(直進するときに使用する) #define LOWPOWER 3 // モーターを弱く回すときのパワーの大きさ(カーブするときにライントレースからはみ出ないように使用する) #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define set_power_N SetPower(OUT_B,LOWPOWER); #define go_fwd set_power_H; OnFwd(OUT_AC); // 直進 #define arm_fwd set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B); // アームを閉じる #define arm_bwd set_power_N; OnRev(OUT_B);Wait(30);Off(OUT_B); // アームを開く #define turn_left1 set_power_L ;OnFwd(OUT_C);OnRev(OUT_A); // 左折1(その場で曲がりやすい) #define turn_left0 set_power_L ;\ OnFwd(OUT_C);Off(OUT_A); // 左折0(その場で曲がりにくい) #define turn_right0 set_power_L ;\ OnFwd(OUT_A);Off(OUT_C); // 右折1(その場で曲がりにくい) #define turn_right1 set_power_L ;\ OnFwd(OUT_A);OnRev(OUT_C); // 右折0(その場で曲がりやすい) #define STEP 1 #define nMAX 200 // 通常の旋回で許容できる繰り返しの最大値 #define short_break Off(OUT_AC); Wait(100); #define CROSS_TIME 300 // 交差点を通過するのにかかる時間 #define cross_line set_power_L;\ OnFwd(OUT_A);OnRev(OUT_C);\ Wait(CROSS_TIME);short_break; // 交差点を渡る
task main () {
SetSensor(SENSOR_2, SENSOR_LIGHT); int nOnline=0; // カウンタに0を代入する ClearTimer(0); // タイマーをクリアする
/* 黒を続けてnMAX回繰り返さない&タイマーが6秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=600){ while(nOnline < nMAX && FastTimer(0)<=600){ if(SENSOR_2< THRESHOLD -13) { turn_left1; nOnline++; // カウンタを1プラスする }else{ if(SENSOR_2< THRESHOLD -11){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } nOnline=0; // カウンタを0にする } Wait(STEP); } } arm_fwd; PlaySound(SOUND_CLICK); // 音を鳴らす
/* 黒を続けてnMAX回繰り返さない&タイマーが16秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=1600){ while(nOnline < nMAX && FastTimer(0)<=1600){ if(SENSOR_2< THRESHOLD -13) { turn_left1; nOnline++; // カウンタを1プラス }else{ if(SENSOR_2< THRESHOLD -11){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } nOnline=0; // カウンタをリセット } Wait(STEP); } }
PlaySound(SOUND_DOUBLE_BEEP); // 音を鳴らす ClearTimer(0); // タイマーをリセット turn_right1; Wait(10); arm_fwd;
/* 黒を続けてnMAX回繰り返さない&タイマーが12秒を超えるまで通常のライントレースをする */
while(FastTimer(0)<=1200){ while(nOnline < nMAX && FastTimer(0)<=1200){ if(SENSOR_2< THRESHOLD -15) { turn_right1; nOnline++; // カウンタを1プラス }else{ if(SENSOR_2< THRESHOLD -13){ turn_right0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD +2){ turn_left0; }else{ turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP); } } PlaySound(SOUND_DOWN); // 音を鳴らす turn_left1; Wait(10); arm_fwd;
/* 黒を続けてnMAX回繰り返さない&タイマーが20秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=2000){ while(nOnline < nMAX && FastTimer(0)<=2000){ if(SENSOR_2< THRESHOLD -13) { turn_left1; nOnline++; // カウンタを1プラス }else{ if(SENSOR_2< THRESHOLD -11){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } nOnline=0; // カウンタをリセット } Wait(STEP); } } PlaySound(SOUND_LOW_BEEP); // 音を鳴らす turn_right1; Wait(20); arm_fwd;
/* 黒を続けてnMAX回繰り返さない&タイマーが29秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=2900){ while(nOnline < nMAX && FastTimer(0)<=2900){ if(SENSOR_2< THRESHOLD -15) { turn_right1; nOnline++; カウンタを1プラス }else{ if(SENSOR_2< THRESHOLD -13){ turn_right0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD +2){ turn_left0; }else{ turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP); } } PlaySound(SOUND_FAST_UP); arm_fwd;
/* 黒を続けてnMAX回繰り返さない&タイマーが45秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=4500){ while(nOnline < nMAX && FastTimer(0)<=4500){ if(SENSOR_2< THRESHOLD -13) { turn_right1; nOnline++; // カウンタを1プラス }else{ if(SENSOR_2< THRESHOLD -11){ turn_right0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_left0; }else{ turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP); } } /* 缶を話す作業 */ PlaySound(SOUND_DOUBLE_BEEP); // 音を鳴らす turn_left1; Wait(275); arm_bwd; OnRev(OUT_AC); Wait(100); turn_left1; Wait(275);
/* 黒を続けてnMAX回繰り返さない&タイマーが55秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=5500){ while(nOnline < nMAX && FastTimer(0)<=5500){ if(SENSOR_2< THRESHOLD -13) { turn_left1; nOnline++; // カウンタを1プラス }else{ if(SENSOR_2< THRESHOLD -11){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } nOnline=0; // カウンタをリセット } Wait(STEP); } /* 交差点の通過 */ short_break; turn_right1;Wait(nMAX*STEP); cross_line; nOnline=0; // カウンタをリセット } }