ESP32 마이크로파이썬 IR 슬롯형 광학 속도 센서

이 튜토리얼에서는 ESP32와 MicroPython으로 IR 슬롯형 광학 속도 센서를 사용하는 방법을 알아봅니다. 자세히 배울 내용은 다음과 같습니다:

ESP32 마이크로파이썬과 ir 슬롯형 광학 속도 센서 모듈

준비물

1×38-pin ESP32 ESP-WROOM-32 Dev Module - Narrow 쿠팡 | 아마존
1×(또는) 38-pin ESP32 ESP-WROOM-32 Dev Module - Wide 쿠팡 | 아마존
1×(또는) 30-pin ESP32 ESP-WROOM-32 Dev Module - Wide 아마존
1×(또는) ESP32 Uno-form board 아마존
1×(또는) ESP32 S3 Uno-form board 아마존
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×(추천) ESP32용 스크루 터미널 확장 보드 쿠팡 | 아마존
1×(추천) Breakout Expansion Board for ESP32 쿠팡 | 아마존
1×(추천) ESP32용 전원 분배기 쿠팡 | 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

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

모듈을 옆에서 보면 U자 모양입니다. 두 팔 사이에는 열린 통로가 있고, 이 통로에서 감지가 이루어집니다. 메이커들은 이 부품을 옵토 인터럽터 또는 포토 인터럽터라고 부릅니다. 출력이 디지털이므로 MicroPython은 핀 하나에서 0 또는 1만 읽으면 됩니다.

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

어디에 쓸 수 있을까요? 몇 가지 아이디어입니다:

  • 슬롯이 있는 인코더 디스크로 모터의 RPM 읽기
  • 작은 회전계 만들기
  • 틈을 지나가는 펄스나 물건 세기
  • 바퀴 회전 수를 세어 로봇이 이동한 거리 구하기
  • 로봇 자동차에 바퀴 속도 피드백 주기
  • 움직이는 부품의 끝 위치(리미트) 감지하기

핀 배치

ir 슬롯형 광학 속도 센서 핀 배치
  • VCC 핀: ESP32의 3.3V 핀에 연결합니다(모듈은 3.3V에서 5V까지 받을 수 있습니다)
  • GND 핀: GND(0V)에 연결합니다
  • OUT 핀: ESP32의 GPIO에 연결합니다. 여기서는 GPIO18입니다. 통로가 막히면 0, 열려 있으면 1을 읽습니다

제조 묶음에 따라 이 세 핀의 순서가 다를 수 있습니다. 사진이 아니라 보드에 적힌 표기를 믿으세요.

전원에 대한 주의: OUT의 전압은 VCC의 전압만큼 올라갈 수 있습니다. ESP32의 GPIO 핀은 3.3V에서 작동합니다. 모듈에 5V를 공급하면 OUT이 GPIO에 5V를 밀어 넣을 수 있습니다. 그러니 3.3V 핀에서 전원을 받으면 신호가 안전합니다.

작동 원리

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

왼쪽 팔 안에는 적외선 LED가 있습니다. 오른쪽 팔 안에는 NPN 포토트랜지스터가 있습니다. 둘은 5.9 mm 통로를 사이에 두고 서로를 똑바로 바라봅니다.

  • 통로가 비어 있을 때: 보이지 않는 빛이 포토트랜지스터에 닿습니다. Pin.value()는 1을 반환합니다.
  • 카드, 손가락, 또는 인코더 디스크의 이빨 하나가 통로에 있을 때: 빛이 차단됩니다. Pin.value()는 0을 반환합니다.

모듈에는 슈미트 트리거도 있습니다. 천천히 변하는 빛의 세기를 또렷한 0 또는 1로 바꿔 줍니다. 덕분에 신호가 튀지 않아서 MicroPython 스크립트에 디바운스 코드가 필요 없습니다.

빛이 통과하지 못하는 물체를 고르세요. 얇고 투명한 플라스틱 판은 IR 빛을 통과시킬 수 있으며, 그러면 센서는 계속 "비어 있음"으로 읽습니다.

모든 브랜드가 같은 로직을 쓰는 것은 아닙니다. 다른 제조사의 일부 모듈에서는 출력이 반대입니다. 통로가 비어 있는데 막혔다고 나오면 첫 번째 스크립트에서 0과 1을 서로 바꾸세요. RPM 스크립트는 어느 쪽이든 이빨마다 에지 하나를 세므로 바꿀 필요가 없습니다.

선연결

ESP32와 슬롯 센서 배선

모듈에는 점퍼 와이어 세 개만 있으면 됩니다. 브레드보드는 선택 사항입니다. 연결을 단단하게 하고 싶다면 ESP32용 나사 단자 브레이크아웃 보드를 사용할 수도 있습니다.

ESP32 마이크로파이썬 ir 슬롯형 광학 속도 센서 배선도

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

속도 센서 핀 ESP32 핀
VCC 3.3V
GND GND
OUT GPIO18

슬롯에 인코더 디스크 놓기

속도를 재려면 가장자리에 구멍이나 이빨이 있는 둥근 디스크가 필요합니다. 디스크가 돌면 이빨 하나하나가 잠깐씩 빛을 막고, 한 번 막힐 때마다 펄스 하나가 됩니다. 디스크를 모터 축이나 바퀴에 끼우세요. 그런 다음 디스크의 가장자리가 통로 안에서 돌도록 M3 구멍으로 모듈을 나사로 고정하세요. 손으로 디스크를 한 바퀴 돌려 보고 센서에 닿지 않는지 확인하세요.

처음에는 손가락으로 천천히 돌리는 것으로 충분합니다. 모터로 디스크를 돌리고 싶다면 모터에는 별도의 배선이 있습니다. ESP32 마이크로파이썬 - DC 모터에서 찾을 수 있습니다.

ESP32 마이크로파이썬 코드 - 슬롯을 지나가는 물체 세기

이 첫 번째 스크립트는 빠른 루프에서 GPIO18을 폴링합니다. 마지막으로 본 값을 기억해 두고, 새 값이 다르면 한 줄을 출력합니다. 0으로 바뀔 때는 카운터에 1도 더합니다.

/* * 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-ir-slotted-optical-speed-sensor */ from machine import Pin import time SENSOR_PIN = 18 # ESP32 GPIO18 connected to the OUT pin of the speed sensor sensor = Pin(SENSOR_PIN, Pin.IN) last_state = sensor.value() object_count = 0 # how many times the slot was blocked while True: state = sensor.value() if state != last_state: # the state has changed if state == 0: # LOW = something is in the slot object_count += 1 print("The slot is blocked - count: {}".format(object_count)) else: # HIGH = the slot is clear print("The slot is clear") last_state = state time.sleep_ms(1)

빠른 단계

Thonny IDE를 사용하여 ESP32에서 MicroPython 코드를 설정하고 실행하는 방법은 다음과 같습니다:

  • 컴퓨터에 Thonny IDE가 설치되어 있는지 확인하세요.
  • ESP32 보드에 MicroPython 펌웨어가 설치되어 있는지 확인하세요.
  • ESP32에서 MicroPython이 처음이신가요? ESP32 마이크로파이썬 - 시작하기 가이드부터 시작하세요.
  • 제공된 다이어그램에 따라 IR 슬롯형 광학 속도 센서를 ESP32 보드에 연결하세요.
  • USB 케이블로 ESP32 보드를 컴퓨터에 연결하세요.
  • 컴퓨터에서 Thonny IDE를 여세요.
  • Thonny IDE에서 도구 옵션으로 이동하세요.
  • 인터프리터 탭에서 드롭다운 메뉴의 MicroPython (ESP32)를 선택하고, 올바른 포트가 선택되어 있는지 확인하세요(예: Windows에서는 COM12, Linux에서는 /dev/ttyUSB0).
  • 제공된 MicroPython 코드를 복사하여 Thonny 편집기에 붙여넣으세요.
  • 코드를 ESP32에 저장하려면:
    • 저장 버튼을 클릭하거나 Ctrl+S를 누르세요.
    • 저장 대화 상자에서 MicroPython 장치를 선택하세요.
    • 파일 이름을 main.py로 지정하세요.
  • 초록색 실행 버튼을 클릭하거나 (또는 F5 키를 눌러) 스크립트를 실행하세요.
  • 종이 카드 조각을 틈에 밀어 넣었다가 빼고, 이를 두 번 더 반복하세요.
  • Thonny 하단의 Shell에서 메시지를 확인하세요.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot 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
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

스크립트 이름을 main.py로 지정하여 MicroPython 장치에 저장하면, ESP32의 전원이 켜질 때마다 자동으로 실행됩니다.

ESP32 마이크로파이썬 코드 - 모터 속도(RPM) 읽기

두 번째 스크립트는 모듈을 회전계로 바꿉니다. 디스크가 빠르게 돌 때는 폴링이 너무 느리므로, 이 스크립트는 대신 인터럽트를 사용합니다. sensor.irq(trigger=Pin.IRQ_FALLING, handler=count_pulse) 줄은 핀이 1에서 0으로 떨어지는 바로 그 순간에 ESP32가 count_pulse()를 호출하도록 합니다. 이 하강은 이빨마다 한 번 일어나므로 같은 이빨이 두 번 세어지지 않습니다.

메인 루프는 1초 동안 쉬고, 카운터를 복사한 다음, 카운터를 지웁니다. 그리고 계산을 합니다:

  • 20슬롯 디스크가 한 바퀴 돌면 펄스 20개가 나옵니다.
  • 1초 동안의 펄스 × 60 = 1분 동안의 펄스.
  • 1분 동안의 펄스 ÷ 20 = 분당 회전수, 즉 RPM.

20슬롯은 TT 기어 모터에 딸려 오는 디스크의 일반적인 슬롯 수입니다. 디스크가 다른가요? SLOTS_PER_TURN을 실제 슬롯 수로 설정하세요.

/* * 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-ir-slotted-optical-speed-sensor */ from machine import Pin import time SENSOR_PIN = 18 # ESP32 GPIO18 connected to the OUT pin of the speed sensor SLOTS_PER_TURN = 20 # number of slots (holes) in the encoder disc pulse_count = 0 # runs every time a tooth of the disc blocks the slot def count_pulse(pin): global pulse_count pulse_count += 1 sensor = Pin(SENSOR_PIN, Pin.IN) sensor.irq(trigger=Pin.IRQ_FALLING, handler=count_pulse) while True: time.sleep(1) # count pulses for 1 second pulses = pulse_count # read and reset the counter pulse_count = 0 rpm = pulses * 60 / SLOTS_PER_TURN # pulses per second -> turns per minute print("Pulses: {} | Speed: {:.2f} RPM".format(pulses, rpm))

빠른 단계

  • 인코더 디스크 그림처럼 디스크와 모듈을 장착하세요. 같은 세 개의 선을 유지합니다.
  • 제공된 MicroPython 코드를 복사하여 Thonny 편집기에 붙여넣으세요.
  • MicroPython 장치에 저장하세요. main.py라는 이름의 파일은 하나만 있을 수 있습니다. 같은 이름을 다시 쓰면 이 스크립트가 첫 번째 스크립트를 대체합니다. 둘 다 보관하고 싶다면 이 스크립트에는 rpm.py 같은 다른 이름을 지어 주세요.
  • 초록색 실행 버튼을 클릭하거나 (또는 F5 키를 눌러) 스크립트를 실행하세요.
  • 손으로 디스크를 돌리거나 모터를 켜세요.
  • Thonny 하단의 Shell에서 메시지를 확인하세요. 아래 예시에서는 모터가 멈춘 상태에서 시작해 300 RPM 근처로 돌다가 멈춥니다.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot 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
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

main.py라는 이름의 파일만 전원이 켜질 때 저절로 시작됩니다. 그러니 혼자 실행하고 싶은 스크립트를 그 이름으로 저장하고, 다른 하나는 다른 이름으로 보관하세요.

거리도 알고 싶나요? 바퀴가 한 바퀴 돌면 로봇은 바퀴 둘레, 즉 π × 바퀴 지름만큼 움직입니다. 여기에 회전 수를 곱하세요.

좁은 틈 안이 아니라 로봇 앞의 물체를 감지해야 하나요? ESP32 마이크로파이썬 - 장애물 회피 센서을 사용해 보세요.

동영상

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