[[光を追いかけるロボット]] 目次 #contents 光を見失ったときには演奏しながら旋回して光源を探すロボットを作成 *光を見失ったときには演奏しながら旋回して光源を探すロボット [#yd54c69c] #ref(2006a/B3/課題3右/hs.jpg,100%,ロボット) *プログラム1(失敗) [#h41564b4] プログラム 一つ目 (制作者 祭) 一回しか光探しをしない。失敗 #define stop_turning Off(OUT_A+OUT_C); #define turn_right OnFwd(OUT_A);OnRev(OUT_C); #define turn_left OnFwd(OUT_C);OnRev(OUT_A); #define turn_time 425 task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); if(SENSOR_1<50){ //明るさが50より小さいとき 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); //一周にかかる時間から一番明るいところからの時間を引く OnFwd(OUT_A+OUT_C); //前進 } } 失敗の解決 無限ループを使う。 改良点 はじめから光源を向いていた時にはそのまま進むようにする 曲の決定 パッヘルベルのカノンを使うことにしたけどきっちりした楽譜がなかったので少し変に聞こえる。 *プログラム2(成功) [#gc24937d] プログラム 二つ目 (制作者 祭&メンチカツ) 成功 #define stop_turning Off(OUT_A+OUT_C); #define turn_right OnFwd(OUT_A);OnRev(OUT_C); #define turn_left OnFwd(OUT_C);OnRev(OUT_A); #define turn_time 425 #define A 440 #define B 466 #define C 523 #define D 587 #define E 659 #define F 698 #define G 784 #define A1 880 #define B1 988 #define C1 1047 #define D1 1175 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); 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); //前進 } } } 苦労した点&今後の課題 *苦労した点&今後の課題 [#t6859809] 無限ループを使うときwhileを使うのはわかったけどどこまでをくくるのかということ。はじめから光源を向いていたときどうするかで悩んだ。一応ifを使い明るさが60以上だと光源を向いていることにしたけど複数の光源があるときや60以下の光源のときの対策をしていないのでそれをなんとかする。 コメントをどうぞ #comment