課題3:懐中電灯などの光源を用意する。まず明るさに比例した周波数の音を出しながら全方角の中から光源のある方角を探し、探した後は、光源の光を追いかけて進むロボットを作成せよ。
ただし支給されているモータ、光センサ、タッチセンサはいくつ使ってもよい。
このページでは、光の明るさに比例した音を出して明るいところをその場で回転しながら探し、光源を追うロボットについて紹介します。
光をうまくとらえられるように2個の光センサーを前向きに、ロボットの前面に取り付けています。足回りは、キャタピラだと摩擦が大きくなってしまいプログラムが作り辛いのでドライブベースを基本にして、四輪のタイヤとしています。
#define TURN_TIME 400 //ロボットが1回転する時間を設定します。 task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); //光センサーを設定します。 int light_max=0,time_max; ClearTimer(0); while(FastTimer(0)<TURN_TIME) //光の強さが最高になるまで繰り返します。 {OnFwd(OUT_A); OnRev(OUT_C); //その場で回転します。 PlayTone(SENSOR_1*10,3); //光の強さに応じた高さの音を出します。 if(SENSOR_1>light_max) //強い光を発見したら、発見までにかかった時間を記憶します。 {light_max=SENSOR_1; time_max=FastTimer(0); } } OnFwd(OUT_C);OnRev(OUT_A);Wait(TURN_TIME-time_max); //光が最も強かった方向を向きます。 OnFwd(OUT_A+OUT_C); Wait(50); while(true){ //光を追いかけ始めます。 if(SENSOR_1>SENSOR_3+3) {OnFwd(OUT_C); OnRev(OUT_A); Wait(10);} //センサ−1の方が明るかったらセンサ−1の方を向きます。 if(SENSOR_1+3<SENSOR_3) {OnFwd(OUT_A); OnRev(OUT_C); Wait(10);} //センサ−3の方が明るかったらセンサ−3の方を向きます。 else{OnFwd(OUT_A+OUT_C);} //明るい方向を向いているときは、そのまま走ります。 } }
懐中電灯の光を当てる角度を工夫すれば、それを追うことはできるが光センサーを少し上向きに取り付ければもっと感度がよくなったと思う。
光センサーは、値が常に変化し、周囲の状況にも大きく左右されるため、難しい。プログラムの工夫でその誤差を小さくしていくことが大事だと思う。