[[2006b/MemberOnly/進行状況A]] *課題 光を追いかけるロボット [#h8afbc59] #contents *ロボット本体 [#tc595f3f] &ref(2006b/A1/課題3右/3_1.JPG);上からみたロボット本体です。周りの光の影響を軽減するために屋根をつけました。 正面から見たロボット本体です。中央に緑のついたてがあります。&ref(2006b/A1/課題3右/3_2.JPG); *苦労した点とその解決策・工夫した点 [#o8ce333e] -屋根 --部屋の照明の光にセンサーが反応してしまうことを避けるために、センサー上部に大きな屋根を取り付けました。&ref(2006b/A1/課題3右/3_4.JPG); -センサーの着ける位置 --【高さ】ライトを感知しやすい高さに調節しました。高さが決まっても最初は色々な部品を使って本体への取り付け方に悩まされましたが、上の屋根部分に直接取り付けることによりかいけつしました。&ref(2006b/A1/課題3右/3_3.JPG); --【距離・ついたて】二つのセンサー間の距離も調整しました。右からの光を左のセンサーも感知するなどしてしまうので、ついてたて代わりに板のブロックを間に取り付けました。ついたてを設置した上でセンサー間の距離を縮めてしまうと進行方向に対して真横(90度あたり)からの光を感知しないので、ある程度距離を長くしました。&ref(2006b/A1/課題3右/3_6.JPG); *プログラム [#me83035d] task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); #define Turn_Time 400 ロボットを回転させる時間です。 int light_M=0,int time_M; 変数を二つ定義します ClearTimer(0); タイマー0をクリアします while(FastTimer(0)<Turn_Time) 回転させている間・・・↓ { OnFwd(OUT_A); OnRev(OUT_C); if(light_M<SENSOR_1) 現時点での光センサーが最大値(変数light_M)より大きかった場合・・・ { light_M=SENSOR_1; 最大値を更新します ClearTimer(1); タイマー1をクリアします } } タイマー1にはこの時点での最大値をとる位置からの回転した時間がはいっています time_M=FastTimer(1); すぐにもう一つの変数にタイマー1の値をいれます OnFwd(OUT_C); OnRev(OUT_A); Wait(time_M); 逆回転させて最大値のところまで戻します while(true) { OnFwd(OUT_A+OUT_C); if(SENSOR_1<SENSOR_3) 右のセンサーのほうが明るい場合・・・ { Off(OUT_C); 左のタイヤを止めます Wait(5); } if(SENSOR_1>SENSOR_3) 左のセンサーのほうが明るい場合・・・ { Off(OUT_A); 右のタイヤを止めます Wait(5); } } } -苦労点 --全体として早くから出来上がっていたが、最大値を探す際に <<if(light_M>SENSOR_1)>>としてしまい、最大値の値がゼロのままになり、その後延々と回り続ける羽目に・・・ -- *考察 [#ca30b024] -ライト以外の光の制御はうまく出来たと思うが、ついたての位置のバランスがあまりきれいではない。細かいことだが、ついたての固定方法にもう一工夫あってもよかった。 -屋根やついたてを取り付けるというアイディアはとても良かったと思う。 *コメント [#x46d73d5] -意見や感想があったらお願いします。 -while(true)の中にある OnFwd(OUT_A+OUT_C); という命令は左右のセンサの値がまったく同じ時以外は有効ではないので、他の条件分岐と同じように「左右のセンサの値の差が○○以下の時には直進」のような条件を設定してみてください。 -- [[松本(教員)]] &new{2007-01-09 (火) 14:02:16}; -ついたてをつけた所が、素晴らしいですね。 -- [[ゆき(TA)]] &new{2007-01-12 (金) 11:30:18}; #comment [[このページの先頭へ>2006b/A1/課題3右]]