1. 제어주기

T/C2 사용 Overflow Interrupt Routine

 

2. 정규화

void Normalization(int array[], int max[], int min[]){ 
	double numerator = 0; // 분자
	double denominator = 0; // 분모
	
	for(int i = 0; i < 8; i++)
	{
		numerator = array[i] - min[i];
		denominator = max[i] - min[i];
		array[i] = (numerator / denominator) * 100; // ADC값 정규화
		if(array[i] <= 50) line[i] = 1; // 검은색이면 1 흰색이면 0으로 배열 line에 저장
		else line[i] = 0;
	}
}

 

3. 가중치

void Weighted_Data_Processing(){ // 가중치
	int j = 0;
	sigma_L = 0; // 좌측 ADC 가중치
	sigma_R = 0; //우측 ADC 가중치
	for(int i = 0; i < 4; i++) sigma_L -= (line[i] * (1<<(3 - i))); // -8, -4, -2, -1
	for(int i = 4; i < 8; i++) sigma_R += (line[i] * (1<<(i - 4))); // 1, 2, 4, 8
 	UART1_Transmit(' ');
	UART1_TransNum(sigma_R + sigma_L); // 총 가중치를 uart로 출력
}

 

4. 주행

while (1)
	{
		ADC_Receive(adc_array); // ADC값을 받아온다.
		
		if(button == 1) // 버튼을 한 번 누르면 ADC 최대 최소값 받음
		{
			PORTA = 0x55;
			for(int i = 0; i < 8; i++)
			{
				if(adc_array[i] > adc_max[i]) adc_max[i] = adc_array[i];
				if(adc_array[i] < adc_min[i]) adc_min[i] = adc_array[i];
			}
		}
		else if(button >= 2) // 버튼을 한 번 더 누르면
		{
			PORTA = ~(1 << flag);
			Normalization(adc_array, adc_max, adc_min); // 정규화
			line_s = 0;
			for(int i = 0; i < 8; i++)
			{
				UART1_Transmit(line[i] + 48); // 각 센서가 검은줄 위에 있는지 0/1로 uart로 출력
				line_s += line[i]; // 검은줄 위에 있는 수발광 센서의 수
			}
			if((sigma_L + sigma_R) != 0) uturn = MOTOR_Direction((sigma_R + sigma_L), line_s, uturn); // 가중치 가 0이 아닐 경우 모터 방향 변경
			//uturn = MOTOR_Direction((sigma_R + sigma_L), line_s, uturn); // 수정
			// 문제점 1. 가중치가 0일 경우를 제외하였기 때문에 직진을 바르게 하지 못했음.
		}
		UART1_Transmit(' '); // 띄어쓰기
		Weighted_Data_Processing(); // 가중치
		UART1_Transmit(13); // uart 줄넘김
	}

 

<Github>

https://github.com/Myoung-Jisoo/Line-Tracer

+ Recent posts