- 追加された行はこの色です。
- 削除された行はこの色です。
*課題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
}
}
プログラムの大まかな流れ
-最初に少し車体を回転させる。
↓
-車体を回転させながら超音波センサーを使い、目標を探す。
↓
-ちょうど一周し終わったら、今度は逆回転に回って、目標に車体を向ける。
↓
-目標との距離から、発射するのに最適な間合いを取る。
↓
-アームをおろしてボールを転がす。
メンバーと異なる点
-カウントを使っている点、一回転する間に目標をとらえたカウント数を記憶しておいて、次に回転するときの指標にする。
-誤差をなくすために最初に一回車体を回している。また物体の幅が大きいと誤差が生じるので、補正をかけている。
**感想・反省 [#oe59856c]
OnFwdでは毎回の動作に信頼性を欠くのでRotateMotorを使うべきだった。機体の方は割とシンプルにできて良かったと思う。缶にボールを当てる精度がまだ低いので改良の余地がある。