빛·소리·불꽃 · 난이도 쉬움
LM393 소리 센서로 소리 크기를 진폭으로 재고 dB 측정기와 다른 점 알기
LM393 소리 센서 모듈은 작은 마이크의 신호를 AO로, 문턱을 넘었는지를 DO로 알려 줘요. 3.3V 배선, 50ms 동안의 최대−최소로 진폭을 구하는 코드, 기준 대비 상대 dB 계산, 이 모듈이 dB 측정기가 아닌 이유, 거리·방음 재료·시간대 소음 탐구를 정리했어요.
이 센서로 무엇을 잴 수 있나
소리 센서 모듈은 작은 전자 마이크(일렉트릿 콘덴서 마이크), LM393 비교기, 가변저항을 붙인 기판이에요. Joy-IT의 KY-038 자료에 따르면 AO는 마이크 쪽 신호를 그대로 내보내고, DO는 소리가 가변저항으로 정한 문턱을 넘으면 HIGH가 돼요. 기판의 LED 하나는 전원, 다른 하나는 문턱을 넘었다는 표시예요. 같은 이름으로 팔아도 DO만 있는 3핀 제품이 있으니, AO가 있는 4핀 모듈인지 먼저 확인해요.
이 모듈로는 "같은 소리가 조건에 따라 얼마나 커지고 작아지나"를 잴 수 있어요. 소리가 나는 곳에서 멀어질 때 줄어드는 정도, 방음 재료가 소리를 얼마나 막는지, 쉬는 시간과 수업 시간의 교실 소음이 얼마나 다른지 같은 비교 탐구에 맞아요. 소음 측정기처럼 dB 숫자를 내지는 못해요. 그 이유는 아래 '값 해석과 보정'에 정리했어요.
원리
소리는 공기의 압력이 빠르게 오르내리는 파동이에요. 마이크는 이 압력 변화를 작은 전압 변화로 바꾸고, AO에는 일정한 전압 위에 이 변화가 얹혀 나와요. 그래서 AO를 한 번 읽은 값은 파동의 한 점일 뿐, 소리 크기가 아니에요. 아래 코드는 50ms 동안 쉬지 않고 읽어 가장 큰 값과 가장 작은 값의 차이(진폭, peak-to-peak)를 구해요. 100Hz보다 높은 소리라면 50ms 안에 파동이 5번 넘게 지나가요.
Joy-IT 자료는 이 모듈의 AO가 뒤집혀 나온다고 적어요. 센서가 큰 값을 느낄수록 AO 전압은 낮아진다는 뜻이에요. 최대−최소의 차이는 방향과 상관없으니 진폭 계산에는 영향이 없어요.
진폭을 비교할 때는 데시벨처럼 로그로 나타내면 편해요. 기준 진폭에 대한 상대 크기는 20 × log10(진폭 ÷ 기준 진폭)이에요. 진폭이 2배면 약 +6dB, 절반이면 약 −6dB예요. 작은 소리 원천에서 멀어질 때, 주변에 반사가 없는 열린 곳이라면 거리가 두 배가 될 때마다 소리 압력의 진폭이 절반으로 줄어요.
준비물
- 라즈베리파이 피코와 USB 케이블
- AO·DO가 있는 소리 센서 모듈(4핀), 암-수 점퍼선 4개, 작은 드라이버
- 일정한 소리를 낼 스마트폰(음 발생 앱)이나 작은 스피커, 줄자, 받침대
- 탐구용: 신발 상자, 수건, 스펀지, 에어캡, 신문지
배선
브레드보드 따라 꽂기 순서 (9단계)
- 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
- 주황 선: 피코 36번 핀(3V3(OUT)) 옆 칸 a6 → 위쪽 + 줄(3.3V). 이제 이 줄 전체가 3.3V예요.
- 검은 선: 피코 38번 핀(GND) 옆 칸 a4 → 위쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
- 소리 크기 LM393 마이크 모듈 꽂기: 다리 VCC · GND · AO · DO를 위쪽 a24 · a25 · a26 · a27에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
- 주황 선(3.3V 전원): 소리 크기 VCC 줄 b24 → 위쪽 + 줄(3.3V)
- 검은 선(GND): 소리 크기 GND 줄 b25 → 위쪽 − 줄(GND)
- 초록 선(신호): 소리 크기 AO 줄 b26 → 피코 32번 핀(GP27) 옆 칸 a10
- 초록 선(신호): 소리 크기 DO 줄 b27 → 피코 22번 핀(GP17) 옆 칸 a20
- 마지막 확인: ① 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)이 서로 이어지지 않았나요? ② 모든 부품의 GND가 − 줄에 이어졌나요? ③ 5V 신호 다리는 저항을 거쳐 피코에 이어졌나요? ④ 긴 브레드보드는 + − 줄이 가운데에서 끊긴 것도 있어요(빨간·파란 선이 끊겨 있으면 짧은 선으로 이어요). ⑤ 그림과 한 칸씩 비교한 뒤 USB를 꽂아요.
| 모듈 핀 | 피코 핀 | 비고 |
|---|---|---|
| VCC | 3V3 (36번) | 3.3V로 켜야 AO가 3.3V를 넘지 않아요 |
| GND | GND (38번) | 피코와 접지를 함께 써요 |
| AO | GP27 (32번) | 마이크 파형 |
| DO | GP17 (22번) | 문턱을 넘었는지(쓰지 않아도 돼요) |
5V로 켜면 AO와 DO가 5V까지 나올 수 있으니 반드시 3V3에 이어요. 마이크는 기판 가장자리의 은색 원통이에요. 실험 내내 마이크가 같은 방향을 보도록 모듈을 받침에 테이프로 붙이고, 손으로 감싸지 않아요.
코드
from machine import ADC, Pin
import math
import time
mic = ADC(Pin(27)) # AO → GP27
do = Pin(17, Pin.IN) # DO → GP17 (문턱을 넘으면 HIGH)
def amplitude(ms=50):
first = mic.read_u16()
hi = first
lo = first
over = do.value()
t0 = time.ticks_ms()
while time.ticks_diff(time.ticks_ms(), t0) < ms:
v = mic.read_u16()
if v > hi:
hi = v
if v < lo:
lo = v
if do.value():
over = 1
return hi - lo, over
print("1초 동안 조용히 해 주세요. 기준 진폭을 재요")
s = 0
for i in range(20):
a, o = amplitude()
s += a
REF = max(s / 20, 1) # 0으로 나누지 않게 최소 1
print(f"기준 진폭: {REF:.0f}")
while True:
p2p, over = amplitude()
rel_db = 20 * math.log(max(p2p, 1) / REF) / math.log(10)
print(f"DATA: p2p={p2p}, rel_db={rel_db:.1f}, do={over}")
if p2p > 60000:
print("진폭이 ADC 끝에 닿았어요. 잘린 값이라 비교에서 빼요")
time.sleep(0.1)
amplitude()는 50ms 동안 AO의 최대와 최소를 찾아 그 차이를 돌려주고, 그사이 DO가 한 번이라도 HIGH였는지도 함께 돌려줘요.- 처음 1초(50ms × 20번)는 조용한 상태의 평균 진폭을 재서 기준
REF로 써요. rel_db는 기준보다 몇 dB 큰지예요. 0이면 조용할 때와 같고, 6이면 진폭이 약 2배예요.- 진폭이 60000을 넘으면 파형이 ADC 범위 끝에서 잘렸을 수 있어 알려 줘요.
값 해석과 보정
rel_db는 dB라는 이름을 빌렸지만 소음 측정기의 dB와 달라요. 소음계는 IEC 61672 같은 규격에 맞춰, 1Pa 압력에 몇 mV가 나오는지 아는 마이크를 보정하고, 사람 귀처럼 주파수마다 무게를 다르게 주는(A 특성) 계산까지 해서 dB를 내요. 이 모듈은 마이크 감도도, 주파수에 따른 반응도 알려져 있지 않고, 기판마다 증폭과 기준 전압이 달라요. 그래서 이 값은 "같은 모듈, 같은 자리, 같은 소리"에서만 비교하고, 발표할 때는 "조용할 때 대비 상대 dB"라고 밝혀요.
조용할 때의 진폭도 0이 아니에요. 마이크와 ADC의 잡음 때문이에요. 기준과 몇 dB밖에 차이 나지 않는 작은 소리는 잡음과 구별하기 어려우니, 결론을 내기 전에 조용한 상태를 여러 번 재서 얼마나 흔들리는지 먼저 봐요.
소리 원천도 맞춰야 해요. 말소리와 음악은 높고 낮은 소리가 섞인 정도가 달라서, 같은 크기로 들려도 모듈 반응이 다를 수 있어요. 탐구에서는 스마트폰 앱으로 같은 높이의 음(예를 들어 1kHz)을 같은 볼륨으로 틀고, 50ms 창 20개의 중앙값을 한 번의 측정값으로 써요(센서 값의 신뢰도).
자주 하는 실수
- AO를 한 번 읽은 값을 소리 크기로 쓰기. 파동의 한 점이라 크게 흔들려요. 진폭으로 바꿔요.
rel_db를 소음계의 dB처럼 발표하기. 보정하지 않은 상대값이에요. 단위 옆에 "상대"를 꼭 붙여요.- 5V로 켜기. AO가 3.3V를 넘을 수 있어요. 3V3에 이어요.
- 서로 다른 소리로 비교하기. 노래와 박수처럼 성질이 다른 소리는 모듈 반응이 달라요. 같은 음을 써요.
- 실험 중 가변저항을 돌리기. DO 문턱이 바뀌어
do기록을 앞뒤로 비교할 수 없어요.
이 센서로 잴 수 있는 탐구
1. 거리가 두 배면 진폭은 절반이 될까
- 질문: 스피커와 마이크 사이 거리를 두 배로 늘릴 때마다 rel_db가 약 6dB씩 줄어들까?
- 바꾸는 것: 거리 25cm, 50cm, 100cm, 200cm, 장소(교실, 복도나 운동장)
- 재는 것: 거리마다 50ms 창 20개의 p2p 중앙값과 그 rel_db
- 방법: 스마트폰으로 1kHz 음을 같은 볼륨으로 틀어요. 마이크와 스피커는 같은 높이에서 마주 보게 두고, 거리마다 3번 재요. 반사가 많은 교실과 열린 곳의 결과를 견줘요.
2. 어떤 재료가 소리를 가장 잘 막을까
- 질문: 신발 상자 안쪽에 붙인 재료에 따라 밖으로 새는 소리가 얼마나 줄어들까?
- 바꾸는 것: 상자 안쪽 재료(없음, 신문지, 에어캡, 수건, 스펀지)
- 재는 것: 상자 밖 30cm에서 잰 rel_db, 재료가 없을 때와의 차이(dB)
- 방법: 상자 안에 스마트폰을 넣고 같은 음을 틀어요. 재료의 두께와 붙이는 면을 같게 하고, 재료마다 3번 재요.
3. 쉬는 시간과 수업 시간의 교실 소음은 얼마나 다를까
- 질문: 쉬는 시간의 교실은 수업 시간보다 몇 dB 시끄러울까?
- 바꾸는 것: 시간대(수업 중, 쉬는 시간, 점심시간)
- 재는 것: 1분마다의 rel_db 중앙값
- 방법: 교실 뒤쪽 같은 자리에 센서를 고정하고 5일 동안 기록해요. 기준은 첫날 아침 빈 교실에서 한 번만 재고 그 값을 계속 써요.
안전
- 큰 소리를 귀 가까이에서 틀지 않아요. 음 발생 앱은 보통 대화보다 크지 않은 볼륨으로, 짧게 써요.
- 이 코드는 소리를 녹음하지 않고 진폭 숫자만 남겨요. 그래도 교실 소음을 잴 때는 무엇을 왜 기록하는지 미리 알려요.
- 배선은 USB를 뽑은 채로 바꾸고, 모듈 전원은 3V3에만 이어요.
- 이 값은 소음 기준을 지켰는지 판단하는 데 쓰지 마세요.
더 알아보기
- 모듈 자료: Joy-IT "KY-038 Microphone sound sensor"(LM393 비교기, 문턱을 넘으면 DO가 HIGH, AO는 뒤집힌 직접 측정값, 피코 연결 예)
- 규격: IEC 61672-1(소음계의 성능 규격, A 특성 주파수 가중)
- 라이브러리: 따로 없어요. MicroPython 내장
machine.ADC,machine.Pin - 기초 글: 센서 값의 신뢰도, 잴 수 있는 탐구 주제 만들기, 피코 핀 지도, 브레드보드 처음 쓰기