04_구동함수_Servo motor
프로젝트/스마트독서실 시스템

04_구동함수_Servo motor

728x90

이번에는 데모모델에서 문의 역할을 대체할 Servo motor입니다. 실제 문이나 다른 방식으로 구현해도 좋지만 저는 데모모델에서 구현하기 수월한 Servo motor을 선택하였습니다.

 

소형 DC모터와 감속기어장치, 회전각도 센서(potentionmeter), 제어를 위한 전자회로 등이 하나의 모듈로 되어있는 구조로, 유지토크의 크기 및 제어기 성능에 따라 가격이 달라집니다. 회전을 지속적으로 이용하는 것이 아닌, 일정 범위를 신속하게 움직이는것에 목적이 있기 때문에 대체로 90 ~ + 90 범위로 사용하도록 되어 있으며 사용할 서보모터도 마찬가지입니다. 서보모터 사양에 맞는 PWM신호를 보내 특정각도를 유지하는 방법을 사용하며, DC모터등과 달리 그 각도에 제한이 있으며 각도를 계속 유지합니다.

 

 

서보모터는 아래와 같은 핀 배열을 가지며, 들어오는 PWM 신호에 따라 각도값을 가지게 됩니다.

 

 

그림과 같이 들어오는 pwm신호의 %에 따라서 서보 모터의 각도가 조절됨을 알 수 있습니다.

 

참고로 pwm신호를 atmega로 만들기 위해서는 timercount를 사용하여 구현할 수 있습니다. 

결선예시

위 그림과 같이 서보모터를 codevision avr에 연결하고, 동작시키는 동작 구현 프로그램입니다.

 

#include <mega128.h>
#include <delay.h>

void Init_Timer1()  // 타이머 인터럽트 사용을 위함
{
    TCCR1A = 0x82;
    TCCR1B = 0x1a;
    OCR1A = 3000;
    ICR1 = 40000;
}
interrupt [TIM1_COMPA] void timer2_out_comp()
{
    #asm("nop");
}
void main(void)
{
    unsigned char sw;
    DDRB = 0xff;
    DDRD = 0x00;
    Init_Timer1();    
    SREG |=0x80;
   

 
while (1)
    {    
     sw = (PIND & 0xff);
     switch(sw)  //각도에따라 PWM신호를 출력하여 SurvoMotor를 제어
     {
         case 0xfe:
            delay_ms(500);
            OCR1A = 1290;
            break;
         case 0xfd:
            delay_ms(500);
            OCR1A = 1860;
            break;
         case 0xfb:
            delay_ms(500);
            OCR1A = 2430;
            break;
         case 0xf7:
            delay_ms(500);
            OCR1A = 3000;
            break;
         case 0xef:
            delay_ms(500);
            OCR1A = 3570;
            break;
         case 0xdf:
            delay_ms(500);
            OCR1A = 4140;
            break;
         case 0xbf:                                                     
            delay_ms(500);
            OCR1A = 4710;
            break;
         default:
         break;
     
     }
    }
}

 

이제 Keypad,FND,buzzer 사용법을 한번에 올리고 만든 구동함수들을 종합하여 프로젝트를 진행해 보겠습니다.

728x90