目次

課題

懐中電灯に向かってブロックを投げるロボット

黄色いホイールを2個以上連射するロボットを作成し、以下の動きをするようにプログラムを作成せよ。ただし1は懐中電灯を2個使用し、ロボットの動作中は懐中電灯を動かさないがいろいろな距離や方向にある懐中電灯に対応できるロボットにすること。2は懐中電灯を1個使用し懐中電灯をゆっくり動かす。

  1. 全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。
  2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。

メンバー

新谷・みのう

ロボットの製作

製作したロボット

ロボット画像1
ロボット画像2

工夫した点

今後改善すべき点

プログラムの作成(新谷)

課題

作成したプログラム

int tmax_1;
int tmax_2;//明るいところを見つけた時間を代入する変数
int lmax_1;
#define TURN_TIME 400//一周する時間
#define SHOT_TIME 1480//撃つために必要な時間

task main(){
tmax_1=0;
lmax_1=0;
tmax_2=0;//変数に0代入
SetSensor(SENSOR_2,SENSOR_LIGHT);//SENSOR_2はSENSOR_LIGHT  

OnRev(OUT_C);//回り始める
OnFwd(OUT_A);
ClearTimer(0);//タイマー動かす
while(FastTimer(0)<TURN_TIME){//TURN_TIMEの時間回り続ける
if (SENSOR_2>lmax_1){ 

lmax_1=SENSOR_2;//lmax_1にSENSOR_2の値を代入
tmax_1=FastTimer(0);//tmax_1にFastTimer(0)の値を代入
Wait(10);
}else if (lmax_1-15>SENSOR_2 & tmax_2==0){//lmax_1よりSENSOR_2の値が大幅に小さくなるとき
tmax_2=tmax_1;//tmax_2にtmax_1の値を代入
lmax_1=0;//lmax_1を0にする
}
}

PlaySound(SOUND_DOWN) ;//音を鳴らす
Off(OUT_A+OUT_C);//回り終わる
Wait(50);
OnRev(OUT_A);//回り始める
OnFwd(OUT_C);
Wait(400-tmax_1);//二回目に見つけた明るい光源の方向を向く
Off(OUT_A+OUT_C);//止まる
start shot;//shotのタスクを動かし始める
Wait(500);//撃つまで待つ
//撃つ
PlaySound(SOUND_UP) ;  //音を鳴らす
OnRev(OUT_A);//回り始める
OnFwd(OUT_C);
Wait(tmax_1-tmax_2);//初めに見つけた明るい光源の方向を向く
Off(OUT_A+OUT_C);//撃つまで待つ
//撃つ
Wait(50);
PlaySound(SOUND_FAST_UP) ;//音を鳴らす
Wait(30);//待つ
PlaySound(SOUND_LOW_BEEP) ; //音を鳴らす
}

task shot(){
OnRev(OUT_B);//撃つ動作を始める
Wait(SHOT_TIME);
Off(OUT_B);
Wait(20);
OnRev(OUT_B);
Wait(SHOT_TIME);
Off(OUT_B);//撃つ動作終了
}

工夫した点

今後改善すべき点

プログラムの作成(みのう)

課題

作成したプログラム

// 定数定義
#define TURN_ONCE 430 // 1回転する時間
#define SHOT_TIME 1480 // ホイールを発射し、次発射する準備までの時間
#define THRESHOLD 45 // この値だけ暗くなったら回転方向を変える

// 変数宣言
int max_bright; // 最大の明るさ
int mb_count; // 最大の明るさの時間
int turn_direction; // 回転方向
int shot_count; // ホイールを投げた回数

task main() {
	SetSensor(SENSOR_1, SENSOR_TOUCH);
	SetSensor(SENSOR_2, SENSOR_LIGHT);
	SetSensor(SENSOR_3, SENSOR_TOUCH);

	// 懐中電灯の方向を探す
	max_bright = 0;
	mb_count = 0;
	ClearTimer(0);
	while(FastTimer(0)<TURN_ONCE) {
		OnFwd(OUT_A);
		OnRev(OUT_C);
		if(max_bright < SENSOR_2) {
			max_bright = SENSOR_2;
			mb_count = FastTimer(0);
		}
	}
	Off(OUT_A+OUT_C);

	// 懐中電灯の方向を向く
	ClearTimer(0);
	while(FastTimer(0)<TURN_ONCE-mb_count) {
		OnRev(OUT_A);
		OnFwd(OUT_C);
	}
	Off(OUT_A+OUT_C);

	// 懐中電灯の方向を追いかける
	SetSensorMode(SENSOR_2, SENSOR_MODE_RAW);
	turn_direction = 0; // 始めは右回転
	max_bright = 0;
	shot_count = 0; // ホイール発射回数リセット
	ClearTimer(0);
	while(shot_count <= 1) {
		if(turn_direction == 0) { // turn_directionが0のとき、右回転
			OnFwd(OUT_A);
			Float(OUT_C);
			if(max_bright < SENSOR_2) { // 明るくなったら最大値変更
				max_bright = SENSOR_2;
			} else if(max_bright-THRESHOLD > SENSOR_2) { // 暗くなったら回転方向逆転
				max_bright = SENSOR_2;
				turn_direction = 1; // turn_directionを1にする
				ClearTimer(0);
			}
		} else if(turn_direction == 1) { // turn_directionが1のとき、左回転
			Float(OUT_A);
			OnFwd(OUT_C);
			if(max_bright < SENSOR_2) { // 明るくなったら最大値変更
				max_bright = SENSOR_2;
			} else if(max_bright-THRESHOLD > SENSOR_2) { // 暗くなったら回転方向逆転
				max_bright = SENSOR_2;
				turn_direction = 0; // turn_directionを0にする
				ClearTimer(0);
			}
		}
		if(FastTimer(0) > 500) { // 5秒以上一定以上の明るさの場合は停止し発射
			Off(OUT_A+OUT_C); // 停止
			start shot; // ホイール発射
			shot_count++; // ホイール発射回数増加
			Wait(500);
			ClearTimer(0);
			Wait(10);
		}
	}
}

task shot() { // 発射のタスク
	OnRev(OUT_B);
	Wait(SHOT_TIME);
	Off(OUT_B);
}

工夫した点

今後改善すべき点

反省・感想

コメントをどうぞ



添付ファイル: file100716robo3.jpg 301件 [詳細] file100716robo2.jpg 320件 [詳細] file100716robo1.jpg 269件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-07-31 (土) 09:27:01