학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

리모콘으로 모형자동차 제어하기

학습목표

적외선리모콘을 사용하여 모형 자동차를 제어한다.

학습주제

리모콘의 =정지 =전진 =우회전 =좌회전 =후진 으로 동작하는 모형자동차를 만든다.

예습내용

리모콘 모듈은 www.comfile.co.kr IR Remocon 사용하여 구성한다.

1.       리모콘의 출력은 8개의 디지털 포트로 나오며 이를 RCM128 D채널을 입력으로 하여 연결한다.

2.       리모콘의 TX 포트는 RCM128 RX 연결하여 리모콘의 입력을 인터럽트로 처리한다.

위의 2가지 방법으로 처리할 있다. 여기서는 1 항목으로 제어를 한다.

실습방법

   

1. 8비트 채널로 모형자동차 제어

다음은 모터와 리모콘을 연결한 회로도이다.

 

리모콘을 누름에 따라 D채널에 입력되는 값은 IR Remocon DataSheet 참조하고 이에 따라 C채널의 모터 출력을 제어한다.

보기1  모형자동차의 방향제어

#include <mega128.h>  

 

void main(void)

{

// Port C initialization

// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out

// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0

PORTC=0x00;

DDRC=0xFF;    

 

// Port D initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTD=0x00;

DDRD=0x00;

 

while (1)

      {

      // Place your code here

      if(PORTD==0x00)                     // 전진 

          PORTC=0x05;

      else if(PORTD==0x01)             // 후진

        PORTC=0x0a;

      else if(PORTD==0x02)              // 우회전

        PORTC=0x06;

      else if(PORTD==0x03)              // 좌회전

        PORTC=0x09;

      else if(PORTD==0x44)              // 정지

        PORTC=0x00;

}

 

다음은 모형자동차의 방향과 속도를 동시에 제어 한다. 

자동차의 속도는 PWM으로 펄스의 듀티비로 제어한다. 리모콘의 [미세조정+] 따라 PWM 듀티비를 증가시켜서 속도를 증가하고 [미세조정-] 따라 듀티를 감소 시킴으로 속도를 줄인다. 속도는 EEPROM “vel” 값을 저장함으로 전원을 Off시켰다. 동작 시켜도 속도를 유지한다.

리모콘의 버튼을 누르면 “PSH” 1(5V) 된다. 이를 AVR PA0 포트에 연결하고 포트가 1 리모콘의 값을 D채널에서 읽어서 명령을 수행하면 된다.

보기2  모형자동차의 방향과 속도 제어

#include <mega128.h> 

       

eeprom char vel;

 

void main(void)

{         

// A,D채널=입력

PORTA=0x00;

DDRA=0x00;

PORTD=0x00;

DDRD=0x00;

 

// B,C채널=입력

PORTB=0x00;

DDRB=0xFF;

PORTC=0x00;

DDRC=0xFF; 

 

// Global enable interrupts

#asm("sei")

 

// (1) Fast PWM Mode   ATmega128(L) Data Book P100  주기조절

// 16M(ClkTOS)/1024=15625 Hz

TCCR0 = 0x6f;

// ATmega128(L) Data Book P102   듀티비조절  초기듀티=50    

OCR0 = vel; 

 

while (1)

      {

       if(PINA.0==1) {

          switch(PIND) {

                       case 0x00 :                          // 전진

                                      PORTC=0x05;

                                      break;

                       case 0x01 :                          // 후진

                                      PORTC=0x0a;

                                      break;

                       case 0x02 :                          // 우회전

                                      PORTC=0x06;

                                      break;

                       case 0x03 :                          // 좌회전

                                      PORTC=0x09;

                                      break;

                       case 0x44 :                          // 정지

                                      PORTC=0x00;

                                      break;

                       case 0x04 :                          // 속도증가

                                      if(vel!=0xff)

                                                vel++;

                                                OCR0 = vel; 

                                                     break;                          

                        case 0x05 :                    // 속도감소

                                      if(vel!=0x00)

                                                vel--;

                                                OCR0 = vel; 

                                                     break;

          }

            }

      }

}

 

2. RS232 모형자동차 제어

그림은 리모콘의 TX AVR RX 연결하여 통신으로 모형자동차를 제어한다.

리모콘에서 키가 눌러지면 [R] [M] [키스캔 코드] 3글자가 전송된다. 그러므로 “RM” 전송되면 다음 글자를 읽어서 명령을 수행 하면된다.

문자가 전송되면 한글자가 변수 “data” 저장되고 이를 rx_buffer0 8개까지 rx_wr_index0 0부터7까지 증가 시키면서 저장하게 된다. 여기 프로그램에서는 3개의 데이터를 저장하고 명령을 수행한다.

보기3  통시 단자로 모형자동차의 방향제어

interrupt [USART0_RXC] void uart0_rx_isr(void)

{

 

char status,data;

#asm

    push r26

    push r27

    push r30

    push r31

    in   r26,sreg

    push r26

#endasm

status=UCSR0A;

data=UDR0;

 

if(data == 0x52) {//문자 R

              rx_wr_index0 = 0;  

              rmCount = 0;

} 

 

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)

   {

   rx_buffer0[rx_wr_index0]=data;

   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;

   if (++rx_counter0 == RX_BUFFER_SIZE0)

      {

      rx_counter0=0;

      rx_buffer_overflow0=1;

      };

   };

#asm

    pop  r26

    out  sreg,r26

    pop  r31

    pop  r30

    pop  r27

    pop  r26

#endasm   

if(rx_buffer0[0]==0x52 && rx_buffer0[1]==0x4d && rmCount==2) { 

              //lcd_gotoxy(0,0);

              //lcd_putchar(rx_buffer0[2]);

              //sprintf(sbuf,"%c %c %02X",rx_buffer0[0],rx_buffer0[1],rx_buffer0[2]);

              //lcd_puts(sbuf);

                             switch(rx_buffer0[2]) {

                       case 0x00 :                          // 전진

                                      PORTC=0x05;

                                      break;

                       case 0x01 :                          // 후진

                                      PORTC=0x0a;

                                      break;

                       case 0x02 :                          // 우회전

                                      PORTC=0x06;

                                      break;

                       case 0x03 :                          // 좌회전

                                      PORTC=0x09;

                                      break;

                       case 0x44 :                          // 정지

                                      PORTC=0x00;

                                      break;

                       case 0x04 :                          // 속도증가

                                      if(vel!=0xff)

                                                vel++;

                                                OCR0 = vel; 

                                                     break;

                                      case 0x05 :                          // 속도감소

                                      if(vel!=0x00)

                                                vel--;

                                                OCR0 = vel; 

                                                     break;

            }

}

rmCount++;

}

프로그램은 정식버전에서 통신 UART0에서 RX, TX 인터럽트를 선택하면 생성되는 프로그램에 빨간색 부분을 추가한 것이다. 이를 그대로 복사하여 평가판에서 컴파일, 링크 하면 된다.

[프로그램 보기]

처음