課題3

半径1m以内にある空き缶を探して、25cmの距離からボールを転がしてその空き缶に当てるロボットを製作。ただし25cm以内に空き缶がある場合には、30cmまで離れる。

機体説明

特徴
  • 前輪である二つの車輪を動かすことで車体を回転、前後に移動することが出来る。
  • 上方に取り付けたアームを上下に動かすことで坂を作り、ボールをレールの上で転がし、目標の物体に向かって発射させることが出来る。
img3141.JPG

プログラム

//車体が一回転するのにかかるカウント(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
	}		
}
プログラムの大まかな流れ
  • 最初に少し車体を回転させる。 ↓
  • 車体を回転させながら超音波センサーを使い、目標を探す。 ↓
  • ちょうど一周し終わったら、今度は逆回転に回って、目標に車体を向ける。 ↓
  • 目標との距離から、発射するのに最適な間合いを取る。 ↓
  • アームをおろしてボールを転がす。
メンバーと異なる点
  • カウントを使っている点、一回転する間に目標をとらえたカウント数を記憶しておいて、次に回転するときの指標にする。
  • 誤差をなくすために最初に一回車体を回している。また物体の幅が大きいと誤差が生じるので、補正をかけている。

感想・反省

OnFwdでは毎回の動作に信頼性を欠くのでRotateMotorを使うべきだった。機体の方は割とシンプルにできて良かったと思う。缶にボールを当てる精度がまだ低いので改良の余地がある。


添付ファイル: fileimg3141.JPG 116件 [詳細] fileIMG_3141[1].JPG 57件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-08-09 (日) 15:29:59