#define Rotate_R 55		//四つの閾値
 #define Adjust_R 50
 #define Adjust_L 40
 #define Rotate_L 35
 #define t_border 190			//直角・交差点 判断用の時間
 #define POW_TURN 40
 #define POWER 30
 #define Gap 38			//機体旋回軸とセンサーの見ているところの距離
 
 #define Pause() Off(OUT_BC); PlaySound(SOUND_DOWN); Wait(2000)	//マクロ群
 #define Snd_up() PlaySound(SOUND_UP)				//サウンド関係
 
 float ANGLE_CALC=178/90;		//1度あたりの旋回時間
 float Calc_long=2.0463;		//角度計算用定数(360/Cir_fere)
 
 sub go_f(int l){			//指定距離前進
 	float Ang=l*Calc_long;
 	RotateMotor(OUT_BC,POWER,Ang);
 	Off(OUT_BC);
 }
 sub turn_R(float angle){		//指定角度左旋回
 	RotateMotorEx(OUT_BC,POW_TURN,-ANGLE_CALC*angle,100,true,true);
 }
 sub rotate_L(){
 	Off(OUT_BC);
 	OnFwd(OUT_B,POWER);
 	OnRev(OUT_C,POWER);
 	until( SENSOR_4>Rotate_L );	//ちょうどいい所まで旋回
 }
 sub rotate_R(){
 	Off(OUT_BC);
 	OnFwd(OUT_C,POWER);
 	OnRev(OUT_B,POWER);
 	until( (SENSOR_4>=Adjust_L) && (SENSOR_4<=Adjust_R) );	//ちょうどいい所まで旋回
 }
 sub adjust_L(){
 	Off(OUT_BC);
 		OnFwd(OUT_B,POWER);
 	until( (SENSOR_4>=Adjust_L) && (SENSOR_4<=Adjust_R) || (SENSOR_4<Rotate_R));	//ちょうどいい所まで右輪だけ前進
 }
 sub adjust_R(){
 	Off(OUT_BC);
 		OnFwd(OUT_C,POWER);
 	until( (SENSOR_4>=Adjust_L) && (SENSOR_4<=Adjust_R) || (SENSOR_4>Rotate_L));	//ちょうどいい所まで左輪だけ前進
 }
 sub Step_Over(){				//ラインをまたぐ
 	OnFwd(OUT_B,POW_TURN);
 	OnRev(OUT_C,POW_TURN);
 	until(SENSOR_4<Adjust_R);		//線が見えるまで旋回
 						//この時点では線の右側を見ているため
 	OnFwd(OUT_B,POW_TURN);
 	OnRev(OUT_C,POW_TURN);
 	until(SENSOR_4>Adjust_R);		//左側を見るように合わせる
 }
 sub Turn_Right_angle(){			//直角に曲がる
 	Off(OUT_BC);
 	go_f(Gap);				//直角と思われる地点に機体の旋回軸を合わせる
 	Step_Over();				//線の左側を見るように合わせる
 }
 sub cross(){					//交差点直進
 	Off(OUT_BC);
	turn_R(30);
 	go_f(Gap);				//少し前進
 	OnRev(OUT_B,POW_TURN);
 	OnFwd(OUT_C,POW_TURN);
 	until(SENSOR_4<Adjust_L);		//線上に行くまで右旋回
 }
 task main(){
 	SetSensorLight(S4);			//センサ定義
 	int N=1;
 	long t0=0,tmax=0,talt=0;	//各変数初期化
 	OnFwd(OUT_BC,POWER);		//前進開始
 	t0=CurrentTick();			//タイマーリセット
 	while(N<=13){
 		if(CurrentTick()-t0<t_border){
 			t0=CurrentTick();		//タイマーリセット
 			if(SENSOR_4<=Rotate_L)		//黒の時(右に行き過ぎ_左旋回)
 				rotate_L();
 			else if(SENSOR_4<=Adjust_L)	//少し黒めの時(ちょっと右寄り_左へ方向をいじる)
 				adjust_L();
 			else if((SENSOR_4>Adjust_L) && (SENSOR_4<=Adjust_R))	//ちょうどいい色の時(維持)
 				OnFwd(OUT_BC,POWER);
 			else if(SENSOR_4>=Rotate_R)	//少し白めの時(ちょっと左寄り_右へ方向をいじる)
 				rotate_R();
 			else if(SENSOR_4>Adjust_R)	//白の時(左に行き過ぎ_右旋回)
 				adjust_R();
 		}
 		else if((CurrentTick()-t0>=t_border) ){	//サイクルの時間で直角・交差点か判断
 			switch(N){				//N回目は直角,交差点などの判断をして関数に放り込む
 				case 1:		//F地点
 					Off(OUT_BC);
 					Snd_up();
 					//Turn_Right_angle();
 					N++;
 					break;
 				case 2:		//Q地点
 					Off(OUT_BC);
 					Pause();
 					//Turn_Right_angle();
 					N++;
 					break;
 				case 3:		//R地点
 					Off(OUT_BC);
 					Snd_up();
 					cross();
 					N++;
 					break;
 				case 4:		//S地点
 					Off(OUT_BC);
 					Snd_up();
 					//Turn_Right_angle();
 					N++;
 					break;
 				case 5:		//G地点
 					Off(OUT_BC);
 					Snd_up();
 					//Turn_Right_angle();
 					N++;
 					break;
 				case 6:		//H地点
 					Off(OUT_BC);
 					if(CurrentTick()-t0<t_border+220)
 						break;
 					Snd_up();
 					//Turn_Right_angle();
 					N++;
 					break;
 				case 7:		//T_1地点
 					Off(OUT_BC);
 					Pause();
 					cross();
 					N++;
 					break;
 				case 8:		//T_2地点
 					Off(OUT_BC);
 					Pause();
 					cross();
 					N++;
 					break;
 				case 9:		//R地点
 					Off(OUT_BC);
 					Pause();
 					//Turn_Right_angle();
 					N++;
 					break;
 				case 10:	//S地点
 					Off(OUT_BC);
 					Snd_up();
 					cross();
 					N++;
 					break;
 				case 11:	//P地点
 					Off(OUT_BC);
 					Snd_up();
 					//Turn_Right_angle();
 					N++;
 					break;
 				case 12:	//E地点
 					Off(OUT_BC);
 					Pause();
 					//Turn_Right_angle();
 					N++;
 					break;
 				case 13:	//A地点
 					Off(OUT_BC);
 					N++;
 					break;
 			}
 		t0=CurrentTick()			//タイマーリセット
 		}
 	}
 	turn_R(60);
 	go_f(Gap*5);
 	Off(OUT_BC);
 	PlaySound(SOUND_DOWN);
 }

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS