課題3の目次 #contents *課題内容 [#r771c781] 半径1m以内にある懐中電灯を探して、懐中電灯にピンポン玉を当てるロボットを製作しなさい。 ロボット本体が懐中電灯に接触しない限りどこからピンポン玉を放ってもよい。 *ロボット本体の説明 [#l31ce163] &ref(./1438149968394.jpg,40%); &ref(./1438149974069.jpg,40%); &ref(./1438149971623.jpg,40%); ロボット本体はアーム以外ほとんど課題2のものを流用している。 アームはモータBを使いロボット前面のタイヤが回転するようになっており、シュートの際にはタイヤを回転させることでボールを前方に押し出し、ボールが転がって進むことでシュートをするという形になるよう作成した。 *プログラムの説明 [#u1c925e9] **マクロ [#zd18422a] ロボットが懐中電灯の明かりを探すために必要となる動作を右旋回と左旋回として定義した。 そして、懐中電灯に向けてボールをシュートする動作を定義した。 #define turn_right OnFwd(OUT_A); OnRev(OUT_C); //右旋回 #define turn_left OnFwd(OUT_C); OnRev(OUT_A); //左旋回 #define shoot OnFwd(OUT_B); Wait(50); Off(OUT_B); //ボールをシュートする **メインタスク [#f6df45ff] タイマー0でロボットが1周するだけの時間右旋回を続け、光センサーが最も明るい場所を見つけるたびにタイマー1をリセットする。 1周したのちタイマー1の時間だけ左旋回をすることでロボットが最も明るい場所に向くようにし、最後に懐中電灯の明るさが一定以上になるまで前進してシュートをする。 task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); int light_max = 0; int run_time = 300; int time_max = 0; ClearTimer(0); //タイマー0をリセットする while(FastTimer(0) < run_time) { turn_right; //run_timeの時間だけ右旋回 if(SENSOR_2 > light_max) { light_max = SENSOR_2; //一番明るい場所を記録する ClearTimer(1); //タイマー1をリセットする } } turn_left; time_max = FastTimer(1); Wait(time_max); //タイマー1の時間だけ左旋回 Off(OUT_AC); //一番明るい場所で止まる Wait(100); until(SENSOR_2 > light_max+5) { //一定の明るさになるまで前進 OnFwd(OUT_AC); } shoot; } *まとめ [#sb150637] 今回の課題では前回と違ってボールをシュートする際にボールが直進して目標地点に到達するようにしなければならなかったのでそのためのロボットを製作することに多くの時間を使い大変苦労した。プログラムは例として示されたものに自分なりの工夫を入れ、目標地点になるべく近づいてからシュートすることで課題達成の確実性を上げることに成功した。最終的にはシュートの際、ボールを直進させ続けることは難しくシュートする場所を近づけることしかできなかったのでロボコンではまっすぐボールをシュートするロボットを作成していきたい。