라인트레이서 관련 소스입니다.
여기서 제가 궁금한게
후진을 해놓았는데 선 이탈하거나 찾지 못할경우 후진을 하고싶습니다.
그냥 아래와같이 해놨더니 허공에 뛰어놓을경우만 후진을 하더라구요.
그리고 스위치가 4개 있는데 하나는 리셋버튼으로 적용이 되있지만
다른 3개를 적용하고싶습니다
1번 스위치는 off 2번 스위치는 on 3번 스위치는 속도증가...
위와같이 적용해서 작동할수 있게끔 소스좀 만들어주시면 감사하겠습니다.
지금 8시간동안 작업하다 힘들어서 올려봅니다.
부탁드립니다...
(버튼은 맨 아래 그림 첨부했습니다.)
그리고 혹시나 수정해야하거나 조금 더 나은부분이 있다면 설명과 함께 수정 부탁드리겠습니다.
진심으로 부탁합니다...(__)
//==================================================================
//
// 헤더 파일 및 전처리기 선언
//
//==================================================================
#include <mega128.h>
#include <stdio.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
//==================================================================
//
// 전역 변수 선언
//
//==================================================================
unsigned char Port_Input_Value ;
unsigned int Port_Data[3];
unsigned int timer_data_0;
//==================================================================
//
// 타이머/카운터1 인터럽트
//
//==================================================================
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0xb1;
TCNT1L=0xe0;
timer_data_0++;
}
//==================================================================
//
// 기능별 함수 정의 (5개)
// Read_adc();, Read_adc_save();, Motor_RPM_Control();, Line_Tracer();
//
//==================================================================
unsigned int Read_adc(unsigned char adc_input) // 아날로그 값을 읽고 10비트 저장공간에 저장
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void Read_adc_save(void)
{
for(Port_Input_Value=3;Port_Input_Value<6;Port_Input_Value++)
{
Port_Data[Port_Input_Value-3] = Read_adc(Port_Input_Value) ;
if(Port_Data[Port_Input_Value-3] > 950) Port_Data[Port_Input_Value-3] = 950;
}
}
void Motor_RPM_Control(unsigned char Motor_D, unsigned char Motor_L, unsigned char Motor_R)
{
PORTA = Motor_D;
OCR0 = Motor_L;
OCR2 = Motor_R;
}
void Line_Tracer(void)
{
unsigned int Line_Tracer_MIN_Value = 290; // 기준 값
unsigned char Line_Tracer_mode = 0; // 모드 설정값
//==================================================================
//
// 라인감지센서의 기준 값과 감지 된 값을 비교하여 그 방향에 따라 선언 되는 'Line_Tracer_mode' 값 정의
// Line_Tracer_mode에 맞추어 switch문을 구성한다.
// 문서상에서 줄 넘김이 발생 할 수 있다.
//==================================================================
if(Port_Data[0] > Line_Tracer_MIN_Value && Port_Data[1] > Line_Tracer_MIN_Value && Port_Data[2] < Line_Tracer_MIN_Value) Line_Tracer_mode=1; //001
else if(Port_Data[0] > Line_Tracer_MIN_Value && Port_Data[1] < Line_Tracer_MIN_Value && Port_Data[2] > Line_Tracer_MIN_Value) Line_Tracer_mode=2; //010
else if(Port_Data[0] > Line_Tracer_MIN_Value && Port_Data[1] < Line_Tracer_MIN_Value && Port_Data[2] < Line_Tracer_MIN_Value) Line_Tracer_mode=3; //011
else if(Port_Data[0] < Line_Tracer_MIN_Value && Port_Data[1] > Line_Tracer_MIN_Value && Port_Data[2] > Line_Tracer_MIN_Value) Line_Tracer_mode=4; //100
else if(Port_Data[0] < Line_Tracer_MIN_Value && Port_Data[1] > Line_Tracer_MIN_Value && Port_Data[2] < Line_Tracer_MIN_Value) Line_Tracer_mode=5; //101
else if(Port_Data[0] < Line_Tracer_MIN_Value && Port_Data[1] < Line_Tracer_MIN_Value && Port_Data[2] > Line_Tracer_MIN_Value) Line_Tracer_mode=6; //110
else if(Port_Data[0] < Line_Tracer_MIN_Value && Port_Data[1] < Line_Tracer_MIN_Value && Port_Data[2] < Line_Tracer_MIN_Value) Line_Tracer_mode=7; //111
else if(Port_Data[0] > Line_Tracer_MIN_Value && Port_Data[1] > Line_Tracer_MIN_Value && Port_Data[2] > Line_Tracer_MIN_Value) Line_Tracer_mode=8; //000
switch(Line_Tracer_mode)
{
case 1 :
Motor_RPM_Control(0x0A,240,50); //오른쪽으로 회전
break;
case 2 :
Motor_RPM_Control(0x06,240,240); //전진
break;
case 3 :
Motor_RPM_Control(0x06,240,100); //오른쪽으로 약하게 회전
break;
case 4 :
Motor_RPM_Control(0x05,50,240); //왼쪽으로 회전
break;
case 5 :
Motor_RPM_Control(0x06,240,240); //전진
break;
case 6 :
Motor_RPM_Control(0x06,100,240); //왼쪽으로 약하게 회전
break;
case 7 :
Motor_RPM_Control(0x09,60,60); //후진
break;
}
}
//==================================================================
//
// 메인 함수
//
//==================================================================
void main(void)
{
//==================================================================
// PORTB 초기화
//==================================================================
DDRB=0x90;
//==================================================================
// ADC 초기화
//==================================================================
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
//==================================================================
// 타이머/카운터0 초기화 (왼쪽 모터 속도 조절에 사용)
//==================================================================
ASSR=0x00;
TCCR0=0x6E;
TCNT0=0x00;
OCR0=0x00;
//==================================================================
// 타이머/카운터2 초기화 (오른쪽 모터 속도 조절에 사용)
//==================================================================
TCCR2=0x6C;
TCNT2=0x00;
OCR2=0x00;
//==================================================================
// 타이머/카운터1 초기화 (타이머/카운터 인터럽트에 사용)
//==================================================================
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0xb1;
TCNT1L=0xe0;
TIMSK=0x04;
//==================================================================
// 전역 인터럽트 인에이블
//==================================================================
#asm("sei")
while (1)
{
if(timer_data_0==7)
{
timer_data_0 =0;
}
Read_adc_save(); // ADC 변환 함수
Line_Tracer(); // 라인감지센서 함수
}
}