아두이노 기초 강좌 10 – 서보모터 컨트롤

아두이노 기초 강좌는 아두이노를 처음 접하시는 전자분야 비 전공자를 위한 강좌입니다. 이해를 위해서는 간단한 프로그래밍 지식이 필요할 수 있습니다. 프로그래밍이 처음이라면 [아두이노 프로그래밍 기초] 강좌를 먼저 읽으시길 권해 드립니다.

=============================================================

 

이제까지의 강좌에서는 움직임이 없이 정적인 형태의 구현을 주로 다루었습니다. 이번에는 모터를 사용해서 뭔가 움직이는 것을 만들 수 있도록 해보겠습니다.

일반적으로 많이 사용하는 3개 종류의 모터가 있습니다. DC 모터, 스텝(Stepper) 모터, 서보(Servo) 모터. 이 모터들은 각각의 특징이 있고 사용법이 모두 틀리기 때문에 서로의 차이점부터 알아봐야 할 것 같습니다. 

DC 모터 : 주변에서 흔히 보는 모터. 입력 전류(+, -) 방향으로 회전 방향을 제어할 수 있음. 상대적으로 고회전에 유리. 회전 움직임을 사용하는 RC카, 쿼드콥터 등 사용처가 매우 다양. 회전수와 방향을 자유롭게 제어하기 위해서는 별도의 드라이버 모듈이 필요.

서보 모터 : 보통 0~180 사이를 움직이며, 해당 회전 범위 안에서의 위치를 사용자가 설정 가능. 동작 범위가 제한적이지만 정확한 위치 제어가 가능. 제어 방법도 간단함. (PWM 신호로 간단히 위치제어) RC카의 방향타, 로봇 관절 등 회전각 제어가 필요한 곳에 광범위하게 사용.

스텝 모터 : 회전 방향과 속도 뿐 아니라 회전각을 정밀히 제어할 수 있음. DC 모터와 서보 모터의 장점을 합친 모터. 하지만 제어가 복잡함. 그래서 보통 스텝모터 드라이버 모듈을 이용해서 제어. 상대적으로 고회전이 필요치 않으면서 정밀한 제어가 필요한 곳에 사용. 3D 프린터 움직임을 만드는 핵심 모터이기도 함.

 

 

1. 서보 모터

 

이번 강좌에서 다룰 모터는 서보 모터, 그 중에서도 아두이노의 제한된 전원으로도 충분히 동작-제어가 가능한 마이크로 서보모터(SG-90) 입니다. 

95298244941_19928_image1

비록 힘은 딸리지만 작고, 값도 싸고, 아두이노의 전원(5V 핀)으로도 동작합니다. 더 큰 힘(토크)이 필요하다면 MG-9xx 시리즈와 같은 고출력 모델을 구입해서 사용하시면 됩니다만 이 경우는 별도의 외부 전원에서 모터에 전력을 공급해 줘야합니다. 어느쪽이든 모터를 제어하는 방법은 같습니다.

 

 

2. 서보모터 제어 방법

 

먼저 6회 강좌에서 배웠던 PWM 에 대한 개념을 떠올리셔야 합니다.

PWM(Pulse Width Modulation, 펄스 폭 변조) 이란?  PWM은 5V출력을 on 혹은 off 상태로 유지하는 것이 아니라 빠르게 on/off 를 반복하는 것입니다. 아래 그림처럼요. 

pwm1

이 PWM 신호를 이용해서 서보모터를 제어할 수 있습니다. 즉, 아두이노와 연결된 핀으로 입력되는 신호의 지속시간(pulse width)으로 위치를 제어합니다.

여기서 사용하는 SG90 모터는 -90′ ~ 90′  범위 이내에서 위치를 제어할 수 있습니다. 신호의 폭(신호의 지속시간, pulse width, 펄스 폭)은 0.5ms 에서 -90′, 2.5ms 에서 90′ 회전한 위치에 맞춰집니다. 아래 그림과 같이요.

rcservo_pwm_vs_angle

따라서 우리가 원하는 펄스 폭을 주면 서보모터의 팔이 원하는 위치로 가게됩니다. 보통 -90′ ~ 90′ 범위에서 양 끝에는 약간의 여유를 둬야 할겁니다. 모터에 따라 180′ 전체를 다 쓰지는 못하는 것 같습니다.

 

 

3. 서보모터 연결 방법

 

표준 RC 서보에는 3가닥의 전선이 있습니다. 검정색(GND), 적색(PWR = Power), 황색(SIG = Signal). 검정색 대신 갈색선을 사용하기도 합니다. 3가닥의 선을 각각 아두이노에 연결합니다. 황색선이 모터를 제어할 PWM 신호를 보내주는 선입니다.

주의!!: 서보모터가 약하거나 제대로 동작하지 않는다면 아두이노 보드의 출력보다 많은 전류를 요구하기 때문일 수 있습니다. 이때는 외부 전원으로 파워를 공급해줘야 합니다. 아래 PWR, GND를 외부 전원의(일반적으로 4.5 ~ 6V) +, – 에 연결합니다. 이 때 외부전원의 (-) 를 아두이노 GND, 서보모터 GND와 연결되도록 해야 합니다.

서보모터 아두이노
GND (검정색 혹은 갈색) GND
PWR (적색) 5V
SIG (황색) D2

 

 

4. 소스코드 (스케치)

 

서보모터를 쓰는 가장 간단한 방법은 서보모터 라이브러리를 이용하는 것입니다. #include <Servo.h> 를 선언하고 Servo servo; 를 통해 서보모터를 사용할 준비를 합니다.

서보모터 라이브러리는 servo.write(angle); 형태로 사용하며 angle 에 원하는 값을 적어주기만 하면 됩니다. angle 값은 0’~180′ 사이의 값입니다.

아래 예제는 서보모터 라이브러리를 이용하여 아두이노 시작할 때 서보모터를 0′ 위치에서 180′ 위치까지 이동하도록 하는 예제입니다.

굉장히 간단한 코드라 별다른 설명이 필요 없을 정도입니다.

setup() 함수 안에서 servo.attach(servoPin); 으로 서보모터를 초기화 합니다. 초기화 할 때 서보모터의 제어핀과 연결된 아두이노 디지털 핀을 입력합니다. 

loop() 함수 안에서는 0′ 부터 180′ 까지 각도를 1씩 올려가며 서보모터를 움직입니다.

for 반복문 안에서 각도를 1’씩 움직일 때 반복문이 굉장히 빨리 실행됩니다. 따라서 서보모터가 반응할 시간을 벌어주기 위해 아두이노를 잠시 쉬게하는 delay(time); 함수를 사용했습니다. delay() 함수를 사용하면 작성한 코드가 여기에 멈춰서 지정한 시간만큼 쉬는 상태가 됩니다. time 값은 milli-second 단위(1/1000 초) 입니다.

 

 

다음 회에서는 이제까지 진행한 강좌를 바탕으로 응용 작품을 만들어 보도록 하겠습니다.

 

 

 

===============================================================

이 문서는 작성자의 동의없이 개인적인 목적 외의 상업적인 목적으로 활용되어서는 안됩니다.

이 문서의 일부 혹은 전체를 수정, 삭제, 재배포 하여서는 안됩니다.

작성자 : GodsTale (godstale@hotmail.com)  

Post Author: TORTUGA

TORTUGA
궁금하신 점은 새로 개편한 홈페이지의 QnA 게시판을 이용해주세요!!!!!!! http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=qna

9 thoughts on “아두이노 기초 강좌 10 – 서보모터 컨트롤

    이상돈

    (2015년 8월 22일 - 10:44 오후)

    매우 배워보고싶은분야군요 자세하게 풀이되어감사합니다 연락처 010 9071 0945

      TORTUGA

      TORTUGA

      (2015년 8월 26일 - 6:38 오후)

      좋은 말씀 감사합니다.

    박혁수

    (2015년 12월 3일 - 11:15 오후)

    안녕하세요 게시글 잘봤습니다
    저는 지금 인천에 모특성화고에 제학중인 2학년학생입니다 실습과제로 아두이노활용제작을 하게되었습니다 저희는 초음파와 서보모터를 이용해서 차의 크기에 따라 내부에서 주차장이 변환되는 차고를 만들려고합니다 그러기위해선 일단 차고의 셔터를 만들기위해 서보를 한번 작동시켜야 할것이고 셔터가 올려진뒤에 내부에서 0, 90 180도로 3가지의 방을 설정해야합니다 그래서 먼저 초음파를 잘동시키기위해
    long distance로 길이변환을 해주고 void loop에서
    일단먼저 램프들의 초기화를 위해
    digitalWrite(RED,LOW);
    digitalWrite(GREEN,LOW);
    digitalWrite(BLUE,LOW);
    해주고 if문을 사용해 초음파의 거리에 따라 변환하게합니다

    if(distance <10);
    {
    digitalWrite(RED,HIGH);
    myservo.write(0); //서보모터의 각도를 설정해줌
    delay(100); //충돌을 방지하기위해 delay를 걸어줍니다
    }
    else if(distance<20);
    {
    digitalWrite(GREEN,HIGH);
    myservo.write(90);
    delay(100);
    }
    else if(distance<30);
    {
    digitalWrite(BLUE,HIGH);
    myservo.write(180);
    delay(100);
    }
    delay(300);
    }
    이렇게 써주었습니다 하지만 정작 업로드후 램프와 서보모터를 보니 거리가 20이하일때는 90도로 정확히바뀌는반면에 10이하이거나 30이하일때는 0도와 90도를 왔다갔다하고 180도와 90도를 왔다갔다합니다
    제생각에는 아두이노와 서보모터사이의 노이즈때문아닐까하는생각이있었지만 혹시 회로가 틀렸을수도있어 문의드립니다 더좋고 간단한 회로가 있다면 설명해주시면 감사합니다. 말이너무 길어졌습니다. 끝까지 봐주셔서 감사합니다

      TORTUGA

      TORTUGA

      (2015년 12월 9일 - 2:07 오후)

      적어주신 코드상으로는 별 문제가 없어보입니다. 전체 소스를 봐야겠는데요?

    zz--

    (2015년 12월 16일 - 1:47 오전)

    혹시 와이파이 이용해 서브모터 조절하려면 어떤소스를써야할지좀 알려주실수잇으세요 ?ㅜ

      TORTUGA

      TORTUGA

      (2015년 12월 22일 - 10:10 오전)

      wifi direct로 연결하실 예정인가요? 그런 경우 가장 쉬운 방법은 wifi232 모듈을 이용하는겁니다.
      http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=tech_comm&wr_id=30&page=1

      하지만 wifi232 모듈이 그리 자주 사용되는 모듈이 아니라서… ESP8266 등의 모듈을 이용하시는게 더 보편적입니다. 관련 내용은 구글 검색을 한번 해보세요. 제가 아는 소스중에 입맛에 딱 맞는 소스는 없는듯

    허멈

    (2016년 5월 27일 - 6:48 오후)

    안녕하세요 서보모터 관련하여 프로젝트를 하고있는데 물어볼게 있어 이렇게 글을 남깁니다.

    현재 지금 제가 하는 프로젝트에서 안되는 부분이

    라즈베리파이에서 가스센스를 이용하여 가스값을 측정해 임계치가 어느정도 넘어가면 아두이노에 있는 서보모터가 180도 돌아 가도록 하였구요 또한 아두이노에 서보모터 뿐만아니라 3x4키패드를 장착하여 패스워드(1234)가 맞을 경우 서보모터가 돌아가게끔 하였는데….

    가스센서 측정되었을때만 서모모터가 작동이 되고 키패드에서 패스워드를 누를 경우에는 서모보터가 작동을 안하는데 … 해결방법이 없을까요?

    NAME

    (2017년 11월 27일 - 1:56 오후)

    안녕하세요 현재 대학교2학년에 재학중인 학생입니다.
    제가 학교 프로젝트 때문에 전자기파가 탐지 되면 서보모터가 돌아가도록 하는걸 만들고 있는데 도움 좀 부탁드리려고 합니다.
    제가 코드도 직접 짜야하는데 if문 사용해서 하면 될까요?

    박정진

    (2017년 12월 29일 - 6:33 오전)

    도움이 많이돼었습니다
    기계설비를 해야하는데 도움이필요함니다
    도움을 받을수 있는지 알고 싶습니다
    강좌해주신 부분이 핵심부분이라 자세히 알고 싶습니다
    연락한번 부탁드립니다
    010-3270-6497

댓글 남기기

이메일은 공개되지 않습니다.