IBM Developer Day 2018에서 배포한 IoT 뱃지는 ESP32 Devkit을 기반으로 구성되어 있습니다. 배포 당시 설치된 행사용 소프트웨어 대신 마이크로 파이썬이 포팅된 펌웨어를 설치하면 IoT 뱃지를 개발 보드로 활용할 수 있습니다. 이 튜토리얼에서는 IoT Badge에 피에조 부저와 MQ135 센서 보드를 연결하고 마이크로 파이썬 프로그래밍으로 유해 가스 센서 탐지 정보를 확인하고 일정 값 이상 시 부저로 알릴 수 있는 방법에 대해 학습합니다.

학습 목표

이 튜토리얼을 마치게 되면 다음과 같은 것을 할 수 있습니다:

  • REPL을 이용하여 IoT Badge에 마이크로 파이썬 코드 실행
  • 마이크로 파이썬 코드로 GPIO 포트에서 Analog 입력 확인
  • 마이크로 파이썬 코드로 GPIO 포트에서 Digital 입력 확인
  • 마이크로 파이썬 코드로 GPIO 포트에 PWM 출력으로 피에조 부저 동작

사전 준비 사항

  1. Developer Day 2018 IoT Badge 펌웨어 설치하기
  2. Developer Day 2018 IoT Badge에 나만의 파이썬 코드 실행하기
  3. Developer Day 2018 IoT Badge로 피에조 부저 동작하기
  4. IBM Developer Day 2018 IoT Badge
  5. 데이터 통신용 USB 2.0 Micro B Type 케이블 (마이크로 5핀)
  6. J8번 6핀 2.54mm Female 소켓 헤더 연결
  7. J4번 4핀 2.54mm Female 소켓 헤더 연결
  8. MQ135 가스 센서 breakout board
  9. 피에조 부저

소요 시간

이 튜토리얼을 완료하기까지 대략 30분 정도가 소요됩니다.

단계

피에조버져는 Developer Day 2018 IoT Badge로 피에조 부저 동작하기 튜토리얼을 통해 구성하고 해당 코드를 재사용합니다.

MQ135 Breakout Board 연결하기

본 튜토리얼에서는 MQ135 센서를 이용하여 유해 가스를 탐지합니다. MQ135 센서는 보통 유해 가스 탐지 센서로 암모니아, 황화물, 벤젠류의 가스를 탐지할 수 있다고 합니다.

MQ135 센서를 IoT 뱃지와 연결하려면 동작회로가 필요한데, 일반적으로 시중에서는 Breakout Board 형태로 판매를 합니다. 본 튜토리얼에서 사용하는 MQ135 Breakout Board는 VCC, GND, Digital Out, Analog Out 4 Pin과 가변 저항이 있어 특정 수치 이상인 경우 보드에 내장된 LED가 켜지고 Digial Out 핀에 High 값이 출력됩니다.

MQ135 Breakout 보드를 IoT 뱃지의 J4커넥터에 연결합니다. 아래 그림에서와 같이 제일 왼쪽을 기준으로 첫 번째는 Vcc, 두 번째가 GND, 세 번째는 GPIO35번 그리고 마지막이 GPIO34번 입니다.

만약 준비된 MQ135 Breakout 보드가 튜토리얼과 맞지 않는 경우 센서 혹은 IoT Badge가 손상될 수 있음으로 해당 Breakout 보드의 연결에 주의해야 합니다. IoT 뱃지에 전원을 연결하기 전에 위에 언급된 순서대로 센서와 연결이 가능한지 확인하십시오.

센서와 보드가 연결되면 아래와 같은 모양이 됩니다.

마이크로 파이썬 코드 작성하기

MQ135 센서의 경우 다른 센서와 달리 내장 Heater가 있는 특징이 있습니다. 일반적 센서의 경우 배선을 잘못하거나 고장났을 때 온도가 올라가는 경우가 있지만 이 센서는 가스 탐지를 위해 센서의 온도를 일정하게 유지하도록 되어 있습니다. 센서에 전원을 연결하고 잠시 기다리면 약간 따뜻한 정도로 가열되므로 안정화 되기까지 잠시 기다려야 합니다.

J4 커넥터에 연결된 가스 센서는 GPIO35에서 Digital 입력을 GPIO34에서 Analog 입력을 받을 수 있습니다. 먼저 Digital 입력을 받은 코드를 작성합니다. 이 코드를 실행하면 가스가 탐지되면 0이, 아닌 경우는 1이 출력됩니다.

import time
from machine import Pin

din = Pin(35, Pin.IN)
while(True):
    print(din.value())
    time.sleep_ms(500)

센서 테스트

MQ135 센서를 테스트 하려면 앞서 말한 센서가 탐지 가능한 가스(암모니아, 황화물 또는 벤젠 계열)가 있어야 합니다. 화학물을 취급하는 경우나 주변 환경에 문제가 있는 경우가 아니면 이런 가스를 구하기는 어렵습니다. 그렇지만, 자체 테스트를 해본 결과 기화된 알콜에도 반응하고 주변에서 손쉽게 구할 수 있는 보드 마커에 포함된 성분이 검출되므로 이를 이용할 수 있습니다.

ADC 사용하기

이번에는 MQ135 센서의 Analog 값을 확인 해 보도록 합니다. 마이크로파이썬의 machine.ADC 모듈을 이용하게 되는데, ESP32의 ADC는 아날로그 신호를 디지털로 변환 할 때 몇 가지 옵션을 선택 할 수 있습니다. 먼저 해상도를 지정할 수 있는데 최대 12bits 즉, 0부터 4095(0xfff)까지 얻을 수 있습니다. 그리고 Attenuation값을 11dB로 설정하면 정밀도는 낮아지긴 하지만 3.3V 이상 3.9V이하까지 전압 입력 값을 측정 할 수 있습니다. 관련 내용은 ESP32 Software Framework인 IDF API Reference 문서를 참고하시기 바랍니다.

다음과 같이 machine.ADC 모듈로 측정된 전압 값을 확인 해 볼 수 있습니다.

from machine import Pin, ADC

adc = ADC(Pin(34))
adc.atten(ADC.ATTN_11DB)
adc.width(ADC.WIDTH_12BIT)

while True:
    print(adc.read())
    time.sleep_ms(500)

이제 이 두 가지를 하나로 합쳐서 확인해 보도록 합니다.

from machine import Pin, ADC

din = Pin(35, Pin.IN)
adc = ADC(Pin(34))
adc.atten(ADC.ATTN_11DB)
adc.width(ADC.WIDTH_12BIT)

while True:
    print('D:{}, A:{}'.format(din.value(), adc.read()))
    time.sleep_ms(500)

위의 코드를 출력하면 아래와 유사한 결과를 얻을 수 있습니다. 지금은 대략 Analog 입력 값이 대략 2000이 넘는 경우 Digital 값이 변하는 기준인 것을 확인 할 수 있습니다. 이 값은 보드에 내장된 가변 저항을 돌려서 조절하면 변경 가능합니다.

D:1, A:1220
D:1, A:1278
D:1, A:1440
D:1, A:1635
D:1, A:1745
D:1, A:1839
D:1, A:1904
D:1, A:1950
D:1, A:1998
D:0, A:2042
D:0, A:2103
D:0, A:2155
D:0, A:2195
D:0, A:2214
D:0, A:2221
D:0, A:2218
D:0, A:2207
D:0, A:2177
D:0, A:2083
D:1, A:1995
D:1, A:1934
D:1, A:1877
D:1, A:1834
D:1, A:1793

Digital 측정 값으로 부저 연동하기

앞의 예제에서 가스 센서의 측정 값을 확인했다면, 이번에는 이 값에 따라 부저 소리를 발생하는 코드를 작성해 보겠습니다. 피에조 부저는 PWM 방식으로 소리를 발생할 수 있는데, 피에조 부저가 연결된 GPIO27번에 일정한 주파수 값을 PWM으로 출력하면 부저에 있는 떨림판이 울려 소리가 나게 됩니다. 예를 들어 440Hz인 경우 가온 다(C4)에 해당하는 소리를 들을 수 있습니다.

MQ135 센서의 Digital 측정 값이 0이라면 가스가 탐지된 상황이므로 부저 소리를 내도록 다음과 같이 코드 추가합니다.

from machine import Pin, ADC, PWM

din = Pin(35, Pin.IN)
adc = ADC(Pin(34))
adc.atten(ADC.ATTN_11DB)
adc.width(ADC.WIDTH_12BIT)
pwm = PWM(Pin(27, Pin.OUT))
pwm.duty(0)

while True:
    d = din.value()
    a = adc.read()
    print('D:{}, A:{}'.format(d, a))
    if d is 0:
      pwm.freq(440)
      if pwm.duty() != 50:
          pwm.duty(50)
    else:
      if pwm.duty() != 0:
          pwm.duty(0)
    time.sleep_ms(500)

Analog 측정 값으로 부저 연동하기

Digital 측정 값은 Breakout 보드에 있는 가변 저항에 따라 탐지 여부가 결정됩니다. 측정 기준이 하드웨어적으로 고정되며, 기준 초과 여부만 판단하게 되므로 별도 소프트웨어 없이 단순 회로를 조합해서 사용 할 수 있습니다. 그러나, 센서가 측정 한 값이 농도에 대응되는 값이므로 만약 측정된 값에 따라 다른 대응을 하고자 한다면 Analog 측정 값을 이용해야 합니다.

아래 코드는 측정 값에 따라 부저음과 더 큰 소리가 나도록 작성한 예제입니다.

from machine import Pin, ADC, PWM

din = Pin(35, Pin.IN)
adc = ADC(Pin(34))
adc.atten(ADC.ATTN_11DB)
adc.width(ADC.WIDTH_12BIT)
pwm = PWM(Pin(27, Pin.OUT))
duty = 0
pwm.duty(duty)

while True:
    d = din.value()
    a = adc.read()
    print('D:{}, A:{}'.format(d, a))

    if a >= 1000:
        freq = a
        duty = 50+int(50 * a / 0xfff) # max 0xfff cause it bandwidth is 12bits
        print('freq:{}, duty:{}'.format(freq, duty))
        pwm.freq(freq)
    else:
        duty = 0
    
    if pwm.duty() != duty:
        pwm.duty(duty)
    
    time.sleep_ms(500)

맺음말

이 튜토리얼에서는 Develper Day 2018 IoT 뱃지와 유해 가스 센서 그리고 피에조 부저를 연결하여 마이크로 파이썬으로 어떻게 ADC와 PWM을 활용하는지에 대해 알아보았습니다.