2008b/MemberOnly/進行状況A

2008b/A7/課題3右


光追跡ロボット

製作者:タキさ Y田

目次

課題についての説明

インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、
以下の動きをするようにプログラムを作成せよ。
(重複しないように一人一つ以上のプログラムを作成すること)

   1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで
     懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。
   2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを
     止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。

懐中電灯の代わりに携帯のライトなどを利用してもよい。モータ、光センサ、
タッチセンサはそれぞれ2個まで使用可。ただし、平面的な方向だけでなく
懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい。

製作したマシン

マシン製作はほとんどY田が担当。タキさは光センサ位置等の調整くらいしかやってない。

下にある画像が完成したマシンです。 このマシンの製作行程は以下の通り。


まずインストの「top secret」を参考にしてドライブベース部を作った。 このとき、モーターを回転させると、ストッパーがなければ両方のタイヤがそれぞれ逆方向に回転するが、このストッパーのおかげで後方に回転できないため、一方のタイヤだけが前進する。また、モーターを逆回転させれば、もう一方のタイヤだけが前進するようになっている。

ストッパー   ギアの組み合わせ   ドライブベース

stoper3.jpg| gia3.jpg| kiteibu3.jpg|

次に、ブロックを投げるアームを製作

少し長いアームになったが、これは「苦労・工夫した点」に記述する。

ブロックを投げるアーム

aim_light3.jpg| arm_left3.jpg|

ドライブベースとアーム、RCX、光センサを組む。 そして光センサの位置等を調節して、下図のようになり、マシン完成。

マシン全体図

zentai_yoko3.jpg| zentai_ue3.jpg|

モータ・センサに対応する端子

モータ、センサについては以下の端子に接続してあります。

プログラムの紹介

Y田製作プログラム(課題1)

   1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで
     懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。
task main(){
	int  s1, s3; //s1:センサ1の判定値、s3:センサ3の判定値
	s1 = 0;
	s3 = 0;
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT); 
	SetPower(OUT_A,5);
	OnRev(OUT_A); //左回転
	ClearTimer(0);
	while(FastTimer(0) <= 500){
		if(SENSOR_1 > s1)s1 = SENSOR_1; //センサ1のmax値を測定
		if(SENSOR_3 > s3)s3 = SENSOR_3; //センサ3のmax値を測定
	}
	s1 = s1 - 5; //センサ1の判定値を決定
	s3 = s3 - 5; //センサ3の判定値を決定
 	while(1){
		if((SENSOR_1 > 75) || (SENSOR_3 > 75)){  //75:おおよそ50cm離れてるときの値
			Off(OUT_A);
			OnRev(OUT_C); //ブロックを投げる
			Wait(17);
			Off(OUT_C);
			break;
		}
		if(SENSOR_1 < s1 && SENSOR_3 >= s3){ //センサ3のみが判定値を超えていたら
			while(SENSOR_1 < s1)OnFwd(OUT_A); //センサ1が判定値を超えるまで右回転
		}
		if(SENSOR_1 >= s1 && SENSOR_3 < s3){ //センサ1のみが判定値を超えていたら
			while(SENSOR_3 < s3)OnRev(OUT_A); //センサ3が判定値を超えるまで右回転
		}
	}
}	

タキさ製作プログラム(課題2)

   2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを
     止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。
/* 光追跡ロボット */

/* 定数を定義 */
#define SHI_J 75 //75:おおよそ50cm離れてるときの光センサ値

/* 前進関数 */
void move_fwd(void){  
	OnFwd(OUT_A);
	Wait(27);
	OnRev(OUT_A);
	Wait(20);
	Off(OUT_A);
}

/* メイン関数 */
task main(){
	int rigth_max, left_max;  //右センサ、左センサの懐中電灯判断値
	rigth_max = 0;
	left_max = 0;
	
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT); 
	
	SetPower(OUT_A,5);
	
	OnRev(OUT_A);
	ClearTimer(0);
	while(FastTimer(0) <= 500){
		if(SENSOR_1 > rigth_max)rigth_max = SENSOR_1; //右センサのmax値を測定
		if(SENSOR_3 > left_max)left_max = SENSOR_3; //左センサのmax値を測定
	}
	ligth_max = rigth_max - 5;   //右センサの判断値決定
	left_max = left_max - 5;   //左センサの判断値決定
	
	while(1){
		if((SENSOR_1 > SHI_J) || (SENSOR_3 > SHI_J)){ //懐中電灯まで50cmになったら
			Off(OUT_A); //停止
			OnRev(OUT_C); //ブロックを投げる
			Wait(17);
			Off(OUT_C);
			break; //ループを抜ける
		}
		
		if(SENSOR_1 >= rigth_max && SENSOR_3 >= left_max){ //両センサ値とも判断値以上なら
			while((SENSOR_1 >= rigth_max) || (SENSOR_3 >= left_max))move_fwd(); //その間前進
		}

		else if(SENSOR_1 < rigth_max && SENSOR_3 >= left_max){ //左センサ値だけ判断値以上なら
			while(SENSOR_1 < rigth_max)OnRev(OUT_A); //右センサ値が判断値以上になるまで左回転
		}

		else if(SENSOR_1 >= rigth_max && SENSOR_3 < left_max){ //右センサ値だけ判断値以上なら
			while(SENSOR_3 < left_max)OnFwd(OUT_A); //左センサ値が判断値以上になるまで右回転
		}

		else if(SENSOR_1 < rigth_max && SENSOR_3 < left_max){ //両センサ値とも判断値未満なら
			while((SENSOR_1 < rigth_max) || (SENSOR_3 < left_max))OnRev(OUT_A); //どちらかのセンサ値が判断値以上になるまで左回転
		}
	}
}	

苦労・工夫した点

苦労した点

工夫した点

皆さんのコメント

よろしければコメントをどうぞ



添付ファイル: filesensa.jpg 177件 [詳細] filezentai_yoko3.jpg 316件 [詳細] filezentai_ue3.jpg 330件 [詳細] filestoper3.jpg 303件 [詳細] filekiteibu3.jpg 347件 [詳細] filegia3.jpg 330件 [詳細] filearm_left3.jpg 304件 [詳細] fileaim_light3.jpg 340件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-02-14 (土) 15:40:55