[[2013a/Member]]

*ロボットの紹介 [#t1e80d59]

#特徴はアームが大きいことです.コンピュータ部分がデフォルトのものより上に位置しています.

*コース攻略法 [#u89cc0ea]
 時計回りについてのみ書きます.
 始めの十字路は左側をトレースし,あえて交差点の識別をしていません.
 これは,時計回りのコースへの導入をするためです.
 次に缶の一歩手前で停止し,つかんでから右側のトレースへと入ります.
 交差点をいくつか通り,道なりに進みます.
 最後の交差点を通過後,一定時間がたってから180°回転して缶を置き,スタート地点に戻ります.
 このときもまた,交差点の識別を行っていません.

*プログラムの説明 [#sdeaed12]
 #define CENTER 45
 #define CCC 14000
 #define SPEED_H 52
 #define SPEED_L 32
 #define turn_R Off(OUT_B); OnFwd(OUT_C,SPEED_L);
 #define turn_L Off(OUT_C); OnFwd(OUT_B,SPEED_L);
 #define turn_SR OnRev(OUT_B,SPEED_L); OnFwd(OUT_C,SPEED_L);
 #define turn_SL OnRev(OUT_C,SPEED_L); OnFwd(OUT_B,SPEED_L);
 #define go_F OnFwd(OUT_BC,SPEED_H);
 #define STEP 1
 #define nMAX 330
 #define short_break Off(OUT_BC);Wait(400);
 #define CROSS_TIME 400
 #define cross_line OnFwd(OUT_B,SPEED_L);OnFwd(OUT_C,SPEED_L);Wait(CROSS_TIME);short_break;
 #define cross OnFwd(OUT_C,SPEED_L);OnFwd(OUT_B,SPEED_L);Wait(CROSS_TIME+200);short_break;
 #define go_b OnFwd(OUT_B,-50);OnFwd(OUT_C,-50);

以上が変数,マクロの定義.

 sub trace_R()
 {
	int n;
	while(true) {
		while(n < nMAX) {
			if(SENSOR_1 < CENTER-12) {
				turn_SR;
				n++;
			} else {
				if(SENSOR_1 < CENTER-6) {
					turn_R;
				} else if(SENSOR_1 < CENTER+6) {
					go_F;
				} else if(SENSOR_1 < CENTER+12) {
					turn_L;
				} else {
					turn_SL;
				}
				n=0;
			}
			Wait(STEP);
		}
		short_break;
		turn_SL;Wait(nMAX*STEP);
		cross;
		n=0;
		break;
	}
 }

ラインの右側をトレースするサブルーチン.交差点に差し掛かるとループが終わる.

 sub trace_L()
 {
	int n;
	while(true) {
		while(n < nMAX) {
			if(SENSOR_1 < CENTER-12) {
				turn_SL;
				n++;
			} else {
				if(SENSOR_1 < CENTER-6) {
					turn_L;
				} else if(SENSOR_1 < CENTER+6) {
					go_F;
				} else if(SENSOR_1 < CENTER+12) {
					turn_R;
				} else {
					turn_SR;
				}
				n=0;
			}
			Wait(STEP);
		}
		short_break;
		turn_SR;Wait(nMAX*STEP);
		cross;
		n=0;
		break;
	}
 }

ラインの左側をトレースするサブルーチン.交差点に差し掛かるとループが終わる.

 task main() 
 {
	SetSensorLight(S1);
	SetSensorTouch(S3);
	int n=0,count = 0;
	long t = 0;
	
	if(t >= 0){
		t = CurrentTick();
		while(true){
			if(SENSOR_1 < CENTER-9){
				if(SENSOR_1 < CENTER-19){
					turn_L;
				}else{
					turn_SL;
				}
			}else if(SENSOR_1 < CENTER+2){
				go_F;
			}else{
				if(SENSOR_1 < CENTER){
					turn_SR;
				}else{
					turn_R;
				}
			}
			Wait(STEP);
			if(CurrentTick() - t > 7000){
				break;
			}
		}
	}

交差点の識別を行わないトレース.
	
	short_break;
	OnFwd(OUT_A,-30);
	turn_SR;
	Wait(520);
	Off(OUT_BC);

休憩ののち,缶をつかんで回転.回転するのは左側から右側のトレースにスムーズに移行するため.
	
	trace_R();
		
	trace_L();
	
	trace_L();
	
	trace_L();
	
	t=CurrentTick();
	
	while(true) {
		while(CurrentTick()-t <= CCC) {
			if(SENSOR_1 < CENTER-12) {
				turn_SL;
			} else {
				if(SENSOR_1 < CENTER-6) {
					turn_L;
				} else if(SENSOR_1 < CENTER+6) {
					go_F;
				} else if(SENSOR_1 < CENTER+12) {
					turn_R;
				} else {
					turn_SR;
				}
			}
		}
		break;
	}
	
	turn_SR;
	Wait(2700);
	OnFwd(OUT_A,30);
	Wait(300);
	Off(OUT_A);
	go_b;
	Wait(600);
	turn_SR;
	Wait(1100);
	Off(OUT_BC);

	while(true) {
		while(n < nMAX) {
			if(SENSOR_1 < CENTER-12) {
				turn_SL;
			} else {
				if(SENSOR_1 < CENTER-6) {
					turn_L;
				} else if(SENSOR_1 < CENTER+6) {
					go_F;
				} else if(SENSOR_1 < CENTER+12) {
					turn_R;
				} else {
					turn_SR;
				}
				n=0;
			}
			Wait(STEP);
		}
	}
	
 }

*まとめ [#se9d32be]
難しかった

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