라즈베리 파이 IR 슬롯형 광학 속도 센서
이 튜토리얼에서는 라즈베리 파이로 IR 슬롯형 광학 속도 센서의 펄스를 짧은 Python 스크립트로 읽는 방법을 안내합니다. 이 부품은 포토 인터럽터 또는 옵토 인터럽터라고도 부릅니다. 좁은 틈을 무언가 지나가면 이를 알아챕니다. 이 신호 하나로 라즈베리 파이는 물체를 세거나 바퀴나 모터 축이 얼마나 빨리 도는지 알 수 있습니다. 자세히 다음을 배웁니다:
- 틈이 열려 있을 때와 막혔을 때 U자형 IR 센서 내부에서 일어나는 일
- IR 슬롯 센서를 3.3V로 라즈베리 파이 4의 GPIO 헤더에 연결하는 방법
- 슬롯을 지나가는 모든 물체를 세도록 라즈베리 파이를 프로그래밍하는 방법
- 인코더 디스크와 GPIO 이벤트 콜백으로 모터의 속도를 RPM으로 측정하도록 라즈베리 파이를 프로그래밍하는 방법
다음을 추천합니다:
- 손으로 돌리는 노브이면서 회전 방향도 알려 주는 부품이 필요하다면 라즈베리 파이 - 로터리 인코더를 사용하세요.
- 물체가 센서 앞쪽 몇 센티미터 떨어진 곳에 있고 슬롯에 들어갈 수 없다면 라즈베리 파이 - 장애물 센서를 사용하세요.

준비물
| 1 | × | 라즈베리 파이 5 | 쿠팡 | 아마존 | |
| 1 | × | IR Slotted Optical Speed Sensor | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (옵션) Breadboard | 쿠팡 | 아마존 | |
| 1 | × | (추천) 라즈베리 파이용 스크루 터미널 블록 쉴드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 라즈베리 파이 프로토타이핑 베이스 플레이트 & 브레드보드 키트 | 아마존 |
IR 슬롯형 광학 속도 센서에 대하여
모듈을 옆에서 보면 U자 모양이 보입니다. U의 두 팔은 5.9 mm 너비의 틈을 사이에 두고 마주 보고 있습니다. 한쪽 팔에는 적외선 LED가 있고, 다른 쪽 팔에는 NPN 포토트랜지스터가 있습니다. LED는 틈 너머로 항상 빛을 비추고, 포토트랜지스터는 그 빛을 지켜봅니다.
| IR 슬롯형 광학 속도 센서 | |
|---|---|
| 센서 종류 | 슬롯형 광전 센서 (IR LED + NPN 포토트랜지스터) |
| 슬롯 너비 | 5.9 mm |
| 동작 전압 | 3.3V ~ 5V DC |
| 출력 | 디지털 (TTL), 막히면 LOW, 열려 있으면 HIGH |
| 신호 처리 | 내장 슈미트 트리거 |
| 장착 | 양쪽 끝에 M3 나사 구멍 |
| 핀 | 3개 (VCC, GND, OUT) |
이 센서는 다음과 같은 용도로 쓰입니다:
- 인코더 디스크가 달린 모터의 속도(RPM) 측정
- 간단한 회전계 만들기
- 물체나 펄스 세기
- 바퀴가 몇 번 도는지 세어 거리 측정
- 로봇 바퀴의 속도 피드백
- 한계 위치나 홈 위치 감지
작동 방식

OUT 핀은 빛의 경로를 따릅니다:
- 틈이 비어 있음: 적외선이 포토트랜지스터에 닿으므로 OUT은 HIGH를 유지합니다.
- 틈에 불투명한 것이 있음(카드 조각이나 인코더 디스크의 이빨 하나): 빛이 건너가지 못하므로 OUT이 LOW로 떨어집니다.
보드에는 슈미트 트리거도 있습니다. 이것이 원래 신호를 가장자리에서 떨림 없는 깨끗한 0 또는 1로 바꿔 줍니다. 덕분에 Python 스크립트에 디바운스 코드가 필요 없습니다.
기억해 둘 작은 점 두 가지:
- 투명한 플라스틱이나 유리는 IR 빛을 통과시킬 수 있어서 센서가 보지 못할 수 있습니다. 불투명한 물체를 사용하세요.
- 다른 제조사의 일부 모듈은 반대로 동작합니다. 틈이 비어 있는데 모듈이 "막힘"으로 알려 준다면 첫 번째 스크립트에서 LOW와 HIGH를 바꾸세요. RPM 스크립트는 이빨 하나당 에지를 한 번 세므로 어느 쪽이든 올바른 속도를 줍니다.
IR 슬롯형 광학 속도 센서 핀 배열

모듈에는 핀이 세 개 있습니다:
- VCC: 이 핀은 전원(3.3V ~ 5V)에 연결해야 합니다. 라즈베리 파이에서는 3.3V를 사용하세요.
- GND: 이 핀은 그라운드(0V)에 연결해야 합니다
- OUT: 이 핀은 디지털 신호를 라즈베리 파이의 GPIO 입력 핀으로 보냅니다
※ 주의:
모듈의 핀 배열은 제조사마다, 심지어 생산 배치마다 다를 수 있습니다. 모듈을 사용할 때는 항상 모듈에 인쇄된 표기를 확인하는 것이 매우 중요합니다. 꼼꼼히 살펴보세요!
선연결

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
배선 구성을 간단하고 체계적으로 만들기 위해, Raspberry Pi용 스크루 터미널 블록 실드 사용을 권장합니다. 이 실드는 아래와 같이 더욱 안정적이고 관리하기 쉬운 연결을 제공합니다:

- 센서 VCC 핀을 라즈베리 파이 3.3V(핀 1)에 연결
- 센서 GND 핀을 라즈베리 파이 GND(핀 6 또는 다른 GND 핀)에 연결
- 센서 OUT 핀을 라즈베리 파이 GPIO17(핀 11)에 연결
WARNING
이 센서를 라즈베리 파이의 5V 핀으로 전원 공급하지 마세요. OUT 핀은 VCC 전압까지 올라갑니다. VCC가 5V이면 OUT이 GPIO17로 5V를 보내게 되는데, 라즈베리 파이 GPIO 핀은 3.3V만 받을 수 있습니다. 센서를 3.3V로 전원 공급하면 OUT 신호가 안전하게 유지됩니다.
속도 측정을 위한 인코더 디스크 설치
두 번째 스크립트에는 인코더 디스크가 필요합니다. 가장자리를 따라 슬롯이 뚫린 둥근 디스크입니다.
- 디스크를 모터 축이나 바퀴에 고정합니다.
- M3 나사 구멍으로 센서를 장착하여 디스크의 가장자리가 틈 안에서 움직이게 합니다.
- 디스크의 이빨이 센서 팔에 닿지 않고 슬롯을 지나가는지 확인합니다.
디스크를 손으로 돌리거나 모터를 작동시킬 수 있습니다. 모터 배선은 이 페이지에서 다루지 않습니다. 라즈베리 파이로 모터를 구동하려면 라즈베리 파이 - DC 모터 튜토리얼을 참조하세요.
IR 슬롯형 광학 속도 센서로 물체를 감지하고 세는 라즈베리 파이 프로그래밍 방법
이 첫 번째 스크립트는 루프에서 GPIO17을 계속 확인합니다. 핀의 상태가 바뀔 때만 한 줄을 출력합니다. 틈이 막힐 때마다 카운트가 1씩 올라갑니다.
빠른 단계
- 라즈베리 파이에 Raspbian 또는 다른 라즈베리 파이 호환 운영 체제가 설치되어 있는지 확인합니다.
- 라즈베리 파이가 PC와 같은 로컬 네트워크에 연결되어 있는지 확인합니다.
- 라이브러리를 설치해야 하면 라즈베리 파이가 인터넷에 연결되어 있는지 확인합니다.
- 라즈베리 파이를 처음 사용한다면 라즈베리 파이 - 소프트웨어 설치을 참조하세요.
- Linux와 macOS의 내장 SSH 클라이언트 또는 Windows의 PuTTY를 사용하여 PC를 SSH로 라즈베리 파이에 연결합니다.
- RPi.GPIO 라이브러리가 설치되어 있는지 확인합니다. 없다면 다음 명령으로 설치합니다:
- 위의 배선도와 같이 센서를 라즈베리 파이에 연결합니다.
- Python 스크립트 파일 OpticalSpeedSensor.py를 만들고 다음 코드를 추가합니다:
- 파일을 저장하고 다음 명령으로 스크립트를 시작합니다:
- 카드 조각이나 손가락을 틈에 넣었다가 빼 보세요. 몇 번 반복합니다.
- 터미널에서 결과를 확인합니다.
아무것도 바뀌지 않는 동안 터미널은 조용합니다. 틈이 막히거나 다시 열리는 순간에만 새 줄이 나타납니다. 스크립트는 터미널에서 Ctrl + C 키를 누를 때까지 계속 지켜봅니다. 그다음 종료하기 전에 GPIO 핀을 정리합니다.
IR 슬롯형 광학 속도 센서로 모터 속도(RPM)를 측정하는 라즈베리 파이 프로그래밍 방법
디스크가 빠르게 돌면 펄스가 아주 빠르게 들어옵니다. 위와 같은 단순한 루프는 일부를 놓칠 수 있습니다. 그래서 이 스크립트는 GPIO.add_event_detect()로 RPi.GPIO가 백그라운드에서 핀을 지켜보게 합니다. FALLING 에지(이빨이 틈을 막는 순간)마다 카운터에 1을 더하는 작은 함수가 호출됩니다. 이렇게 하면 이빨 하나가 정확히 한 번의 카운트를 줍니다.
스크립트는 1초에 한 번 카운터를 읽고, 0으로 되돌리고, 속도를 계산합니다:
- 20슬롯 디스크가 한 바퀴 돌면 펄스 20개가 나옵니다.
- 1초 동안의 펄스 × 60 = 1분 동안의 펄스.
- 1분 동안의 펄스 ÷ 20 = 1분 동안의 회전수, 즉 RPM입니다.
값 20은 SLOTS_PER_TURN에 저장되어 있습니다. TT 기어 모터와 함께 파는 흔한 인코더 디스크의 슬롯 수입니다. 디스크의 슬롯 수가 다르면 이 상수를 바꾸세요.
빠른 단계
- 첫 번째 예제와 같은 준비를 합니다. 라즈베리 파이에 SSH로 접속하고, RPi.GPIO를 설치하고, 같은 배선을 유지합니다.
- 위의 인코더 디스크 설치에 나온 대로 인코더 디스크를 제자리에 설치합니다.
- Python 스크립트 파일 OpticalSpeedSensorRPM.py를 만들고 다음 코드를 추가합니다:
- 파일을 저장하고 다음 명령으로 스크립트를 시작합니다:
- 디스크를 손으로 돌리거나 모터를 켭니다.
- 터미널에서 결과를 확인합니다. 아래 줄은 약 300 RPM으로 도는 모터에서 나온 것입니다:
첫 번째 스크립트와 달리 이 스크립트는 디스크가 움직이지 않을 때도 1초마다 한 줄을 출력합니다(time.sleep(1) 줄 때문입니다). 그 경우에는 펄스 0개와 0.00 RPM을 보여 줍니다. 측정값은 터미널에서 Ctrl + C 키를 누를 때까지 계속 나옵니다. 그러면 스크립트는 GPIO 핀을 정리하고 멈춥니다.
추가 지식
슬롯형 광학 센서 vs 장애물 회피 센서 vs 로터리 인코더
세 부품 모두 라즈베리 파이에 펄스나 ON/OFF 신호를 보내므로 헷갈리기 쉽습니다. 각각이 무엇을 위해 만들어졌는지 비교해 봅시다:
| IR 슬롯형 광학 속도 센서 | IR 장애물 회피 센서 | 로터리 인코더 | |
|---|---|---|---|
| 감지 대상 | 5.9 mm 틈 안의 물체 | 앞쪽 몇 센티미터 떨어진 물체 | 노브가 얼마나, 어느 방향으로 돌았는지 |
| 감지 방식 | 틈을 가로지르는 빛이 막힘 | 반사된 적외선 | 서로 위상이 어긋난 두 신호 |
| 가장 좋은 용도 | RPM, 카운트, 바퀴 회전, 홈 위치 | 로봇의 장애물 감지 | 사용자 입력 노브 |
| 방향 감지 | 아니요 | 아니요 | 예 |
분명히 슬롯형 광학 센서는 움직이는 부품이 틈을 지나갈 수 있고 속도나 정확한 카운트가 필요할 때 알맞은 선택입니다. 물체가 밖에 있다면 장애물 센서를 사용하세요. 사람이 노브를 돌리고 방향이 중요하다면 로터리 인코더를 사용하세요.
인코더 디스크의 슬롯 수 고르기
슬롯이 적은 디스크와 슬롯이 많은 디스크를 비교해 봅시다:
- 슬롯이 많으면 한 바퀴당 펄스가 많아집니다. RPM 값이 더 세밀한 단계로 나오고 낮은 속도에서 더 잘 반응합니다. 20슬롯과 1초 측정 구간에서는 펄스가 하나 늘 때마다 결과가 3 RPM(60 ÷ 20)씩 바뀝니다.
- 슬롯이 적으면 초당 펄스가 적습니다. 모터가 매우 빠를 때 라즈베리 파이가 따라가기 더 쉽지만 결과는 더 큰 단계로 움직입니다.
어떤 디스크를 쓰든 실제 슬롯 수를 SLOTS_PER_TURN에 쓰세요. 그렇지 않으면 RPM 값이 틀립니다.
바퀴 회전수로 거리 측정하기
인코더 디스크가 바퀴와 함께 돈다면 바퀴가 얼마나 굴러갔는지도 알 수 있습니다:
- 바퀴 둘레 = π × 바퀴 지름
- 거리 = 회전수 × 바퀴 둘레
- 회전수 = 전체 펄스 ÷ SLOTS_PER_TURN
예를 들어 지름 65 mm 바퀴는 한 바퀴에 약 204 mm를 굴러갑니다. 따라서 10바퀴 뒤에는 약 2미터를 움직인 것입니다.
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.