目次
E地点右折コースを選択した。 詳しくは2017a/Mission2を参照
プログラミングを工夫することによってロボットは基本の形にした。
地面とセンサーを近づけることによってより値を正確にできた。
ラインどりを2種類つかう方法を採用した。
CurrentTick()がtimemaxを超えるとライントレースをやめるようになっている。また黒以外では、CurrentTick()がリセットされる。よって交差点は黒が続くので、CurrentTick()がリセットされることがなく、timemaxを超えて止まるという仕組みである。
#define White 63 #define Gray 50 #define WhiteGray 58 #define BlackGray 43 #define go_st OnFwd(OUT_BC,50); #define spin_left OnFwd(OUT_B,25);OnRev(OUT_C,25); #define spin_right OnFwd(OUT_C,25);OnRev(OUT_B,25); #define turn_left OnFwd(OUT_B,50); #define turn_right OnFwd(OUT_C,50); #define pose(int t) Off(OUT_BC);Wait(t)
sub line_uchi(long timemax)//timemax秒間内側のライン取り { long t0=CurrentTick(); while(CurrentTick()-t0<timemax){ if (SENSOR_1>White) { spin_left; t0=CurrentTick(); } else if (SENSOR_1>WhiteGray) { turn_left; t0=CurrentTick(); } else if (SENSOR_1>Gray) { go_st; t0=CurrentTick(); } else if (SENSOR_1>BlackGray) { turn_right; t0=CurrentTick(); } else { spin_right; } } } sub line_soto(long timemax)//timemax秒間外側のライン取り { long t0=CurrentTick(); while(CurrentTick()-t0<timemax){ if (SENSOR_1>White) { spin_right; t0=CurrentTick(); } else if (SENSOR_1>WhiteGray) { turn_right; t0=CurrentTick(); } else if (SENSOR_1>Gray) { go_st; t0=CurrentTick(); } else if (SENSOR_1>BlackGray) { turn_left; t0=CurrentTick(); } else { spin_left; } } Off(OUT_BC); }
ロボットの通るコースについての前半を参照
task main() { SetSensorLight(S1); go_st; Wait(1100); line_uchi(230); OnFwd(OUT_BC,50); PlaySound(SOUND_UP);//E右折 Wait(20); line_soto(180); pose(100); PlaySound(SOUND_DOWN);//P一時停止 line_soto(190); turn_right; PlaySound(SOUND_UP);//Q直進 Wait(100); line_soto(110); OnFwd(OUT_BC,50); PlaySound(SOUND_UP);//R左折 Wait(100); Off(OUT_BC); line_uchi(230); pose(100); PlaySound(SOUND_DOWN);//T一時停止 turn_left; Wait(300); Off(OUT_BC); line_uchi(230); pose(100); PlaySound(SOUND_DOWN);//T一時停止 turn_left; Wait(300); Off(OUT_BC); line_uchi(230); PlaySound(SOUND_UP);//H Off(OUT_BC); repeat(13){ line_uchi(200); } OnFwd(OUT_BC,20); PlaySound(SOUND_UP);//G Wait(500); line_soto(180); pose(100); PlaySound(SOUND_DOWN);//S左折
ロボットの通るコースについての後半を参照
line_soto(180); turn_right; PlaySound(SOUND_UP);//P直進 Wait(100); line_soto(120);; OnFwd(OUT_BC,20); PlaySound(SOUND_UP);//Q Wait(500); line_uchi(200); PlaySound(SOUND_UP);//F Off(OUT_BC); line_uchi(180); pose(100); PlaySound(SOUND_DOWN);//A }
HからGまでのルートの2つ目の急カーブを止まらず曲がりきろうとするとtimemaxの値が大きくなり、GでSOUND_UPを鳴らすことが出来なくなってしまったので、repeatを用いてtimemaxの値が短いものをいくつも繰り返すことで曲がりきりGでも止まることができた。しかし、まれに曲がりきれない場合もあり改善が必要だと感じた。