2015a/Member 課題3(光量の最大値を求め光の方向へシュートをうつ)目次
半径1m以内にある懐中電灯を探して、懐中電灯にピンポン玉を当てるロボットを製作すること。 ただし、ピンポン玉を放つ距離は10〜30cmである。 ロボット本体が懐中電灯に接触しない限りどこからピンポン玉を放っても良いこと。
光の場所を特定するためロボットの正面に光センサーを取り付けた。それ以外のロボットの構造はベーシックなものとなっている。
#define TURN_TIME 395//一回転する時間 int light_max; //lightセンサーの値の最大値 int time_max; //lightセンサーの値が最大の時の時間 task main(){ SetSensor(SENSOR_3, SENSOR_LIGHT); ClearTimer(1); if (Timer(1) <=10000) { light_max = 0; time_max = 0; OnFwd(OUT_A); OnRev(OUT_C); start GetMax;} else { start shoot;} } //lightセンサーが最大になる時の値、及び時間決定// task GetMax(){ ClearTimer(0);//タイマーを初期化 while (FastTimer(0) <= TURN_TIME) {//一回転して一番明るいところを探す if (SENSOR_3 > light_max){ light_max=SENSOR_3; //SENSOR_3の値が現在のlight_max time_max=FastTimer(0); //SENSOR_3が最大の時の時間を記録 } } //回転して// if (time_max <= TURN_TIME/2) {//最明点≦180°のとき Wait(time_max); //360もう一度回る } else {//最明点>180°のとき Toggle(OUT_A);//反転 Toggle(OUT_C);//反転→左旋回 Wait(TURN_TIME-time_max); } start Chase; } //光を追いかける動作// task Chase(){ Float(OUT_AC); while(true){ if (SENSOR_3 >= light_max){ (OUT_A); Float(OUT_C); } else { Float(OUT_A); OnFwd(OUT_C); } } } //シュートする動作// task shoot () { OnFwd(OUT_B); //開く Wait(10); OnRev(OUT_AC);Wait(10); OnFwd(OUT_AC);Wait(25); }
光を見つけるプログラムを作るのに苦労した。最終的にできたプログラムも一度一回転しただけで光を見つけることが出来ず何度か回転しなければ光を見つけることが出来なかった。前回のライントレースのときからそうであるが、ロボットの動きを課題の目的に合わせて簡潔に動かすことが出来なかったのは心残りではあるが自分なりに考え課題を形にできたのはよかったと思う。今回の課題で最後の課題となるわけだが努力はできたと思う。