[[2015a/Member]] #contents *はじめに [#d2a18bf1] 今回の課題は「光に向かってボールを発射するロボット」です。 半径1メートル以内にある懐中電灯に向かって球を発射することがルールです。 *本体 [#z181a141] 今回のロボットは、前回のロボットを少し改良したものになりますので、変更点だけを説明していきます。詳しく知りたいという方は、「Mission2」を参照してください。 下は、今回のロボットの写真になります。 &ref(2015a/Member/Keima/Mission3/1438260469008.jpg,50%,本体写真1); &ref(2015a/Member/Keima/Mission3/1438260476362.jpg,50%,本体写真2); **アーム [#k74916f9] 今回の変更点の1つです。 前回は左右からアームではさむという方法をとっていましたが、発射が難しく、またアーム自体が脆くなっていました。 今は、球を持つときはアームで押さえ、発射はアームを持ち上げたときに根元のでっぱりが球をはじき出す仕組みになっています。 アームを動かすモーターは裏に取り付けました。スマートに見えますよね。 &ref(2015a/Member/Keima/Mission3/1438260462519.jpg,50%,アーム); &ref(2015a/Member/Keima/Mission3/1438260480985.jpg,50%,アーム裏); **センサー [#d1477d46] 今回の変更点の1つです。 光センサーは、懐中電灯を探すのに必要なので、上に取り付けてあります。 *プログラム [#pa093d3c] 今回、僕が作ったプログラムになります。 #define turn_right set_power_L;OnFwd(OUT_C);OnRev(OUT_A); #define turn_left set_power_L;OnFwd(OUT_A);OnRev(OUT_C); #define High_power 4 #define Low_power 1 #define set_power_H SetPower(OUT_B,High_power); #define set_power_L SetPower(OUT_AC,Low_power); #define shot set_power_H;OnRev (OUT_B);Wait(30);Off(OUT_B); task main(){ SetSensor(SENSOR_2,SENSOR_LIGHT); int count=0; ClearTimer(0); while(FastTimer(0)<=200){ turn_right; if(SENSOR_2>count){ count=SENSOR_2; } } until(SENSOR_2 = count){ turn_left; } Off(OUT_AC); shot; } **定義 [#vc3158e7] #define turn_right set_power_L;OnFwd(OUT_C);OnRev(OUT_A); #define turn_left set_power_L;OnFwd(OUT_A);OnRev(OUT_C); #define High_power 4 #define Low_power 1 #define set_power_H SetPower(OUT_B,High_power); #define set_power_L SetPower(OUT_AC,Low_power); #define shot set_power_H;OnRev (OUT_B);Wait(30);Off(OUT_B); 今回は、モーターの回転を速く、あるいは遅くするため、パワーの定義を加えました。3、4行目です。 #define High_power 4 #define Low_power 1 これにより、アーム部分のモーターBを速く、タイヤ部分のモーターA,Cを遅くすることができます。 #define set_power_H SetPower(OUT_B,High_power); #define set_power_L SetPower(OUT_AC,Low_power); それを利用して、左右の回転と、 #define turn_right set_power_L;OnFwd(OUT_C);OnRev(OUT_A); #define turn_left set_power_L;OnFwd(OUT_A);OnRev(OUT_C); 球の発射、 #define shot set_power_H;OnRev (OUT_B);Wait(30);Off(OUT_B); この3つの動作を定義しました。 **メインプログラム [#qbb8029d] task main(){ SetSensor(SENSOR_2,SENSOR_LIGHT); int count=0; ClearTimer(0); while(FastTimer(0)<=200){ turn_right; if(SENSOR_2>count){ count=SENSOR_2; } } until(SENSOR_2 = count){ turn_left; } Off(OUT_AC); shot; } 今回もカウンタとタイマーを使っています。 ただし、カウンタは懐中電灯を見つけるために使ています。 if(SENSOR_2>count){ count=SENSOR_2; この部分なんですが、カウンタの値がセンサー測定した値よりも小さいとき、センサーの値をそのままカウンタの値として置き換えます。それを、タイマーが作動している間、右回転しているときずっと行っています。光が強いほどセンサーは大きい値を測定するので、一回転している間に懐中電灯の場所を見つけることができます。 懐中電灯を見つけたら、次はそこに向かって打ち出さなければいけません。そのために、懐中電灯がある角度まで戻ります。 until(SENSOR_2 = count){ turn_left; } これは戻るためのプログラムです。「until」は括弧内の条件が満たされるまで同じ動作をし続けるというプログラムです。 前のプログラムで、カウンタが懐中電灯の光の値を記録しているので、センサーがその値を測定する、つまり、懐中電灯に向くまで左に回転し続けます。 最後に、球を打ち出します。 shot; *最後に [#c15a75da] 今回は、プログラムをスマートに作ることができたと思います。また、本体も、前回の反省を生かして丈夫に作ることができました。 僕自身は満足のいく出来でした。