아두이노 우노 & 에이다프루트 PWM 쉴드로 정밀 서보 캘리브레이션하기
부품 및 소모품
| 부품명 | 수량 |
| 아두이노 우노 | 1 |
| 에이다프루트 PWM 서보 드라이버 쉴드 | 1 |
| M3 볼트 | 8 |
| M3 와셔 | 8 |
| LM2596 DC-DC 강압 컨버터 | 1 |
| 빨간 PLA 필라멘트 | 1 |
| 흰색 PLA 필라멘트 | 1 |
| 180도 투명 각도기 | 1 |
| 로터리 포텐셔미터 (일반) | 1 |
| 9g 서보 모터 | 1 |
필요한 도구 및 기계
앱 및 온라인 서비스
프로젝트 소개
이전 해커스터 포스트에서 동일한 배치의 서로 다른 서보들이 같은 PWM 신호를 받아도 다르게 동작함을 보여드렸습니다. 모든 서보가 최시계 반대 방향에서 시작해 동일한 PWM 신호를 받았음에도 미세하게 다른 동작을 보였습니다.
왜 아두이노 기본 서보 라이브러리를 쓰지 않을까?
에이다프루트 PWM 서보 드라이버를 사용하면 I2C 통신으로 단 두 핀만으로 다수의 서보를 제어할 수 있습니다. 아두이노 기본 서보 라이브러리는 서보마다 전용 핀이 필요합니다. 또한 기본 라이브러리로 서보를 연결하고 0도 위치 신호를 보낼 때 서보가 이동 한계까지 돌아가며 기어가 갈리는 현상을 경험하기도 했습니다.
사용 중인 9g 서보는 저가형이라 정밀도를 위해 설계되지 않았지만, 보행 로봇 프로젝트에 사용하려면 더 정확하고 예측 가능한 동작이 필요했습니다.
취미용 서보를 더 정확하게 제어하려면?
서보마다 동작이 다르다는 것을 확인하고, 각 서보를 캘리브레이션할 수 있는 장치를 만들기로 했습니다. 어떤 PWM 값이 0도에 해당하는지, 90도 중앙점은 무엇인지, 기어가 갈리는 극단 위치를 피하려면 어떻게 해야 하는지 알아내기 위함입니다.
두 가지 간단한 개념을 결합했습니다:
- 서보를 각도기 중앙에 정렬해 서보 혼(waip)이 회전할 때 위치를 측정할 수 있게 함
- 포텐셔미터를 아두이노 아날로그 입력에 연결해 포텐셔미터 축을 돌리며 PWM 값을 조절해 서보 위치 제어
이 버전에서는 아두이노 IDE 시리얼 모니터로 PWM 값을 읽어 수동 기록하는 방식을 택했습니다.
오토데스크 123D로 포텐셔미터, 각도기, 서보, 아두이노, 에이다프루트 PWM 드라이버와 전원 공급장치를 고정할 심플한 지그를 설계했습니다. 최종 프로젝트에서도 에이다프루트 드라이버를 쓸 예정이므로 캘리브레이션에도 동일 장비를 사용했습니다.
장치 제작
모든 부품을 3D 프린팅하고 M3 볼트와 와셔로 조립했습니다. 장착 구멍은 보유 부품에 맞춰 조정했습니다.
전자 회로는 포텐셔미터 중앙 핀을 아두이노 A0에, 양단을 0V와 5V에 연결했습니다. PWM 서보 드라이버를 아두이노에 장착하고, DC-DC 벅 컨버터(9V 입력을 5V로 조정)로 전원을 공급했습니다. 9g 서보를 드라이버 쉴드 첫 번째 슬롯에 연결하고 스케치를 업로드했습니다.
완성된 장치로 상단 좌측 노브를 돌려 서보 위치를 제어하고, 시리얼 모니터로 각도별 PWM 값을 읽을 수 있습니다.
장치가 알려주는 정보
서보를 최시계 방향으로 돌리고 혼을 180도 눈금 조금 너머에 위치시켰습니다. 전원을 켜고 포텐셔미터를 돌려 서보 바늘을 0도에 맞춘 뒤 시리얼 출력 PWM 값을 기록했습니다. 이후 10도 간격으로 180도까지 반복 측정했습니다.
결과를 그래프로 그리니 PWM과 서보 각도 간 강한 선형 관계가 뚜렷했습니다. 이 데이터는 해당 서보 고유의 특성입니다. 다른 서보도 비슷하겠지만 완전히 동일하진 않습니다.
더 정확한 제어를 위한 두 가지 방법
- 룩업 테이블 방식: 각도-PWM 값 쌍을 배열에 저장해 원하는 각도의 PWM 값을 참조. 10도 배수 각도만 제어 가능하다는 단점.
- 선형 회귀 공식 활용: 데이터셋으로 선형 회귀를 수행해 공식 도출 (예: PWM = 2.35 × 각도 + 159.4). 원하는 각도를 파라미터로 전달해 프로그래밍 방식으로 PWM 계산. 모든 각도 제어 가능.
어느 방식이든 캘리브레이션 전보다 훨씬 정확하고 자신 있게 서보를 제어할 수 있습니다. 각 서보를 정밀 캘리브레이션하는 건 노력이 들지만, 프로젝트 정밀도를 위해 충분히 가치 있습니다.
장치에서 서보를 분리할 때 혼을 그대로 유지해야 합니다. 측정값이 캘리브레이션 시 혼 장착 상태 기준이기 때문입니다.
차기 버전 개선 아이디어
- 서보 퀵 릴리즈 메커니즘 (네오디뮴 자석 클립 활용)
- 아두이노와 전원 공급장치 재배치로 크기 축소
- 9V 배터리와 벅 컨버터 사이에 파워 스위치 추가
- 출력 파트 수 감소로 프린팅 간소화
- 서보 특정 각도 도달 시 센서가 감지해 아두이노에 피드백 (시차 오차 제거)
- LCD 디스플레이 추가로 PC 연결 없이 결과 확인
마무리
취미용 서보는 저렴하고 정밀도를 위해 설계되지 않았지만, 많은 용도에선 충분합니다. 다만 더 높은 정확도와 반복 성능이 필요할 때 이 지그가 큰 도움이 됩니다.
코드
서보 캘리브레이터 장치 스케치 (C/C++)
#include <Adafruit_PWMServoDriver.h>
#define analogIn A0
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
int inputValue = 0;
int tmpPwmValue = 0;
void setup() {
Serial.begin(9600);
pwm.begin();
pwm.setPWMFreq(60);
}
void loop() {
inputValue = analogRead(analogIn); // 0-1024 범위
// 서보 최소/최대 PWM 값은 보통 100-612 사이
int pwmValue = (int)(100 + (inputValue / 2));
pwm.setPWM(0, 0, pwmValue);
// 중복 데이터 출력 방지
if (pwmValue != tmpPwmValue) {
Serial.print("Potentiometer Input = ");
Serial.print(inputValue);
Serial.print(", PWM = ");
Serial.println(pwmValue);
}
tmpPwmValue = pwmValue;
delay(15);
}
커스텀 파트 및 인클로저
서보 캘리브레이터 파트 저장소