esp32 서보모터 PWM제어
SG90, MG90S, MG966R 서보모터
datasheet
사용법
ESP32는 16개의 PWM채널이 있으므로, 최대 16개의 서보모터를 동시에 제어할 수 있다.
서보모터 데이터 시트의 스펙상으로는…
대부분의 서보모터(SG90, MG90S, MG966R 등 포함)는 위의 그림처럼 20ms가 1주기가 되므로, PWM frequency를 50Hz로 설정한다.
20ms가 1주기이고, HIGH 펄스가 2ms 지속될 때 180º 회전을 한다.
그러므로, 전체 펄스 폭의 1/10만큼 HIGH 펄스가 주어지면 180º 회전을 한다.
Resolution이 16비트라면 65535의 1/10에 해당하는
6554의 값이 duty값으로 주어지면 서보모터는 180º 회전을 한다.데이터 시트에 나온 스펙에 따라서, 16비트 해상도에서 duty값에 따른 회전 각도PWM 5% : 3277 → 0ºPWM 7.5% : 4915 → 90ºPWM 10% : 6554 → 180º라고 생각했으나, 실제로는 이와 달랐다.
MG90S
16비트 해상도(0~65535)에서 duty값에 따른 회전 각도는
- PWM 2.5% : 1639 → 0º
- PWM 7.5% : 4915 → 90º
- PWM 12.5% : 8191 → 180º
즉, 각도에 따른 PWM값은 다음과 같이 지정한다.
$$
PWM = 2^{16} \times 0.1 \times \frac{angle}{180} + 2^{16} \times 0.025 = 2^{16} \times 0.1 \times (\frac{angle}{180} + 0.25)
$$그리고, 이 서보모터 스펙상 180도 회전을 하지만 PWM 값을 조절하면 최대 190도 정도까지는 회전한다.
그러므로, map 함수를 사용하여 다음과 같이 각도를 조절한다.
duty = map(deg, 0, 180, 1638, 8191);
이에 따라, 12비트 해상도(0~4095)에서 duty값에 따른 회전 각도는
- PWM 2.5% : 103 → 0º
- PWM 7.5% : 307 → 90º
- PWM 12.5% : 511 → 180º
MG996R
duty = map(deg, 0, 180, 2720, 8191);
가 가장 적당한 값을 나타내었다. (4.15% ~ 12.5%) (이유는 잘 모르겠음)
이런 내용을 종합해 볼때, 기기 데이터시트의 스펙과는 관계없이, 테스트를 통해 경험적으로 값을 찾아야 하는 듯…
delay( );
서보 회전 속도를 조절하며, 숫자가 작을 수록 빠르게 회전한다.
이동하는 각도만큼 돌아갈 수 있는 충분한 시간을 주어야한다.
(전류가 약하면) delay( ) 값이 너무 작을 경우 원하는 각도의 회전을 완성하지 못할 수도 있다.
전류가 충분하면 delay값을 줄여도 됨.
Servo 라이브러리를 이용하지 않는 경우
일반적으로 아두이노에서 서보모터를 사용하는 경우 아두이노 IDE에 기본적으로 포함되어 있는 <Servo.h> 라이브러리를 사용하면 되지만 이 라이브러리는 ESP32에서 사용할 수 없다. 그러므로 ESP32에 맞는 별도의 Servo.h 라이브러리를 다운로드 받아 사용해야하는 불편함이 있다. 또한 ESP32servo와 같은 ESP32용 라이브러리를 사용할 경우, 라이브러리에 따라 ledcWrite를 사용할 수 없는 경우도 있다.
그러므로, 여기서는 라이브러리를 사용하지 않고 PWM을 사용하여 ESP32로 MG90 서보모터를 제어해보고자 한다.
schematic
sketch
1 | const int ledPin = 15; // corresponds to GPIO 15 |
sketch: 시리얼 모니터에 입력한 문자로 서보모터 회전시키기
1 | const int ledPin = 15; // corresponds to GPIO 15 |
2축 서보모터 거치대 조립 및 테스트
거치대 조립
첫번째 단계로 서보모터 거치대를 조립하고 서보모터 2개를 장착한다.
SG90 서보 2개를 준비하고
니퍼로 아래 빨간 동그라미로 표시한 부분의 크기에 맞추어, 서보모터 날개를 잘라낸 뒤
아래 형태대로 조립한다.
날개를 나사로 조인 부분에 순간접착제를 살짝 뿌려, 완전히 고정시킨다. (단, 서보모터의 회전축 부분에는 접착제가 뭍지 않도록 주의한다.)
schematic
sketch: 두개의 서보모터를 180도 회전시키기
1 | // for horizontal Servo PWM properties |
Joystick 1개를 사용하여 2개의 서보모터 제어하기
schematic
sketch
1 | // for horizontal Servo PWM properties |
ESP32Servo 라이브러리 사용시
library for ESP32
스케치> 라이브러리 포함하기> 라이브러리 관리 에서 “esp32servo“ (by Kevin Harrington) 검색 후 설치
schematic
sketch
1 |
|
esp32 서보모터 PWM제어