・A地点からB地点へ
A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点
・B地点からC地点へ
B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点
・C地点からA地点へ
C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点
私は1番目のルートを通るプログラミング(A地点からB地点)作りました。
前回の課題を行い、機体が重たいと電池の消耗が激しくなることや、動くスピードが遅くなることがわかったため、今回は前回の反省を活かしてシンプルな機体にしました。
また、機体の裏と床が触れ合う所は摩擦が少なくなるように工夫しました。
なめらかな面でできている部品を使ってあります。
#define straight 5 #define carb 2 #define set_straight SetPower(OUT_AC,straight); #define set_carb SetPower(OUT_AC,carb); #define go_forward set_straight; OnFwd(OUT_AC); #define turn_leftL set_carb; OnFwd(OUT_C); OnRev(OUT_A); #define turn_leftS set_carb; OnFwd(OUT_C); Off(OUT_A); #define turn_rightS set_carb; OnFwd(OUT_A); Off(OUT_C); #define turn_rightL set_carb; OnFwd(OUT_A); OnRev(OUT_C); #define black 38 #define glayA 42 #define glayB 45 #define glayC 48 #define white 50 #define kazu 13 #define OTO1 8 #define OTO2 20 #define OTO3 4 #define OTO_A 1047 #define OTO_B 988 #define OTO_C 698 #define OTO_D 659 //定義
task play_music() //fff r fff r frfmmmdmmmdmdm { PlayTone(OTO_A,OTO1); Wait(OTO2); PlayTone(OTO_A,OTO1); Wait(OTO2); PlayTone(OTO_A,OTO1); Wait(OTO2); PlayTone(587,OTO3); Wait(OTO2-8); PlayTone(OTO_A,OTO3); Wait(OTO2-8); PlayTone(OTO_A,OTO1); Wait(OTO2); PlayTone(587,OTO1); Wait(OTO2); PlayTone(OTO_A,OTO3); Wait(OTO2-8); PlayTone(587,OTO3); Wait(OTO2-8); PlayTone(OTO_A,OTO3); Wait(OTO2-8);//10048 PlayTone(OTO_B,OTO1); Wait(OTO2);//m PlayTone(OTO_B,OTO1); Wait(OTO2);//m PlayTone(OTO_B,OTO1); Wait(OTO2);//m PlayTone(523,OTO3); Wait(OTO2-8);//d PlayTone(OTO_B,OTO3); Wait(OTO2-8);//m PlayTone(OTO_B,OTO1); Wait(OTO2);//m PlayTone(523,OTO1); Wait(OTO2);//d PlayTone(OTO_B,OTO3); Wait(OTO2-8);//m PlayTone(523,OTO3); Wait(OTO2-8);//d PlayTone(OTO_B,OTO3); Wait(OTO2-8);//m } //マリオカートでスターが出た時の音
sub massugu() { Off(OUT_AC); Wait(100); PlaySound(SOUND_UP); go_forward; Wait(70); } //交差点に来た時、まっすぐに進む命令のサブルーチン
sub hidari() { Off(OUT_AC); Wait(70); PlaySound(SOUND_DOWN); turn_leftS; Wait(145); } //交差点に来た時、まっすぐに進む命令のサブルーチン
sub natural() { while (FastTimer(0) <= kazu) { if (SENSOR_2 < black) { //20 turn_leftL; } else if (SENSOR_2 < glayA) { turn_leftS; ClearTimer(0); } else if (SENSOR_2 < glayB) { go_forward; ClearTimer(0); } else { turn_rightL; ClearTimer(0); //30 } Wait(1); } } //通常のライントレースをさせる命令のサブルーチン
task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); repeat(3){ ClearTimer(0); natural(); massugu(); } //3回交差点で真っ直ぐにいかせる ClearTimer(0); natural(); hidari(); //最後の交差点で左に曲がらせる ClearTimer(0); natural(); massugu(); //Bの枠内に入れるために少し進ませる。 repeat(2) { start play_music; } Off(OUT_AC);} //終わりの曲♪
最後までゴールすることができました。(42.43秒)
交差点で止まる際に、止まるまでの時間の調整がとても細かくて大変でしたが、それは地道に実験しながら探っていきました。
具体的に図で説明すると以下のようになります。
(グレー:コース、青:機体、赤:光センサー)
ここで止まるのが理想だが、時間が長すぎると、交差点だと判断する前に曲がってしまう⇓
数値を0.1ずつ変えていき、適当な値を見つけることができました。
今回は、サブルーチンやリピートなども使えて、手応えを感じました。
光の量を判断して、ラインのギリギリを走らせるという発想は、とてもおもしろかったです。
ですが、それ故とても繊細で、緻密な数値が大事になってくるのだということも理解しました。
終わりのメロディも楽しいものになり(マリオカートのスターが出た時の音)、全体的に良かったと思います。