ESP32 마이크로파이썬 IR 슬롯형 광학 속도 센서
이 튜토리얼에서는 ESP32와 MicroPython으로 IR 슬롯형 광학 속도 센서를 사용하는 방법을 알아봅니다. 자세히 배울 내용은 다음과 같습니다:
- 슬롯 센서가 틈이 비어 있는지 막혀 있는지 아는 방법
- IR 슬롯 센서를 ESP32에 연결하고 틈에 인코더 디스크를 놓는 방법
- ESP32용 MicroPython 코드를 작성하여 물체를 세고 모터의 속도를 RPM(분당 회전수)으로 측정하는 방법

준비물
| 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 | × | IR Slotted Optical Speed Sensor | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (옵션) Breadboard | 쿠팡 | 아마존 | |
| 1 | × | (추천) ESP32용 스크루 터미널 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) Breakout Expansion Board for ESP32 | 쿠팡 | 아마존 | |
| 1 | × | (추천) ESP32용 전원 분배기 | 쿠팡 | 아마존 |
IR 슬롯형 광학 속도 센서에 대하여
모듈을 옆에서 보면 U자 모양입니다. 두 팔 사이에는 열린 통로가 있고, 이 통로에서 감지가 이루어집니다. 메이커들은 이 부품을 옵토 인터럽터 또는 포토 인터럽터라고 부릅니다. 출력이 디지털이므로 MicroPython은 핀 하나에서 0 또는 1만 읽으면 됩니다.
| IR 슬롯형 광학 속도 센서 | |
|---|---|
| 센서 종류 | 슬롯형 광전 센서(IR LED + NPN 포토트랜지스터) |
| 슬롯 폭 | 5.9 mm |
| 동작 전압 | 3.3V ~ 5V DC |
| 출력 | 디지털(TTL) - 막히면 LOW, 비어 있으면 HIGH |
| 신호 처리 | 내장 슈미트 트리거 |
| 장착 | 양 끝에 M3 나사 구멍 |
| 핀 | 3개(VCC, GND, OUT) |
어디에 쓸 수 있을까요? 몇 가지 아이디어입니다:
- 슬롯이 있는 인코더 디스크로 모터의 RPM 읽기
- 작은 회전계 만들기
- 틈을 지나가는 펄스나 물건 세기
- 바퀴 회전 수를 세어 로봇이 이동한 거리 구하기
- 로봇 자동차에 바퀴 속도 피드백 주기
- 움직이는 부품의 끝 위치(리미트) 감지하기
핀 배치

- VCC 핀: ESP32의 3.3V 핀에 연결합니다(모듈은 3.3V에서 5V까지 받을 수 있습니다)
- GND 핀: GND(0V)에 연결합니다
- OUT 핀: ESP32의 GPIO에 연결합니다. 여기서는 GPIO18입니다. 통로가 막히면 0, 열려 있으면 1을 읽습니다
제조 묶음에 따라 이 세 핀의 순서가 다를 수 있습니다. 사진이 아니라 보드에 적힌 표기를 믿으세요.
전원에 대한 주의: OUT의 전압은 VCC의 전압만큼 올라갈 수 있습니다. ESP32의 GPIO 핀은 3.3V에서 작동합니다. 모듈에 5V를 공급하면 OUT이 GPIO에 5V를 밀어 넣을 수 있습니다. 그러니 3.3V 핀에서 전원을 받으면 신호가 안전합니다.
작동 원리

왼쪽 팔 안에는 적외선 LED가 있습니다. 오른쪽 팔 안에는 NPN 포토트랜지스터가 있습니다. 둘은 5.9 mm 통로를 사이에 두고 서로를 똑바로 바라봅니다.
- 통로가 비어 있을 때: 보이지 않는 빛이 포토트랜지스터에 닿습니다. Pin.value()는 1을 반환합니다.
- 카드, 손가락, 또는 인코더 디스크의 이빨 하나가 통로에 있을 때: 빛이 차단됩니다. Pin.value()는 0을 반환합니다.
모듈에는 슈미트 트리거도 있습니다. 천천히 변하는 빛의 세기를 또렷한 0 또는 1로 바꿔 줍니다. 덕분에 신호가 튀지 않아서 MicroPython 스크립트에 디바운스 코드가 필요 없습니다.
빛이 통과하지 못하는 물체를 고르세요. 얇고 투명한 플라스틱 판은 IR 빛을 통과시킬 수 있으며, 그러면 센서는 계속 "비어 있음"으로 읽습니다.
모든 브랜드가 같은 로직을 쓰는 것은 아닙니다. 다른 제조사의 일부 모듈에서는 출력이 반대입니다. 통로가 비어 있는데 막혔다고 나오면 첫 번째 스크립트에서 0과 1을 서로 바꾸세요. RPM 스크립트는 어느 쪽이든 이빨마다 에지 하나를 세므로 바꿀 필요가 없습니다.
선연결
ESP32와 슬롯 센서 배선
모듈에는 점퍼 와이어 세 개만 있으면 됩니다. 브레드보드는 선택 사항입니다. 연결을 단단하게 하고 싶다면 ESP32용 나사 단자 브레이크아웃 보드를 사용할 수도 있습니다.

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
| 속도 센서 핀 | ESP32 핀 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| OUT | GPIO18 |
슬롯에 인코더 디스크 놓기
속도를 재려면 가장자리에 구멍이나 이빨이 있는 둥근 디스크가 필요합니다. 디스크가 돌면 이빨 하나하나가 잠깐씩 빛을 막고, 한 번 막힐 때마다 펄스 하나가 됩니다. 디스크를 모터 축이나 바퀴에 끼우세요. 그런 다음 디스크의 가장자리가 통로 안에서 돌도록 M3 구멍으로 모듈을 나사로 고정하세요. 손으로 디스크를 한 바퀴 돌려 보고 센서에 닿지 않는지 확인하세요.
처음에는 손가락으로 천천히 돌리는 것으로 충분합니다. 모터로 디스크를 돌리고 싶다면 모터에는 별도의 배선이 있습니다. ESP32 마이크로파이썬 - DC 모터에서 찾을 수 있습니다.
ESP32 마이크로파이썬 코드 - 슬롯을 지나가는 물체 세기
이 첫 번째 스크립트는 빠른 루프에서 GPIO18을 폴링합니다. 마지막으로 본 값을 기억해 두고, 새 값이 다르면 한 줄을 출력합니다. 0으로 바뀔 때는 카운터에 1도 더합니다.
빠른 단계
Thonny IDE를 사용하여 ESP32에서 MicroPython 코드를 설정하고 실행하는 방법은 다음과 같습니다:
- 컴퓨터에 Thonny IDE가 설치되어 있는지 확인하세요.
- ESP32 보드에 MicroPython 펌웨어가 설치되어 있는지 확인하세요.
- ESP32에서 MicroPython이 처음이신가요? ESP32 마이크로파이썬 - 시작하기 가이드부터 시작하세요.
- 제공된 다이어그램에 따라 IR 슬롯형 광학 속도 센서를 ESP32 보드에 연결하세요.
- USB 케이블로 ESP32 보드를 컴퓨터에 연결하세요.
- 컴퓨터에서 Thonny IDE를 여세요.
- Thonny IDE에서 도구 옵션으로 이동하세요.
- 인터프리터 탭에서 드롭다운 메뉴의 MicroPython (ESP32)를 선택하고, 올바른 포트가 선택되어 있는지 확인하세요(예: Windows에서는 COM12, Linux에서는 /dev/ttyUSB0).
- 제공된 MicroPython 코드를 복사하여 Thonny 편집기에 붙여넣으세요.
- 코드를 ESP32에 저장하려면:
- 저장 버튼을 클릭하거나 Ctrl+S를 누르세요.
- 저장 대화 상자에서 MicroPython 장치를 선택하세요.
- 파일 이름을 main.py로 지정하세요.
- 초록색 실행 버튼을 클릭하거나 (또는 F5 키를 눌러) 스크립트를 실행하세요.
- 종이 카드 조각을 틈에 밀어 넣었다가 빼고, 이를 두 번 더 반복하세요.
- Thonny 하단의 Shell에서 메시지를 확인하세요.
스크립트 이름을 main.py로 지정하여 MicroPython 장치에 저장하면, ESP32의 전원이 켜질 때마다 자동으로 실행됩니다.
ESP32 마이크로파이썬 코드 - 모터 속도(RPM) 읽기
두 번째 스크립트는 모듈을 회전계로 바꿉니다. 디스크가 빠르게 돌 때는 폴링이 너무 느리므로, 이 스크립트는 대신 인터럽트를 사용합니다. sensor.irq(trigger=Pin.IRQ_FALLING, handler=count_pulse) 줄은 핀이 1에서 0으로 떨어지는 바로 그 순간에 ESP32가 count_pulse()를 호출하도록 합니다. 이 하강은 이빨마다 한 번 일어나므로 같은 이빨이 두 번 세어지지 않습니다.
메인 루프는 1초 동안 쉬고, 카운터를 복사한 다음, 카운터를 지웁니다. 그리고 계산을 합니다:
- 20슬롯 디스크가 한 바퀴 돌면 펄스 20개가 나옵니다.
- 1초 동안의 펄스 × 60 = 1분 동안의 펄스.
- 1분 동안의 펄스 ÷ 20 = 분당 회전수, 즉 RPM.
20슬롯은 TT 기어 모터에 딸려 오는 디스크의 일반적인 슬롯 수입니다. 디스크가 다른가요? SLOTS_PER_TURN을 실제 슬롯 수로 설정하세요.
빠른 단계
- 인코더 디스크 그림처럼 디스크와 모듈을 장착하세요. 같은 세 개의 선을 유지합니다.
- 제공된 MicroPython 코드를 복사하여 Thonny 편집기에 붙여넣으세요.
- MicroPython 장치에 저장하세요. main.py라는 이름의 파일은 하나만 있을 수 있습니다. 같은 이름을 다시 쓰면 이 스크립트가 첫 번째 스크립트를 대체합니다. 둘 다 보관하고 싶다면 이 스크립트에는 rpm.py 같은 다른 이름을 지어 주세요.
- 초록색 실행 버튼을 클릭하거나 (또는 F5 키를 눌러) 스크립트를 실행하세요.
- 손으로 디스크를 돌리거나 모터를 켜세요.
- Thonny 하단의 Shell에서 메시지를 확인하세요. 아래 예시에서는 모터가 멈춘 상태에서 시작해 300 RPM 근처로 돌다가 멈춥니다.
main.py라는 이름의 파일만 전원이 켜질 때 저절로 시작됩니다. 그러니 혼자 실행하고 싶은 스크립트를 그 이름으로 저장하고, 다른 하나는 다른 이름으로 보관하세요.
거리도 알고 싶나요? 바퀴가 한 바퀴 돌면 로봇은 바퀴 둘레, 즉 π × 바퀴 지름만큼 움직입니다. 여기에 회전 수를 곱하세요.
좁은 틈 안이 아니라 로봇 앞의 물체를 감지해야 하나요? ESP32 마이크로파이썬 - 장애물 회피 센서을 사용해 보세요.
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.