[[2015b/Member]]

目次
#contents
*課題内容 [#g9939cd0]

#ref(./2015b-mission3.png,60%,課題)

*ロボットAについて [#k3ee3c7c]
ロボットAは、ボールを掴んで缶に当てる動作を行います。このロボットには、モーターを3つと、光センサを2つ、角度センサを1つ使用しています。モーターのうち2つは車輪に使い、残りの1つは、ボールを掴む・弾く動作のために使っています。光センサは、ライントレース用と、缶の位置を探す用に分けて使っています。角度センサは、主に距離を測るために使っています。

#ref(./DSC_0248.JPG,60%,ロボット全体図)
↑ロボット全体像

**ボールを掴む・弾く動作 [#v79a51aa]

#ref(./DSC_0250.JPG,60%,動作説明)
*ロボットBについて [#afae0e3e]
#ref(./DSC_0249.JPG,60%,ロボット全体図)
**ボールを取る動作 [#rd0d793d]
#ref(./DSC_0251.JPG,60%,動作説明)
*プログラム [#we877882]
**ロボットA用 [#daa1aaa3]
 //black = 43 < 48 < white = 52
 //SENSOR_2 トレース
 //SENSOR_3 物体探索
 //TIMER(0) トレース
 //TIMER(1) 光探索


 /*共通機構*/
 #define power(s) SetPower(OUT_A+OUT_C,s);

 /*ライントレース用*/
 #define shiki 48

 #define tomaru(t) Off(OUT_AC);Wait(t);
 #define FWD OnFwd(OUT_AC);
 #define BACK OnRev(OUT_AC);
 #define LEFT_t OnRev(OUT_A); OnFwd(OUT_C);
 #define LEFT Off(OUT_A); OnFwd(OUT_C);
 #define RIGHT_t OnRev(OUT_C); OnFwd(OUT_A); 
 #define RIGHT Off(OUT_C); OnFwd(OUT_A);
 #define TMAX 20

 /*ロボコン独自機構*/
 #define open(t) OnFwd(OUT_B);Wait(t);//玉を扱う機構
 #define close(t) OnRev(OUT_B);Wait(t);Off(OUT_B);
 #define stop_B Off(OUT_B);
 #define SUN 50//ランタンの輝度を表す数値
 #define shoot power(2);open(15);Wait(10);close(15);

 /*赤球迄のトレース*/
 sub trace_0()
 {
	power(2);
	ClearSensor(SENSOR_1);
	while(1){
                if (SENSOR_2 < shiki -7){
			LEFT_t;
		} else if (SENSOR_2 < shiki -4){
			LEFT;
		} else if (SENSOR_2 < shiki){
			FWD;
		} else if(SENSOR_2 < shiki +4){
			RIGHT;
		} else {
			RIGHT_t;
		} 
		if(SENSOR_1 > 335){
			power(3);
			close(50);
			ClearSensor(SENSOR_1);
			break;
		}
	}
 }

 /*赤球を放つ手前*/
 sub trace_1()
 {
	ClearSensor(SENSOR_1);
	close(10);
	Off(OUT_B);
	power(2);
	while(1){
                if (SENSOR_2 < shiki -7){
			LEFT_t;
		} else if (SENSOR_2 < shiki -4){
			LEFT;
		} else if (SENSOR_2 < shiki){
			FWD;
		} else if(SENSOR_2 < shiki +4){
			RIGHT;
		} else {
			RIGHT_t;
		} 
                if(SENSOR_1 > 62){
		tomaru(10);
		break;
		}
	}
 }

 sub trace_2()
 {
	power(1);
	ClearSensor(SENSOR_1);
	while(1){
                if (SENSOR_2 < shiki -7){
			RIGHT_t;
		} else if (SENSOR_2 < shiki -4){
			RIGHT;
		} else if (SENSOR_2 < shiki){
			FWD;
		} else if(SENSOR_2 < shiki +4){
			LEFT;
		} else {
			LEFT_t;
		} 
		if(SENSOR_1 > 44){
			power(3);
			close(50);
			ClearSensor(SENSOR_1);
			break;
		}
	}
 }

 sub trace_3()
 {
	power(2);
	ClearSensor(SENSOR_1);
	while(1){
		close(1);
		Off(OUT_B);
		if (SENSOR_2 < shiki -7){
			RIGHT_t;
		} else if (SENSOR_2 < shiki -4){
			RIGHT;
		} else if (SENSOR_2 < shiki){
			FWD;
		} else if(SENSOR_2 < shiki +4){
			LEFT;
		} else {
			LEFT_t;
		} 
		if(SENSOR_1 > 110){
			power(3);
			close(50);
			ClearSensor(SENSOR_1);
			break;
		}
	}
 }

 /*光源を探す*/
 sub LIGHT()
 {	
	
	PlaySound(SOUND_UP);
	int sun_MAX = 0;
	int sensor_MAX = 0;
	close(20);
	ClearSensor(SENSOR_1);
	power(1);
	while(SENSOR_1 < 85){
		RIGHT_t;
		if(SENSOR_3 > sun_MAX){
			sun_MAX = SENSOR_3;
			sensor_MAX = SENSOR_1;
		}
	}
	tomaru(10);
	LEFT_t;
	until(SENSOR_1 < sensor_MAX);
	tomaru(10);
 }

 task main()
 {
	/*回転センサ*/
	SetSensor(SENSOR_1,SENSOR_ROTATION);
	/*トレース用センサ*/
	SetSensor(SENSOR_2,SENSOR_LIGHT);
	/*探索用センサ*/
	SetSensor(SENSOR_3,SENSOR_LIGHT);
        FWD;Wait(150);
	trace_0();//向かう
	tomaru(50);
        trace_1();//赤玉持ち
	LIGHT();
	shoot;
	tomaru(20);
	ClearSensor(SENSOR_1);
	RIGHT_t;
	until(SENSOR_1 > 28);
	tomaru(10);
	ClearSensor(SENSOR_1);
	FWD;
	until(SENSOR_1 > 26);
	Off(OUT_B);
	FWD;
	until(SENSOR_2 < 48);
	open(7);
	Off(OUT_B);
	trace_2();
	tomaru(10);
	FWD;Wait(100);
	trace_3();
	tomaru(10);
	LIGHT();
	shoot;
	trace_1();
 }
**ロボットB用 [#rdc01f14]
 /*
 37 black
 53 white
 */

 int startime=300;

 #define CHECKCROSSTIME 25

 #define fwd(OUT) Off(OUT);OnFwd(OUT)
 #define rev(OUT) Off(OUT);OnRev(OUT)

 #define TURNLEFT fwd(OUT_AC)
 #define LEFT Off(OUT_C);fwd(OUT_A)

 #define TURNRIGHT rev(OUT_AC)
 #define RIGHT Off(OUT_A);rev(OUT_C)

 #define STRAIGHT rev(OUT_C);fwd(OUT_A)
 #define BACK fwd(OUT_C);rev(OUT_A)

 #define ISNOTCROSS FastTimer(0) <= CHECKCROSSTIME || FastTimer(1) <= startime

 #define RELEASE rev(OUT_B);
 #define LOADING fwd(OUT_B);

 sub trace(){
	ClearTimer(0);
	while(ISNOTCROSS){
		if(FastTimer(1) < startime){
			ClearTimer(0);
		}
		if(52 <= SENSOR_1){
			TURNRIGHT;
		}else if(50 <= SENSOR_1){
			RIGHT;
		}else if(41 <= SENSOR_1){
			STRAIGHT;
		}else if(39 <= SENSOR_1){
			LEFT;
		}else {
			TURNLEFT;
		}
		if(39 <= SENSOR_1) ClearTimer(0);
	}
	Off(OUT_AC);
	ClearTimer(0);
	Wait(100);
 }

 /* 直進する */
 sub go_straight(){
	STRAIGHT;
	Wait(30);
	ClearTimer(1);
 }

 /* 左折する */
 sub turn_left(){
	ClearTimer(1);
	ClearTimer(0);
 }

 /* 右折する */
 sub turn_right(){
	ClearTimer(1);
	while(ISNOTCROSS){
		if(FastTimer(1) >= startime){
			ClearTimer(0);
			ClearTimer(1);
			break;
		}
		if(53 <= SENSOR_1){
			TURNLEFT;
		}else if(50 <= SENSOR_1){
			LEFT;
		}else if(47 <= SENSOR_1){
			STRAIGHT;
		}else if(44 <= SENSOR_1){
			RIGHT;
		}else {
			TURNRIGHT;
		}
	}
	TURNLEFT;
	Wait(10);
	Off(OUT_AC);
	ClearTimer(0);
	ClearTimer(1);
 } 

 task main(){
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	ClearTimer(0);
	LOADING;
	go_straight();
	trace();
	go_straight();
	Off(OUT_AC);
	Wait(2300);
	ClearTimer(1);
	startime=900;
	trace();
	startime=300;
	//turn_left();//
	//trace();
	go_straight();
	trace();
	go_straight();
	//turn_left();
	trace();
	go_straight();
	startime=1400;
	trace();
	startime=300;
         TURNRIGHT;
	Wait(10);
	Off(OUT_AC);
	RELEASE;
	Wait(300);
	BACK;
	Wait(100);
	TURNRIGHT;
	Wait(40);
         LOADING;
	ClearTimer(0);
	trace();
	turn_left();
	startime=900;
	trace();
	startime=300;
	//turn_left();//
	//trace();
	go_straight();
	trace();
	go_straight();
	trace();
	go_straight();
	startime=1400;
	trace();
	startime=300;
         TURNRIGHT;
	Wait(10);
	Off(OUT_AC);
	RELEASE;
	Wait(300);
	go_straight();
	Wait(10);
	Off(OUT_ABC);
 }

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS