[[2015a/MemberOnly]] #contents *今回の課題 [#e37991ac] 半径1メートル以内にある缶を音響センサーを用いて発見し、ボールを転がしながら缶から25センチまで接近する。そして、そこからシュートを打って缶にボールを命中させる、というものである。その際に、ロボットが缶から半径25センチ圏内にあった場合は、距離が30センチまで離れる様にしなければならない。 *ロボットについて [#d490114e] 今回のロボットは、課題2で用いたものに少し手を加えただけであるので、詳細は課題2で見てほしい。 ここでは、課題3用に手を加えた点のみ説明する。 **アーム [#sfe5ee77] 以前はボールを転がしながら移動すると、ボールがマシンの中心に収まっていない限り正確なシュートが打てなかった。しかし、今回はアームの構造を変えて、ボールを囲むと同時に移動に支障をきたさない程度に固定できるようにした。 #ref(./IMG_3042.JPG,10%) **超音波センサー [#zcba2ce0] この課題に不可欠な超音波センサーは、超音波を用いることで物体との距離を測定する事ができる。また、アームの付け根部分に設置したのでアームと物体との距離の誤差が最少になるようにした。 #ref(./IMG_3043.JPG,10%) *プログラム [#z221dfd1] **定義 [#nc614397] #define SpinTime 8000 #define Stop Off(OUT_BC);Wait(500); #define Spin OnFwd(OUT_C,25);OnRev(OUT_B,25); //その場で回転 #define Sekkin OnFwd(OUT_BC,25);Wait(1000); //少し前に進む #define Shoot_position 25 #define Shoot OnRev(OUT_BC,50);Wait(200);Off(OUT_BC);OnFwd(OUT_A,30);Wait(500);OnFwd(OUT_BC,100);Wait(200);Off(OUT_BC); #define Back OnRev(OUT_BC,25);Wait(3800); #define D_line 40 **本体のプログラム [#b5bdf3f2] 缶の探し方は、一度その場で回転して缶を見つけ、その方向へ少し移動する。そして、もう一度同じ動作を繰り返してから缶まで半径25センチの位置まで近づき、シュートを打つ。2回同じ動作をさせている理由は、缶の位置を正確に計測しボールを当てやすくするためである。また、もし缶が予め半径25センチ以内にあった場合は、バックして半径30センチ以上離れてから通常の缶にボールを当てるプログラムが動くようになっている。 task main() { SetSensorLowspeed(S2); int d_min=100; //物体までの距離の仮の最小値 int COUNT=0; long t0=CurrentTick(); /*缶が予め半径25センチ圏内の時*/ while(CurrentTick()-t0 <= SpinTime){ Spin; if(SensorUS(S2) < Shoot_position){ Back; //バックして缶から半径30センチ圏外まで移動 COUNT++; } } /*缶が予め半径25センチ圏外の時*/ while(COUNT <= 1){ long t = CurrentTick(); while(CurrentTick()-t <= SpinTime){ Spin; if(SensorUS(S2) < d_min){ d_min=SensorUS(S2); } } if(COUNT == 0){ Spin; until(SensorUS(S2) == d_min); Sekkin; COUNT++; } else { Spin; until(SensorUS(S2) == d_min); Sekkin; until(SensorUS(S2) <= Shoot_position); Shoot; } } } *課題3に対する感想 [#g7159432] 今回は課題2のロボットにセンサーを付け、アームを改良しただけだったのでロボット製作に苦労する事は無かった。しかし、プログラムはロボットに送る際エラーが多発し、原因を究明するのはとても大変であった。