- 追加された行はこの色です。
- 削除された行はこの色です。
[[2006b/A4]]
*このページについて [#fc0a0fe6]
課題3:懐中電灯などの光源を用意する。まず明るさに比例した周波数の音を出しながら全方角の中から光源のある方角を探し、探した後は、光源の光を追いかけて進むロボットを作成せよ。
ただし支給されているモータ、光センサ、タッチセンサはいくつ使ってもよい。
このページでは、光の明るさに比例した音を出して明るいところをその場で回転しながら探し、光源を追うロボットについて紹介します。
*ロボットについて [#j4050858]
光をうまくとらえられるように2個の光センサーを前向きに、ロボットの前面に取り付けています。足回りは、キャタピラだと摩擦が大きくなってしまいプログラムが作り辛いのでドライブベースを基本にして、四輪のタイヤとしています。
*プログラム [#f3806847]
#define TURN_TIME 400 ロボットが1回転する時間を設定します。
#define TURN_TIME 400 //ロボットが1回転する時間を設定します。
task main ()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,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) 強い光を発見したら、発見までにかかった時間を記憶します。
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_C);OnRev(OUT_A);Wait(TURN_TIME-time_max); //光が最も強かった方向を向きます。
OnFwd(OUT_A+OUT_C); Wait(50);
while(true){ 光を追いかけ始めます。
while(true){ //光を追いかけ始めます。
if(SENSOR_1>SENSOR_3+3)
{OnFwd(OUT_C); OnRev(OUT_A); Wait(10);} センサ−1の方が明るかったらセンサ−1の方を向きます。
{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);} 明るい方向を向いているときは、そのまま走ります。
{OnFwd(OUT_A); OnRev(OUT_C); Wait(10);} //センサ−3の方が明るかったらセンサ−3の方を向きます。
else{OnFwd(OUT_A+OUT_C);} //明るい方向を向いているときは、そのまま走ります。
}
}
*苦労した点 [#d59674fb]
-どのように最も光の強い方向を向くかということ。授業での説明があるまでは、うまく光の強い方向を記憶することができなかったため、光の強い方向は、わかってもその方向を向くことはできなかった。
-どのように光の強さに応じた周波数の音を出すかということ。光の強いところは察知できても音をどう出すかは、すぐにはいい考えが浮かばなかったために話し合うことになった。
-懐中電灯からの光の当て方によっては(光センサーとの角度によっては)うまくセンサーが反応しないことがあった。外からの光によって、懐中電灯とは別の方向に向かってしまうことがあった。
-光を当てる角度が悪いことに気が付くのが遅かったこと。はじめはプログラムに問題があるのかと思い、かなり時間を無駄にしてしまった。
-授業時間外の作業時は懐中電灯ではなく、携帯電話の明かりだったので明かりが弱かったことも苦労の原因になった。
*工夫した点 [#h226c37c]
-光の強さに応じた周波数の出し方。
-携帯電話の弱い明かりでも反応させるために真横から光を当てたこと。
-授業で言われたことだが、はじめにその場で回転して光を探すときは、光センサーの最高値までの時間を計っておき、一回転した時間からそれを引いた分だけ逆回転するという手法をとった。こうすることで、一回転の時間設定が正確なものでなくても、正確に光の方向を向くことができる。
-左右の光センサーの間を広く取ることで、両センサーの値に違いがはっきり出るようにした。結果、より正確に光の方向を追いかけることができるようになった。
-光センサーの位置や角度を調整して誤差を埋めていった。また、それでもどうしようもない部分は、何度も値の調整を続けて、誤差を小さくしていった。
*まとめ [#q17f1b11]
懐中電灯の光を当てる角度を工夫すれば、それを追うことはできるが光センサーを少し上向きに取り付ければもっと感度がよくなったと思う。
光センサーは、値が常に変化し、周囲の状況にも大きく左右されるため、難しい。プログラムの工夫でその誤差を小さくしていくことが大事だと思う。
**ご自由にコメントをどうぞ [#je1fc76b]
-もう少し具体的に書いて下さい。どんな事で苦労したのか、原因は何なのか、どう工夫したのかetc. -- [[ゆき(TA)]] &new{2007-02-02 (金) 12:51:37};
#comment