아두이노 IR 슬롯형 광학 속도 센서

이 튜토리얼에서는 다음을 배웁니다:

아두이노 ir 슬롯형 광학 속도 센서

준비물

1×아두이노 우노 R3 쿠팡 | 아마존
1×USB 2.0 타입 A-to-B 케이블 (USB-A PC용) 쿠팡 | 아마존
1×USB 2.0 타입 C-to-B 케이블 (USB-C PC용) 아마존
1×IR Slotted Optical Speed Sensor 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(옵션) Breadboard 쿠팡 | 아마존
1×(추천) 아두이노 우노용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) Sensors/Servo Expansion Shield for Arduino Uno 쿠팡 | 아마존
1×(추천) 아두이노 우노용 브레드보드 쉴드 쿠팡 | 아마존
1×(추천) 아두이노 우노용 케이스 쿠팡 | 아마존
1×(추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

IR 슬롯형 광학 속도 센서에 대하여

IR 슬롯형 광학 속도 센서는 작은 U자형 모듈입니다. 슬롯 센서, 옵토 인터럽터, U자형 IR 센서라고도 부릅니다. 슬롯 안에 무언가 있는지 없는지를 아두이노에 알려 줍니다. 인코더 디스크와 함께 사용하면 모터나 바퀴가 얼마나 빨리 도는지도 알 수 있습니다.

IR 슬롯형 광학 속도 센서
센서 종류 슬롯형 광전 센서(IR LED + NPN 포토트랜지스터)
슬롯 폭 5.9 mm
동작 전압 3.3V ~ 5V DC
출력 디지털(TTL), 막히면 LOW, 비어 있으면 HIGH
신호 처리 내장 슈미트 트리거
장착 양쪽 끝에 M3 나사 구멍
핀 3개(VCC, GND, OUT)

이런 곳에 사용할 수 있습니다:

  • 인코더 디스크로 모터 속도(RPM) 측정
  • 회전계 만들기
  • 물체나 펄스 세기
  • 바퀴 회전 수를 세어 거리 측정
  • 로봇의 바퀴 속도 피드백 얻기
  • 한계 위치나 위치 감지

핀아웃

ir 슬롯형 광학 속도 센서 핀아웃

IR 슬롯형 광학 속도 센서에는 세 개의 핀이 있습니다:

  • VCC 핀: VCC(5V 또는 3.3V)에 연결해야 합니다
  • GND 핀: GND(0V)에 연결해야 합니다
  • OUT 핀: 디지털 출력 핀입니다. 슬롯이 막히면 LOW, 슬롯이 비어 있으면 HIGH입니다. 이 핀은 아두이노의 입력 핀에 연결해야 합니다.

배치(batch)에 따라 핀 순서가 다를 수 있습니다. 모듈에 인쇄된 라벨을 확인하세요.

동작 원리

ir 슬롯형 광학 속도 센서 동작 원리

U자의 한쪽에는 적외선 LED가 있습니다. 다른 쪽에는 NPN 포토트랜지스터가 있습니다. 둘은 5.9 mm 슬롯을 사이에 두고 마주 보고 있습니다.

  • 슬롯이 비어 있으면 IR 빛이 포토트랜지스터에 닿습니다. OUT 핀은 HIGH입니다.
  • 불투명한 물체(카드 조각이나 인코더 디스크의 톱니)가 슬롯에 들어가면 빛을 막습니다. OUT 핀은 LOW가 됩니다.

내장 슈미트 트리거는 출력을 떨림 없이 깨끗하고 안정적인 0 또는 1로 만들어 줍니다. 그래서 코드에서 디바운스를 할 필요가 없습니다.

몇 가지 팁:

  • 불투명한 물체를 사용하세요. 투명한 물체는 IR 빛을 잘 막지 못할 수 있습니다.
  • 다른 제조사의 일부 모듈은 반대로 동작합니다. 슬롯이 비었는데 센서가 "막힘"이라고 하면, 첫 번째 코드에서 LOW와 HIGH를 서로 바꾸기만 하면 됩니다. RPM 코드는 톱니 하나당 한 번의 에지를 세므로 어느 쪽이든 동작합니다.

인코더 디스크로 속도 측정하기

인코더 디스크는 가장자리 근처에 슬롯(구멍)이 있는 둥근 판입니다. TT 기어 모터용 일반 디스크는 슬롯이 20개입니다. 디스크를 모터 축이나 바퀴에 고정하여, 톱니가 센서의 슬롯에 닿지 않고 통과하게 합니다.

디스크가 돌면 톱니가 지날 때마다 잠깐씩 빛을 막습니다. OUT 핀은 톱니 하나당 펄스 하나를 냅니다. 한 바퀴에 20개의 펄스가 나옵니다. 아두이노는 1초 동안 펄스를 세고 속도를 계산합니다:

  • 1초 동안의 펄스 × 60 = 1분 동안의 펄스
  • 1분 동안의 펄스 ÷ 20 = 1분 동안의 회전 수(RPM)

선연결

아래 이미지와 같이 센서의 VCC를 아두이노의 5V에, GND를 GND에, OUT을 아두이노의 2번 핀에 연결합니다.

아두이노 ir 슬롯형 광학 속도 센서 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

2번 핀은 아두이노 우노의 인터럽트 핀이기 때문에 사용합니다. RPM 코드에 필요합니다.

IR 슬롯형 광학 속도 센서를 위한 아두이노 프로그래밍 방법

  • 라이브러리 불필요: 코드는 내장 함수만 사용합니다.
  • 핀 정의: const int SENSOR_PIN = 2;
  • pinMode()로 핀을 입력으로 설정: pinMode(SENSOR_PIN, INPUT);
  • digitalRead()로 상태 읽기: int state = digitalRead(SENSOR_PIN);
  • 상태 확인: if (state == LOW)는 슬롯 안에 무언가 있다는 뜻입니다. HIGH는 슬롯이 비어 있다는 뜻입니다.
  • 빠른 펄스를 세려면 인터럽트를 사용합니다. OUT 핀이 HIGH에서 LOW로 바뀔 때마다(톱니가 슬롯을 막을 때) 아두이노가 작은 함수를 실행합니다: attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • 카운터는 인터럽트 안에서 바뀌므로 volatile로 선언합니다: volatile unsigned long pulseCount = 0;
  • 1초마다 펄스를 RPM으로 변환: float rpm = pulses * 60.0 / SLOTS_PER_TURN;

왜 인터럽트를 사용할까요? 모터가 빨리 돌면 펄스가 아주 짧습니다. loop()에서 핀만 확인하면 일부 펄스를 놓칠 수 있습니다. 인터럽트는 모든 펄스를 잡아냅니다. 톱니 하나당 한 번만 세도록 FALLING을 사용합니다.

아두이노 코드 - 슬롯 안의 물체 감지

아래 코드는 다음 동작을 합니다:

  • OUT 핀을 계속 읽습니다
  • 상태가 바뀔 때만 메시지를 출력합니다
  • 슬롯이 막힌 횟수를 셉니다
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino pin connected to the OUT pin of the speed sensor int lastState; // the previous state of the sensor int objectCount = 0; // how many times the slot was blocked void setup() { Serial.begin(9600); pinMode(SENSOR_PIN, INPUT); lastState = digitalRead(SENSOR_PIN); } void loop() { int state = digitalRead(SENSOR_PIN); if (state != lastState) { // the state has changed if (state == LOW) { // LOW = something is in the slot objectCount++; Serial.print("The slot is blocked - count: "); Serial.println(objectCount); } else { // HIGH = the slot is clear Serial.println("The slot is clear"); } lastState = state; } }

빠른 단계

  • 위 다이어그램과 같이 배선합니다.
  • USB 케이블로 아두이노를 PC에 연결합니다.
  • Arduino IDE를 엽니다. Tools 메뉴로 이동하여 올바른 보드와 포트를 선택합니다.
  • 위 코드를 복사하여 Arduino IDE에 붙여넣습니다.
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 아두이노에 업로드합니다.
  • 시리얼 모니터(보드레이트 9600)를 엽니다.
  • 카드 조각이나 손가락을 슬롯에 몇 번 통과시킵니다.
  • 시리얼 모니터에서 결과를 확인합니다.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
The slot is blocked - count: 1 The slot is clear The slot is blocked - count: 2 The slot is clear The slot is blocked - count: 3 The slot is clear
Ln 11, Col 1
Arduino Uno on COM15
2

아두이노 코드 - 모터 속도(RPM) 측정

아래 코드는 다음 동작을 합니다:

  • 디스크의 톱니가 슬롯을 막을 때마다 펄스를 하나 셉니다(FALLING 에지의 인터럽트)
  • 1초마다 속도를 RPM으로 계산합니다
  • 펄스 수와 속도를 출력합니다
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino pin connected to the OUT pin of the speed sensor const int SLOTS_PER_TURN = 20; // number of slots (holes) in the encoder disc volatile unsigned long pulseCount = 0; // changed inside the interrupt unsigned long lastTime = 0; // runs every time a tooth of the disc blocks the slot void countPulse() { pulseCount++; } void setup() { Serial.begin(9600); pinMode(SENSOR_PIN, INPUT); attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING); } void loop() { if (millis() - lastTime >= 1000) { // every 1 second lastTime = millis(); noInterrupts(); // read and reset the counter safely unsigned long pulses = pulseCount; pulseCount = 0; interrupts(); float rpm = pulses * 60.0 / SLOTS_PER_TURN; // pulses per second -> turns per minute Serial.print("Pulses: "); Serial.print(pulses); Serial.print(" | Speed: "); Serial.print(rpm); Serial.println(" RPM"); } }

코드는 SLOTS_PER_TURN = 20을 사용합니다. 인코더 디스크의 슬롯 수가 다르면 이 숫자를 바꾸세요.

빠른 단계

  • 인코더 디스크를 모터 축이나 바퀴에 고정하여 톱니가 슬롯을 통과하게 합니다.
  • 첫 번째 코드와 같은 배선을 그대로 유지합니다.
  • 위 코드를 복사하여 Arduino IDE에 붙여넣고 업로드합니다.
  • 디스크를 손으로 돌리거나 모터에 전원을 켭니다. 모터를 구동하려면 아두이노 - DC 모터를 참고하세요.
  • 시리얼 모니터에서 결과를 확인합니다. 아래 예시는 약 300 RPM으로 도는 모터입니다.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Pulses: 0 | Speed: 0.00 RPM Pulses: 98 | Speed: 294.00 RPM Pulses: 101 | Speed: 303.00 RPM Pulses: 100 | Speed: 300.00 RPM Pulses: 99 | Speed: 297.00 RPM Pulses: 0 | Speed: 0.00 RPM
Ln 11, Col 1
Arduino Uno on COM15
2

예를 들어 1초에 펄스 100개는 100 × 60 ÷ 20 = 300 RPM입니다.

바퀴가 움직인 거리를 알고 싶나요? 회전 수에 바퀴 둘레(π × 바퀴 지름)를 곱하세요.

슬롯 안이 아니라 멀리 있는 물체를 감지하려면 아두이노 - 적외선 장애물 회피 센서를 참고하세요. 노브와 그 방향을 읽으려면 아두이노 - 로터리 엔코더를 참고하세요.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

댓글