ESP32 로터리 엔코더 서보 모터
이 튜토리얼에서는 ESP32와 로터리 엔코더를 프로그래밍하여 서보 모터의 각도를 제어하는 방법을 배우게 됩니다.
준비물
| 1 | × | 38-pin ESP32 ESP-WROOM-32 Dev Module - Narrow | 쿠팡 | 아마존 | |
| 1 | × | (또는) 38-pin ESP32 ESP-WROOM-32 Dev Module - Wide | 쿠팡 | 아마존 | |
| 1 | × | (또는) 30-pin ESP32 ESP-WROOM-32 Dev Module - Wide | 아마존 | |
| 1 | × | (또는) ESP32 Uno-form board | 아마존 | |
| 1 | × | (또는) ESP32 S3 Uno-form board | 아마존 | |
| 1 | × | USB 케이블 타입-A to 타입-C (USB-A PC용) | 쿠팡 | 아마존 | |
| 1 | × | USB 케이블 타입-C to 타입-C (USB-C PC용) | 아마존 | |
| 1 | × | 서보 모터 | 쿠팡 | 아마존 | |
| 1 | × | 로터리 엔코더 (Rotary Encoder) | 쿠팡 | 아마존 | |
| 1 | × | 브레드보드 | 쿠팡 | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (추천) ESP32용 스크루 터미널 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) Breakout Expansion Board for ESP32 | 쿠팡 | 아마존 | |
| 1 | × | (추천) ESP32용 전원 분배기 | 쿠팡 | 아마존 |
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
서보 모터와 로터리 엔코더에 대하여
서보 모터와 로터리 엔코더, 그리고 그들의 핀아웃, 기능성, 프로그래밍에 익숙하지 않으신가요? 아래에서 이 주제들에 대한 종합적인 튜토리얼을 탐색해보세요:
선연결

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
ESP32 및 다른 구성 요소에 전원을 공급하는 방법에 대해 잘 알지 못하는 경우, 다음 튜토리얼에서 안내를 찾을 수 있습니다: ESP32 전원 공급 방법.
ESP32 코드
/*
* 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다
* 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/esp32/esp32-rotary-encoder-servo-motor
*/
#include <ESP32Servo.h>
#define CLK_PIN 25 // ESP32 핀 GPIO25가 로터리 엔코더의 CLK 핀에 연결됨
#define DT_PIN 26 // ESP32 핀 GPIO26가 로터리 엔코더의 DT 핀에 연결됨
#define SW_PIN 27 // ESP32 핀 GPIO27이 로터리 엔코더의 SW 핀에 연결됨
#define SERVO_PIN 33 // ESP32 핀 GPIO33이 서보 모터에 연결됨
#define DIRECTION_CW 0 // 시계 방향
#define DIRECTION_CCW 1 // 반시계 방향
int counter = 0;
int direction = DIRECTION_CW;
int CLK_state;
int prev_CLK_state;
int angle = 90;
Servo servo; // 서보 제어를 위한 서보 객체 생성
void setup() {
Serial.begin(9600);
// 엔코더 핀을 입력으로 구성
pinMode(CLK_PIN, INPUT);
pinMode(DT_PIN, INPUT);
// 로터리 엔코더의 CLK 핀의 초기 상태 읽기
prev_CLK_state = digitalRead(CLK_PIN);
servo.attach(SERVO_PIN); // 서보 객체에 핀 9에 서보를 부착
servo.write(angle);
}
void loop() {
// 로터리 엔코더의 CLK 핀의 현재 상태 읽기
CLK_state = digitalRead(CLK_PIN);
// CLK의 상태가 변경된 경우, 펄스가 발생함
// 이중 계산을 피하기 위해 상승 에지(LOW에서 HIGH로)에만 반응
if (CLK_state != prev_CLK_state && CLK_state == HIGH) {
// DT 상태가 HIGH인 경우
// 엔코더가 반시계 방향으로 회전 => 카운터 감소
if (digitalRead(DT_PIN) == HIGH) {
direction = DIRECTION_CCW;
counter--;
angle -= 2; // 이 해상도를 변경할 수 있음
} else {
// 엔코더가 시계 방향으로 회전 => 카운터 증가
direction = DIRECTION_CW;
counter++;
angle += 2; // 이 해상도를 변경할 수 있음
}
if (angle < 0)
angle = 0;
else if (angle > 180)
angle = 180;
// 카운터에 따라 서보 각도 설정
servo.write(angle);
Serial.print("COUNTER: ");
Serial.print(counter);
Serial.print(" | ANGLE: ");
Serial.println(angle);
}
// 마지막 CLK 상태 저장
prev_CLK_state = CLK_state;
}
사용 방법
- ESP32를 처음 사용하는 경우, ESP32 - 소프트웨어 설치을 참조하세요.
- 위 이미지와 같이 배선하세요.
- 마이크로 USB 케이블을 사용하여 ESP32 보드를 PC에 연결하세요.
- PC에 Arduino IDE를 오픈하세요.
- 올바른 ESP32 보드(예: ESP32 Dev Module)와 COM 포트를 선택하세요.
- USB 케이블을 통해 ESP32를 PC에 연결하세요
- Arduino IDE를 열고, 올바른 보드와 포트를 선택하세요
- 위의 코드를 복사하고 Arduino IDE로 열기
- Arduino IDE에서 Upload 버튼을 클릭하여 코드를 ESP32에 업로드하세요.

- 시리얼 모니터 열기
- 로터리 인코더 회전시키기
- 서보 모터의 회전 확인하기
- 시리얼 모니터에서 결과 보기
8
Serial.println("Hello World!");
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
COUNTER: 0 | ANGLE: 90
COUNTER: 1 | ANGLE: 92
COUNTER: 2 | ANGLE: 94
COUNTER: 3 | ANGLE: 96
COUNTER: 4 | ANGLE: 98
COUNTER: 5 | ANGLE: 100
COUNTER: 6 | ANGLE: 102
코드 설명
소스 코드의 주석 라인에 있는 줄별 설명을 읽으세요!
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.