아두이노 나노 IR 슬롯형 광학 속도 센서
이 튜토리얼에서는 아두이노 나노로 IR 슬롯형 광학 속도 센서를 읽는 방법을 설명합니다. 이 센서는 틈 사이로 무언가 지나가면 보드에 알려 주는 작은 U자형 부품입니다. 자세히 다음 내용을 배웁니다:
- 아두이노 나노를 브레드보드에서 IR 슬롯형 광학 속도 센서에 연결하는 방법
- 슬롯을 통과하는 물체를 하나씩 세도록 아두이노 나노를 프로그래밍하는 방법
- 인코더 디스크와 D2 인터럽트 핀을 사용하여 모터 속도를 RPM(분당 회전수)으로 계산하도록 아두이노 나노를 프로그래밍하는 방법
다음을 권장합니다:
- 손으로 돌리는 노브를 만들거나, 프로젝트가 어느 방향으로 도는지 알아야 한다면 아두이노 나노 - 로터리 엔코더를 사용하세요.
- 찾으려는 물체가 열린 공간에 있고 작은 틈을 통과하지 않는다면 아두이노 나노 - 장애물 센서를 사용하세요.

준비물
| 1 | × | 아두이노 나노 | 쿠팡 | 아마존 | |
| 1 | × | USB A to Mini-B USB 케이블 | 쿠팡 | 아마존 | |
| 1 | × | IR Slotted Optical Speed Sensor | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (옵션) Breadboard | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 나노용 스크루 터미널 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 나노용 브레이크아웃 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 나노용 전원 분배기 | 쿠팡 | 아마존 |
IR 슬롯형 광학 속도 센서에 대하여
이 부품은 슬롯 센서, 포토 인터럽터, 옵토 인터럽터, U자형 IR 센서 등 여러 이름으로 불립니다. 모두 같은 것을 뜻합니다. 바로 빛의 문입니다. 틈의 한쪽에서 반대쪽으로 빛을 보내고, 모듈은 그 빛이 지나가는지 알려 줍니다.
물체를 감지하는 방법

"U"의 두 팔을 보세요. 첫 번째 팔 안에는 적외선 LED가 있습니다. 두 번째 팔 안에는 NPN 포토트랜지스터가 있습니다. 둘은 5.9 mm 틈을 사이에 두고 서로 마주 봅니다.
경우는 두 가지뿐입니다:
- 틈이 비어 있습니다. 포토트랜지스터가 적외선을 감지하므로 모듈은 OUT을 HIGH로 설정합니다.
- 카드 조각이나 인코더 디스크의 이빨 하나처럼 불투명한 물체가 틈에 있습니다. 빛이 통과하지 못하므로 모듈은 OUT을 LOW로 설정합니다.
모듈에는 슈미트 트리거도 들어 있습니다. 이 회로는 원래의 빛 세기를 또렷한 0 또는 1로 바꿔 줍니다. 신호의 가장자리가 이미 깨끗하므로 아두이노 나노 스케치에는 디바운스 코드가 필요 없습니다.
기억할 점이 두 가지 있습니다:
- 투명한 플라스틱이나 유리는 적외선을 통과시킬 수 있습니다. 속이 비치지 않는 물체로 테스트하세요.
- 다른 브랜드의 일부 모듈은 반대로 작동합니다(비어 있을 때 LOW). 그렇다면 첫 번째 스케치에서 LOW와 HIGH를 바꾸세요. RPM 스케치는 슬롯마다 에지 하나를 세므로 두 종류 모두에서 올바른 값을 줍니다.
사양
| IR 슬롯형 광학 속도 센서 | |
|---|---|
| 센서 종류 | 슬롯형 광전 센서 (IR LED + NPN 포토트랜지스터) |
| 슬롯 폭 | 5.9 mm |
| 동작 전압 | 3.3V ~ 5V DC |
| 출력 | 디지털 (TTL), 막히면 LOW, 비어 있으면 HIGH |
| 신호 처리 | 내장 슈미트 트리거 |
| 장착 | 양쪽 끝에 M3 나사 구멍 |
| 핀 | 3개 (VCC, GND, OUT) |
이 센서는 다음과 같은 프로젝트에 쓰입니다: 소형 모터용 회전계, 로봇 자동차의 바퀴 속도 피드백, 벨트 위 부품 카운터, 움직이는 부품이 한계에 도달했음을 알려 주는 엔드 스톱, 바퀴가 몇 번 돌았는지 세는 간단한 주행 거리계.
IR 슬롯형 광학 속도 센서 핀아웃

모듈에서 나오는 핀은 세 개뿐입니다:
- VCC 핀: 아두이노 나노의 5V 핀에 연결해야 합니다
- GND 핀: GND(0V)에 연결해야 합니다
- OUT 핀: 디지털 신호선이며 아두이노 나노의 입력 핀(이 튜토리얼에서는 D2)에 연결해야 합니다
※ 주의:
모듈의 핀 배열은 제조사마다 다를 수 있으며, 같은 제품이라도 생산 묶음(batch)에 따라 순서가 바뀔 수 있습니다. 모듈을 사용할 때는 항상 모듈에 인쇄된 라벨을 확인하는 것이 중요합니다. 꼼꼼히 살펴보세요!
펄스를 속도로 바꾸기
센서 하나만으로는 "무언가 있음"과 "아무것도 없음"만 알 수 있습니다. 속도를 읽으려면 인코더 디스크를 추가합니다. 가장자리에 구멍이 뚫린 얇은 바퀴입니다. 이것을 모터 축에 달면 가장자리가 틈 사이로 돌아갑니다. 이빨 하나가 빔을 한 번씩 끊으므로, OUT 핀은 이빨마다 LOW 펄스 하나를 줍니다.
대부분의 TT 기어 모터에 딸려 오는 디스크에는 슬롯이 20개 있습니다. 즉 펄스 20개가 한 바퀴입니다. 아두이노 나노가 1초 동안 펄스를 센다면 계산은 다음과 같습니다:
RPM = (1초 동안의 펄스 수 x 60) / 20
"x 60"은 초를 분으로 바꿉니다. "/ 20"은 펄스를 회전수로 바꿉니다.
선연결
아두이노 나노를 브레드보드 가운데에 걸쳐 놓고, 센서에서 점퍼 와이어 세 개를 연결합니다. 아래 그림처럼 VCC는 5V에, GND는 GND에, OUT은 D2에 연결합니다.

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
Arduino Nano와 기타 부품에 전원을 공급하는 가장 효과적인 방법은 다음 링크를 참조하세요: 아두이노 나노 전원 공급 방법.
나노는 5V 보드이므로 5V 핀에서 전원을 가져옵니다. 그러면 OUT 신호가 0V와 5V 사이에서 움직이며, 나노 입력 핀과 정확히 맞습니다. 레벨 시프터나 추가 저항은 필요 없습니다.
IR 슬롯형 광학 속도 센서를 위한 프로그래밍 방법
라이브러리를 설치할 필요가 없습니다. 두 스케치 모두 아두이노 코어에 이미 포함된 함수만 사용합니다.
1부: digitalRead()로 슬롯 확인하기
- 첫 번째 단계는 OUT에 연결된 아두이노 나노 핀을 지정하는 것입니다:
- Setup() 안에서 그 핀을 입력으로 설정합니다. 모듈이 스스로 선을 구동하므로 일반 INPUT이면 충분합니다:
- Loop() 안에서 핀을 계속 읽습니다. LOW 값은 빔이 끊어졌다는 뜻입니다:
- 스케치는 마지막 값을 lastState에 보관합니다. 새 값이 이전 값과 다를 때만 출력하고 세므로, 물체가 틈에 오래 머물러도 한 번만 셉니다.
2부: 인터럽트로 빠른 펄스 잡기
아두이노 나노에는 외부 인터럽트를 일으킬 수 있는 핀이 D2와 D3 두 개뿐입니다. 그래서 센서를 D2에 연결합니다. 1부에서는 다른 디지털 핀도 사용할 수 있지만, 2부에서는 안 됩니다.
- 펄스 카운터는 volatile 키워드로 선언합니다. 이것은 값이 loop()의 일반적인 흐름 밖에서 언제든 바뀔 수 있다고 컴파일러에 알려 줍니다:
- 인터럽트 루틴은 작은 일 하나만 합니다. 카운터에 1을 더하고 돌아옵니다:
- Setup()에서 이 루틴을 D2에 연결합니다. FALLING 옵션은 OUT이 HIGH에서 LOW로 떨어지는 순간에 루틴을 시작합니다. 그때가 이빨이 틈에 들어오는 순간이므로 이빨마다 한 번씩 셉니다:
- 1초에 한 번, 스케치는 카운터를 복사하고 0으로 되돌립니다. 나노의 ATmega328P 칩은 한 번에 8비트씩 처리하므로 4바이트 숫자를 복사하려면 여러 단계가 필요합니다. noInterrupts()와 interrupts()는 복사 도중에 새 펄스가 숫자를 바꾸지 못하게 합니다:
- 마지막 단계는 위에서 본 공식을 사용합니다:
슬롯 안의 물체를 세는 아두이노 나노 코드
아래 스케치는 loop()에서 D2를 폴링합니다. 새 물체가 빔을 끊을 때마다 개수에 1을 더하고 출력합니다. 틈이 다시 비면 짧은 메시지를 출력합니다.
빠른 단계
- 아두이노 나노를 처음 사용한다면 아두이노 나노 - 소프트웨어 설치을 참조하세요.
- 다이어그램과 같이 부품을 연결합니다.
- USB 케이블로 아두이노 나노 보드를 컴퓨터에 연결합니다.
- 컴퓨터에서 Arduino IDE를 엽니다.
- Arduino Nano 보드와 해당 COM 포트를 선택합니다. 나중에 업로드가 실패하면 Processor 메뉴에서 ATmega328P (Old Bootloader)를 시도해 보세요.
- 위의 코드를 새 스케치에 붙여넣습니다.
- Upload 버튼을 누르고 "Done uploading" 메시지가 나올 때까지 기다립니다.
- 시리얼 모니터를 열고 9600 보드레이트를 선택합니다.
- 카드 조각이나 손가락을 틈에 넣었다가 빼세요. 이것을 세 번 합니다.
- 시리얼 모니터의 메시지를 확인합니다.
틈이 비어 있는데 "blocked"가 보이나요? 그렇다면 모듈의 논리가 반대입니다. 코드에서 LOW와 HIGH 검사를 서로 바꾸고 다시 업로드하세요.
모터 속도(RPM)를 측정하는 아두이노 나노 코드
슬롯이 20개인 디스크를 단 모터는 초당 수백 개의 펄스를 만들 수 있습니다. 폴링은 일부를 놓칠 수 있습니다. 예를 들어 Serial.print()가 텍스트를 보내느라 바쁠 때입니다. 인터럽트를 사용하면 나노가 아주 짧은 시간 동안 하던 일을 멈추고, 펄스를 세고, 다시 계속합니다. 모든 이빨이 셈에 들어갑니다.
스케치는 1초에 한 번 펄스 수와 RPM을 출력합니다. 상수 SLOTS_PER_TURN은 20입니다. 디스크의 구멍 수가 다르다면 구멍을 세어 그 숫자를 코드에 넣으세요.
빠른 단계
- 첫 번째 스케치의 배선을 바꾸지 마세요. OUT은 D2에 그대로 두어야 합니다. 나노에서 다른 선택지는 D3뿐이며, D3를 사용하면 SENSOR_PIN을 3으로 설정하세요.
- 인코더 디스크를 모터 축이나 바퀴에 장착합니다. 이빨이 틈의 가운데를 지나가고 플라스틱에 닿지 않도록 맞추세요.
- RPM 코드를 Arduino IDE에 붙여넣고 나노에 업로드합니다.
- 9600 보드레이트로 시리얼 모니터를 엽니다.
- 손으로 디스크를 돌리거나 모터를 켭니다. 아두이노 나노 - DC 모터 튜토리얼에서 나노로 모터를 구동하는 방법을 볼 수 있습니다.
- 시리얼 모니터에서 속도를 확인합니다.
여기서 모터는 약 300 RPM으로 돌고 있습니다. 펄스가 98인 줄을 봅시다: 98 x 60 = 분당 5880 펄스이고, 5880 / 20 = 294 RPM입니다. 맨 위와 맨 아래의 0인 줄은 모터가 시작하기 전과 멈춘 후에 출력된 것입니다.
나노에서 인터럽트 코드를 쓸 때의 좋은 습관:
- 인터럽트 루틴이 바꾸는 모든 변수에 volatile을 붙이세요.
- 루틴은 아주 작게 유지하세요. 그 안에 delay()나 Serial.print()를 넣지 마세요.
- FALLING을 유지하세요. CHANGE는 이빨마다 두 번 발생하여 RPM이 두 배가 됩니다.
추가 지식
어떤 센서를 골라야 할까?
슬롯 센서, IR 장애물 센서, 로터리 엔코더는 모두 아두이노 나노에 펄스를 줄 수 있습니다. 그래도 각각 해결하는 문제가 다릅니다. 다음 질문을 스스로 해 보세요:
- 물체가 작고 고정된 틈(디스크 이빨, 움직이는 부품에 달린 플래그)을 통과하나요? IR 슬롯형 광학 속도 센서를 고르세요. 한 번 지나갈 때마다 깨끗한 디지털 신호 하나를 줍니다.
- 물체가 틈 안이 아니라 센서 앞 어딘가(벽, 손, 탁자 위 상자)에 있나요? 아두이노 나노 - 장애물 센서를 고르세요. 열린 공간에서 반사된 빛을 감지합니다.
- 사람이 노브를 돌리고, 코드가 방향(왼쪽 또는 오른쪽)을 알아야 하나요? 아두이노 나노 - 로터리 엔코더를 고르세요. 출력이 두 개(CLK와 DT)이고 푸시 버튼이 있습니다.
대상이 항상 같은 5.9 mm 틈의 같은 위치를 지나가므로, 빠르게 도는 부품에는 슬롯 센서가 가장 믿을 수 있는 개수를 준다는 것이 분명합니다. 유일한 한계는 회전 방향을 알 수 없다는 것입니다.
바퀴 두 개, 센서 두 개
작은 로봇 자동차에는 구동 바퀴가 두 개 있는 경우가 많습니다. 나노에는 인터럽트 핀이 딱 두 개 있으므로, 센서 하나는 D2에, 두 번째 센서는 D3에 연결할 수 있습니다. 그러면 각 센서마다 자신만의 카운터와 인터럽트 루틴이 필요합니다. 로봇의 나머지 부분을 계획하기 전에 이 점을 기억하세요. D2와 D3를 이미 다른 부품이 사용하고 있다면 그 부품을 다른 핀으로 옮기세요. 이 일을 할 수 있는 나노 핀은 달리 없기 때문입니다.
문제 해결
| 문제 | 확인할 사항 |
|---|---|
| 개수가 바뀌지 않음 | OUT이 D2에, VCC가 5V에 연결되어 있는지 확인하세요. 순서는 생산 묶음마다 다를 수 있으므로 모듈의 핀 라벨을 읽으세요. |
| 틈이 비어 있는데 "Blocked"가 나옴 | 모듈이 반대 논리를 사용합니다. 첫 번째 스케치에서 LOW와 HIGH를 바꾸세요. |
| RPM이 항상 0임 | 디스크 이빨이 틈에 닿지 않을 수 있습니다. 이빨이 슬롯 가운데를 지나가도록 센서를 옮기세요. |
| RPM이 오르락내리락함 | 디스크가 축에 단단히 고정되어 있고 흔들리거나 센서에 닿지 않는지 확인하세요. |
| RPM이 너무 높거나 낮음 | SLOTS_PER_TURN이 디스크와 맞지 않습니다. 구멍을 세어 상수를 고치세요. |
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.