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์„ ํ™œ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.