모터 > HS-311 RC 서보모터의 이해

TODAY191 TOTAL2,275,300
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 모터 | 서보모터 | HS-311 RC 서보모터의 이해

페이지 정보

작성자 키트 작성일2017-09-05 16:33 조회1,216회 댓글0건

본문

 HS src

 

HS-311
Standard Economy Servo (GEAR: Nylon)
TORQUE
4.8/6.0/7.4V
| src3.0Kg/3.5Kg/Null
SPEED
4.8/6.0/7.4V
| src0.19sec/0.15sec/Null
SIZE(LxWxH)| src40*20*36.5mm
WEIGHT| src43g

 

http://hitecrcd.co.kr/KR/Content.php?basecode=71&mod=view&goodsIdx=50&page=1&search=y&fld=name&kwd=311&PHPSESSID=604bea8b97d4fa4066546e5ecbf78e2a

 

 


 

3660040649_Qk8uIrSE_207154264BB2148623CBBB

 

 

3660040649_0TcdSY93_dsc01710_ekit.jpg3Ftype3Dw7403660040649_76Rp8jHs_dsc01709_ekit.jpg3Ftype3Dw7403660040649_oLi2VIRv_dsc01708_ekit.jpg3Ftype3Dw7403660040649_gPGuVz2e_dsc01707_ekit.jpg3Ftype3Dw740

 

 

#include
#include
void main(void){
   int i;
    DDRA=0xFF;
    while(1){
        for(i=0;i<25;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(20); } // 0도
        for(i=0;i<25;i++){ PORTA.0=1; delay_us(2400); PORTA.0=0; delay_ms(20); } // 90도

        for(i=0;i<25;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(20); } // 0도
        for(i=0;i<25;i++){ PORTA.0=1; delay_us( 600); PORTA.0=0; delay_ms(20); } // -90도
    }

간단한 소스이니 어렵지 않을겁니다.

 

high 펄스 10us에 1도씩 90도면 900us가 되고

기본 1500us를 더해줘야 합니다.

따라서 +90도는 1500us + 900us = 2400us

-90도는 1500us - 900us = 600us

 

90도를 이동 하는데 약 0.5초 걸립니다.

for(i=0;i<25;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(20); }

20ms * 25 = 500ms;

모터가 이동 하는 시간이니 이 시간은 충분히 이동 할 수 있도록 딜레이를 줍니다.

//--------------------------------------------------------------------------------

 

#include
#include
void main(void){
   int i;
    DDRA=0xFF;
    while(1){
        for(i=0;i<50;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(10); }
        for(i=0;i<50;i++){ PORTA.0=1; delay_us(2400); PORTA.0=0; delay_ms(10); }
        for(i=0;i<50;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(10); }
        for(i=0;i<50;i++){ PORTA.0=1; delay_us( 600); PORTA.0=0; delay_ms(10); }
    }
} 

low 구간이 10ms면 제대로 제어가 안됩니다.

15ms 에서는 동작 하는 것을 확인 했습니다.

 

#include
#include
void main(void){
   int i;
    DDRA=0xFF;
    while(1){
        for(i=0;i<33;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(15); }
        for(i=0;i<33;i++){ PORTA.0=1; delay_us(2400); PORTA.0=0; delay_ms(15); }
        for(i=0;i<33;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(15); }
        for(i=0;i<33;i++){ PORTA.0=1; delay_us( 600); PORTA.0=0; delay_ms(15); }
    }
} 

//--------------------------------------------------------------------------------

30ms 에서도 동작 합니다.

 

#include
#include
void main(void){
   int i;
    DDRA=0xFF;
    while(1){
        for(i=0;i<17;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(30); }
        for(i=0;i<17;i++){ PORTA.0=1; delay_us(2400); PORTA.0=0; delay_ms(30); }
        for(i=0;i<17;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(30); }
        for(i=0;i<17;i++){ PORTA.0=1; delay_us( 600); PORTA.0=0; delay_ms(30); }
    }
} 

//--------------------------------------------------------------------------------

100ms 에서도 동작 하지만

100ms면 짧은 시간이 아니라서  가다 서다 하면서 이동 하는 것이 보입니다.

 

#include
#include
void main(void){
   int i;
    DDRA=0xFF;
    while(1){
        for(i=0;i<5;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(100); }
        for(i=0;i<5;i++){ PORTA.0=1; delay_us(2400); PORTA.0=0; delay_ms(100); }
        for(i=0;i<5;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(100); }
        for(i=0;i<5;i++){ PORTA.0=1; delay_us( 600); PORTA.0=0; delay_ms(100); }
    }
} 

매끄럽게 제어 하기 위해서 이동 하는 동안 딜레이가 생기지 않도록 계속 신호를 줘야 합니다.

//--------------------------------------------------------------------------------

이동을 하고 난 후에 신호를 안주면

그 위치에서 정지 해 있습니다.

 

#include
#include
void main(void){
   int i;
    DDRA=0xFF;
    while(1){
        for(i=0;i<25;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(20); } // 0도
        delay_ms(5000); // 5초동안 정지 상태
        for(i=0;i<25;i++){ PORTA.0=1; delay_us(2400); PORTA.0=0; delay_ms(20); } // 90도

        delay_ms(5000); // 5초동안 정지 상태
        for(i=0;i<25;i++){ PORTA.0=1; delay_us(1500); PORTA.0=0; delay_ms(20); } // 0도
        delay_ms(5000); // 5초동안 정지 상태
        for(i=0;i<25;i++){ PORTA.0=1; delay_us( 600); PORTA.0=0; delay_ms(20); } // -90도 

        delay_ms(5000); // 5초동안 정지 상태
    }

} 

 

//----------------------------------------------------------------------------

 


#include
#include
//
void servo(int angle){
    int i, k;
    for(k=0;k<48;k++){ PORTA.0=1; delay_us(690); for(i=0;i<(angle+90);i++)delay_us(9); PORTA.0=0; delay_ms(20); }
}
//
void main(void){
    DDRA=0xFF;
    while(1){
        servo( 90); // 90도
        servo(-90); // 90도
    }
}

 

함수로 만들어서 동작 시켜봤습니다.

각도 * 10us에서

for(i=0;i<(angle+90);i++)delay_us(9);

delay_us(9);를 준 이유는 for()문의 루프 실행 시간을 빼주기 위한 것입니다.

 

servo() 함수 실행 시간은 약 1초인데

딜레이를 더 줄이고 싶다면

현재 각도에서 이동할 각도까지 몇도 정도 이동 해야 하는지를 함수의 인수에 넣어주고

for(k=0;k<48;k++){

인수 값으로 for() k비교값 48을 변경 시켜주면 됩니다.

귀찮아서..그렇게 쓸 사람은 있을지 모르겠지만..

 

//-------


#include
#include
//
void servo(int angle){
    int i;
    PORTA.0=1; delay_us(690);

    for(i=0;i<(angle+90);i++)delay_us(9);

    PORTA.0=0; delay_ms(20);

}
//
void main(void){
    int i,k;
    DDRA=0xFF;

    while(1){
        for(i=-90;i<90;i++){

            for(k=0;k<10;k++)servo(i); // 반복횟수=10, 숫자가 크면 느리게 움직입니다.
        }

        for(i=90;i>-90;i--){

            for(k=0;k<10;k++)servo(i); // 반복횟수=10, 숫자가 크면 느리게 움직입니다.
        }

    }


}

 

 //--------------


#include
#define F_CPU 16000000UL  // 16 MHz
#include

 

int main(void){
   int i;
    DDRA=1;
    while(1){
        for(i=0;i<50;i++){ PORTA=1; _delay_us(1500); PORTA=0; _delay_ms(20); }
        for(i=0;i<50;i++){ PORTA=1; _delay_us(2400); PORTA=0; _delay_ms(20); }
        for(i=0;i<50;i++){ PORTA=1; _delay_us(1500); PORTA=0; _delay_ms(20); }
        for(i=0;i<50;i++){ PORTA=1; _delay_us( 600); PORTA=0; _delay_ms(20); }
    }
}

댓글 0

조회수 1,216

등록된 댓글이 없습니다.

모터HOME > 모터 > 서보모터 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기