光を見失ったときには演奏しながら旋回して光源を探すロボットを作成.
移動方式 タイヤ
理由 できるだけスムーズに動いたほうがいいと思ったから。
今回はあまり本体が重要ではないとの判断によりただもとの形に光センサーをつけただけの無粋な形に
プログラム 一つ目 (制作者 祭) 一回しか光探しをしない。失敗
#define stop_turning Off(OUT_A+OUT_C); //stop_turning で停止 #define turn_right OnFwd(OUT_A);OnRev(OUT_C); //turn_right で右に旋回 #define turn_left OnFwd(OUT_C);OnRev(OUT_A); // turn_left で左に旋回 #define turn_time 425 //一周にかかる時間 task main ()
{
SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1に光センサーをつける if(SENSOR_1<50){ //明るさが50より小さいとき int light_max=0,time_max=0; //変数を0に turn_right; //右に旋回 ClearTimer(0); //タイマーをリセット while(FastTimer(0)<turn_time){ if(SENSOR_1>light_max){ //センサーが今までで一番明るい光を感知したとき light_max=SENSOR_1; time_max=FastTimer(0); } } stop_turning;Wait(100); //一秒停止 turn_left; //左に旋回 Wait(turn_time-time_max); //一周にかかる時間から一番明るいところまでの時間を引く OnFwd(OUT_A+OUT_C); //前進 } }
失敗の解決
無限ループを使う。
改良点
はじめから光源を向いていた時にはそのまま進むようにする
曲の決定
パッヘルベルのカノンを使うことにしたけどきっちりした楽譜がなかったので少し変に聞こえる。
プログラム 二つ目 (制作者 祭&メンチカツ) 成功
#define stop_turning Off(OUT_A+OUT_C); //stop_turningで停止 #define turn_right OnFwd(OUT_A);OnRev(OUT_C); //turn_rightで右に旋回 #define turn_left OnFwd(OUT_C);OnRev(OUT_A); //turn_leftで左に旋回 #define turn_time 425 // 一周にかかる時間425 #define A 440 // Aをラの音に #define B 466 // Bをシの音に #define C 523 // Cをドの音に #define D 587 // Dをレの音に #define E 659 // Eをミの音に #define F 698 // Fをファの音に #define G 784 // Gをソの音に #define A1 880 // A1を1オクターブ高いラの音に #define B1 988 // B1を1オクターブ高いシの音に #define C1 1047 // C1を1オクターブ高いドの音に #define D1 1175 // D1を1オクターブ高いレの音に task play_music() { while(true) パッヘルベルのカノン 演奏 { PlayTone(G,50);Wait(55); PlayTone(E,25);Wait(30); PlayTone(F,25);Wait(30); PlayTone(G,50);Wait(55); PlayTone(E,25);Wait(30); PlayTone(F,25);Wait(30); PlayTone(G,20);Wait(25); PlayTone(B,25);Wait(30); PlayTone(A,25);Wait(30); PlayTone(B,25);Wait(30); PlayTone(C,25);Wait(30); PlayTone(D,25);Wait(30); PlayTone(E,25);Wait(30); PlayTone(F,25);Wait(30); PlayTone(E,50);Wait(55); PlayTone(C,25);Wait(30); PlayTone(D,25);Wait(30); PlayTone(E,50);Wait(55); PlayTone(C,25);Wait(30); PlayTone(D,25);Wait(30); PlayTone(E,25);Wait(30); PlayTone(F,25);Wait(30); PlayTone(E,25);Wait(30); PlayTone(D,25);Wait(30); PlayTone(E,25);Wait(30); PlayTone(C1,25);Wait(30); PlayTone(B1,25);Wait(30); PlayTone(C1,25);Wait(30); PlayTone(A1,50);Wait(55); PlayTone(C1,25);Wait(30); PlayTone(B1,25);Wait(30); PlayTone(A1,50);Wait(55); PlayTone(G,25);Wait(30); PlayTone(F,25);Wait(30); PlayTone(G,25);Wait(30); PlayTone(F,25);Wait(30); PlayTone(E,25);Wait(30); PlayTone(F,25);Wait(30); PlayTone(G,25);Wait(30); PlayTone(A1,25);Wait(30); PlayTone(B1,25);Wait(30); PlayTone(C1,25);Wait(30); PlayTone(A1,50);Wait(55); PlayTone(C1,25);Wait(30); PlayTone(B1,25);Wait(30); PlayTone(C1,50);Wait(55); PlayTone(B1,25);Wait(30); PlayTone(C1,25);Wait(30); PlayTone(B1,25);Wait(30); PlayTone(A1,25);Wait(30); PlayTone(B1,25);Wait(30); PlayTone(C1,25);Wait(30); PlayTone(D1,25);Wait(30); PlayTone(C1,25);Wait(30); PlayTone(A1,25);Wait(30); PlayTone(B1,25);Wait(30); PlayTone(C1,200);Wait(205); } } task main ()
{
SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1に光センサーをつける while(true){ if(SENSOR_1<60){ //明るさが60より小さいとき start play_music ; //音楽をならす int light_max=0,time_max=0; turn_right; //右に旋回 ClearTimer(0); //タイマーをリセット while(FastTimer(0)<turn_time){ if(SENSOR_1>light_max){ //光センサーが今までで一番明るい光を感知したとき light_max=SENSOR_1; //明るい値を今の値に変える time_max=FastTimer(0); //時間をリセットする } } stop_turning;Wait(100); //一秒停止 turn_left; //左に旋回 Wait(turn_time-time_max); //一周にかかる時間から一番明るいろころまでかかった時間をひく値分待つ stop play_music ; //音楽を止める OnFwd(OUT_A+OUT_C); }else{ //はじめから光源を向いていたとき stop play_music ; //音楽をならさない OnFwd(OUT_A+OUT_C); //前進 } } }
苦労した点&今後の課題
無限ループを使うときwhileを使うのはわかったけどどこまでをくくるのかということ結局最後までくくった。はじめから光源を向いていたときどうするかで悩んだ。一応ifを使い明るさが60以上だと光源を向いていることにして始めがその明るさ以上だとそのまま前進するようにした。でも複数の光源があるときや60以下の光源のときの対策をしていないのでそれをなんとかすることが今後の課題。
コメントをどうぞ