가스·공기 · 난이도 보통
MQ-2 가스 센서로 기준 전압 대비 변화와 DO 경보 문턱 재기
MQ-2는 LPG·프로판·수소·메테인·알코올·연기에 함께 반응하는 센서예요. 5V 출력을 분압해 피코로 읽는 배선, 예열이 자리 잡았는지 확인하고 기준 전압보다 몇 % 올랐는지 보는 코드, DO 경보 문턱을 직접 재는 탐구를 정리했어요.
이 센서로 무엇을 잴 수 있나
MQ-2는 산화주석(SnO₂) 막을 데워서 쓰는 반도체식 가스 센서예요. 한웨이(Hanwei) 데이터시트는 감지 대상으로 LPG, 아이소뷰테인, 프로판, 메테인, 알코올, 수소, 연기를 적어 두었어요. 여러 기체에 한꺼번에 반응하기 때문에, 값이 올라도 어떤 기체 때문인지는 알 수 없어요.
그래서 교실에서는 "깨끗한 공기일 때보다 몇 % 변했나"를 재는 도구로 써요. 손 소독제에서 나온 알코올 증기가 거리에 따라 얼마나 약해지는지, 바람이 반응을 얼마나 빨리 지우는지, 모듈의 DO 경보가 어느 전압에서 켜지는지를 숫자로 확인할 수 있어요. 데이터시트의 감지 범위(LPG·프로판 200~5000ppm, 알코올 100~2000ppm 등)는 표준 가스로 보정한 장치 이야기라서, 모듈만으로 ppm을 말할 수는 없어요.
원리
센서 안에는 히터 코일과 산화주석 막이 들어 있어요. 데워진 막은 깨끗한 공기에서 전기가 잘 통하지 않다가, 가연성 기체가 닿으면 저항(Rs)이 내려가요. 모듈은 Rs와 부하 저항(RL)을 5V에 직렬로 잇고, RL 양 끝의 전압을 AO로 내보내요. 기체가 늘면 Rs가 줄고 AO 전압은 올라가요. 데이터시트의 식은 Rs = (Vc ÷ VRL − 1) × RL이에요. Vc는 회로 전압(5V), VRL은 AO 전압이에요.
모듈에는 비교기(LM393)도 있어요. AO 전압이 가변저항으로 정한 문턱을 넘으면 DO 핀 상태가 바뀌고 작은 LED가 켜져요. 흔한 모듈은 문턱을 넘을 때 DO가 LOW가 되지만 제품마다 다를 수 있으니 직접 확인하세요.
히터 저항은 33Ω(±5%)이라 5V를 걸면 약 0.15A가 흘러요. 피코 자체보다 훨씬 많은 전류라서, 센서를 여러 개 달 때는 전원부터 계산해야 해요.
준비물
- 라즈베리파이 피코(Pico 2 W 포함)와 USB 케이블
- MQ-2 모듈(VCC·GND·DO·AO 네 핀)
- 10kΩ 저항 2개, 20kΩ 저항 2개(AO용과 DO용 분압 두 벌)
- 브레드보드, 점퍼선
- 멀티미터(VBUS 전압과 RL 확인용, 있으면 좋아요)
- 탐구용: 손 소독제, 면봉, 자, USB 선풍기
배선
브레드보드 따라 꽂기 순서 (10단계)
- 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
- 빨간 선: 피코 40번 핀(VBUS) 옆 칸 a2 → 아래쪽 + 줄(5V). 이제 이 줄 전체가 5V예요. 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)은 절대 서로 잇지 않아요.
- 검은 선: 피코 3번 핀(GND) 옆 칸 j4 → 아래쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
- 복합 가스: LPG·프로판·메탄·수소·연기 MQ-2 꽂기: 다리 VCC · GND · AO를 아래쪽 j24 · j25 · j26에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
- 빨간 선(5V 전원): 복합 가스: LPG·프로판·메탄·수소·연기 VCC 줄 i24 → 아래쪽 + 줄(5V)
- 검은 선(GND): 복합 가스: LPG·프로판·메탄·수소·연기 GND 줄 i25 → 아래쪽 − 줄(GND)
- 저항 10kΩ(색띠 갈색·검정·주황): g26 ↔ g28 (AO 다리 칸 → 나눔 칸 28열)
- 저항 20kΩ(색띠 빨강·검정·주황): i28 ↔ 아래쪽 − 줄(GND)
- 초록 선: 나눔 칸 h28 → 피코 31번 핀(GP26) 옆 칸 a11. 5V 신호가 3.3V 아래로 줄어 피코가 안전해요.
- 마지막 확인: ① 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)이 서로 이어지지 않았나요? ② 모든 부품의 GND가 − 줄에 이어졌나요? ③ 5V 신호 다리는 저항을 거쳐 피코에 이어졌나요? ④ 긴 브레드보드는 + − 줄이 가운데에서 끊긴 것도 있어요(빨간·파란 선이 끊겨 있으면 짧은 선으로 이어요). ⑤ 그림과 한 칸씩 비교한 뒤 USB를 꽂아요.
| 모듈 핀 | 피코 핀 | 비고 |
|---|---|---|
| VCC | VBUS (40번) | 히터·측정 회로 5V, 약 0.15A |
| GND | GND (38번) | 피코와 접지를 함께 써요 |
| AO | GP26 (31번) | 10kΩ·20kΩ 분압 뒤 연결 |
| DO | GP16 (21번) | 10kΩ·20kΩ 분압 뒤 연결 |
분압은 AO ─ 10kΩ ─ ● ─ 20kΩ ─ GND로 잇고, 가운데 점(●)을 GP26에 연결해요. 가운데 점의 전압은 AO × 20 ÷ (10 + 20), 곧 2/3예요. AO가 5V까지 올라가도 약 3.33V라서 피코 ADC가 읽는 3.3V 끝 근처에 머물러요. 코드에서는 읽은 값에 1.5를 곱해 원래 AO 전압으로 되돌려요. DO도 HIGH일 때 5V 가까이 나오니 같은 방법으로 낮춰 GP16에 연결해요. 배선 그림과 따라 꽂기는 AO 쪽만 보여 주니, DO용 분압 저항 한 벌은 그림을 따라 꽂은 뒤 같은 모양으로 더 꽂아요.
알아 둘 점이 하나 더 있어요. 분압 저항 30kΩ은 모듈의 RL과 나란히 붙어 실제 부하를 조금 줄여요. 기준과 비교하는 상대 변화에는 문제가 없지만, Rs를 직접 계산할 때는 이 점을 넣어야 해요.
코드
from machine import ADC, Pin
import time
ao = ADC(Pin(26)) # AO → 10kΩ/20kΩ 분압 → GP26
do = Pin(16, Pin.IN) # DO → 10kΩ/20kΩ 분압 → GP16
def ao_volt(n=16):
s = 0
for i in range(n):
s += ao.read_u16()
return s / n * 3.3 / 65535 * 1.5 # 분압을 되돌린 AO 전압(V)
# 1) 자리 잡기 확인: 10초 사이 변화가 1%보다 작아질 때까지(최대 5분)
prev = ao_volt()
for k in range(30):
time.sleep(10)
now = ao_volt()
drift = abs(now - prev) / prev * 100 if prev > 0 else 100
print(f"예열 확인 {k + 1}: {now:.3f} V, 10초 변화 {drift:.1f}%")
if drift < 1:
break
prev = now
base = ao_volt(64) # 2) 깨끗한 공기의 기준 전압
print(f"기준 전압: {base:.3f} V")
while True:
v = ao_volt()
rise = (v - base) / base * 100 if base > 0 else 0
alarm = 1 if do.value() == 0 else 0 # 흔한 모듈: 문턱을 넘으면 DO가 LOW
print(f"DATA: mq2_v={v:.3f}, rise={rise:.0f}, do_alarm={alarm}")
time.sleep(1)
ao_volt()는 16번 읽어 평균을 내요.read_u16()값 0~65535를 0~3.3V로 바꾸고 1.5를 곱해 AO 전압으로 되돌려요.- 처음
for반복은 예열 확인이에요. 10초 사이 변화가 1%보다 작아지면 넘어가고, 5분이 지나면 그냥 넘어가요. 새 센서는 데이터시트에 따라 24시간(한웨이 판) 또는 48시간(새 형식 판) 넘게 켜 두어야 특성이 자리 잡아요. 이 코드는 "오늘 켠 뒤 값이 멈췄나"만 봐요. - 기준 전압은 64번 평균이에요. 이때 주변에 소독제나 입김이 없어야 해요.
rise는 기준보다 몇 % 올랐는지,do_alarm은 DO가 LOW일 때 1이에요.
값 해석과 보정
rise는 같은 센서, 같은 날, 같은 자리에서 비교할 때만 의미가 있어요. 다른 모듈과 숫자를 그대로 견주지 마세요.
데이터시트 감도 곡선의 기준 Ro는 "깨끗한 공기 속 1000ppm 수소에서 잰 저항"이에요. 우리가 잡은 깨끗한 공기 기준과 달라요. 곡선 식에 대입해 ppm을 내는 예제가 많지만, 표준 가스로 보정하지 않았다면 그 숫자에는 근거가 없어요.
데이터시트에는 온도와 습도(33%RH, 85%RH)에 따라 Rs/Ro가 달라지는 그래프도 있어요. 아침과 오후, 맑은 날과 비 오는 날은 기준이 달라지니 실험할 때마다 기준을 새로 잡아요.
Rs가 궁금하면 전원을 끈 채 모듈의 RL을 멀티미터로 재고, Rs = (VBUS ÷ AO − 1) × (RL과 30kΩ의 병렬값)으로 계산해요. VBUS도 정확히 5V가 아닐 수 있으니 재서 넣어요.
DO 문턱은 "지금 가변저항이 가리키는 AO 전압"일 뿐이에요. 탐구 2처럼 직접 재 두면 경보 기준을 숫자로 설명할 수 있어요.
자주 하는 실수
- AO를 GP26에 바로 연결하기. 진한 기체에서는 AO가 5V 가까이 올라 피코 입력 범위를 넘어요. 반드시 분압해요.
- 켜자마자 기준을 잡기. 히터가 막을 데우는 동안 값이 계속 움직여서, 아무것도 안 했는데 올랐다거나 내렸다고 나와요. 예열 확인 단계를 지우지 마세요.
- DO LED가 켜지면 가스가 있다고 믿기. 문턱은 가변저항을 돌린 사람이 정한 값이에요. 공장에서 맞춘 경보 기준이 아니에요.
- 센서를 상자에 넣고 실리콘으로 붙이기. 데이터시트는 유기 실리콘 증기에 노출되면 센서가 제 기능을 잃는다고 경고해요. 실리콘 접착제나 실란트 가까이에 두지 마세요.
- 소독제를 센서에 직접 뿌리기. 물이 튀거나 진한 기체에 오래 두면 감도가 떨어진다고 데이터시트에 적혀 있어요. 면봉에 묻혀 몇 cm 떨어뜨려 두세요.
이 센서로 잴 수 있는 탐구
1. 거리가 두 배가 되면 반응은 얼마나 줄까 - 질문: 소독제 면봉과 센서 사이 거리에 따라 최고 상승률이 어떻게 바뀔까? - 바꾸는 것: 거리 2cm, 4cm, 8cm - 재는 것: 최고 상승률(%), 기준 +10% 안으로 돌아오기까지 걸린 시간(초) - 방법: 면봉을 소독제에 한 번만 찍어 양을 맞추고, 센서 옆 같은 높이에 30초 두었다가 치워요. 값이 기준으로 돌아온 뒤 다음 거리를 재고, 거리마다 3번 반복해 평균을 내요.
2. DO는 어느 전압에서 바뀔까
- 질문: 가변저항을 돌린 정도에 따라 DO가 켜지는 AO 전압은 어떻게 달라질까?
- 바꾸는 것: 가변저항 위치(작은 드라이버로 1/4바퀴씩)
- 재는 것: do_alarm이 0에서 1로 바뀐 순간의 mq2_v(V)
- 방법: 소독제 면봉을 천천히 가까이 가져가며 기록하고, 저장한 표에서 do_alarm이 처음 1이 된 줄의 전압을 찾아요. 위치마다 3번 재요.
3. 바람은 반응을 얼마나 지울까 - 질문: 바람이 불면 최고 상승률이 작아지고 회복이 빨라질까? - 바꾸는 것: USB 선풍기 바람(끔, 약, 강). 선풍기는 30cm 떨어뜨려 고정 - 재는 것: 최고 상승률(%), 회복 시간(초) - 방법: 면봉 거리는 4cm로 고정하고 바람 세기마다 3번씩 재요. 바람이 센서 옆을 스치도록 방향을 맞춰요.
안전
- 히터가 켜져 있으면 센서 겉면이 뜨거워요. 켠 채로 만지지 말고, 끈 뒤에도 식을 때까지 기다려요.
- 학생 실험에서는 기체를 만들거나 불을 쓰지 않아요. 향이나 종이를 태운 연기, 라이터 가스는 쓰지 않아요. LPG·부탄 반응을 보여 주고 싶다면 교사가 환기된 곳에서 불 없이 아주 조금만 시연해요.
- 소독제도 불이 붙는 액체예요. 면봉에 묻힌 양만 쓰고 불 가까이 두지 마세요.
- 이 장치는 인증받은 가스누설경보기가 아니에요. 집이나 학교의 가스 누출을 지키는 데 쓰지 마세요. 실제로 가스 냄새가 나면 실험을 멈추고 창문을 연 뒤 선생님께 알려요.
- VBUS(5V) 선이 GP 핀에 닿으면 피코가 망가질 수 있어요. 배선은 USB를 뽑고 바꿔요.