*課題3 [#n87b8124] 半径1m以内にある空き缶を探して、25cmの距離からボールを転がしてその空き缶に当てるロボットを製作。ただし25cm以内に空き缶がある場合には、30cmまで離れる。 **機体説明 [#ee10824c] 特徴 -前輪である二つの車輪を動かすことで車体を回転、前後に移動することが出来る。 -上方に取り付けたアームを上下に動かすことで坂を作り、ボールをレールの上で転がし、目標の物体に向かって発射させることが出来る。 #ref(img3141.JPG) **プログラム [#gf905ffb] //車体が一回転するのにかかるカウント(Spn) = 28 //目標に向けての軌道補正 +- 2 //SPD=60で1m進むのにかかる時間=3600ms //1cmあたり36ms #define Level 100 //物体いる範囲のしきい値 #define SPD 60 //スピード #define Cls_Pos OnFwd(OUT_B,SPD);OnFwd(OUT_C,-SPD);Wait(1000);Off(OUT_BC);Wait(1000);PlayTone(1320,50); //後輪の調整 #define Turn_Right OnFwd(OUT_B,SPD);OnFwd(OUT_C,-SPD); //時計回りに回転 #define Turn_Left OnFwd(OUT_B,-SPD);OnFwd(OUT_C,SPD); //半時計回りに回転 #define Shot OnFwd(OUT_A,20);Wait(1000); //ボールを発射 #define Spn 28 //一回転するのにかかるカウント数 task main(){ ////// カンを見つける ////// SetSensorLowspeed(IN_1); Cls_Pos int C = 0; int E = 0; //車体を一回転させる間に物体を検出する while( Spn > C ) { C++; if ( SensorUS(IN_1) > Level) { Turn_Right TextOut(0,LCD_LINE1,"Searching Now..."); } else { E = C; Turn_Right PlayTone(880,50); } NumOut(80,LCD_LINE2,SensorUS(IN_1)); NumOut(80,LCD_LINE3,E); Wait(1); Float(OUT_BC); } Wait(1000); //一回転しても物体を見つけられない場合、電源を落とす if (E == 0){ TextOut(0,LCD_LINE7,"NOT FIND!!"); PlayTone(440,700); Wait(2000); TextOut(0,LCD_LINE8,"Turn off"); Wait(500); //物体を検出後、車体を物体に向ける } else { int A = 0; int R = Spn - E + 2; NumOut(80,LCD_LINE6,R); Wait(1000); PlayTone(1320,30); while( R > A ) { A++; Turn_Left TextOut(0,LCD_LINE4,"Find!"); Wait(55); Float(OUT_BC); NumOut(80,LCD_LINE7,A); } Wait(1500); PlayTone(1320,30); ////// カンにボールを当てる ////// int BackTime = 0; int FwdTime = 0; int F = SensorUS(IN_1) - 30; int B = 30 - SensorUS(IN_1); //物体との距離が25cm以内の時は30cmになるまで離れる if(B>0){ BackTime = 36*B; OnFwdSync(OUT_BC,-SPD,0); Wait(BackTime); Off(OUT_BC); //物体との距離が25cmよりも離れているとき } else { FwdTime = 36*F; OnFwdSync(OUT_BC,SPD,0); Wait(FwdTime); Off(OUT_BC); } Wait(1000); PlayTone(1320,30); Shot } } プログラムの大まかな流れ -最初に少し車体を回転させる。 ↓ -車体を回転させながら超音波センサーを使い、目標を探す。 ↓ -ちょうど一周し終わったら、今度は逆回転に回って、目標に車体を向ける。 ↓ -目標との距離から、発射するのに最適な間合いを取る。 ↓ -アームをおろしてボールを転がす。 メンバーと異なる点 -カウントを使っている点、一回転する間に目標をとらえたカウント数を記憶しておいて、次に回転するときの指標にする。 -誤差をなくすために最初に一回車体を回している。また物体の幅が大きいと誤差が生じるので、補正をかけている。