오렌지 보드를 사용해 서보모터 제어하기

[컴퓨터월드]

 

1회 아두이노를 사용해 LED를 제어하기 (1월호)
2회 오렌지보드를 사용하여 7세그먼트로 숫자 표시하기 (2월호)
3회 릴레이 모듈을 사용해 LED를 깜박이기 (3월호)
4회 아두이노를 사용하여 16X2 LCD에 문자 출력하기 (4월호)
5회 초음파 센서로 거리 측정하기 (5월호)
6회 조도센서를 사용하여 광량 측정하기 (6월호)
7회 오렌지 보드를 사용해 서보모터 제어하기 (이번호)

 

아두이노는 이탈리어로 ‘친한 친구’라는 뜻을 가진 대표적인 오픈소스 하드웨어다. 딱딱하고 접근하기 힘들었던 임베디드 분야를 누구나 쉽게 접근할 수 있도록 만든 미니 기판이라 할 수 있다. 이번 강좌에 사용하는 아두이노 오렌지보드는 한국형 아두이노라 할 수 있다.

아두이노의 보급은 오픈소스 하드웨어의 확산을 불러일으켰고 메이커 문화의 확산에도 큰 기여를 했다. 최근에는 인텔, 마이크로소프트 등 대형 기업들도 이런 오픈소스 하드웨어시장에 뛰어들기 시작했다. 그 만큼 오픈소스 하드웨어 시장의 잠재력이 커졌다는 얘기이다.


서보모터란 무엇인가?

서보(Servo)의 어원은 라틴어의 ‘Servue’로서 노예라는 의미를 가지고 있으며 목표치에 대한 위치, 방위, 자세 등의 제어가 자동화되어 있는 장치 이름에 붙여지곤 한다.

정리하면 서보모터는 모터와 기어박스 그리고 제어회로로 구성돼 특정 위치로 이동하거나 특정한 수치(속도 등)만큼 가동시킬 때, 모터로 부터의 피드백을 통해 정확하게 제어할 수 있는 구조를 갖추고 있는 모터로 자동화 생산 시스템, 로봇, 장난감, 가전제품 등 광범위하게 쓰이고 있다.

▲ 서보모터


서보모터 사용방법

서보모터는 일반 모터와 달리 회전 반경이 정해져 있다. 종류에 따라 다르지만 일반적으로 약 0~180도 범위의 회전각을 가진다. 서보모터에는 3개의 단자가 있다. 검은색(또는 갈색), 붉은색, 황색(또는 주황색, 흰색)이며 붉은색 선은 +전원, 검은색 선은 –전원에 연결되어 서보모터에 전기를 공급하는 역할을 하며, 노란색 선은 서보모터의 동작을 제어하는 신호선이다. 서보모터의 회전 각도는 아래 그림과 같이 PWM(펄스폭변조) 방식으로 제어한다.

▲ 펄스폭에 따른 서보모터의 각도

 PWM이란 Pulse Width Modulation의 약자로 펄스의 폭을 조절하여 디지털 신호를 전달하는 구형파를 아날로그 신호처럼 사용할 수 있게 하는 것을 말한다. 기존의 구형파는 HIGH신호와 LOW신호 밖에 없기 때문에 ON, OFF만 제어가 가능하지만 아래의 이미지와 같이 ON, OFF시간을 조절하여 펄스의 폭을 조절하면 그 폭에 따라서 파형의 1주기당 HIGH 신호의 비율에 따라 전구의 밝기를 제어할 수 있다.

▲ 펄스폭변조(Pulse Width Modulation)


필요한 부품 목록
오렌지보드로 서보모터를 제어해보기 위한 준비물은 아래와 같다.

 


하드웨어 연결하기

1. 오렌지보드의 5V핀을 브레드보드의 +버스에 연결한다.
2. 오렌지보드의 GND핀을 브레드보드의 -버스에 연결한다.
3. 스위치를 그림과 같이 양쪽 IC영역에 걸치게 꽂는다.
4. 서보모터의 흰색(또는 황색) 단자를 오렌지보드 A3번핀에 연결한다.
5. 서보모터의 붉은색 단자를 +버스에 연결한다.
6. 서보모터의 검은색 단자를 -버스에 연결한다.
7. 스위치의 왼쪽 상단 단자를 오렌지보드 5번핀에 연결한다.
8. 스위치의 오른쪽 하단 단자를 -버스에 연결한다.

 

 

 

소스코드

/*
제목 : 서보모터 움직이기
내용 : 스위치를 누를때마다 서보모터가 지정된 각도 만큼 회전하도록 해봅시다.
*/
// 서보모터를 쉽게 제어하기 위하여 라이브러리를 추가합니다.
#include <Servo.h>
// 서보모터를 제어하기 위한 Servo 객체를 생성합니다.
Servo myservo;
// 스위치를 5번 핀으로 설정합니다.
int sw = 5;
// 서보모터의 회전 각도입니다.
int angle = 0;
// 기계적인 스위치를 누르게 되면 전극판이 완전히 밀착되기 전까지,
// 매우 짧은 시간 동안 불안정한 신호를 발생시키며, 여러번 누른 것과 같은 현상이 나타납니다.
// 이를 바운스 현상이라 하며, 이를 방지하기 위해 일정시간동안은 이러한 불안정한 신호를 고려하지 않습니다.
// 이러한 방법을 디바운스라 합니다.
// 바운스 시작 시간을 초기화합니다.
long bounceStartTime = 0;
// 본 예제에서는 스위치를 눌렀을때 50ms 안의 신호는 바운스 현상으로 간주하고, 디바운스 합니다.
long debounce = 50;
// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
// 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
void setup() {
// 서보모터를 A3핀으로 설정합니다.
myservo.attach(A3);
// 스위치가 연결된 핀의 모드를 INPUT_PULLUP 상태(초기 로직레벨을 HIGH로 설정)로 설정합니다.
// 설정된 디지털 핀은 아래와 같은 값을 반환합니다.
// 스위치가 열려있다면 (누르지 않은 상태) HIGH
// 스위치를 닫혀있다면 (누른 상태), LOW
pinMode(sw, INPUT_PULLUP);
}// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행됩니다.
void loop() {
// 스위치가 연결된 핀의 로직레벨이 LOW라면,
// 스위치가 닫혀있는 상태(누른 상태) 이므로, 아래의 블록을 실행합니다.
if (digitalRead(sw) == LOW) {
// 시작 시간이 0으로 초기화 되어있다면, 현재 시간을 시작 시간으로 설정합니다.
if (bounceStartTime == 0) {
bounceStartTime = millis();
}
// 현재 시간 - 시작 시간이 디바운스 시간보다 크다면, 아래의 블록을 실행합니다.
if (millis() - bounceStartTime > debounce) {
// 현재 각도에서 15도를 증가시킵니다.
angle += 15;
// 최종 각도가 180도를 넘는다면, 0도로 초기화 시킵니다.
if (angle > 180) {
angle = 0;
}
// 서버모터로 지정된 각도로 회전하도록 설정합니다.
myservo.write(angle);
// 회전 후, 바운스 시작 시간을 0으로 초기화 합니다.
bounceStartTime = 0;
// 1초 동안 대기합니다.
delay(1000);
}
}
}

 
위 코드에서는 서보모터를 사용하기 위해 별도의 Servo.h 라는 헤더파일이 필요하다. 이 헤더파일의 경우에는 아두이노IDE에서 기본적으로 지원해주는 라이브러리이기 때문에 별도의 다운로드가 필요 없고 2개의 예제 코드(Knob, Sweep)를 제공한다.

위에서 작성한 코드는 스위치를 사용해 서보모터의 각도를 0도부터 180도까지 증가시키는 코드이다.
스위치를 누르게 되면 15도씩 증가하며 서보모터의 각도가 180도가 넘을 경우 다시 서보모터의 날개가 0도로 되돌아가서 처음부터 작동한다.

스위치를 사용할 때는 채터링(바운싱 현상)을 고려하게 되는데 채터링이란 스위치를 눌렀을 때, 물리적인 진동에 의해 짧은 시간 동안 불규칙적인 신호가 반복되는 현상을 말한다.

 

앞뒤로 발생하는 바운스를 잡기위해 스위치가 눌렸을 경우 코드 상에서 약간의 딜레이를 주어 짧은 시간 동안 들어온 불규칙한 신호의 값은 무시한다. 그렇게 해서 딜레이 이후 스위치가 눌렸다는 신호가 들어온다면 서보모터의 각도를 15도 증가시킨다.

if (millis() - bounceStartTime > debounce) {
// 현재 각도에서 15도를 증가시킵니다.
angle += 15;
// 최종 각도가 180도를 넘는다면, 0도로 초기화 시킵니다.
if (angle > 180) {
angle = 0;
}
// 서버모터로 지정된 각도로 회전하도록 설정합니다.
myservo.write(angle);
// 회전 후, 바운스 시작 시간을 0으로 초기화 합니다.
bounceStartTime = 0;
// 1초 동안 대기합니다.
delay(1000);
}


마치며

서보모터는 DC모터와 달리 사용자가 원하는 각도로 움직이고 정밀하게 제어할 수 있기 때문에 사용할 수 있는 방법이 많다. 국내외 아두이노 프로젝트를 찾다보면 서보모터를 이용한 프로젝트들을 많이 찾을 수 있다.

 

서보모터가 쓰이는 대표적인 제품이나 프로젝트를 꼽자면 로봇팔이나 로봇을 들 수 있다. 정밀한 관절의 제어가 필요하기 때문에 서보모터를 이용하여 관절을 표현한다.

 

다만 정밀한 제어가 가능한 만큼 다른 모터들에 비해 가격이 비싸다는 것이 단점이며, 아두이노에서 사용할 때에는 다른 모터와 마찬가지로 전력 수급의 문제로 인해 큰 서보모터를 사용하기 힘들다. 그렇기 때문에 큰 서보모터를 사용할 때는 외부전력을 공급하여 사용하는 것이 좋다.

하지만 아두이노에서 사용할 때는 단점보다는 사용하기 쉽다는 장점이 많이 부각되는 부품이니, 아두이노를 활용한 프로젝트를 구상하는 중이라면 서보모터를 응용해 멋진 작품을 많이 만들어 볼 수 있을 것이다.

 

 

 

 코코아팹은 한국 메이커 문화를 만들어가는 온라인 메이커포털이다. 오픈소스 하드웨어 오렌지보드의 생산과 활용법 공개 등 많은 활동을 진행하고 있다.

저작권자 © 아이티데일리 무단전재 및 재배포 금지