ESP32 - 로터리 엔코더 서보 모터 | ESP32 - Rotary Encoder Servo Motor
이 튜토리얼에서는 ESP32와 로터리 엔코더를 프로그래밍하여 서보 모터의 각도를 제어하는 방법을 배우게 됩니다.
준비물
1 | × | ESP-WROOM-32 Dev Module | 쿠팡 | Amazon | |
1 | × | USB Cable Type-C | 쿠팡 | Amazon | |
1 | × | Servo Motor | 쿠팡 | Amazon | |
1 | × | Rotary Encoder | 쿠팡 | Amazon | |
1 | × | Breadboard | 쿠팡 | Amazon | |
1 | × | Jumper Wires | Amazon | |
1 | × | (Recommended) Screw Terminal Expansion Board for ESP32 | 쿠팡 | Amazon |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
서보 모터와 로터리 엔코더에 대하여
서보 모터와 로터리 엔코더, 그리고 그들의 핀아웃, 기능성, 프로그래밍에 익숙하지 않으신가요? 아래에서 이 주제들에 대한 종합적인 튜토리얼을 탐색해보세요:
선연결
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
ESP32 및 다른 구성 요소에 전원을 공급하는 방법에 대해 잘 알지 못하는 경우, 다음 튜토리얼에서 안내를 찾을 수 있습니다: ESP32 전원 공급 방법.
ESP32 코드
/*
* 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다
* 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/esp32/esp32-rotary-encoder-servo-motor
*/
#include <Servo.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를 처음 사용하는 경우, Arduino IDE에서 ESP32 환경 설정하는 방법을 참조하세요.
- 위 이미지와 같이 배선하세요.
- 마이크로 USB 케이블을 사용하여 ESP32 보드를 PC에 연결하세요.
- PC에 Arduino IDE를 오픈하세요.
- 올바른 ESP32 보드(예: ESP32 Dev Module)와 COM 포트를 선택하세요.
- USB 케이블을 통해 ESP32를 PC에 연결하세요
- Arduino IDE를 열고, 올바른 보드와 포트를 선택하세요
- 위의 코드를 복사하고 Arduino IDE로 열기
- Arduino IDE에서 Upload 버튼을 클릭하여 코드를 ESP32에 업로드하세요.
- 시리얼 모니터 열기
- 로터리 인코더 회전시키기
- 서보 모터의 회전 확인하기
- 시리얼 모니터에서 결과 보기
COM6
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
Autoscroll
Clear output
9600 baud
Newline
코드 설명
소스 코드의 주석 라인에 있는 줄별 설명을 읽으세요!
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.