072_포토인터럽터_빛가림감지와_회전계측 ⚡🎡
보이지 않는 적외선 광선검을 통과하는 순간을 포착하라! U자형 포토 인터럽터(Photo Interrupter)의 원리와 초고속 회전 계측
적외선 발광-수광 소자의 동작 원리, 휠 엔코더 슬롯 디스크를 활용한 모터 회전수(RPM) 측정, 아두이노 외부 인터럽트(Interrupt) 기반의 고속 펄스 카운팅 스케치를 학습합니다.

- 🖥️ 강의 슬라이드: slides.md
1. 포토 인터럽터(Photo Interrupter)란 무엇일까요? 🔦
프린터에 종이를 넣을 때 종이가 쏙 들어가면 어떻게 프린터가 종이를 알아챌까요?
또 빠르게 도는 로봇 바퀴의 속도를 어떻게 1초에 수백 번씩 정확하게 잴 수 있을까요?
그 비밀이 바로 포토 인터럽터(Photo Interrupter / Slotted Optical Switch)에 있습니다!
👧 도로시: “지니야! 초음파 센서는 거리를 재고 조도 센서는 밝기를 재는데, 물체가 지나가는 찰나의 순간을 정확히 감지하려면 어떤 센서를 써야 해?”
🐱 지니: “그럴 땐 U자 모양 홈 사이에 보이지 않는 적외선 빔을 쏘고 있는 포토 인터럽터가 최고란다! 빛이 차단되는 순간을 전기가 1마이크로초 만에 감지하거든!”
🐶 토토: “멍멍! (빛을 가로막으면 찰칵하고 신호가 뜬다 멍!)”
2. 센서 내부 구조와 동작 원리 🔍
포토 인터럽터는 U자형 플라스틱 몸체 양쪽에 서로 마주 보는 두 개의 전자 부품을 품고 있습니다.
[ U자형 포토 인터럽터 내부 구조 ]
┌─────────────┐ 슬롯 (틈새) ┌─────────────┐
│ 발광 소자 │ ───────────────────> │ 수광 소자 │
│ (IR LED) │ 적외선 빛(Beam) │(포토트랜지스터)│
└─────────────┘ └─────────────┘
▲ │
│ ▼
[ 5V 전원 ] [ 신호 출력 (OUT) ]
- 빛 통과 시: LOW (0)
- 물체 차단: HIGH (1)
- 발광부 (IR LED): 사람 눈에는 보이지 않는 적외선(Infrared) 빛을 반대편으로 쉬지 않고 발사합니다.
- 수광부 (포토트랜지스터): 마주 오는 적외선 빛을 받으면 전기가 통하는(ON) 빛 감지 스위치입니다.
- 물체 통과 시:
- 틈새에 아무것도 없을 때 ➡️ 빛이 도달함 ➡️ 출력 핀 = LOW (0V)
- 종이나 회전판 날개가 틈새를 가릴 때 ➡️ 빛이 차단됨 ➡️ 출력 핀 = HIGH (5V)
3. 센서 모듈 핀맵과 배선도 📌
시중에서 가장 많이 쓰이는 아두이노용 포토 인터럽터 모듈(LM393 비교기 내장형)은 3개 또는 4개의 핀으로 구성됩니다.
| 모듈 핀 이름 | 아두이노 우노 연결 핀 | 기능 및 역할 |
|---|---|---|
| VCC | 5V | 센서 전원 공급 (3.3V ~ 5V 호환) |
| GND | GND | 전원 접지 |
| DO (Digital Out) | D2 (디지털 2번) | 차단 감지 디지털 신호 (외부 인터럽트 INT0 활용) |
| AO (Analog Out) | 연결 안 함 (선택) | 수광량에 따른 미세 전압 (보통 DO만 사용) |
💡 하드웨어 팁: 모듈 기판에는 작은 가변저항(감도 조절용)과 상태 표시 LED가 있습니다. 슬롯 사이에 명함이나 종이를 끼웠을 때 모듈의 LED가 번쩍 켜지는지 먼저 확인하세요!
4. 슬롯 디스크(Wheel Encoder)와 RPM 계산 공식 🎡
모터 축에 구멍(슬롯)이 뚫린 둥근 원판(슬롯 디스크)을 끼우고, 디스크 날개가 포토 인터럽터의 틈을 지나가게 하면 바퀴의 회전 속도를 완벽하게 측정할 수 있습니다.
[ RPM (분당 회전수) 계산 마법 공식 ]
1초 동안 들어온 펄스 개수 (Pulse Count)
회전수 = ────────────────────────────────────── × 60초
원판 1바퀴당 뚫린 슬롯 개수 (예: 20개)
예를 들어 원판 구멍이 20개인데 1초 동안 200번의 펄스가 감지되었다면:
RPM = (200 / 20) * 60 = 600 RPM (1분에 600바퀴 회전!)
5. 실전 실습: 외부 인터럽트(Interrupt) 기반 초고속 RPM 계측기 🚀
모터가 빠르게 회전할 때는 digitalRead()를 루프에서 읽으면 펄스를 놓칠 수 있습니다.
따라서 아두이노의 하드웨어 외부 인터럽트(attachInterrupt)를 사용하여 빛이 차단되는 순간 CPU가 즉각 카운트하도록 작성합니다.
/*
* [아두이노 우노 포토 인터럽터 RPM 계측 스케치]
* 배선: DO -> D2 (INT0), VCC -> 5V, GND -> GND
* 슬롯 디스크 구멍 수: 20개
*/
const byte sensorPin = 2; // D2번 핀 (우노 하드웨어 인터럽트 0번)
const int SLOTS_PER_REV = 20; // 휠 엔코더 원판 1바퀴당 구멍 수
volatile unsigned long pulseCount = 0; // 인터럽트 서비스 루틴에서 증가시킬 펄스 변수
unsigned long prevMillis = 0;
// [인터럽트 서비스 루틴 (ISR)] 빛이 차단될 때마다 초고속 자동 호출!
void countPulse() {
pulseCount++;
}
void setup() {
Serial.begin(115200);
pinMode(sensorPin, INPUT_PULLUP);
// 2번 핀의 전압이 LOW에서 HIGH로 솟구칠 때(RISING) 인터럽트 발생!
attachInterrupt(digitalPinToInterrupt(sensorPin), countPulse, RISING);
Serial.println(F("========================================"));
Serial.println(F(" 🎡 포토 인터럽터 실시간 RPM 측정기 가동 "));
Serial.println(F("========================================"));
}
void loop() {
// 정확히 1초(1000ms)마다 RPM을 계산하여 출력
if (millis() - prevMillis >= 1000) {
detachInterrupt(digitalPinToInterrupt(sensorPin)); // 계산 중 값 변동 방지 (잠시 정지)
// 1초간 누적된 펄스로 RPM 산출
float rpm = ((float)pulseCount / SLOTS_PER_REV) * 60.0;
Serial.print(F("[측정 결과] 1초간 통과 펄스: "));
Serial.print(pulseCount);
Serial.print(F(" 개 | 모터 회전 속도: "));
Serial.print(rpm, 1);
Serial.println(F(" RPM"));
pulseCount = 0; // 펄스 카운터 초기화
prevMillis = millis();
attachInterrupt(digitalPinToInterrupt(sensorPin), countPulse, RISING); // 인터럽트 재개
}
}
🌟 도로시와 지니의 핵심 요약! 🏆

- 광학 비접촉 센서: U자형 홈 사이의 적외선 빔이 물체에 가려지는 순간을 마이크로초 단위로 감지합니다.
- 휠 엔코더의 짝꿍: 구멍 뚫린 원판과 결합하여 바퀴 회전수(RPM) 및 이동 거리를 완벽하게 산출합니다.
- 외부 인터럽트 필수: 초고속으로 회전하는 모터의 펄스를 누락 없이 세기 위해
attachInterrupt()를 사용합니다. - 다양한 실생활 응용: 프린터 종이 감지, 코인 계수기, 공장 컨베이어 벨트 물품 수량 카운팅에 핵심 부품으로 사용됩니다.
👧 도로시: “빛을 가르는 것만으로 모터가 1분에 몇 바퀴 도는지 숫자로 딱 나오는 게 너무 신기해!”
🐱 지니: “광학 비접촉 방식으로 물체를 세어보았으니, 다음 챕터에서는 물리적으로 철컥 부딪쳐서 기계의 끝을 알려주는 ‘173_리미트스위치_기계식엔드스탑과_충돌감지’를 정복해 보자!”