ESP32 C3 Super Mini IR 슬롯형 광학 속도 센서
ESP32 C3 Super Mini와 IR 슬롯형 광학 속도 센서로 물체를 세고 모터 속도를 RPM으로 측정하는 방법을 배웁니다.

필요한 하드웨어
| 1 | × | ESP32 C3 Super Mini | 아마존 | |
| 1 | × | USB 케이블 타입-A to 타입-C (USB-A PC용) | 쿠팡 | 아마존 | |
| 1 | × | USB 케이블 타입-C to 타입-C (USB-C PC용) | 아마존 | |
| 1 | × | IR Slotted Optical Speed Sensor | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (옵션) Breadboard | 쿠팡 | 아마존 | |
| 1 | × | (옵션) DC 커넥터 전원 연결 잭 플러그 소켓 | 쿠팡 | 아마존 |
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
IR 슬롯형 광학 속도 센서에 대하여
이 모듈은 U자형 포토 인터럽터입니다. 슬롯 안으로 무언가 지나가면 ESP32 C3 Super Mini에 알려 줍니다.
간단 정보:
- 센서 종류: 슬롯형 광전 센서 (IR LED + NPN 포토트랜지스터)
- 슬롯 폭: 5.9 mm
- 동작 전압: 3.3V ~ 5V DC
- 출력: 디지털 (TTL) - 막히면 LOW, 비어 있으면 HIGH
- 신호 처리: 내장 슈미트 트리거
- 장착: 양쪽 끝에 M3 나사 구멍
- 핀: 3개 (VCC, GND, OUT)
이런 용도에 좋습니다:
- 인코더 디스크로 모터 속도(RPM) 측정
- 간단한 타코미터
- 물체 또는 펄스 개수 세기
- 바퀴 회전수로 거리 계산
- 로봇 바퀴 속도 피드백
- 리미트 또는 위치 감지
핀아웃

- VCC — 전원 입력 (3.3V ~ 5V)
- GND — 그라운드 (0V)
- OUT — ESP32 C3 입력 핀으로 가는 디지털 신호
※ 주의:
핀 순서는 제작 배치마다 달라질 수 있습니다. 항상 모듈에 인쇄된 라벨을 따르세요.
동작 원리

- 양쪽 구조: 슬롯의 한쪽에는 IR LED가 있고, 반대쪽에는 포토트랜지스터가 마주 보고 있습니다.
- 슬롯이 비어 있음: IR 빛이 포토트랜지스터에 닿습니다 → OUT은 HIGH
- 슬롯이 막힘: 불투명한 물체(카드, 디스크의 톱니)가 빛을 막습니다 → OUT은 LOW
- 깨끗한 신호: 슈미트 트리거가 안정적인 0 또는 1을 만듭니다. 떨림이 없으므로 소프트웨어 디바운스가 필요 없습니다.
- 투명 플라스틱: 투명한 물체는 IR을 잘 막지 못할 수 있습니다. 불투명한 물체를 사용하세요.
- 반대 로직: 다른 제조사의 일부 모듈은 반대로 동작합니다. 슬롯이 비어 있는데 "막힘"으로 나오면 코드에서 LOW와 HIGH를 바꾸세요.
배선 다이어그램
IR 슬롯형 광학 속도 센서를 ESP32 C3 Super Mini에 연결하는 방법은 다음과 같습니다:

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
| 속도 센서 핀 | ESP32 C3 Super Mini 핀 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| OUT | GPIO4 |
- 5V가 아닌 3.3V를 사용하세요: OUT 핀의 출력은 VCC 전압까지 올라갑니다. ESP32 C3는 3.3V 보드이므로 센서도 3.3V로 전원을 공급하세요.
- 추가 부품 없음: 저항이 필요 없습니다. 선 세 개면 충분합니다.
IR 슬롯형 광학 속도 센서를 위한 프로그래밍 방법
IR 슬롯 센서를 읽는 코드는 다음과 같습니다. 라이브러리는 필요 없습니다.
- 핀을 입력으로 설정:
pinMode(4, INPUT);
- 상태 읽기 (LOW = 막힘, HIGH = 비어 있음):
int state = digitalRead(4);
- 인터럽트로 빠른 펄스 세기 (톱니 하나당 한 번, FALLING 에지에서):
attachInterrupt(digitalPinToInterrupt(4), countPulse, FALLING);
- 펄스를 RPM으로 변환 (1초 동안 센 펄스):
float rpm = pulses * 60.0 / SLOTS_PER_TURN;
ESP32 C3 Super Mini 코드 - 슬롯 안의 물체 감지
이 코드가 하는 일:
- digitalRead()로 OUT 핀을 계속 읽습니다
- 상태가 바뀔 때만 메시지를 출력합니다
- 슬롯이 막힐 때마다 카운터에 1을 더합니다
/*
* 이 ESP32 C3 Super Mini 코드는 newbiely.kr 에서 개발되었습니다
* 이 ESP32 C3 Super Mini 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/esp32-c3/esp32-c3-super-mini-ir-slotted-optical-speed-sensor
*/
const int SENSOR_PIN = 4; // ESP32 C3 Super Mini GPIO4 connected to the OUT pin of the speed sensor
int lastState; // the previous state of the sensor
int objectCount = 0; // how many times the slot was blocked
void setup() {
Serial.begin(9600);
pinMode(SENSOR_PIN, INPUT);
lastState = digitalRead(SENSOR_PIN);
}
void loop() {
int state = digitalRead(SENSOR_PIN);
if (state != lastState) { // the state has changed
if (state == LOW) { // LOW = something is in the slot
objectCount++;
Serial.print("The slot is blocked - count: ");
Serial.println(objectCount);
} else { // HIGH = the slot is clear
Serial.println("The slot is clear");
}
lastState = state;
}
}
빠른 단계
- 이 보드를 처음 사용하시나요? Arduino IDE를 설정하려면 ESP32 C3 슈퍼 미니 - 시작하기를 읽어 보세요.
- 위의 표와 같이 센서를 배선합니다.
- USB Type-C 케이블로 ESP32 C3 Super Mini를 PC에 연결합니다.
- Arduino IDE에서 ESP32 C3 Super Mini 보드와 올바른 COM 포트를 선택합니다.
- 코드를 복사하여 Arduino IDE에 붙여넣습니다.
- Upload를 클릭합니다. 업로드가 실패하면 BOOT 버튼을 누른 채로 RESET을 누른 다음 다시 시도합니다.
- 시리얼 모니터를 열고 9600 보드레이트로 설정합니다.
- 카드 조각이나 손가락을 슬롯 사이로 몇 번 지나가게 합니다.
- 시리얼 모니터에서 결과를 확인합니다.
8
Serial.println("Hello World!");
Message (Enter to send message to 'ESP32C3 Dev Module' on 'COM15')
New Line
9600 baud
The slot is blocked - count: 1
The slot is clear
The slot is blocked - count: 2
The slot is clear
The slot is blocked - count: 3
The slot is clear
ESP32 C3 Super Mini 코드 - 모터 속도(RPM) 측정
이 코드가 하는 일:
- FALLING 에지에서 인터럽트를 사용합니다. 슬롯을 막는 디스크 톱니 하나마다 펄스가 1씩 늘어납니다.
- 1초마다 펄스 수를 읽고 0으로 초기화합니다
- RPM을 계산하여 펄스와 속도를 출력합니다
왜 인터럽트를 사용할까요?
- 펄스가 매우 빠르게 들어옵니다. loop()에서 핀을 확인하면 일부를 놓칠 수 있습니다.
- FALLING은 톱니 하나당 한 번 센다는 뜻입니다.
RPM 공식:
- 1회전 = 펄스 20개 (TT 기어 모터의 일반적인 디스크는 슬롯이 20개입니다)
- 1초 동안의 펄스 × 60 = 분당 펄스 수
- 분당 펄스 수 ÷ 20 = 분당 회전수 (RPM)
- 디스크의 슬롯 수가 다른가요? 코드에서 SLOTS_PER_TURN을 바꾸세요.
/*
* 이 ESP32 C3 Super Mini 코드는 newbiely.kr 에서 개발되었습니다
* 이 ESP32 C3 Super Mini 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/esp32-c3/esp32-c3-super-mini-ir-slotted-optical-speed-sensor
*/
const int SENSOR_PIN = 4; // ESP32 C3 Super Mini GPIO4 connected to the OUT pin of the speed sensor
const int SLOTS_PER_TURN = 20; // number of slots (holes) in the encoder disc
volatile unsigned long pulseCount = 0; // changed inside the interrupt
unsigned long lastTime = 0;
// runs every time a tooth of the disc blocks the slot
void IRAM_ATTR countPulse() {
pulseCount++;
}
void setup() {
Serial.begin(9600);
pinMode(SENSOR_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
}
void loop() {
if (millis() - lastTime >= 1000) { // every 1 second
lastTime = millis();
unsigned long pulses = pulseCount; // read and reset the counter
pulseCount = 0;
float rpm = pulses * 60.0 / SLOTS_PER_TURN; // pulses per second -> turns per minute
Serial.print("Pulses: ");
Serial.print(pulses);
Serial.print(" | Speed: ");
Serial.print(rpm);
Serial.println(" RPM");
}
}
빠른 단계
- 첫 번째 예제와 같은 배선을 유지합니다.
- 인코더 디스크를 모터 축이나 바퀴에 고정합니다. 톱니가 센서에 닿지 않고 슬롯을 통과해야 합니다.
- 앞에서와 같은 방법으로 코드를 업로드합니다.
- 시리얼 모니터를 9600 보드레이트로 엽니다.
- 디스크를 손으로 돌리거나 모터를 켭니다.
- 펄스와 RPM이 1초마다 바뀌는 것을 확인합니다.
모터가 약 300 RPM일 때의 출력 예시:
8
Serial.println("Hello World!");
Message (Enter to send message to 'ESP32C3 Dev Module' on 'COM15')
New Line
9600 baud
Pulses: 0 | Speed: 0.00 RPM
Pulses: 98 | Speed: 294.00 RPM
Pulses: 101 | Speed: 303.00 RPM
Pulses: 100 | Speed: 300.00 RPM
Pulses: 99 | Speed: 297.00 RPM
Pulses: 0 | Speed: 0.00 RPM
- RPM 코드는 슬롯당 에지를 한 번 셉니다. 그래서 모듈이 반대 로직이어도 작동합니다.
추가 지식
슬롯 센서와 다른 센서 비교:
- IR 슬롯형 광학 속도 센서: 5.9 mm 슬롯 안의 물체를 감지합니다. 속도, RPM, 개수 세기에 가장 좋습니다.
- IR 장애물 회피 센서: 슬롯 안이 아니라 앞쪽 멀리 있는 물체를 감지합니다.
- ESP32 C3 Super Mini - 로터리 인코더: 손으로 입력하는 노브입니다. 회전 방향도 알려 줍니다.
회전당 슬롯 수 고르기:
- 슬롯이 많을수록 회전당 펄스가 많아지고 속도를 더 세밀하게 읽을 수 있습니다
바퀴 회전수로 거리 계산:
- 회전수 = 펄스 ÷ 회전당 슬롯 수
- 거리 = 회전수 × 바퀴 둘레 (π × 지름)
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.