ServoTimer2 라이브러리 마스터: 서보 스윕 제어 심플 가이드
부품 및 소모품
| 서보 모터 (Tower Pro MG996R) |
×1 |
| 아두이노 우노 (Arduino UNO) |
×1 |
| 점퍼 와이어 (일반) |
×1 |
| UTSOURCE 전자 부품 |
×1 |
프로젝트 소개
소개
최근 휴머노이드 로봇을 만들려고 시도했는데, 서보 모터 다루기가 필수였습니다. 모든 게 잘 작동했는데 로봇에 말하기 기능(TMRpcm 라이브러리 필요)을 추가하려니 문제가 생겼습니다.
TMRpcm.h, VirtualWire.h 같은 라이브러리는 아두이노 Timer1을 사용합니다. 동일한 타이머를 사용하는 두 장치를 동시에 사용할 수 없습니다. 그래서 로봇이 말하면 서보가 작동하지 않습니다. Servo.h와 TMRpcm 모두 Timer1을 사용하기 때문입니다.
둘 다 작동하게 하려면 서보용으로 다른 라이브러리가 필요한데, 그게 바로 ServoTimer2 라이브러리입니다. 이 라이브러리는 아두이노 Timer2를 사용합니다. 안타깝게도 인터넷에서 이 라이브러리 작동 원리와 코드 사용법을 설명한 튜토리얼을 찾지 못해, 저 같은 사람들이 이해할 수 있도록 튜토리얼을 만들기로 했습니다. 서보 모터 1개로 간단한 스윕 코드를 만들어보겠습니다.
영상을 보면 더 잘 이해하실 수 있습니다.
1단계: 부품 및 조립
메인 부품은 서보 모터입니다. 마이크로 서보 SG90을 사용했지만 어떤 모델이든 괜찮습니다.
서보 혼을 하드보드지에 붙여(각도 가시성 확보) 서보 모터에 장착합니다.
2단계: ServoTimer2 라이브러리 다운로드 및 아두이노에 추가
- 여기서 라이브러리 다운로드 후 아두이노 라이브러리 폴더에 붙여넣기
- 아두이노 IDE에서 스케치 → 라이브러리 포함 → .ZIP 라이브러리 추가 선택 후 라이브러리 폴더에서 파일 선택
- 이제 사용 준비 완료
3단계: 간단한 회로 구성
- 서보 빨간선 → 아두이노 VCC (5V)
- 서보 회색선 → GND
- 서보 주황선 → 디지털 핀 6
이게 가장 쉬운 부분입니다.
4단계: 코드
먼저 기존 Servo.h 라이브러리의 스윕 코드를 살펴봅시다. (모터가 0°→90°→1초 대기→180°→1초 대기)
#include <Servo.h>
Servo servo1;
void setup() {
servo1.attach(6);
}
void loop() {
servo1.write(0); delay(1000);
servo1.write(90); delay(1000);
servo1.write(180); delay(1000);
}
기존 라이브러리는 원하는 각도만 쓰면 서보가 알아서 이동합니다. 하지만 ServoTimer2 라이브러리는 펄스 폭(Pulse Width)을 직접 지정해야 합니다. 일반적으로 1500μs = 90°입니다. 최대 펄스 폭 2250μs ≈ 180°, 최소 750μs ≈ 0°지만 서보마다 다릅니다. 직접 값을 보내보며 확인하세요. 서보에 해가 되지 않습니다.
같은 동작을 ServoTimer2로 구현하면:
#include "ServoTimer2.h"
ServoTimer2 servo1;
void setup() {
servo1.attach(6);
}
void loop() {
servo1.write(750); // 최소 펄스 폭 ≈ 0°
delay(1000);
servo1.write(1500); // 펄스 폭 ≈ 90°
delay(1000);
servo1.write(2250); // 최대 펄스 폭 ≈ 180°
delay(1000);
}
이제 아두이노에 전원을 공급하고 각도기로 어떤 값에서 얼마나 회전하는지 확인하세요. 이렇게 하면 프로젝트에 적용할 수 있습니다. 즐거운 메이킹!
5단계: 아두이노 전원 켜고 실험
아두이노에 전원을 연결하고 각도기로 각 값에서 서보가 얼마나 회전하는지 측정하세요. 이 과정을 통해 여러분의 프로젝트를 완성할 수 있습니다. 즐거운 메이킹!
코드
- 서보 스윕 코드 (Servo.h)
- ServoTimer2 스윕 코드
서보 스윕 코드 (Servo.h)
C/C++
#include <Servo.h>
Servo servo1;
void setup() {
servo1.attach(6);
}
void loop() {
servo1.write(0); delay(1000);
servo1.write(90); delay(1000);
servo1.write(180); delay(1000);
}
ServoTimer2 스윕 코드
C/C++
#include "ServoTimer2.h"
ServoTimer2 servo1;
void setup() {
servo1.attach(6);
}
void loop() {
servo1.write(750); // min pulse width for 0 degree
delay(1000);
servo1.write(1500); // pulse width for 90 degree
delay(1000);
servo1.write(2250); // max pulse width for around 180 degree
delay(1000);
}
회로도

ServoTimer2 스윕 코드 GitHub: https://github.com/ashraf-minhaj/Arduino-ServoTimer2-basic-sweep-/tree/code-sweep