목차
1 . 로봇(ROBOT)이란 무엇인가?
2 . 라인 트레이서의 구동 원리
2 . 라인 트레이서의 구동 원리
본문내용
OTOR P1_6 // 오른쪽 모터 펄스 출력 포트
#define L_MOTOR P1_7 // 왼쪽 모터 펄스 출력 포트
// 센서 입력과 라인 패턴에 대한 변수 설정
// P3.4(left) P3.5(center) P3.7(right)
#define S000 0x00 // 라인 없음
#define S010 0x02 // 직선 구간
#define S001 0x01 // 우측선 물림
#define S011 0x03 // 우측선 물림 또는 [ㅏ]우측 분기점
#define S100 0x04 // 좌측선 물림
#define S110 0x06 // 좌측선 물림 또는 [ㅓ]좌측 분기점
#define S111 0x07 // T형 분기점 또는 + 분기점
// =====================================================================
void forward(void)
{
unsigned int i;
R_MOTOR = 1;
for(i=0; I< R_M_H ; I++);
R_MOTOR = 0;
L_MOTOR = 1;
for(i=0 ; I< L_M_H ; I++);
L_MOTOR = 0;
}
//=======================================================================
void right_turn(void)
{
unsigned int I;
L_MOTOR = 1;
for(i=0 ; I< L_M_H ; I++);
L_MOTOR = 0 ;
}
//=======================================================================
void letf_turn(void)
{
unsigned int I;
R_MOTOR = 1;
for( i=0; I < R_M_H ; I++ );
R_MOTOR = 0;
}
//=======================================================================
void main(void)
{
unsigned char sensor;
unsigned int delay=0;
unsigned int i,j;
// =======================================================================
// 초기화
R_IR_LED = OFF; // 오른쪽 적외선 IR_LED 출력 포트(발광)
C_IR_LED = OFF; // 중앙 적외선 IR_LED 출력 포트(발광)
L_IR_LED = OFF; // 왼쪽 적외선 IR_LED 출력 포트(발광)
R_IRD = 1; // 오른쪽 적외선 센서 수광 확인 포트(수광)
C_IRD = 1; // 중앙 적외선 센서 수광 확인 포트(수광)
L_IRD = 1; // 왼쪽 적외선 센서 수광 확인 포트(수광)
R_MOTOR = OFF; // 오른쪽 모터 펄스 출력 포트
L_MOTOR = OFF; // 왼쪽 모터 펄스 출력 포트
//=====================================================================
// 초기 동작을 위한 LED 깜빡임
for(i=0; i<10;i++);
{
for(j=0;j<10000;J++);
R_LED = !R_LED;
L_LED = !L_LED;
}
/ ========================================================================
while(1)
{
// 라이센싱
R_IR_LED = ON;
C_IR_LED = ON;
L_IR_LED = ON;
for(i=0;i<100;i++); // 시간 지연
sensor = 0;
if( R_IRD == ON) sensor += 1;
if( C_IRD == ON) sensor += 2;
if( L_IRD == ON) sensor += 4;
R_IR_LED = OFF;
C_IR_LED = OFF;
L_IR_LED = OFF;
//========================================================================
// 주행처리부
switch(sensor)
{
case S000: left_turn(); // 선이없음(센서 감지 없음)
break; // 왼쪽 회전
case S001: right_turn(); // 오른쪽 센서 감지
break;
case S011: right_turn(); // 오른쪽 센서 감지
break;
case S100: right_turn(); // 왼쪽 센서 감지
break;
case S110: forward(); // 왼쪽 센서 감지
break;
case S010: forward(); // 중앙 센서 감지
break;
case S111: forward(); // 모든 센서 감지
break;
default: break;
}
// ========================================================================
// 더듬이 LED 처리부
delay ++;
if(delay == 100)
{
delay = 0;
switch(sensor)
{
case S000: // 센서 없음(감지 없음)
R_LED = 0;
L_LED = 0;
break;
case S001: // 오른쪽 검은선 감지
R_LED = 1;
L_LED = !L_LED;
break;
case S011: // 오른쪽 검은선 감지
R_LED = 1;
L_LED = 0;
break;
case S100: // 왼쪽 검은선 감지
R_LED = !R_LED;
L_LED = 1;
break;
case S110: // 왼쪽 검은선 감지
R_LED = 0;
L_LED = 1;
break;
case S010: // 정상 라인 감지
R_LED = !R_LED; // 모두 켜짐
L_LED = !L_LED;
break;
case S111: // 모두 검은 라인 감지
R_LED = 1; // 모두 꺼짐
L_LED = 1;
break;
default:
break;
}
}
}
}
#define L_MOTOR P1_7 // 왼쪽 모터 펄스 출력 포트
// 센서 입력과 라인 패턴에 대한 변수 설정
// P3.4(left) P3.5(center) P3.7(right)
#define S000 0x00 // 라인 없음
#define S010 0x02 // 직선 구간
#define S001 0x01 // 우측선 물림
#define S011 0x03 // 우측선 물림 또는 [ㅏ]우측 분기점
#define S100 0x04 // 좌측선 물림
#define S110 0x06 // 좌측선 물림 또는 [ㅓ]좌측 분기점
#define S111 0x07 // T형 분기점 또는 + 분기점
// =====================================================================
void forward(void)
{
unsigned int i;
R_MOTOR = 1;
for(i=0; I< R_M_H ; I++);
R_MOTOR = 0;
L_MOTOR = 1;
for(i=0 ; I< L_M_H ; I++);
L_MOTOR = 0;
}
//=======================================================================
void right_turn(void)
{
unsigned int I;
L_MOTOR = 1;
for(i=0 ; I< L_M_H ; I++);
L_MOTOR = 0 ;
}
//=======================================================================
void letf_turn(void)
{
unsigned int I;
R_MOTOR = 1;
for( i=0; I < R_M_H ; I++ );
R_MOTOR = 0;
}
//=======================================================================
void main(void)
{
unsigned char sensor;
unsigned int delay=0;
unsigned int i,j;
// =======================================================================
// 초기화
R_IR_LED = OFF; // 오른쪽 적외선 IR_LED 출력 포트(발광)
C_IR_LED = OFF; // 중앙 적외선 IR_LED 출력 포트(발광)
L_IR_LED = OFF; // 왼쪽 적외선 IR_LED 출력 포트(발광)
R_IRD = 1; // 오른쪽 적외선 센서 수광 확인 포트(수광)
C_IRD = 1; // 중앙 적외선 센서 수광 확인 포트(수광)
L_IRD = 1; // 왼쪽 적외선 센서 수광 확인 포트(수광)
R_MOTOR = OFF; // 오른쪽 모터 펄스 출력 포트
L_MOTOR = OFF; // 왼쪽 모터 펄스 출력 포트
//=====================================================================
// 초기 동작을 위한 LED 깜빡임
for(i=0; i<10;i++);
{
for(j=0;j<10000;J++);
R_LED = !R_LED;
L_LED = !L_LED;
}
/ ========================================================================
while(1)
{
// 라이센싱
R_IR_LED = ON;
C_IR_LED = ON;
L_IR_LED = ON;
for(i=0;i<100;i++); // 시간 지연
sensor = 0;
if( R_IRD == ON) sensor += 1;
if( C_IRD == ON) sensor += 2;
if( L_IRD == ON) sensor += 4;
R_IR_LED = OFF;
C_IR_LED = OFF;
L_IR_LED = OFF;
//========================================================================
// 주행처리부
switch(sensor)
{
case S000: left_turn(); // 선이없음(센서 감지 없음)
break; // 왼쪽 회전
case S001: right_turn(); // 오른쪽 센서 감지
break;
case S011: right_turn(); // 오른쪽 센서 감지
break;
case S100: right_turn(); // 왼쪽 센서 감지
break;
case S110: forward(); // 왼쪽 센서 감지
break;
case S010: forward(); // 중앙 센서 감지
break;
case S111: forward(); // 모든 센서 감지
break;
default: break;
}
// ========================================================================
// 더듬이 LED 처리부
delay ++;
if(delay == 100)
{
delay = 0;
switch(sensor)
{
case S000: // 센서 없음(감지 없음)
R_LED = 0;
L_LED = 0;
break;
case S001: // 오른쪽 검은선 감지
R_LED = 1;
L_LED = !L_LED;
break;
case S011: // 오른쪽 검은선 감지
R_LED = 1;
L_LED = 0;
break;
case S100: // 왼쪽 검은선 감지
R_LED = !R_LED;
L_LED = 1;
break;
case S110: // 왼쪽 검은선 감지
R_LED = 0;
L_LED = 1;
break;
case S010: // 정상 라인 감지
R_LED = !R_LED; // 모두 켜짐
L_LED = !L_LED;
break;
case S111: // 모두 검은 라인 감지
R_LED = 1; // 모두 꺼짐
L_LED = 1;
break;
default:
break;
}
}
}
}
소개글