뉴티씨



  • HOME
  • 고객지원
  • 질문답변

 

 
교수님...라인트레이서 프로그램 인데여..
 글쓴이 : 박성진
작성일 : 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);

  }
}

컴플라자… 05-10-29 00:20
 
  모터가 힘이 없어서 못 움직이는 문제는,
가장 좋은 방법은 모터를 교체 하셔야 합니다.
모터를 기어드 DC 모터로 교체해 주세요.
속도는 느려 지겠지만, 힘이 좋아집니다.

컴플라자… 05-10-29 15:28
 
  기어드 모터는 청계천에서 대략 8,000원~10,000원 정도 합니다
박성진 05-10-31 13:00
 
  좌우 회전 할때는 힘이 되는데여
직진 신호를 받아 들이지 못합니다.
좌우 회전후 직진 신호를 받아 들이지 못 하는데여..
이거를 모터 교체로 해결 할 수 있나여!?
컴플라자… 05-10-31 14:51
 
  라인트레이서를 들어 올렸을 때 헛바퀴 도는 상태에서도
직진 신호를 인식하지 못하나요?  제 말은 즉,
바퀴 두개가 직진 신호시 동시에 같은 방향으로 도는 데,
그게 도는지를 물어보는 겁니다.
만약, 그게 도는 데, 땅에 내려 놓으면 직진이 안된다면
토크가 부족한 듯 하니, 모터를 교체하시고, 그렇지 않다면,
프로그램 오류인 듯 합니다.  여부를 말씀해 주시면, 프로그램을 보겠습니다.
 
   
 

 


1