- 센서에 입력되는 신호가 임계값을 넘으면 Low/High를 출력하는 센서 모듈
- Low/High를 출력하는 센서 모듈 예
- PIR(인체 감지) 센서모듈(HC-SR501)
- Sound 센서모듈(SZH-EK033)
- 홀 센서(Hall Sensor) WSH131
- Low/High를 출력하는 센서 모듈을 제어하는 구성도
- Low/High를 출력하는 센서 모듈을 제어하는 프로그램 예
- Analog 전압을 출력하는 센서 모듈
- ADC(Analog to Digital Conversion) object(class ADC)
- Analog 전압을 출력하는 센서 모듈 예
- 물 수위 센서(Water Level Sensor)
- 포토 센서(GL5516)
- 온도 센서(LM35DZ)
- Analog voltage를 출력하는 센서 모듈을 사용하는 구성도
- Analog voltage를 출력하는 센서 모듈을 사용하는 프로그램 예
- 펄스폭(Pulse width) 출력 모듈
- Single-Wire 통신을 사용하는 센서
- I2C 통신을 사용하는 모듈
- Raspberry Pi Pico 센서(Sensors)와 제어모듈 관련 페이지 보기
- Low/High를 출력하는 센서 모듈 예
- Low/High를 출력하는 센서 모듈을 사용하는 구성도
- Low/High를 출력하는 센서 모듈을 제어하는 프로그램 예
- Low/High를 출력하는 센서 모듈을 제어하는 프로그램 예: sensor_event_handler.py
아래 사진은 자주 자용하는 Low/High를 출력하는 센서 모듈의 예 이다. 아래 예 센서는 입력 신호가 미리 정해진 임계치를 넘으면 Low 상태에서 High 상태(or High 상태에서 Low 상태)로 천이(Rising edge or Falling edge)하기 때문에 External Interrupt 처리 방식으로 제어 할 수 있다.
윗 예의 센서 모듈은 모두 입력 신호가 임계치를 넘기면 Low 상태에서 High 상태로 천이하기 때문에 모두 아래와 같은 External interrupt 방식의 프로그램으로 구현 할 수 있다.
# 외부 Event(센서에 의하여 발생)에 반응하는 장치(센서)를 제어하는 프로그램.
# GPIO17를 Event(Interrupt) input pin으로 사용한다.
# GPIO25를 Event 발생 상태를 표시하는 LED로 시용한다.
from machine import Pin, Timer
# Raspberry Pi Pico 보드는 GPIO25를 LED Pin으로 사용한다.
# Raspberry Pi Pico W 보드는 WL_GPIO0를 LED Pin으로 사용한다.
led = Pin("LED", Pin.OUT)
# Event input pin
eventPin = Pin(17, Pin.IN)
# LED turn off
led.value(0)
# Event 처리 함수
def interruptEvent(pin):
# 이 곳에 Event 가 발생한 경우 처리하여야 하는 프로그램을 작성한다.
led.value(1)
print('Event caused by:', pin)
# timer.init() Method를 사용하여 4000ms 후에 Timer interrupt(One_shot)이 발생하도록 한다.
timer1.init(mode=Timer.ONE_SHOT, period=4000, callback=timeDelay)
# Event 발생 후 일정한 후에 실행(Event 종료)되는 함수
def timeDelay(pin):
# 이 곳에 Event 종료 후 처리하여야 하는 프로그램을 작성한다.
led.value(0)
print('Event removed.')
# Timer object를 생성한다.
timer1 = Timer(callback=timeDelay)
# Event의 rising edge(or falling edge)에서 Interrupt가 발생하도록 설정한다.
eventPin.irq(trigger=Pin.IRQ_RISING, handler=interruptEvent)
- Pi Pico 개발보드와 센서 모듈 연결
- Pi Pico 개발보드 Event input pin(GP17) <-> 센서의 Output pin
- Pi Pico 개발보드 VDD <-> 센서 Vdd pin
- Pi Pico 개발보드 GND <-> 센서 GND
주: 센서에 따라 전원 전압은 5V 또는 3.3V 일 수 있으니 확인 바람.
- 윗 프로그램을 복사하여 File name "sensor_event_handler.py"로 저장 한다.
- Thonny IDE를 실행하고 Thonny IDE의 사용 환경(Thonny 실행에 사용할 장치와 COM Port 선택)이 바르게 되어 있는지 확인한다.
- Thonny IDE의 Python shell 창에 prompt( >>> )가 출력되었는 확인한다.
- Thonny IDE에서 "파일 -> 열기... -> 이 컴퓨터"를 실행하여 sensor_event_handler.py를 Open 한다.
- 실험
- "실행 -> 현재 스크립트 실행"을 실행하거나 Toolbar의 "실행" Icon을 클릭하면 스크립트가 개발보드에 전송되고 프로그램이 실행된다.
- 프로그램이 실행되면 센서에 임계치 이상의 신호를 인가 한다. 센서에 임계치 이상의 신호를 인가되면 LED가 지정된 시간(4Sec) 동안 Turn on 된다.
- 센서에 임계치 이상의 신호를 인가하는 방법 예
- PIR(인체 감지) 센서모듈(HC-SR501): 센서 앞에 손(인체)을 가까이 접근 시킨다.
- Sound 센서모듈(SZH-EK033): 센서에 큰 소음이나 진동(입으로 후하고 마이크에 진동)을 가한다.
- 홀 센서(Hall Sensor) WSH131: 먼저 홀 센서 회로를 구성하고 홀 센서 앞에 자성체(자석)를 접근 시킨다.
참고자료: 홀 센서 회로 예
- ADC(Analog to Digital Conversion) object(class ADC)
- ADC object 생성자(Constructors): classmachine.ADC(id)
- id: Pin 객체. Pin 번호는 26-28 까지 사용할 수 있다.
- Method
- ADC.read_u16(): 0v - 3.3v Analog voltage를 0-65535 범위의 정수로 반환한다.
- ADC class 사용 예
- Analog 전압을 출력하는 센서 모듈 예
- Analog voltage를 출력하는 센서 모듈을 사용하는 구성도
- Analog voltage를 출력하는 센서 모듈을 사용하는 프로그램 예
- Pi Pico를 사용하여 Analog voltage를 주기적으로 측정하여 출력하는 프로그램 예: sensor_analog_voltage_pico.py
- 실험을 위한 준비
- 개발보드와 센서 모듈 연결
- 신호선: Pi Pico의 ADC input pin(GPIO26) <-> 센서의 Output pin
- 전원: 개발보드 VDD <-> 센서 Vdd pin
- GND: 개발보드 GND <-> 센서 GND
- 실험 방법
- 윗 프로그램을 복사하여 File name "sensor_analog_voltage_pico.py"로 저장 한다.
- Thonny IDE를 실행하고 Thonny IDE의 사용 환경(Thonny 실행에 사용할 장치와 COM Port 선택)이 바르게 되어 있는지 확인한다.
- Thonny IDE의 Python shell 창에 prompt( >>> )가 출력되었는 확인한다.
- Thonny IDE에서 "파일 -> 열기... -> 이 컴퓨터"를 실행하여 sensor_analog_voltage_pico.py를 Open 한다.
- 실험
- "실행 -> 현재 스크립트 실행"을 실행하거나 Toolbar의 "실행" Icon을 클릭하면 스크립트가 개발보드에 전송되고 프로그램이 실행된다.
- 프로그램이 실행되면 센서 출력 전압을 디지털 값으로 변환한 결과가 출력된다.
Pi Pico의 ADC 기능은 핀 26-28에서 사용할 수 있다. 기본 구성인 경우 ADC 핀의 입력 전압은 0.0v와 3.3v 사이(12Bit or 16Bit로 읽음)이어야 한다.
from machine import ADC
adc = ADC(Pin(26)) # Create ADC object on ADC pin
adc.adc.read_u16() # Read value
아래 사진은 자주 자용하는 Analog 전압을 출력하는 센서 모듈의 예 이다. 아래 예 센서는 입력 신호의 크기에 따라 출력 전압이 변동하기 때문에 센서 모듈의 출력 전압을 디지털 값으로 변환하는 A/D 변환기를 사용하여야 한다.
ADC 실험을 위한 회로 구성 예
윗 예의 센서 모듈은 모두 Analog voltage 신호를 출력하기 때문에 ADC를 사용하여야 한다.
포토 센서(GL5516)를 사용하는 경우: 전원(Vdd) <-> 10K 저항 <-> GL5516 <-> GND를 연결한다. 여기서 10K 저항과 GL5516를 연결한 점이 신호 출력(센서의 Output pin에 해당)이다.
주: 센서에 따라 전원 전압은 5V 또는 3.3V 일 수 있으니 확인 바람.
주: 센서의 종류에 따라 Conversion_factor를 곱하여 적당한 단위로 환산하는 프로그램을 삽입하여야 한다.
- 초음파 거리 센서(HC-SR04)
- 초음파 거리 센서(HC-SR04) 모듈을 제어하는 프로그램 예
- 초음파 거리 센서(HC-SR04) 모듈을 제어하는 프로그램 예:
초음파 거리 센서(HC-SR04) 모듈을 사용하는 구성도 예
초음파 거리 센서(HC-SR04) 모듈은 초음파를 반사하는 물체까지의 거리에 비례한 Pulse 폭을 출력한다.
# Pi Pico를 사용하여 센서에 의하여 발생하는 Pulse width을 측정하는 프로그램 예
# 초음파 거리 센서 HC-SR04를 사용하여 실험 하였다.
# GP18을 Pulse width input pin으로 사용한다.
# GP19을 Triger output pin으로 사용한다.
from machine import Pin, Timer, time_pulse_us
from time import sleep_us
# HC-SR04 Echo pulse(Pulse width) 입력 Pin
pulseWidthIn = Pin(18, Pin.IN)
# HC-SR04 Trigger pulse output pin
trig = Pin(19, Pin.OUT)
# Trigger pulse를 0로 초기화
trig.value(0)
# Echo pulse width(uSec) 값을 저장하는 변수
pulseWidthUsec = 0
# Timer event 처리 함수. 이 예에서는 2초에 한번 측정한다.
def readPulseWidth(pin):
# 이 곳에 Event 가 발생한 경우 처리하여야 하는 프로그램을 작성한다.
# Triger 신호를 출력한다.
global pulseWidthUsec
trig.value(1)
sleep_us(10)
trig.value(0)
# Echo pulse의 pulse width(High 상태)을 측정한다.
pulseWidthUsec = time_pulse_us(pulseWidthIn, 1, 30000)
# Echo 응답이 없는 경우 Error 메세지 출력
if pulseWidthUsec == -1 or pulseWidthUsec == -2:
print('Object not found: ', pulseWidthUsec)
else:
# Echo pulse 값(uSec)을 거리(cm)로 환산한다.
distance = pulseWidthUsec * 17 /1000
print('Pulse width uSec: ', pulseWidthUsec, 'Distance: ', distance)
# Timer object를 생성하고 측정 주기를 2000mSec(2Sec)로 설정한다.
timer1 = Timer(period=2000, mode=Timer.PERIODIC, callback=readPulseWidth)
- Pi Pico 개발보드와 센서 모듈 연결
- Pi Pico 개발보드 Pulse input pin(GP18) <-> 센서의 echo pin
- Pi Pico 개발보드 Trigger output pin(GP19) <-> 센서의 Trig pin
- Pi Pico 개발보드 VDD(3.3V) <-> 센서 Vdd pin(센서에 따라 5V 전원을 사용하는 것도 있음)
- Pi Pico 개발보드 GND <-> 센서 GND
- 윗 프로그램을 File name "sensor_pulse_width_HC_SR04.py"로 저장 한다.
- Thonny IDE를 실행하고 Thonny IDE의 사용 환경(Thonny 실행에 사용할 장치와 COM Port 선택)이 바르게 되어 있는지 확인한다.
- Thonny IDE의 Python shell 창에 prompt( >>> )가 출력되었는 확인한다.
- Thonny IDE에서 "파일 -> 열기... -> 이 컴퓨터"를 실행하여 sensor_pulse_width_HC_SR04.py를 Open 한다.
- 실험
- "실행 -> 현재 스크립트 실행"을 실행하거나 Toolbar의 "실행" Icon을 클릭하면 스크립트가 개발보드에 전송되고 프로그램이 실행된다.
- 프로그램이 실행되면 2초 간격으로 초음파 거리 센서와 물체와의 거리가 출력된다. 센서 앞 물체의 거리를 변동시키며 출력 값과 비교한다.
- 온도/습도 센서(DHT11/DHT22) 모듈
- 온도/습도 센서(DHT11/DHT22) 모듈을 제어하는 프로그램 예
- 온도/습도 센서(DHT11/DHT22) 모듈을 제어하는 프로그램 예:
- 실험을 위한 준비
- Pi Pico 개발보드와 센서 모듈 연결
- Pi Pico 개발보드 Data input pin(GP18) <-> 센서의 data pin
- Data input line Pull up 저항(1K - 10K): DHT11/DHT22 모듈에 Pull up 저항이 내장된 경우 생략하여도됨.
- Pi Pico 개발보드 VDD(3.3V} <-> 센서 Vcc pin
- Pi Pico 개발보드 GND <-> 센서 GND
- 실험 방법
- 윗 프로그램을 File name "sensor_single_wire_DHT11_pico.py"로 저장 한다.
- Thonny IDE를 실행하고 Thonny IDE의 사용 환경(Thonny 실행에 사용할 장치와 COM Port 선택)이 바르게 되어 있는지 확인한다.
- Thonny IDE의 Python shell 창에 prompt( >>> )가 출력되었는 확인한다.
- Thonny IDE에서 "파일 -> 열기... -> 이 컴퓨터"를 실행하여 sensor_single_wire_DHT11_pico.py를 Open 한다.
- 실험
- "실행 -> 현재 스크립트 실행"을 실행하거나 Toolbar의 "실행" Icon을 클릭하면 스크립트가 개발보드에 전송되고 프로그램이 실행된다.
- 프로그램이 실행되면 2초 간격으로 측정된 온도와 습도 값이 출력된다. 센서에 손가락을 대고 있으면 습도가 변동한다. 유사한 방법으로 온도를 변동 시키며 측정 결과와 비교한다.
- DHT11 Library를 사용한 프로그램 예: sensor-single-wire-DHT11-lib.zip
- 실험을 위한 준비: 회로 구성은 위 예와 동일하다.
- 실험 방법
- sensor-single-wire-DHT11-lib.zip(DHT11-main.py, DHT.py)를 파일을 Download하여 압축을 해제한다.
- Thonny IDE를 실행하고 Thonny IDE의 사용 환경(Thonny 실행에 사용할 장치와 COM Port 선택)이 바르게 되어 있는지 확인한다.
- Thonny IDE의 Python shell 창에 prompt( >>> )가 출력되었는 확인한다.
- Thonny IDE의 "파일 -> 열기"를 실행하여 DHT.py 파일을 Open 한다.
- Thonny IDE의 "...(으)로 저장" 기능을 사용하여 DHT.py 파일을 "MicroPython 장치"에 저장(Upload)한다.
- Thonny IDE에서 "파일 -> 열기... -> 이 컴퓨터"를 실행하여 DHT11-main.py를 Open 한다.
- 실험
- "실행 -> 현재 스크립트 실행"을 실행하거나 Toolbar의 "실행" Icon을 클릭하면 스크립트가 개발보드에 전송되고 프로그램이 실행된다.
- 프로그램이 실행되면 2초 간격으로 측정된 온도와 습도 값이 출력된다. 센서에 손가락을 대고 있으면 습도가 변동한다. 유사한 방법으로 온도를 변동 시키며 측정 결과와 비교한다.
DHT11/DHT22 센서 모듈을 사용하는 구성도 예
참고자료: Single-Wire 통신을 사용하는 센서
온도/습도 센서(DHT11/DHT22) 모듈은 측정한 온도/습도 값을 디지털 데이터로 변환하여 Single-Wire 통신 프로토콜로 출력한다.
주: 센서에 따라 전원 전압은 5V 또는 3.3V 일 수 있으니 확인 바람.
주: 프로그램 개발이 완료되면 DHT11-main.py을 main.py로 Rename하여 Pi Pico에 Upload 하면 Pi Pico에 전원이 인가되는 즉시 자동으로 실행할 수 있다.
- 디지털 출력 온도 센서(DS1621)
- 디지털 출력 온도 센서(DS1621)를 제어하는 프로그램 예
- Raspberry Pi Pico 센서(Sensors)와 제어모듈 관련 페이지 보기
- MicroPython의 이해와 개발 환경 - Thonny IDE
- Raspberry Pi Pico I2C(Inter-Integrated Circuit) 통신
- Raspberry Pi Pico Basic
I2C 통신을 이용한 측정 과 제어 시스템 구성도
주: I2C Pull-Up 저항은 Pi Pico 모듈에 내장되어 있기 때문에 이 구성도에는 생략되었음.
디지털 출력 온도 센서(DS1621)를 사용하는 시스템 구성과 프로그램 예는 "I2C 통신을 이용한 측정 과 제어 시스템 구성 예"에서 설명하였으니 참고하기 바람.