2009b/A2/ロボコン


ピンポン玉を集めて入れるロボットのプログラム

ピンポン玉を集めて入れるロボットNo.1

#define Bright 45							//閾値
#define GOFWD(t) OnRev(OUT_A+OUT_C);Wait(t);				//前進
#define Stop  Off(OUT_A+OUT_C);						//停止
#define GOREV OnFwd(OUT_A+OUT_C);					//後退


task main (){
	SetSensor(SENSOR_1,SENSOR_ROTATION);				//センサー1を回転センサー
	SetSensor(SENSOR_2,SENSOR_LIGHT);				//センサー2を光センサー(前)
	SetSensor(SENSOR_3, SENSOR_LIGHT);				//センサー3を光センサー(後)
	
	//1番目
	Wait(3000);							//30秒待つ
	while(SENSOR_2>Bright){						//光センサー(前)が暗くなるまで前進
		GOFWD(10);
	}
	Wait(10);							//0.01秒前進
	while(SENSOR_2>Bright){						//光センサー(前)が暗くなるまで、左に曲がる
		OnRev(OUT_C);
		Off(OUT_A);
	}
	PlaySound(SOUND_DOUBLE_BEEP);
	ClearSensor(SENSOR_1);						//回転センサーをリセット
	while (abs(SENSOR_1)< 60) {					//回転センサーの絶対値が60未満の間
		if (SENSOR_2 <  Bright) {				//光センサー(前)が暗かったら
			OnRev(OUT_A);					//0.2秒、右に曲がる
			Off(OUT_C);
			Wait(20);
		}else{							//その他の場合、0.2秒、左に曲がる
			Off(OUT_A);
			OnRev(OUT_C);
			Wait(20);
		}
	}
	Stop;								//停止
	
	OnRev(OUT_B);							//アームを動かし始める
	ClearTimer(0);							//タイマー0をリセット
	while(FastTimer(0)<150){					//タイマー0が1.5秒未満の間、以下を繰り返す
		OnRev(OUT_A);						//大きく右に曲がる(0.6秒)
		Float(OUT_C);
		Wait(60);
		OnFwd(OUT_C);						//右回りに回転(0.2秒)
		Wait(20);
	}
	Stop;								//停止
	PlaySound(SOUND_DOUBLE_BEEP);
	ClearSensor(SENSOR_1);						//回転センサーをリセット
	while(abs(SENSOR_1)<40){					//回転センサーの絶対値が40未満の間
		GOFWD(10);						//前進
	}
	Stop;								//停止(1秒)
	Wait(100);
	
	//2番目
	PlaySound(SOUND_FAST_UP);
	ClearSensor(SENSOR_1);						//回転センサーをリセット
	while(abs(SENSOR_1)<40){					//回転センサーの絶対値が40未満の間
		GOREV;							//後退
	}
	Stop;								//停止
	Off(OUT_B);							//アームを止める
	
	while(SENSOR_2>Bright){						//光センサー(前)が暗くなるまで
		OnFwd(OUT_C);						//右に回転
		OnRev(OUT_A);
	}
	PlaySound(SOUND_FAST_UP);
	Stop;								//停止
	
	//ここから後ろ向きに走行
	ClearTimer(0);							//タイマー0をリセット
	while (FastTimer(0)<500) {					//タイマー0が5秒未満の間、以下を繰り返す
		if (SENSOR_3 <  Bright) {				//光センサー(後)が暗かったら
			OnFwd(OUT_C);					//後ろの方向で右へ曲がる
			Off(OUT_A);
		}else {							//その他の場合
			Off(OUT_C);					//後ろの方向で左へ曲がる
			OnFwd(OUT_A);
		}
	}
	Stop;								//停止
	
	ClearSensor(SENSOR_1);						//回転センサーをリセット
	while(abs(SENSOR_1)<=20){					//回転センサーの絶対値が20以下の間、以下を繰り返す
		OnFwd(OUT_C);						//大きく右に曲がる(0.2秒)
		Float(OUT_A);
		Wait(20);
		OnRev(OUT_A);						//右回りに回転(0.05秒)
		Wait(5);
	}
	ClearTimer(0);							//タイマー0をリセット
	while(FastTimer(0)<500){					//タイマー0が5秒未満の間
		OnFwd(OUT_A+OUT_C);					//後退
	}
	
	//3番目
	while(SENSOR_2>Bright){						//光センサー(前)が暗くなるまで
		OnRev(OUT_A+OUT_C);					//前進
	}
	
	//ここから前向きに走行
	ClearSensor(SENSOR_1);						//回転センサーをリセット
	while (abs(SENSOR_1)<=450) {					//回転センサーの絶対値が450以下の間
		if (SENSOR_2 <  Bright) {				//光センサー(前)が暗かったら
			OnRev(OUT_A);					//右に曲がる
			Off(OUT_C);
		}else {							//その他の場合、
			Off(OUT_A);					//左に曲がる
			OnRev(OUT_C);
		}
	}
	Stop;								//停止
}

このプログラムでロボットが動く経路
 実際の動きを大まかに示したものであり、実際はより細かく動く。経路は、1番目から順にその場面ごとプログラムの場所を始めのところに示してある。矢印の定義は次の通りである。

※なお、このプログラムはロボコンで実際に使ったものをそのまま表示している。そして、3番目のプログラムは時間がなく、実際にその通りに動くか確認はされていない。

y1.jpg:前進、ライントレース y2.jpg:後退 y3.jpg:右向きに回転 y4.jpg:左向きに回転

y5.jpg:

ClearTimer(0);					//タイマー0をリセット
while(FastTimer(0)<150){			//タイマー0が1.5秒未満の間、以下を繰り返す
	OnRev(OUT_A);				//大きく右に曲がる(0.6秒)
	Float(OUT_C);
	Wait(60);
	OnFwd(OUT_C);				//右回りに回転(0.2秒)
	Wait(20);
}
Stop;						//停止

y7.jpg:

while(SENSOR_2>Bright){				//光センサー(前)が暗くなるまで
	OnFwd(OUT_C);				//右に回転
	OnRev(OUT_A);
}

y6.jpg:

ClearSensor(SENSOR_1);				//回転センサーをリセット
while(abs(SENSOR_1)<=20){			//回転センサーの絶対値が20以下の間、以下を繰り返す
	OnFwd(OUT_C);				//大きく右に曲がる(0.2秒)
	Float(OUT_A);
	Wait(20);
	OnRev(OUT_A);				//右回りに回転(0.05秒)
	Wait(5);
}

y8.jpg:

while(SENSOR_2>Bright){				//光センサー(前)が暗くなるまで
	OnRev(OUT_A+OUT_C);			//前進
}

1番目

a1.jpg
2番目
a2.jpg
3番目
a3.jpg

ピンポン玉を集めて入れるロボットNo.2

#define FWD_AC OnFwd(OUT_A+OUT_C);					//モーターAとCを前進
#define FWD_A OnFwd(OUT_A);						//モーターAを前進
#define FWD_C OnFwd(OUT_C);						//モーターCを前進
#define REV_AC OnRev(OUT_A+OUT_C);					//モーターAとCを後退
#define REV_A OnRev(OUT_A);						//モーターAを後退
#define REV_C OnRev(OUT_C);						//モーターCを後退
#define OFF_AC Off(OUT_A+OUT_C);					//モーターAとCを停止
#define OFF_A Off(OUT_A);						//モーターAを停止
#define OFF_C Off(OUT_C);						//モーターCを停止
#define FLOAT_AC Float(OUT_A+OUT_C);					//モーターAとCをFloatで停止
#define FLOAT_A Float(OUT_A);						//モーターAをFloatで停止
#define FLOAT_C Float(OUT_C);						//モーターCをFloatで停止
#define THRESHOLD 45							//閾値
#define ARM_OPEN OnFwd(OUT_B);						//アームを開く
#define ARM_CLOSE OnRev(OUT_B);						//アームを閉じる
#define ARM_STOP Off(OUT_B);						//アームを止める


task main(){
	SetSensor(SENSOR_1,SENSOR_LIGHT);				//センサー1を光センサー(左)
	SetSensor(SENSOR_2,SENSOR_ROTATION);				//センサー2を回転センサー
	SetSensor(SENSOR_3,SENSOR_LIGHT);				//センサー3を光センサー(右)
	
	
	//1番目
	Wait(3000);							//30秒待つ
	ClearSensor(SENSOR_2);						//回転センサーをリセット
	while(abs(SENSOR_2)<=21){					//回転センサーの絶対値が21以下の間
		FWD_AC;							//前進
	}
	while(abs(SENSOR_2)<=45){					//回転センサーの絶対値が45以下の間
		line_trace();						//左右の光センサーを使ってライントレースをする
	}
	
	ClearSensor(SENSOR_2);						//回転センサーをリセット
	while(abs(SENSOR_2)<5){						//回転センサーの絶対値が5未満の間
		FWD_A;REV_C;						//右回りに回転
	}
	OFF_AC;								//停止(1秒)
	Wait(100);
	ClearSensor(SENSOR_2);						//回転センサーをリセット
	while(abs(SENSOR_2)<25){					//回転センサーの絶対値が25未満の間
		FWD_AC;							//前進
	}
	OFF_AC;								//停止(1秒)
	Wait(100);
	ARM_CLOSE;Wait(50);						//アームを0.5秒間閉じ始める
	ARM_STOP;							//アームを止める
	
	//2番目
	ClearSensor(SENSOR_2);						//回転センサーをリセット
	while(abs(SENSOR_2)<24){					//回転センサーの絶対値が24未満の間
		REV_AC;							//後退
	}
	OFF_AC;								//停止(1秒)
	Wait(100);
	
	while(SENSOR_1>THRESHOLD) {					//光センサー(左)が明るい間
		FWD_C;REV_A;						//左回りに回転
	}
	ClearSensor(SENSOR_2);						//回転センサーをリセット
	while(SENSOR_3>THRESHOLD){					//光センサー(右)が明るい間
		line_trace1();						//光センサー(左)だけのライントレース
	}
	
	ClearSensor(SENSOR_2);						//回転センサーをリセット
	while(abs(SENSOR_2)<=15){					//回転センサーの絶対値が15以下の間
		FWD_A;REV_C;						//右回りに回転
	}
	
	//3番目
	ClearSensor(SENSOR_2);						//回転センサーをリセット
	while(abs(SENSOR_2)<30){					//回転センサーの絶対値が30未満の間
		line_trace1();						//光センサー(左)だけのライントレース
	}
	
	ClearSensor(SENSOR_2);						//回転センサーをリセット
	while(abs(SENSOR_2)<5){						//回転センサーの絶対値が5未満の間
		FWD_C;REV_A;						//左回りに回転
	}
	OFF_AC;								//停止(0.01秒)
	Wait(10);
	FWD_AC;								//前進(3秒)
	Wait(300);
	OFF_AC;								//停止
	ARM_OPEN;Wait(30);						//アームを開く(0.03秒)
	ARM_STOP;							//アームを止める
	
	//4番目
	while((SENSOR_1>THRESHOLD) || (SENSOR_3>THRESHOLD)){		//光センサー(左)と光センサー(右)が共に暗くなるまで
		REV_AC;							//後退
	}
	
	ClearSensor(SENSOR_2);						//回転センサーをリセット
	while(abs(SENSOR_2)<=5){					//回転センサーの絶対値が5以下の間
		FWD_C;REV_A;						//左回りに回転
	}
	while(SENSOR_1>THRESHOLD){					//光センサー(左)が暗くなるまで
		line_trace3();						//光センサー(右)だけのライントレース
	}
	ClearSensor(SENSOR_2);						//回転センサーをリセット
	while(abs(SENSOR_2)<=5){					//回転センサーの絶対値が5以下の間
		FWD_C;REV_A;						//左回りに回転
	}
	ClearSensor(SENSOR_2);						//回転センサーをリセット
	while(abs(SENSOR_2)<200){					//回転センサーの絶対値が200未満の間
	line_trace3();							//光センサー(右)だけのライントレース	
	}
	OFF_AC;								//停止
}


sub line_trace(){							//左右の光センサーを用いたライントレース
	if(SENSOR_1<THRESHOLD){						//光センサー(左)が暗かったら
		FWD_C;REV_A;						//左回りに回転
	}else if(SENSOR_3<THRESHOLD){					//光センサー(右)が暗かったら
		FWD_A;REV_C;						//右回りに回転
	}else {								//その他の場合
		FWD_AC;							//前進
	}
}

sub line_trace1(){							//左の光センサーだけを用いたライントレース
	if(SENSOR_1<THRESHOLD){						//光センサー(左)が暗かったら
		FWD_A;OFF_C;						//右に曲がる
	}else{								//その他の場合
		FWD_C;OFF_A;						//左に曲がる
	}
}

sub line_trace3(){							//右の光センサーだけを用いたライントレース
	if(SENSOR_3<THRESHOLD){						//光センサー(右)が暗かったら
		FWD_C;OFF_A;						//左に曲がる
	}else{								//その他の場合
		FWD_A;OFF_C;						//右に曲がる
	}
}

このプログラムでロボットが動く経路
 実際の動きを大まかに示したものであり、実際はより細かく動く。経路は、1番目から順にその場面ごとプログラムの場所を始めのところに示してある。矢印の定義は次の通りである。

※なお、このプログラムはロボコンで実際に使ったものをそのまま表示している。そして、3番目以降は時間切れのために実際に動作が図のように動くかどうか確認はできていない。

y1.jpg:前進、ライントレース y2.jpg:後退 y3.jpg:右向きに回転 y4.jpg:左向きに回転

y5.jpg:

while(SENSOR_1>THRESHOLD) {			//光センサー(左)が明るい間
	FWD_C;REV_A;				//左回りに回転
}

1番目

b1.jpg
2番目
b2.jpg

3番目

b3.jpg
4番目
b4.jpg

添付ファイル: filea2.jpg 312件 [詳細] filey8.jpg 261件 [詳細] filey7.jpg 254件 [詳細] filey6.jpg 249件 [詳細] fileb4.jpg 317件 [詳細] fileb3.jpg 262件 [詳細] fileb2.jpg 270件 [詳細] fileb1.jpg 277件 [詳細] filea3.jpg 276件 [詳細] filea1.jpg 260件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-19 (金) 22:30:34