RC 조종기를 이용하다보면 비행기/헬기용의 경우 랜딩기어를 위한 서보를 제어하기 위한 서보포트가 추가적으로 있습니다. 보통 5채널 이상의경우 한채널은 이를 위해 할당되어 있지요.

이것을 이용해서 단순히 서보를 제어하는게 아니라 스위칭 작동을 시켜서 릴레이를 작동시키는 역할을 해볼까 합니다.

아.... 당연히 상용제품을 판매하는 곳이 있습니다. RC 스위치 라고 하고 해외에서 판매를 하고 있는데 국내에서는 보기가 힘들더군요. 가격은 2만원 상당이구요;; 하는 것에 비해서 너무 비싼듯;

그러던중 그냥 만들어 볼까 생각하다가 몇군데 보니 회로가 떠있더군요..

http://www.ef-uk.net/data/rc-switch.htm


4013과 IRF 를 이용한 회로 입니다... 이외에 555 타이머를 이용한 회로도 있더군요..

그런데 위 회로를 구성해 보니 작동을 하지 않더군요;; 왜 그런지는 저도 갸우뚱;;
수신기에서 나오는 신호가 다른가;; ㅡㅡ;

그래서 위 회로에서 IRF 스위칭 회로만 이용을 하고 시그널 변환은 AVR 로 이용하기로 하였습니다.

ATmega8 을 이용하면 추가 회로도 필요없으니 그게 더 나을 듯 하더군요.

원리는 간단합니다.

원래 서보에 들어가는 PWM 신호는 20ms 를 기본으로 하고 duty 비의 차이로 서보의 각도를 지정하게 되어있습니다. 대부분 0.7~2.2 ms 의 High 값을 이용해서 full-left 와 full-right 값을 지정하게 되어있죠.


서보에는 일반적인 standard 와 요즘 많이 사용되는 디지털 서보가 있는데요. 어차피 수신기에서 나온는 PWM 신호는 스탠다드와 디지털이 다르지 않습니다.

아래그림은 후타바사에 올라와있는 그림인데 서보 내부에서 신호를 어떻게 처리하느냐에 대한 도식도 입니다만... 서보 내부에 들어가기 전의 신호는 스탠다드 서보에서 내부처리하는 형식입니다.


그래서 AVR 을 이용해서 duty 비를 읽어 주고 1.5 ms 를 기준으로 하여 On/Off 제어를 하는 것으로 프로그램을 짜도록 하였습니다.

펄스 주기를 읽어야 하기 때문에 AVR 의 INT0 (PIND.0) 에서 상승엣지일때 인터럽트 루틴을 작동시킨 후에 단순히 100us 씩 20번 반복(총 2ms, 한 주기가 20ms 지만 초기 범위 값에 따라서 작동하고 다음 펄스의 인터럽트처리까지 계산과정이 이루어져야 하기 때문에 이 정도의 값으로 작동 시켰습니다.) 해서 PIND.0 가 high 값일때는 카운트 값을 증가 시키고 low 일때는 카운트를 하지 않습니다.

그러면 정확히는 떨어지지 않아도 서보의 중간 포인트 값인 1.5 ms 를 기준으로 약 15회가 카운팅 되기 때문에 이 값보다 같거나 커지면 스위치로 이용할 포트를 ON 하고 작을 경우 OFF 를 하게 하였습니다.

아래의 코드는 AVR-GCC 를 이용한 128 소스입니다. (mega8 이용시 클럭에 따른 딜레이 시간만 주의해서 적용해 주시면 됩니다.
 
#include <avr/io.h>
#include <util/delay.h>
#include <avr/signal.h>
typedef unsigned int byte;
byte TIMER_CNT;

SIGNAL(SIG_INTERRUPT0)               // 인터럽트 서브루틴
{
    byte i;
    TIMER_CNT=0;
    for(i=0; i<20; i++)
    {
        if(PIND == 0xff)
        {
            TIMER_CNT++;
        }
        _delay_us(100);
    }
    if(TIMER_CNT >= 15)   // 여기서 자기의 조종기에 알맞은 값을 선택해서 넣음
    {
        PORTC=0xff;
    }
    else
    {
        PORTC=0x00;
    }
    EIFR |= 0x01;
}

void main(void)
{
    DDRD=0x00;
    PORTD=0xff;             // INT0 초기화
    DDRC=0xff;               // 스위치 역할할 포트 설정

    EIMSK=0x01;            // INT0 설정
    EICRA=0x03;            // INT0 rising edge 설정

    SREG |= 0x80;          // Interrupt Enable set


    while(1);
}


단순히 위 프로그램을 가지고 쉽게 RC 스위치를 구성할 수 있습니다.

실제 구성된 회로도와 작동모습입니다.




ON 한 경우 LED 가 들어와 있는 것을 보실 수 있습니다.
OFF 한 경우에는 당연히 꺼지구요. <아래사진>





Posted by 스핏파이어
,