[[2015a/MemberOnly]] *今回の課題 [#e37991ac] 半径1メートル以内にある缶を音響センサーを用いて発見し、ボールを転がしながら缶から25センチまで接近する。そして、そこからシュートを打って缶にボールを命中させる、というものである。その際に、ロボットが缶から半径25センチ圏内にあった場合は、距離が30センチまで離れる様にしなければならない。 *ロボットについて [#d490114e] 今回のロボットは、課題2で用いたものに少し手を加えただけであるので、詳細は課題2で見てほしい。ここでは、課題3用に手を加えた点のみ説明する。 **アーム [#sfe5ee77] 以前はボールを転がしながら移動すると、ボールがマシンの中心に収まっていない限り正確なシュートが打てなかった。しかし、今回はアームの構造を変えて、ボールを囲むと同時に移動に支障をきたさない程度に固定できるようにした。 #ref(./IMG_3042.JPG,15%) **超音波センサー [#zcba2ce0] この課題に不可欠な超音波センサーは、超音波を用いることで物体との距離を測定する事ができる。また、アームの付け根部分に設置したのでアームと物体との距離の誤差が最少になるようにした。 #ref(./IMG_3043.JPG,15%) *プログラム [#z221dfd1] **定義 [#nc614397] #define SpinTime 8000 //回転する時間 #deine Spin OnFwd(OUT_C,30);OnRev(OUT_B,30);Off(OUT_BC);Wait(2000); //その場で回転 #define Sekkin OnFwd(OUT_BC,20);Wait(500);Off(OUT_BC);Wait(3000); //缶の方向に接近 #define Shoot OnRev(OUT_BC,50);Wait(200);Off(OUT_BC);OnRev(OUT_A,30);Wait(500);OnFwd(OUT_BC,100);Wait(200);Off(OUT_BC); //ボールをシュート **本体のプログラム [#b5bdf3f2] 缶の探し方は、一度その場で回転して缶を見つけ、その方向に少し移動する。ここで、同じ動作をもう一度繰り返しす事によって缶の位置を正確に測定できるした。そして、缶が25センチの位置に来たらシュートを打つようにした。 task main() { SetSensor(S3); // int d_min = 100; //仮の最小値 repeat(2){ // 下の論理式の繰り返し while(true){ long t = CurrentTick(); //時間の設定 while(CurrentTick()-t<= SpinTime){ Spin; //回転 if(SetSonsor(S3) < d_min){ //測定された距離が仮の最小値より小さい時 d_min=SetSensor(S3); //仮の最小値更新 } } Spin; //回転 until(SetSensor(S3) == d_min); //センサーが仮の最小値になるまで Sekkin; // } } Shoot; } *課題3に対する感想 [#g7159432] 今回は課題2のロボットにセンサーを付け、アームを改良しただけだったのでロボット製作に苦労する事は無かった。また、プログラムも比較的使えるようになって来たので大きく苦労する事はなかったが、缶の捜索において、2度同じプログラムを使用して精度を高めるという案を思いつくのが大変だった。