학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

로보트 제어

학습목표

5개의 DC모터를 사용하는 로보트 제어를 공부한다.

학습주제

5V 동작하는 5개의 모터를 모터 드라이버 보드를 제작하여 연결하고 이를 PC에서 제어하는 과정을 공부한다.

[핵심내용]

Rs232에서 데이터가 수신될 인터럽트 함수 interrupt [USART0_RXC] void uart0_rx_isr(void) 수신 데이터를 저장한다. 시간이 걸리는 동작을 실행하면 데이터 수신을 놓칠 있다. 그러므로 데이터 수신 동안은 빠르게 데이타를 수신하고 완료 후에는 메시지를 발생 시키고 메시지 값이 TRUE main 함수에서 데이터 수신 인터럽트를 잠시 중단하고 해당 동작을 완료한 후에 인터럽트를 동작시켜 데이터를 수신 있게 한다.

예습내용

다음은  제작에 필요한 물품을 구매한 곳이다.

로보트 : MOVIT Robot Arm MR-999 구매처:http://www.elekit.co.kr/

모터드라이버 : BA6209(ROHM) 구매처: www.microrobot.co.kr

 

아래는 PC에서 모터 5(M0~M4) 까지를 제어 하는 프로그램이다. 동작 만들기는 스위치는 임의 동작을 하는 프로그램을 동작 시킨다.

모터를 2개이상 동시에 구동하면 BA6209 열이 많이 발생해 모터는 1개씩 동작 하도록 프로그램을 만든다.

[PC프로그램 내려받기]

 

실습방법

   

보드제작

모형자동차를 아래 회로도와 같이 구성한다.

그림이 작습니다. 그림파일을 복사하여 그림 소프트웨어에서 확대해서 보세요.

아니면 다음 워드문서를 다운 받으세요. [내려받기]

로보트팔에는 5개의 모터가 동작한다. 그러므로 모터드라이버(BA6209) 5 사용된다. 그림에서 첫번째 모터

PB4 포트를 통해 PWM 펄스로 제어로서 모터의 속도를 제어한다. 여기서 만드는 펄스는 74LS08 and 회로를 이용해 모터 드라이버의 Fin Rin 넣어서 회전 방향을 제어 한다.

다음은 위보다 않은 파워가 강한 “L296N” 모터 드라이버로 만든 회로도 이다.

 

AVR 프로그램

PC에서는 3개의 문자를 보낸다.

[통신데이터]

첫번째 문자는 아스키코드로 0x02 보내어 통신 시작을 알린다.

두번째 문자는 모터의 번호이다. 모터0=0x30, 모터1=0x31, 모터2=0x32, 모터3=0x33, 모터4=0x34 동작만들기=0x35

세번째 문자는 모터의 방향이다. 방향1=0x31, 방향2=0x32, 정지=기타문자

 

보기1 AVR 프로그램  [AVR프로그램 내려받기]

rs232에서 수신시작 문자 “0x02” 대이타가 들어오면 “rx_buffer0” 자동으로 데이터를 저장하고 수신종료 문자 “0x03” 수신되면 수신종료 메시지 receive 1 저장해 main 함수에서 해당 명령을 수행한다.

 

 

char rmCount,receive=0;

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 == 0x02) {   // 수신 시작

              rx_wr_index0 = 0;  

              rmCount = 0;

}

 

if(data == 0x03)  // 수신완료

              receive=1;  // 수신완료 메시지

 

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

              rmCount++;

}

 

 

 

보기1 AVR 프로그램

데이터 수신 완료 메시지가 발생하면 해당 명령을 수행한다.

 

 

while (1)

{

if(receive==1) {

         #asm("cli")          // 인터럽트 중지

         receive=0;

         PORTB.0=0;

     PORTB.1=0;

     

      if(rx_buffer0[1]==0x30) {                 // Motor0

                 if(rx_buffer0[2]==0x31)

                                              PORTC=0x01;

                 else if(rx_buffer0[2]==0x32)

                                PORTC=0x02;

                 else

                                PORTC=0x00;

      }

      else if(rx_buffer0[1]==0x31) {          // Motor1

                 if(rx_buffer0[2]==0x31)

                                              PORTC=0x08;

                 else if(rx_buffer0[2]==0x32)

                                PORTC=0x04;

                 else

                                PORTC=0x00;

      }

      else if(rx_buffer0[1]==0x32) {          // Motor2

                 if(rx_buffer0[2]==0x31)

                                              PORTC=0x10;

                 else if(rx_buffer0[2]==0x32)

                                PORTC=0x20;

                 else

                                PORTC=0x00;

      }

      else if(rx_buffer0[1]==0x33) {           // Motor3

                 if(rx_buffer0[2]==0x31)

                                              PORTC=0x40;

                 else if(rx_buffer0[2]==0x32)

                                PORTC=0x80;

                 else

                                PORTC=0x00;

      }      

      else if(rx_buffer0[1]==0x34) {           // Motor4

                 if(rx_buffer0[2]==0x31) {

                                              PORTB.0=0x01;

                                PORTB.1=0x00;

                 }

                 else if(rx_buffer0[2]==0x32) {

                                PORTB.0=0x00;

                                PORTB.1=0x01;

                 }

                 else {

                                PORTB.0=0x00;

                                PORTB.1=0x00;

                 }

      }

      else if(rx_buffer0[1]==0x35) {           // 동작 프로그램

                 PORTC=0x01;

                 delay_ms(500);

                 PORTC=0x02; 

                 delay_ms(500);

                 PORTC=0x00; 

                 delay_ms(500);

      }          

      #asm("sei");        //인터럽트 시작

        }

};

 

 

PC프로그램

통신데이터는 위의 규약에 따라 3개의 문자를 만든다. 아래 프로그램은 PC 프로그램 중에 스라이드 1 2 상태에 따라 문자를 보내는 프로그램이다.

 

보기2  PC프로그램  [PC프로그램 내려받기]

 

 

void CRs232Dlg::OnPointerValueChangedCwslide1(long Pointer, VARIANT FAR* Value)

{

              unsigned char buff[5]="";

 

        // 슬라이드 1

              buff[0]=0x02;

              buff[1]=0x30;

              if(m_nMotor0.Value == 0)     // 정지

                             buff[2]=0x30;

              else if(m_nMotor0.Value == 1)             // 열리기

                             buff[2]=0x31;

              else if(m_nMotor0.Value == 2)             // 닫히기

                             buff[2]=0x32;

              buff[3]=0x03;

 

              m_ComuPort.WriteComm((unsigned char*)buff,4);

             

}

 

void CRs232Dlg::OnPointerValueChangedCwslide2(long Pointer, VARIANT FAR* Value)

{

              unsigned char buff[5]="";

 

              // 슬라이드 2

              buff[0]=0x02;

              buff[1]=0x31;

              if(m_nMotor1.Value == 0)     // 정지

                             buff[2]=0x30;

              else if(m_nMotor1.Value == 1)             // 우회전

                             buff[2]=0x31;

              else if(m_nMotor1.Value == 2)             // 닫회전

                             buff[2]=0x32;

              buff[3]=0x03;

 

              m_ComuPort.WriteComm((unsigned char*)buff,4);

             

}

 

……..생략

 

void CRs232Dlg::OnValueChangedCwboolean1(BOOL Value)

{

              unsigned char buff[5]="";

              buff[0]=0x02;

              buff[1]=0x35;

              buff[2]=0x03;

              if(Value==1)

                             m_ComuPort.WriteComm((unsigned char*)buff,3);

}

 

처음

   

“Time delay” 사용하여 로보트 팔의 동작을 만들어 보시오.