[[2006a/A1]] #contents #br *課題3:光を追いかけるロボット [#jc49d95c] 懐中電灯の光を追いかけて進むロボットを製作し、以下の中から2種類以上のプログラムを作成せよ。 +光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す +光源を見失った時には明るさに比例した周波数の音を出しながら旋回して光源を探す +光源を見失っていないときにはある曲を演奏し、見失った時には別の曲警を演奏しながら光源を探す +上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する ただし支給されているモータ、光センサ、タッチセンサはいくつ使ってもよい。 *完成までの道のり [#a536cf7d] >1. 光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す >4. 上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する を、含めたプログラムを作成することに決定。 **プログラム [#ub9bf207] ***基礎プログラム [#ma546646] ・光を追うプログラム (製作者:シュート・アップル) #define front OnFwd(OUT_A+OUT_C); #define right OnRev(OUT_C);OnFwd(OUT_A); #define left OnRev(OUT_A);OnFwd(OUT_C); //マクロ定義 #define minus 15 //定数定義 int light_max; int time_max; //変数定義 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ定義 light_max=SENSOR_1; time_max=Timer(0); //値の代入 ClearTimer(0); while(Timer(0)<=14) //一周右回転する { right; if(SENSOR_1>light_max) //センサの値と変数を比較 { ClearTimer(1); //タイマのクリア light_max =SENSOR_1 ; //変数に値を代入 } else //等しいもしくは小さい場合 { light_max = light_max; //変数はそのまま time_max =Timer(1); //変数に値を代入 } } ClearTimer(1); while(Timer(1)<= time_max) //タイマ1の時刻まで左回転 {left;} while(true) { if(SENSOR_1>= light_max-minus) //センサの値が大きければ直進。 {front;} if(SENSOR_1< light_max-minus) //小さければ右回転。 { right; ClearTimer(2); until((SENSOR_1>= light_max-minus)||(Timer(2)==5)); //大きい値を約半回転探す。 } if(SENSOR_1< light_max-minus) //見つからなければ、左回転。 { left; until(SENSOR_1>= light_max-minus); } } } ***初期プログラム Ver.メリーさんの羊 [#m279d2fb] 1. 光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す (製作者:シュート・アップル) #define front OnFwd(OUT_A+OUT_C); #define right OnRev(OUT_C);OnFwd(OUT_A); //行動マクロ #define TURN_TIME 360 #define Do 1047 #define Re 1175 #define Mi 1319 #define Fa 1397 #define So 784 #define Ra 880 #define Si 988 //音のマクロ 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); } } int Light=0; int turn_time=360; //変数定義 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサを定義 ClearTimer(0); //タイマーをクリア while(Timer(0)<=turn_time) //一周右回転して探す { if(SENSOR_1>Light) //センサの値が大きければ { Light=SENSOR_1; //値を代入 } right } right start play_music; until(SENSOR_1>=Light); //演奏しながら右回転 while(true) { if(SENSOR_1<Light) //変数の方が大きければ { right until(SENSOR_1>=Light); //右に回転して探す } else //センサの値が大きければ { front stop play_music; until(SENSOR_1<Light); //光が弱くなるまで直進 } } } 曲の紹介にあった『メリーさんの羊』を使用した。 ***初期プログラム Ver.きらきら星 [#h8edcb0e] (製作者:ゆず) #define Do 523 //音の定義 #define Re 584 #define Mi 659 #define Fa 698 #define Sol 784 #define Ra 880 #define Si 988 task play_music() //曲演奏のマクロ { while (true) { PlayTone(Do, 10); Wait(15); PlayTone(Do,10); Wait(15); PlayTone(Sol,10); Wait(15); PlayTone(Sol,10); Wait(15); PlayTone(Ra,10); Wait(15); PlayTone(Ra,10); Wait(15); PlayTone(Sol,20); Wait(25); PlayTone(Fa,10); Wait(15); PlayTone(Fa,10); Wait(15); PlayTone(Mi,10); Wait(15); PlayTone(Mi,10); Wait(15); PlayTone(Re,10); Wait(15); PlayTone(Re,10); Wait(15); PlayTone(Do,15); Wait(20); } } task main() { SetSensor(SENSOR_1, SENSOR_TOUCH); //タッチセンサ定義 start play_music ; OnFwd(OUT_A+OUT_B); //曲を演奏しながら直進 until (SENSOR_1 == 1); stop play_music ; Off(OUT_A+OUT_B); //タッチセンサが触れたら、曲を止めて停止 } 簡単な曲でごめんなさい。 ***初期プログラム 機能追加版 [#db1ec10c] 4. 上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する (製作者:シュート・アップル) #define front OnFwd(OUT_A+OUT_C); #define right OnRev(OUT_C);OnFwd(OUT_A); //行動マクロ #define TURN_TIME 360 //一周の秒数定義 #define Do 1047 #define Re 1175 #define Mi 1319 #define Fa 1397 #define So 784 #define Ra 880 #define Si 988 //音の定義 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(So,15); Wait(20); PlayTone(So,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); } } int Light=0; int turn_time=360; //変数定義 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサを定義 ClearTimer(0); //タイマーをクリア while(Timer(0)<=turn_time) //一周右回転して探す { if(SENSOR_1>Light) //センサの値が大きければ { Light=SENSOR_1; //値を代入 } right } right start play_music; until(SENSOR_1>=Light); //演奏しながら右回転 while(true) { if(SENSOR_1<Light) //変数の方が大きければ { right until(SENSOR_1>=Light); //右に回転して探す } if(SENSOR_1>=75) //光源に近づきすぎたら *1 { Off(OUT_A+OUT_C); //モータを停止 } else //センサの値が大きければ { front stop play_music; until(SENSOR_1<Light); //光が弱くなるまで直進 } } } 1)のプログラムに*1部分を追加。 光源に近づきすぎたら、モータを停止して止まる。 **ロボット [#da54df19] ***初号機 [#fd9a5387] #ref(01.JPG) 課題が課題なだけに、マシンとしては簡素な作り。~ 工夫点として、光を追いかけやすいようにと、 光センサーを機体の先端にななめ上向きに取り付けました。 *完成 [#y16abdcd] プログラムもロボットも初期から変更せず。 *反省・感想 [#v0cb9106] **プログラム [#fac98aba] 全体的にスムーズに出来てよかった。しかし、曲を作るのに時間がかかった。 **ロボット [#q146bac5] 光センサーをつけただけの簡単なものだったのでよかったと思う。 ------ #comment