아두이노 나노 ESP32 IR 슬롯형 광학 속도 센서
이 가이드에서는 아두이노 나노 ESP32로 IR 슬롯형 광학 속도 센서를 사용하는 방법을 배웁니다. 자세히 배울 내용은 다음과 같습니다:
- 물체가 센서의 틈에 있을 때 슬롯 센서가 왜 LOW 신호를 내는지.
- 센서를 아두이노 나노 ESP32의 3.3V 핀과 D2 핀에 연결하는 방법.
- 틈을 지나가는 모든 물체를 세도록 아두이노 나노 ESP32를 프로그래밍하는 방법.
- 빠른 메모리에 둔 인터럽트 함수를 사용하여 디스크의 회전 속도를 RPM으로 읽도록 아두이노 나노 ESP32를 프로그래밍하는 방법.

준비물
| 1 | × | 아두이노 나노 ESP32 | 쿠팡 | 아마존 | |
| 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 커넥터 전원 연결 잭 플러그 소켓 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 나노용 스크루 터미널 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 나노용 브레이크아웃 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 나노 ESP32용 전원 분배기 | 쿠팡 | 아마존 |
IR 슬롯형 광학 속도 센서에 대하여
센서를 옆에서 보면 U자 모양입니다. U자의 왼쪽과 오른쪽 벽 안쪽에는 서로 마주 보는 작은 부품 두 개가 있습니다: 한쪽 벽에는 적외선 LED, 다른 쪽 벽에는 NPN 포토트랜지스터입니다. 둘 사이의 빈 공간은 폭이 5.9 mm입니다. 일부 판매자는 이 부품을 옵토 인터럽터, 포토 인터럽터, 또는 간단히 IR 슬롯 센서라고 부릅니다. 모두 같은 것입니다.
작동 원리

작은 빛의 문이라고 생각하세요. LED는 절대 꺼지지 않고, 포토트랜지스터는 그 빛을 계속 지켜봅니다.
- 틈에 아무것도 없으면 → 포토트랜지스터가 빛을 받음 → OUT은 HIGH를 읽습니다.
- 틈에 단단한 물체(종이 카드 조각, 손가락 끝, 인코더 디스크의 이빨 하나)가 있으면 → 빛이 차단됨 → OUT은 LOW를 읽습니다.
모듈에는 슈미트 트리거가 있습니다. 이것이 빛의 세기를 떨림 없이 또렷한 0 또는 1로 바꿔 줍니다. 덕분에 스케치에 디바운스 코드가 필요 없습니다.
기억해 둘 점:
- 유리와 투명 플라스틱은 적외선을 통과시킬 수 있으므로 센서가 보지 못할 수 있습니다. 빛이 통과하지 못하는 물체를 고르세요.
- 다른 브랜드의 일부 모듈은 반대 로직을 사용합니다: 틈이 비어 있을 때 LOW. 아래 첫 번째 스케치가 틈에 아무것도 없는데 "막힘"이라고 알리면, 그 스케치에서 LOW와 HIGH를 서로 바꾸세요. 속도 스케치는 이빨 하나당 한 번의 엣지를 세므로 두 종류 모두 문제없습니다.
사양
| IR 슬롯형 광학 속도 센서 | |
|---|---|
| 센서 종류 | 슬롯형 광전 센서 (IR LED + NPN 포토트랜지스터) |
| 슬롯 폭 | 5.9 mm |
| 동작 전압 | 3.3V ~ 5V DC |
| 출력 | 디지털 (TTL), 막히면 LOW, 비어 있으면 HIGH |
| 신호 처리 | 내장 슈미트 트리거 |
| 장착 | 양 끝에 M3 나사 구멍 |
| 핀 | 3개 (VCC, GND, OUT) |
사용 예:
- 회전계: 모터에 인코더 디스크를 달고 RPM을 읽습니다.
- 로봇 바퀴가 얼마나 빨리 도는지에 대한 피드백.
- 부품, 펄스, 또는 벨트 위의 물건 세기.
- 바퀴가 몇 번 도는지 세어서 거리 구하기.
- 움직이는 접점이 없는 엔드 스톱 또는 홈 위치 스위치.
핀아웃

- OUT 핀: 디지털 신호. 아두이노 나노 ESP32의 디지털 입력에 연결합니다 (이 가이드에서는 D2).
- GND 핀: GND(0V)에 연결합니다.
- VCC 핀: 아두이노 나노 ESP32의 3.3V 핀에 연결합니다. 모듈은 3.3V에서 5V까지 동작합니다.
생산 묶음마다 다를 수 있으며, 세 핀의 순서가 다를 수 있습니다. 그림의 순서가 아니라 가지고 있는 보드의 라벨을 믿으세요.
선연결
나노 ESP32는 3.3V 로직으로 동작하며, 입력 핀은 5V용으로 만들어지지 않았습니다. OUT 신호는 VCC 전압만큼 올라가므로, 센서를 5V가 아니라 3.3V 핀에서 전원을 공급합니다. 이렇게 하면 D2는 3.3V 이상을 받지 않습니다.

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
D2는 인터럽트도 받을 수 있으며, 속도 스케치에서 나중에 이것을 사용합니다.
IR 슬롯형 광학 속도 센서를 위한 프로그래밍 방법
이 센서를 읽는 방법은 두 가지입니다. 어느 쪽이 맞는지는 틈을 지나가는 물체가 얼마나 빠른지에 따라 다릅니다.
방법 1 - loop()에서 핀 읽기 (느린 물체에 적합):
- 보드에 D2가 입력이라고 알려 줍니다.
- 값을 읽습니다. LOW 값은 틈이 막혔다는 뜻입니다.
- 새 값이 이전 값과 다를 때만 동작하고, 다음을 위해 저장합니다.
방법 2 - 인터럽트가 세게 하기 (회전하는 디스크에 필요):
- 인터럽트 함수가 백그라운드에서 값을 바꾸므로, 카운터를 volatile 키워드로 만듭니다.
- 인터럽트 함수를 작성합니다. ESP32 칩에서는 함수 이름 앞에 IRAM_ATTR를 붙입니다. 이렇게 하면 함수가 칩의 빠른 내부 RAM에 놓여, 매번 즉시 실행될 수 있습니다.
- 함수를 D2에 연결합니다. FALLING은 OUT이 HIGH에서 LOW로 떨어질 때 함수가 실행된다는 뜻이며, 이빨이 틈에 들어올 때마다 한 번씩 일어납니다.
- 1초마다 카운트를 가져오고, 0으로 되돌리고, RPM으로 바꿉니다.
계산은 어떻게 될까요? 디스크에 슬롯이 20개 있다고 합시다. 그러면 펄스 20개가 한 바퀴입니다. 1초 동안의 펄스에 60을 곱하면 분당 펄스 수가 됩니다. 이것을 20으로 나누면 분당 회전수, 즉 RPM이 됩니다.
아두이노 나노 ESP32 코드 - 슬롯을 지나가는 물체 세기
아래 스케치는 D2를 계속 읽습니다. 틈이 비어 있다가 막힐 때, 또는 그 반대일 때만 시리얼 모니터에 새 줄이 나타납니다. 막힐 때마다 카운터가 1씩 올라갑니다.
빠른 단계
다음 지침을 단계별로 따르세요:
- 나노 ESP32가 처음이라면, 먼저 아두이노 나노 ESP32 - 소프트웨어 설치을 살펴보세요.
- 제공된 다이어그램에 따라 부품을 배선하세요. VCC가 3.3V에 연결되었는지 다시 확인하세요.
- Type-C 케이블로 아두이노 나노 ESP32를 컴퓨터에 연결하세요.
- 컴퓨터에서 아두이노 IDE를 실행하세요.
- 알맞은 아두이노 나노 ESP32 보드(예: Arduino Nano ESP32)와 COM 포트를 선택하세요.
- 코드를 새 스케치에 붙여넣으세요.
- Upload 버튼을 누르고 끝날 때까지 기다리세요.
- 아두이노 나노 ESP32 - 시리얼 모니터를 열고 9600 보드를 선택하세요.
- 카드 조각을 틈에 밀어 넣고, 잠깐 잡고 있다가 빼세요. 두 번 더 반복하세요.
- 메시지를 읽어 보세요:
카드가 들어갈 때 "blocked" 줄이 한 번, 나올 때 "clear" 줄이 한 번 나옵니다. 가만히 잡고 있는 동안에는 화면이 조용합니다.
아두이노 나노 ESP32 코드 - 모터 속도 읽기 (RPM)
빠른 디스크는 loop()가 두 번 도는 사이에 많은 이빨을 틈으로 통과시킬 수 있으므로, 폴링으로는 일부를 놓칩니다. 이 스케치는 대신 인터럽트를 사용합니다. countPulse() 함수에는 IRAM_ATTR가 붙어 있어서 ESP32가 빠른 메모리에 두고 바로 점프할 수 있습니다. 스케치는 1초에 한 번, 받은 펄스 수와 속도를 RPM으로 출력합니다.
위쪽 근처에서 SLOTS_PER_TURN을 찾아보세요. 이 값은 20이며, TT 기어 모터에 보통 함께 오는 인코더 디스크의 슬롯 수입니다. 가지고 있는 디스크의 슬롯을 세어 보고 20이 아니면 이 숫자를 넣으세요.
인코더 디스크 장착하기
- 디스크를 모터 축에 끼웁니다 (또는 바퀴에 붙입니다).
- 이빨이 있는 디스크의 가장자리가 틈 안에서 지나가도록 센서를 맞춥니다.
- 디스크를 손으로 천천히 돌려 U자의 벽에 닿지 않는지 확인합니다.
- 돌리려면 손을 쓰거나 모터를 작동시키세요. 모터는 자체 배선이 있으며, 아두이노 나노 ESP32 - DC 모터 튜토리얼에서 다룹니다.
빠른 단계
- 센서 배선은 바꾸지 마세요.
- RPM 코드를 아두이노 IDE에 붙여넣으세요.
- Upload를 누르세요.
- 9600 보드로 시리얼 모니터를 여세요.
- 디스크를 돌리고, 그다음 멈추게 하세요.
- 숫자를 지켜보세요. 이번 실행에서는 모터가 약 300 RPM으로 돕니다:
101 줄로 계산해 보세요: 101 × 60 ÷ 20 = 303 RPM. 첫 줄과 마지막 줄은 디스크가 움직이지 않으므로 0입니다.
로봇 바퀴라면 얼마나 멀리 굴러갔는지도 구할 수 있습니다: 회전 수 × π × 바퀴 지름.
※ 주의:
- countPulse() 안에는 코드를 아주 조금만 넣으세요. 여기서는 절대 출력하지 마세요.
- 인터럽트 함수가 바꾸는 모든 변수에는 volatile 키워드가 필요합니다.
- 인터럽트 함수 앞에 IRAM_ATTR를 유지하여 빠른 메모리에 있게 하세요.
- 센서 앞(틈 안이 아님)의 물체를 감지하려면 아두이노 나노 ESP32 - 장애물 센서 튜토리얼을 보세요. 방향도 알려 주는 노브는 아두이노 나노 ESP32 - 로터리 엔코더 튜토리얼을 보세요.
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.