[[2006a/C2/課題3右]] 光を追うプログラム #contents *目的 [#zfda61b7] 今回の実習の目的は、前回の続きで光センサーを使ったロボの誘導と、RCQの中にある音を鳴らすプログラムが使えるようになることです。 *プログラム作成 [#o5d2af02] 今回は、課題を自分で選べるようになっていました。私はその中の「光を探しているときと、進んでいるときで違う音を鳴らしながら光を追う」というものを選びました。 **プログラムに必要な定数 [#s089a4d2] #define AROUND_TIME 210 #define HH 33 #define SH 65 #define DO 523 #define RE 587 #define MI 659 #define FA 698 #define SO 784 #define RA 880 #define SI 988 #define HDO 1047 AROUND_TIMEはロボが1周するまでの時間です。HHはロボが「光を見失った」と判断する基準値です。DO〜HDOは低いドから高いドまでの値です。NQCでは、音の周波数を直接入力しなければなりません。例えば、REなら587Hzとなるわけです。 **曲 [#f5739491] これは、光を探すときに鳴る曲です。 task play_music1() { while(true) { PlayTone(DO,50);Wait(55); PlayTone(MI,10);Wait(15); PlayTone(MI,20);Wait(25); PlayTone(RE,10);Wait(15); PlayTone(SI,10);Wait(15); PlayTone(SI,10);Wait(15); Wait(20); } } こっちは、進んでいるときの曲です。 task play_music2() { while(true) { PlayTone(DO,20);Wait(25); PlayTone(RE,10);Wait(15); PlayTone(MI,20);Wait(25); PlayTone(RE,10);Wait(15); PlayTone(SO,30);Wait(30); PlayTone(SI,10);Wait(15); Wait(20); } } **メインプログラム [#y5b2bab4] ここからは、光を探したり、追ったりするプログラムです。 int light_strongest ; int time_strongest ; task main() { ここから SetSensor(SENSOR_1, SENSOR_LIGHT); while(true){ light_strongest = SENSOR_1; ClearTimer(0); OnFwd(OUT_A); OnRev(OUT_C); start play_music1 ; while(FastTimer(0) < AROUND_TIME){ if(SENSOR_1>light_strongest){ light_strongest = SENSOR_1; time_strongest = FastTimer(0); } } OnFwd(OUT_C); OnRev(OUT_A); Wait( AROUND_TIME - time_strongest ); Off(OUT_A + OUT_C); stop play_music1 ; Wait(20); ここまでが光を探すプログラムです。そしてここから OnRev(OUT_A+OUT_C); start play_music2 ; until(SENSOR_1<HH); stop play_music2 ; } } ここまでが光に向かって進むプログラムです。これでプログラムは完成です。 *苦労したところ [#v0b07e12] 今回、最も苦労したところは、「光を見失った」と判断させるところでした。最初は、光センサの値を40以下になったら「光を見失った」と判断するように設定してやってみましたが、ライトをすごく近いところまでしてやらないと、すぐに光を探し始めました。それは、ライトが上手く当たらないと、光センサの値がすぐに40以下になってしまったからです。次に35でやってみましたが、暗いところでは上手くいきましたが、明るいところではだめでした。なので30でやってみると、ライトを当てなくても光を探しませんでした。これは、ライトを当てなくても、部屋の明かりで30以上になってしまったからだと思いました。次に33でやってみました。そしたら暗いところも、明るいところも上手く判断してくれました。 *まとめ [#bc3ba0cf] このプログラムを作るにあたって、光センサの便利さと、難しさを両方感じることができました。それは、苦労した点にかいてあるとうり、光センサの微妙な値のちがいで、プログラムのできがまったく変わってしまうと思いました。しかしロボの外部の情報を得るには、通信機能か光センサしかなく、 このプログラムを作るにあたって、光センサの便利さと、難しさを両方感じることができました。それは、苦労した点にかいてあるとおり、光センサの微妙な値のちがいで、プログラムのできがまったく変わってしまうと思いました。しかしロボの外部の情報を得るには、通信機能か光センサしかなく、ロボ自身で得られる外部の情報に限っては光センサしかありません。なので光センサはかなり必要なものです。この光センサをうまく使えるか使えないかは、かなり大きな差だと思います。