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

이 가이드에서는 IR 슬롯형 광학 속도 센서를 아두이노 UNO R4와 함께 사용하는 방법을 배웁니다. 자세히 배울 내용은 다음과 같습니다:

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

준비물

1×Arduino UNO R4 WiFi or Arduino UNO R4 Minima
1×(또는) DIYables STEM V4 IoT, Compatible with Arduino Uno R4 WiFi 쿠팡 | 아마존
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×(추천) 아두이노 우노 R4용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) Sensors/Servo Expansion Shield for Arduino UNO R4 쿠팡 | 아마존
1×(추천) 아두이노 우노 R4용 브레드보드 쉴드 쿠팡 | 아마존
1×(추천) 아두이노 우노 R4용 케이스 쿠팡 | 아마존
1×(추천) 아두이노 우노 R4용 전원 분배기 쿠팡 | 아마존
1×(추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
Arduino Uno R4 WiFi Compatible Boards

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

이 작은 모듈은 U자 모양입니다. 포토 인터럽터라고도 부릅니다. 한쪽 팔에는 적외선 LED가, 다른 쪽 팔에는 NPN 포토트랜지스터가 있습니다. 둘은 5.9 mm 간격을 두고 마주 봅니다. 이 센서는 아두이노 UNO R4에 간단한 한 가지를 알려 줍니다: 틈이 비어 있는가, 아니면 무언가 들어 있는가?

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

주요 용도:

  • 인코더 디스크로 모터 속도(RPM) 측정, 회전계처럼 사용
  • 물체나 펄스 개수 세기
  • 바퀴 회전 수를 세어 거리 측정
  • 로봇에 바퀴 속도 피드백 제공
  • 한계 위치나 원점 위치 감지

핀아웃

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

모듈에는 핀이 세 개 있습니다:

  • VCC 핀: 아두이노 UNO R4의 5V에 연결합니다(모듈은 3.3V ~ 5V를 받습니다).
  • GND 핀: GND(0V)에 연결합니다.
  • OUT 핀: 디지털 출력이며, 아두이노 UNO R4의 입력 핀에 연결합니다.

핀 순서는 제조 묶음에 따라 달라질 수 있습니다. 항상 모듈에 인쇄된 라벨을 확인하세요.

동작 원리

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

IR LED는 항상 슬롯 건너편으로 빛을 비춥니다.

  • 슬롯이 비어 있음: 빛이 포토트랜지스터에 닿으므로 OUT 핀은 HIGH입니다.
  • 슬롯이 불투명한 것(카드, 손가락, 인코더 디스크의 이빨)으로 막힘: 빛이 통과하지 못하므로 OUT 핀은 LOW입니다.

내장 슈미트 트리거가 거친 빛의 세기를 깨끗한 0 또는 1로 바꿔 줍니다. 신호가 떨리지 않으므로 소프트웨어 디바운스가 필요 없습니다.

알아둘 작은 점 두 가지:

  • 투명한 플라스틱이나 유리는 IR 빛을 통과시킬 수 있습니다. 불투명한 물체를 사용하세요.
  • 다른 제조사의 일부 모듈은 반대로 동작합니다. 슬롯이 비어 있는데 보드가 "막힘"이라고 표시하면, 첫 번째 코드에서 LOW와 HIGH를 서로 바꾸세요. RPM 코드는 슬롯당 에지 하나를 세므로 두 종류 모두에서 동작합니다.

선연결

선은 세 개만 필요합니다: VCC는 5V에, GND는 GND에, OUT은 아두이노 UNO R4의 2번 핀에 연결합니다. UNO R4는 5V 보드이므로 5V 전원을 써도 되고, OUT 신호도 안전한 레벨을 유지합니다.

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

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

Arduino Uno R4와 기타 부품에 전원을 공급하는 가장 효과적인 방법을 확인하시려면, 아래 링크를 참조하세요: 아두이노 우노 R4 전원 공급 방법.

2번 핀은 인터럽트를 사용할 수 있어서 선택했습니다. 두 번째 코드에 필요합니다.

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

슬롯이 막혔는지 확인하기 (폴링):

  • OUT 핀에 연결된 핀을 입력으로 설정합니다:
pinMode(SENSOR_PIN, INPUT);
  • 핀을 읽습니다. LOW는 막힘, HIGH는 비어 있음을 뜻합니다:
int state = digitalRead(SENSOR_PIN);
  • 마지막 읽기값과 비교하여 상태가 바뀔 때만 동작하게 합니다:
if (state != lastState) { // the slot just became blocked or clear }

빠른 펄스 세기 (인터럽트):

  • 카운터를 만듭니다. 인터럽트가 값을 바꾸므로 volatile로 표시합니다:
volatile unsigned long pulseCount = 0;
  • 카운터에 1을 더하는 작은 함수를 작성합니다:
void countPulse() { pulseCount++; }
  • 신호가 HIGH에서 LOW로 떨어질 때마다(이빨 하나가 슬롯에 들어올 때) 이 함수를 실행합니다:
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • 1초에 한 번, 인터럽트를 잠시 멈춘 상태에서 카운터를 복사하고 초기화한 다음 펄스를 RPM으로 바꿉니다:
noInterrupts(); unsigned long pulses = pulseCount; pulseCount = 0; interrupts(); float rpm = pulses * 60.0 / SLOTS_PER_TURN;

이 공식은 왜 그럴까요? 슬롯이 20개인 디스크는 한 바퀴에 펄스 20개를 만듭니다. 1초 동안의 펄스 수 × 60은 분당 펄스 수입니다. 20으로 나누면 분당 회전수(RPM)가 됩니다.

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

이 스케치는 OUT 핀을 계속 확인합니다. 상태가 바뀔 때만 한 줄을 출력하고, 슬롯이 막힐 때마다 카운터에 1을 더합니다.

/* * 이 아두이노 우노 R4 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 우노 R4 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-r4/arduino-uno-r4-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino UNO R4 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; } }

빠른 단계

다음 안내를 단계별로 따라 하세요:

  • Arduino Uno R4 WiFi/Minima를 처음 사용한다면 아두이노 우노 R4 - 소프트웨어 설치 튜토리얼을 참고하세요.
  • 제공된 배선도에 따라 부품을 연결합니다.
  • USB 케이블로 Arduino Uno R4 보드를 컴퓨터에 연결합니다.
  • 컴퓨터에서 Arduino IDE를 실행합니다.
  • 알맞은 Arduino Uno R4 보드(예: Arduino Uno R4 WiFi)와 COM 포트를 선택합니다.
  • 위 코드를 복사하여 Arduino IDE에 붙여넣습니다.
  • Upload 버튼을 클릭하여 Arduino UNO R4에 코드를 업로드합니다.
  • 아두이노 우노 R4 - 시리얼 모니터를 열고 9600 보드레이트로 설정합니다.
  • 카드 한 장(또는 손가락)을 슬롯에 밀어 넣었다가 빼 보세요. 이를 몇 번 반복합니다.
  • 시리얼 모니터에서 결과를 확인합니다.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' 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 R4 WiFi on COM15
2

한 번 지나갈 때마다 두 줄이 나옵니다: 카드가 들어갈 때 한 줄, 나올 때 한 줄. 아무것도 바뀌지 않는 동안에는 출력되지 않습니다.

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

loop()에서 폴링하는 방식은 느린 물체에는 괜찮습니다. 회전하는 디스크는 훨씬 빠르기 때문에 loop()가 일부 이빨을 놓칠 수 있습니다. 그래서 이 스케치는 FALLING 에지의 인터럽트로 펄스를 세며, 이빨 하나당 정확히 한 번씩 셉니다. 1초마다 펄스 수와 속도(RPM)를 출력합니다.

상수 SLOTS_PER_TURN은 20으로 설정되어 있습니다. TT 기어 모터에 함께 제공되는 일반적인 인코더 디스크입니다. 디스크의 슬롯 수가 다르다면 이 값을 바꾸세요.

/* * 이 아두이노 우노 R4 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 우노 R4 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-r4/arduino-uno-r4-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino UNO R4 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"); } }

인코더 디스크 설치하기

  • 인코더 디스크를 모터 축이나 바퀴에 고정합니다.
  • 디스크의 이빨이 슬롯을 지나가도록 센서를 놓습니다.
  • 디스크가 센서의 팔에 닿지 않도록 합니다.
  • 디스크를 손으로 돌리거나 모터에 전원을 넣어 돌릴 수 있습니다. 모터는 별도의 배선이 필요합니다. 그 부분은 아두이노 우노 R4 - DC 모터 튜토리얼을 참고하세요.

빠른 단계

  • 이전과 같은 배선을 유지합니다.
  • 위의 RPM 코드를 복사하여 Arduino IDE에 붙여넣습니다.
  • Upload 버튼을 클릭합니다.
  • 시리얼 모니터를 9600 보드레이트로 엽니다.
  • 디스크를 돌린 다음 멈춥니다.
  • 시리얼 모니터에서 속도를 확인합니다. 여기서는 모터가 약 300 RPM으로 돕니다:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' 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 R4 WiFi on COM15
2

한 줄을 확인해 봅시다: 100펄스 × 60 ÷ 20 = 300 RPM.

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

※ 주의:

  • 인터럽트 함수는 짧게 유지하세요. 그 안에서 Serial.print()를 호출하지 마세요.
  • 인터럽트가 바꾸는 모든 변수는 volatile이어야 합니다.
  • 슬롯 안이 아니라 떨어진 거리에 있는 물체를 감지하고 싶나요? 아두이노 우노 R4 - 장애물 회피 센서를 사용해 보세요. 회전 방향도 알려 주는 노브가 필요한가요? 아두이노 우노 R4 - 로터리 인코더를 사용해 보세요.

동영상

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

댓글