今回の課題は光を追いかけるロボットを作るというもの。
だが、ただ追いかければよいというものでもない。
今回の課題の内容
懐中電灯の光を追いかけて進むロボットを製作し、以下の中から2種類以上のプログラムを作成せよ。 1. 光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す 2. 光源を見失った時には明るさに比例した周波数の音を出しながら旋回して光源を探す 3. 光源を見失っていないときにはある曲を演奏し、見失った時には別の曲を演奏しながら光源を探す 4. 上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する ただし支給されているモータ、光センサ、タッチセンサはいくつ使ってもよい。
1. 光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す を選択。
4. 上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する を選択。
とりあえずはロボットの前方に光センサーを取り付ける方向で意見がまとまる。
制作。
試作1号機はなんとも面白くない形にまとまってしまった。
そして先生のアドバイスが。
左右で光の強さが変わるようなロボットだと効率的に光を探すことができるとの事。
具体的にはセンサーを2つ使って、センサーとセンサーの間に仕切りを作るというもの。
そこで試作1号機を解体して再度構想を練る。
インパクトがあってかっこいいロボットということで、再び製作開始。
完成
仕切り板の効果があるのか無いのか?
仕組みは右から光が当てられると右側の光センサーは反応大、逆に左側の光センサーは反応小にするというもの。
それを調べるために一回仕切り板をはずしてみた。
センサーに光を当ててみると2つとも同じような数値が出てきた。
そこで再び仕切り板を取り付けて実験。
今回はそれぞれ違った数値が表示された。
これにより仕切り板効果が実証され、採用が確定。
int light_max=0,time_max=0; //light_maxとtime_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); //センサー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; //現在のライトセンサーの値をlight_maxに設定 time_max=FastTimer(0); //それまでの旋回時間をtime_maxに設定 } } 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){ //ライトセンサーの値が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; //音楽をとめる } } }
task main () {
SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ1が光センサであることを宣言 int light_max=0,time_max=0; //整数型変数light_max,time_maxを宣言し0を代入 turn_right; //右旋回 start play_music; //演奏開始 ClearTimer(0); //FastTimer(0)をリセット while(FastTimer(0) < TURN_TIME) { if(SENSOR_1 > light_max) { light_max=SENSOR_1; //light_maxをSENSOR_1に代入 time_max=FastTimer(0); //time_maxをFastTimerに代入 } } turn_stop; //旋回停止 Wait(50); turn_left; //左旋回 Wait(TURN_TIME-time_max); turn_stop; //旋回停止 stop play_music; //演奏停止 while(true) //以下ループ&ループ { if(SENSOR_1<=light_max) { OnFwd(OUT_A+OUT_C); //直進する } if(SENSOR_1>80) //80より値が大きい時 { Off(OUT_A+OUT_C); //停止する } if(SENSOR_1<45) //45より小さい時 { Wait(100); int light_max=0,time_max=0; turn_right; //右旋回 start play_music; //演奏停止 ClearTimer(0); //FastTimer(0)をリセット while(FastTimer(0) < TURN_TIME) { if(SENSOR_1 > light_max) { light_max=SENSOR_1; //light_maxをSENSOR_1に代入 time_max=FastTimer(0); //time_maxをFastTimerに代入 } } turn_stop; //旋回停止 Wait(50); turn_left; //左旋回 Wait(TURN_TIME-time_max); turn_stop; //旋回停止 stop play_music; //演奏停止 } }
}
・仕切りを作って2つの光センサーの反応をそれぞれ変わるようにしたこと。
・光の強い方向を探して回転するとき、効率よく左右に回転するようにしたこと。
・他の班が考えないようなロボットの形にしたこと。
・光センサーの間の仕切り版を取って動かしてみたところ、どちらのセンサーも値が大して変わらず、結局センサーが1つの時とほとんど同じ結果となった。
やはり仕切り版は作っておいて正解だった。
光センサーの使い方が分かった。
ただライントレースに使えるだけじゃなく、光の強弱を判断して、様々な動作をさせられることが面白いと思った。
この性質を使ってプログラムを組むことで、もっと面白い動きをさせることもできるだろう。
音を出すためのプログラムを組む時、どんな曲にしようかと悩んだ。
曲が決まれば後は楽譜どおりにプログラムを組めばよかったから意外と簡単だった。
しかし、音の伸ばし具合がなかなかうまくいかなくて苦労した。
音楽の心得を誰も持っていなかったため曲が、、、