[[2015a/Member]] 目次 #contents *課題 [#re7fd2ec] 半径1m以内にある懐中電灯を探して、懐中電灯にピンポン玉を当てるロボットを製作しなさい。%%ただし、ピンポン玉を放つ距離は10〜30cmとする。%% ロボット本体が懐中電灯に接触しない限りどこからピンポン玉を放ってもよい *ロボットの説明 [#a96812db] 課題3の内容は、課題2の内容と類似した点が多かったため、課題2で組み立てたロボットを少し変更して、課題に取り組んだ。変更点は光センサーの位置と向きである。光センサーの位置はロボットの中心付近からロボットの先端へ、光センサーの向きは下向きから横向きへと変更した。これは、懐中電灯の光を、より探しやすくするためである。 ロボットの概観 #ref(./robo.jpg,120%,ロボットの様子); *プログラムの説明 [#m97b6c2e] **定義文 [#df553b90] #define turntime 360 #define turnright OnFwd(OUT_A);OnRev(OUT_C); //右回り #define turnleft(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t); //左回り #define shoot OnRev(OUT_B);Wait(15);Off(OUT_B);OnFwd(OUT_AC);Wait(100);Off(OUT_AC); //シュート **メインタスク [#h5c321f5] task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); int lightmax = 0; int maxtime = 0; ClearTimer(0); // 0番目のタイマをリセット 一回転して一番明るいところを探す turnright; while (FastTimer(0) <= turntime) { if (SENSOR_2 > lightmax){ // SENSOR_2の値が現在のlightmaxの値よりも大きいとき lightmax=SENSOR_2; // lightmaxの値をSENSOR_2の値に変更 maxtime=FastTimer(0); // SENSOR_2の値をlightmaxの値に変更した時間を記録 } } 逆回転して最後に記録した向きを向く if (maxtime <= turntime) { turnleft(turntime-maxtime); } シュートをうつ shoot; } 一回転する時間を正確に測ることができれば、単純に記録した時間だけ一回目の回転と同じ方向に回れば良い。しかし、実際にそれを行うことは難しく、また、電池の残量が変化すると、それの伴って、モーターのパワーが低下し、一回転する時間も変化してしまうという問題もあるため、2回目は一回目とは逆の方向に、一回目の回転の時間から記録した時間を差し引いた分の時間だけ回転させた。 一回転する時間を正確に測ることができれば、単純に記録した時間だけ一回目の回転と同じ方向に回れば良い。しかし、実際にそれを行うことは難しく、また、電池の残量が変化すると、それに伴って、モーターのパワーが低下し、一回転する時間が変化してしまうという問題もあるため、2回目は一回目とは逆の方向に、一回目の回転の時間から記録した時間を差し引いた分の時間だけ回転させた。 *まとめ [#l5dc6385] 最初、課題3の内容をを聞いたときには、このようなことが果たして本当にできるのだろうかと不安に思っていたが、光センサーとタイマーの両方をうまく組み合わせて使うことによって、無事に成功させることができた。また、課題2ではボールをシュートする際に、一度停止してから行ったのだが、その方法だとボールに伝わる力が弱いせいかシュートらしくないものになってしまっていた。しかし、今回、回転した状態から動きを止めずにシュートの動作に移ったところ、前回よりもスピードのあるシュートを打つことができた。