|
글쓴이 :
박성진
작성일 : 05-10-28 19:11
조회 : 8,759
|
성진이형꺼(라인_센서).DSN (78.0K) [131] DATE : 2005-10-28 19:11:03 |
LINEMAIN.DSN (114.5K) [89] DATE : 2005-10-28 19:11:03 |
DC 모터를 사용해서 작업했습니다..
그런데 직진시 모터가 힘이 없어서 지면에서 움직이지를 않습니다.
좌회전과 우회전은 조금 되는데여..
회로도와 프로그램을 같이 올릴테니 봐 주십시오..
프로그램은 케일C 로 작성했습니다.
<라인 트레이서 프로그램>
#include<At89x51.h>
sbit MORA = P2^2;
sbit MORB = P2^3;
sbit MOLA = P2^4;
sbit MOLB = P2^5;
sbit BUZZ = P3^0;
sbit R1_IN = P0^5;
sbit R_IN = P0^6;
sbit C_IN = P0^7;
sbit L_IN = P1^0;
sbit L1_IN = P1^1;
#define S000 0x00
#define S001 0x01
#define S010 0x02
#define S011 0x03
#define S100 0x04
#define S101 0x05
#define S110 0x06
#define S111 0x07
void delay1(int delay_time) /* 딜레이 시간 */
{
int loop0;
for(loop0 = 0 ; loop0 < delay_time ; loop0++ );
}
void main(void)
{
int i,j;
char sensor; /* 변수설정 */
char prev_data; /* 변수설정 */
MORA = MORB = 0;
MOLA = MOLB = 0;
R1_IN = R_IN = C_IN = L_IN = L1_IN = 0; /*LED를 전부 OFF */
for(i=0;i<3;i++)
{
BUZZ = 0;
delay1(20000);
BUZZ = 1;
delay1(20000);
}
prev_data = 0;
sensor = 0;
delay1(20000);
while(1)
{
sensor = 0;
R1_IN = R_IN = C_IN = L_IN = L1_IN = 0; /*LED를 전부 OFF */
MORA = MORB = 1;
MOLA = MOLB = 1;
delay1(10);
if( R_IN == 1 ) sensor += 1; /* 오른쪽 센서 입력 */
if( C_IN == 1 ) sensor += 2; /* 가운데 센서 입력 */
if( L_IN == 1 ) sensor += 4; /* 왼쪽 센서 입력 */
if(sensor == S000)sensor = prev_data;
if(sensor == S101)sensor = prev_data;
switch(sensor) /*않으면 먼저의 값을 기억 */
{
case S000: /* 입력이 없으면 정지 */
MORA = 1;
MORB = 1;
MOLA = 1;
MOLB = 1;
break;
case S001: /* 오른쪽이 라인이 있으면 우측회전 */
for(i=0;i<2;i++)
{
MORA = 1;
MORB = 0;
MOLA = 1;
MOLB = 0;
for(j=0;j<10;j++){
MORB = 1;}
for(j=0;j<10;j++){}
}
prev_data=sensor;
break;
case S010: /*가운데 라인이 있으면 직진 */
for(i=0;i<2;i++)
{
MORA = 1;
MORB = 0;
MOLA = 1;
MOLB = 0;
}
break;
case S011: /* 오른쪽과 가운데에 라인이 있으면 우회전 */
for(i=0;i<2;i++)
{
MORA = 1;
MORB = 0;
MOLA = 1;
MOLB = 0;
for(j=0;j<20;j++){
MORB = 1;}
for(j=0;j<10;j++){}
}
break;
case S100: /* 왼쪽에 라인이 있으면 좌회전 */
for(i=0;i<2;i++)
{
MORA = 1;
MORB = 0;
MOLA = 1;
MOLB = 0;
for(j=0;j<10;j++){
MOLB = 1;}
for(j=0;j<10;j++){}
}
prev_data=sensor;
break;
case S101: /* 오른쪽과 왼쪽에 라인이 있으면 우측회전 */
for(i=0;i<2;i++)
{
MORA = 1;
MORB = 0;
MOLA = 1;
MOLB = 0;
for(j=0;j<20;j++){
MORB = 1;}
for(j=0;j<10;j++){}
}
break;
case S110: /* 왼쪽과 가운데에 라인이 있으면 좌회전 */
for(i=0;i<2;i++)
{
MORA = 1;
MORB = 0;
MOLA = 1;
MOLB = 0;
for(j=0;j<20;j++){
MOLB = 1;}
for(j=0;j<10;j++){}
}
break;
case S111: /* 모두 라인이 있으면 정지 */
MORA = 1;
MORB = 1;
MOLA = 1;
MOLB = 1;
break;
}
delay1(20);
}
}
|