[[2006a/B5]] *光を追いかけるロボット [#ve18c0e1] **機体 [#od4554f1] 今回は前回の機体をベースに、前のほうに光センサーを取り付けました。ただ、光をこまめに動かして、機体がちょこまか動くと、後輪が外れてしまうことがあります。 余談:今回は光センサーの都合上、毎回恒例の鼻はつけれませんでした(笑)。 #ref(2006a/B5/課題3左/D1000020.JPG) **プログラム [#p7279669] 今回は光を探すときに音楽を流すパターンと、光を探すときとそうではないときの音楽をかえるプログラムを作りました。 -音楽を流すパターン 制作者:たかち int light_max=0,time_max=0,To=440-SENSOR_1+ light_max; #define TURN_TIME 360 #define Do 523 #define Re 587 #define Mi 659 #define Fa 698 #define Sol 784 task play_music() { while (true) { PlayTone(Mi,25); Wait(30); PlayTone(Re, 5); Wait(10); PlayTone(Do,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Mi,35); Wait(40); PlayTone(Re,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Re,35); Wait(40); PlayTone(Mi,15); Wait(20); PlayTone(Sol,15); Wait(20); PlayTone(Sol,35); Wait(40); PlayTone(Mi,25); Wait(30); PlayTone(Re, 5); Wait(10); PlayTone(Do,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Mi,35); Wait(40); PlayTone(Re,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Mi,25); Wait(30); PlayTone(Re, 5); Wait(10); PlayTone(Do,55); Wait(60); Wait(20); } } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); ClearTimer(0); OnFwd(OUT_A);OnRev(OUT_C); start play_music; while(FastTimer(0)<TURN_TIME){ if(SENSOR_1>light_max){ light_max=SENSOR_1; time_max=FastTimer(0); } } Off(OUT_A+OUT_C); stop play_music; Wait(100); OnFwd(OUT_C);OnRev(OUT_A); Wait(TURN_TIME-time_max); Off(OUT_A+OUT_C); while(true){ if(SENSOR_1>=light_max){ OnFwd(OUT_A+OUT_C); }else{ start play_music; OnFwd(OUT_A);OnRev(OUT_C); until(SENSOR_1>=light_max); stop play_music; } } } -音楽をかえるパターン 制作者:たか int light_max=0,time_max=0; //光を追うための値を定義します。 #define TURN_TIME 360 //旋回時間を定義します。 #define Do 523 #define Re 587 #define Mi 659 #define Fa 698 #define Sol 784 #define Ra 880 task play_music1() //一つ目の音楽を流すプログラムです。(メリーさんの羊) { while (true) { PlayTone(Mi,25); Wait(30); PlayTone(Re, 5); Wait(10); PlayTone(Do,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Mi,35); Wait(40); PlayTone(Re,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Re,35); Wait(40); PlayTone(Mi,15); Wait(20); PlayTone(Sol,15); Wait(20); PlayTone(Sol,35); Wait(40); PlayTone(Mi,25); Wait(30); PlayTone(Re, 5); Wait(10); PlayTone(Do,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Mi,35); Wait(40); PlayTone(Re,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Mi,25); Wait(30); PlayTone(Re, 5); Wait(10); PlayTone(Do,55); Wait(60); Wait(20); } } task play_music2() //2つ目の音楽のプログラムです。(カエルのうた) { while(true) { PlayTone(Do,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Fa,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Do,30); Wait(35); PlayTone(Mi,15); Wait(20); PlayTone(Fa,15); Wait(20); PlayTone(Sol,15); Wait(20); PlayTone(Ra,15); Wait(20); PlayTone(Sol,15); Wait(20); PlayTone(Fa,15); Wait(20); PlayTone(Mi,30); Wait(35); PlayTone(Do,15); Wait(50); PlayTone(Do,15); Wait(50); PlayTone(Do,15); Wait(50); PlayTone(Do,15); Wait(50); PlayTone(Do,10); Wait(15); PlayTone(Do,10); Wait(15); PlayTone(Re,10); Wait(15); PlayTone(Re,10); Wait(15); PlayTone(Mi,10); Wait(15); PlayTone(Mi,10); Wait(15); PlayTone(Fa,10); Wait(15); PlayTone(Fa,10); Wait(15); PlayTone(Mi,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Do,30); Wait(35); } } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーに設定します。 ClearTimer(0); //タイマーを初期化します。 OnFwd(OUT_A);OnRev(OUT_C); //旋回します。 start play_music; //音楽を流します。 while(FastTimer(0)<TURN_TIME){ //旋回している間の行動を定めます。 if(SENSOR_1>light_max){ //センサーの値がlight_maxより高いときのことを定めます。 light_max=SENSOR_1; //センサー1の値をlight_maxに設定します。 time_max=FastTimer(0); //この時間をtime_maxに設定します。 } } Off(OUT_A+OUT_C); //停止します。 stop play_music; //音楽をとめます。 Wait(100); //1秒間静止します。 OnFwd(OUT_C);OnRev(OUT_A); //さっきと反対周りに旋回します。 Wait(TURN_TIME-time_max); //先ほどまでの旋回時間から最も光の強かったところまでの 時間を引いただけ旋回します。 Off(OUT_A+OUT_C); //止まります。 while(true){ //光を追尾する行動を設定します。 if(SENSOR_1>=light_max){ //センサー1がlight_maxより大きいか、同じときの行動を設定します。 start play_music1; //1つ目の音楽を流します。 OnFwd(OUT_A+OUT_C); //前進します。 until(SENSOR_1>=light_max); //光を見失うまで続けます。 stop play_music1; //音楽を止めます。 }else{ //光を見失ったときの行動を設定します。 start play_music2; //2つ目の音楽を流します。 OnFwd(OUT_A);OnRev(OUT_C); //旋回します。 until(SENSOR_1>=light_max); //光を見つけるまで続けます。 stop play_music2; //音楽を止めます。 } } } **工夫した点 [#j417a65b] 二つのプログラムの光を探す部分のプログラムを共通のものにすることで、作業を簡略化しました。 **苦労した点 [#n89abfa9] 最後の、光を探すプログラムが少し手こずりました。 **反省・感想 [#p0a94df1] 今回はみんなで集まってやることができたのでよかったです。機体のほうにはあまり工夫を凝らすかとができなかったので残念でした。 **コメント [#x7e8d218] 何かあったらお願いします。 #comment