이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi Pico, Raspberry Pi, WiFi 모듈을 사용 합니다.

python-sensors-modules

Raspberry Pi Pico Sensors and Modules - MicroPython
Raspberry Pi Pico 센서(Sensors)와 제어모듈 - MicroPython


  • 센서에 입력되는 신호가 임계값을 넘으면 Low/High를 출력하는 센서 모듈
    • Low/High를 출력하는 센서 모듈 예
    • 아래 사진은 자주 자용하는 Low/High를 출력하는 센서 모듈의 예 이다. 아래 예 센서는 입력 신호가 미리 정해진 임계치를 넘으면 Low 상태에서 High 상태(or High 상태에서 Low 상태)로 천이(Rising edge or Falling edge)하기 때문에 External Interrupt 처리 방식으로 제어 할 수 있다.

      PIR 센서모듈(HC-SR501)

      Sound 센서모듈(SZH-EK033)

      홀 센서(WSH131)


    • Low/High를 출력하는 센서 모듈을 사용하는 구성도
    • Low/High를 출력하는 센서 모듈을 제어하는 프로그램 예
      • 윗 예의 센서 모듈은 모두 입력 신호가 임계치를 넘기면 Low 상태에서 High 상태로 천이하기 때문에 모두 아래와 같은 External interrupt 방식의 프로그램으로 구현 할 수 있다.

      • Low/High를 출력하는 센서 모듈을 제어하는 프로그램 예: sensor_event_handler.py
      • 
        # 외부 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
          • 주: 센서에 따라 전원 전압은 5V 또는 3.3V 일 수 있으니 확인 바람.

          • Pi Pico 개발보드 GND <-> 센서 GND
      • 실험 방법
        • 윗 프로그램을 복사하여 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: 먼저 홀 센서 회로를 구성하고 홀 센서 앞에 자성체(자석)를 접근 시킨다.
          • 참고자료: 홀 센서 회로 예



  • Analog 전압을 출력하는 센서 모듈
    • ADC(Analog to Digital Conversion) object(class ADC)
      • Pi Pico의 ADC 기능은 핀 26-28에서 사용할 수 있다. 기본 구성인 경우 ADC 핀의 입력 전압은 0.0v와 3.3v 사이(12Bit or 16Bit로 읽음)이어야 한다.

      • ADC object 생성자(Constructors): classmachine.ADC(id)
        • id: Pin 객체. Pin 번호는 26-28 까지 사용할 수 있다.
      • Method
        • ADC.read_u16(): 0v - 3.3v Analog voltage를 0-65535 범위의 정수로 반환한다.
      • ADC class 사용 예
        • from machine import ADC

          adc = ADC(Pin(26))   # Create ADC object on ADC pin

          adc.adc.read_u16()    # Read value

    • Analog 전압을 출력하는 센서 모듈 예
    • 아래 사진은 자주 자용하는 Analog 전압을 출력하는 센서 모듈의 예 이다. 아래 예 센서는 입력 신호의 크기에 따라 출력 전압이 변동하기 때문에 센서 모듈의 출력 전압을 디지털 값으로 변환하는 A/D 변환기를 사용하여야 한다.

      수위 센서(Water Sensor)

      포토 센서(GL5516)

      온도 센서(LM35DZ)


    • Analog voltage를 출력하는 센서 모듈을 사용하는 구성도
    • ADC 실험을 위한 회로 구성 예

    • Analog voltage를 출력하는 센서 모듈을 사용하는 프로그램 예
      • 윗 예의 센서 모듈은 모두 Analog voltage 신호를 출력하기 때문에 ADC를 사용하여야 한다.

      • Pi Pico를 사용하여 Analog voltage를 주기적으로 측정하여 출력하는 프로그램 예: sensor_analog_voltage_pico.py
      • 실험을 위한 준비
        • 개발보드와 센서 모듈 연결
          • 신호선: Pi Pico의 ADC input pin(GPIO26) <-> 센서의 Output pin
          • 포토 센서(GL5516)를 사용하는 경우: 전원(Vdd) <-> 10K 저항 <-> GL5516 <-> GND를 연결한다. 여기서 10K 저항과 GL5516를 연결한 점이 신호 출력(센서의 Output pin에 해당)이다.

          • 전원: 개발보드 VDD <-> 센서 Vdd pin
          • 주: 센서에 따라 전원 전압은 5V 또는 3.3V 일 수 있으니 확인 바람.

          • 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을 클릭하면 스크립트가 개발보드에 전송되고 프로그램이 실행된다.
          • 프로그램이 실행되면 센서 출력 전압을 디지털 값으로 변환한 결과가 출력된다.

          주: 센서의 종류에 따라 Conversion_factor를 곱하여 적당한 단위로 환산하는 프로그램을 삽입하여야 한다.



  • 펄스폭(Pulse width) 출력 모듈
    • 초음파 거리 센서(HC-SR04)
    • 초음파 거리 센서(HC-SR04) 모듈을 사용하는 구성도 예

    • 초음파 거리 센서(HC-SR04) 모듈을 제어하는 프로그램 예
      • 초음파 거리 센서(HC-SR04) 모듈은 초음파를 반사하는 물체까지의 거리에 비례한 Pulse 폭을 출력한다.

      • 초음파 거리 센서(HC-SR04) 모듈을 제어하는 프로그램 예:
      • 
        # 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초 간격으로 초음파 거리 센서와 물체와의 거리가 출력된다. 센서 앞 물체의 거리를 변동시키며 출력 값과 비교한다.


  • Single-Wire 통신을 사용하는 센서
    • 온도/습도 센서(DHT11/DHT22) 모듈
    • DHT11/DHT22 센서 모듈을 사용하는 구성도 예

      참고자료: Single-Wire 통신을 사용하는 센서

    • 온도/습도 센서(DHT11/DHT22) 모듈을 제어하는 프로그램 예
      • 온도/습도 센서(DHT11/DHT22) 모듈은 측정한 온도/습도 값을 디지털 데이터로 변환하여 Single-Wire 통신 프로토콜로 출력한다.

      • 온도/습도 센서(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
          • 주: 센서에 따라 전원 전압은 5V 또는 3.3V 일 수 있으니 확인 바람.

          • 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-main.py을 main.py로 Rename하여 Pi Pico에 Upload 하면 Pi Pico에 전원이 인가되는 즉시 자동으로 실행할 수 있다.


  • I2C 통신을 사용하는 모듈