Bark Back: 스마트 사운드 관리를 위한 IoT 펫 모니터
어디서든 반려동물 행동에 대한 실시간 통찰을 얻으세요. Bark Back 시스템은 사물인터넷을 활용해 집 안 주변 소음 수준을 기록하고, 데이터를 클라우드에 업로드하며, 소리가 사용자 정의 임계값을 초과하면 미리 선택한 오디오 파일을 자동 재생합니다.
라즈베리 파이 기반으로, SparkFun MEMS 마이크를 MCP3002 ADC로 읽고, MQTT로 CloudMQTT에 볼륨 데이터 스트리밍, OMXPlayer 인스턴스 트리거로 미리 선택한 "짖음 응답" 클립 재생.
배울 내용
- 라즈베리 파이 3에 SparkFun MEMS 마이크 연결 및 읽기.
- 실시간 볼륨 레벨을 CloudMQTT로 전송.
- 볼륨 임계값 설정으로 커스텀 오디오 파일 자동 재생.
사전 요구사항
이 튜토리얼을 따라하려면 라즈비안 OS가 설치된 라즈베리 파이 3(또는 이후 모델), 와이파이 연결, 기본 파이썬 지식이 필요합니다. GPIO, MQTT, 아날로그 신호 변환 익숙하면 도움되지만 필수는 아닙니다.
MQTT 통신 프로토콜
MQTT(Message Queuing Telemetry Transport)는 경량 IoT 메시징 프로토콜. 이 가이드는 Eclipse Paho 파이썬 클라이언트와 CloudMQTT 브로커 사용.
- IoT 통신 프로토콜 이해.
- CloudMQTT 계정 설정(무료 "Cute Cat" 플랜 충분).
- Paho MQTT 파이썬 라이브러리 설치 및 사용.
MEMS 마이크 브레이크아웃
SparkFun MEMS 마이크는 아날로그 센서, MCP3002 ADC가 출력을 라즈베리 파이 읽을 수 있는 디지털 신호로 변환.
- SparkFun MEMS Microphone Breakout 시작하기.
- MEMS 마이크 데이터시트 검토.
- MCP3002 ADC 데이터시트 검토.
자재
프로젝트에 필요한 구성품 종합 리스트. 모든 항목 SparkFun 등에서 구매 가능.
- Bark Back: 반려동물 모니터링 & 상호작용! SparkFun 위시리스트
- 아날로그-디지털 컨버터 – MCP3002
- SparkFun MEMS 마이크 브레이크아웃 – INMP401 (ADMP401)
- 브레드보드 – 자가접착 (흰색)
- 점퍼 와이어 – 6″ (M/M, 20팩)
- 벽면 어댑터 전원 공급기 – 5V DC 2A (USB 마이크로-B)
- 라즈베리 파이 GPIO 리본 케이블 – 40핀, 6″ (파이 3, 파이 2, B+ 호환)
- 라즈베리 파이 7″ 터치스크린 LCD
- 라즈베리 파이 3
- 라즈베리 파이™ – 16GB 마이크로SD NOOBS 카드
- 라즈베리 파이 3 + 카메라 인클로저 – 투명
추가 주변기기:
- 마이크로USB 전원 케이블
- HDMI 케이블
- USB 키보드
- USB 마우스
- 1/8″ 헤드폰 포트 스피커
하드웨어 연결
파이를 마이크와 ADC에 연결. 배선도 클릭으로 확대.
라즈베리 파이 2/3 모델 B 핀아웃 다이어그램 참조.
1. MCP3002를 라즈베리 파이에 연결
MCP3002는 4개 SPI 핀 사용: SCLK, MISO, MOSI, CS. 파이 GPIO 핀 11(SCLK), 9(MISO), 10(MOSI), 8(CE0)에 매핑.
핀 연결:
- 핀 1 → 라즈베리 파이 GPIO 8 (CE0)
- 핀 2 → MEMS 마이크 아날로그 출력
- 핀 4 → GND
- 핀 5 → 라즈베리 파이 GPIO 10 (MOSI)
- 핀 6 → 라즈베리 파이 GPIO 9 (MISO)
- 핀 7 → 라즈베리 파이 GPIO 11 (SCLK)
- 핀 8 → 라즈베리 파이 3.3V 출력
2. MEMS 마이크 브레이크아웃 보드 배선
- Vcc → 라즈베리 파이 3.3V
- GND → 라즈베리 파이 GND
- AUD → MCP3002 핀 2
파이 설정
라즈베리 파이가 완전히 업데이트되고 SPI 인터페이스가 활성화됐는지 확인.
1단계: 업데이트 확인 및 설치
sudo apt-get update
sudo apt-get upgrade
sudo reboot
2단계: SPI 활성화 및 의존성 설치
sudo apt-get install python-dev
mkdir py-spidev
cd py-spidev
git clone https://github.com/doceme/py-spidev
sudo python setup.py install
3단계: OMXPlayer 테스트
OMXPlayer는 라즈비안에 사전 설치. 재생 확인:
omxplayer /home/pi/…/SongFilePath/SongFileName.mp3
# 필요시 로컬 출력 강제:
omxplayer -o local /home/pi/…/SongFilePath/SongFileName.mp3
4단계: CloudMQTT 설정
- CloudMQTT 계정 생성(무료 "Cute Cat" 플랜).
- 새 MyCloud 인스턴스 생성.
- 콘솔에서 게시/구독 허용 ACL 규칙 추가.
- WebSocket UI로 메시지 모니터링.
- Paho MQTT 클라이언트 설치:
pip install paho-mqtt
소프트웨어 설정
Bark Back 시스템의 두 핵심 기능: (1) 개 짖음 시 오디오 파일 트리거, (2) 볼륨 데이터 클라우드 전송.
코딩 전 "짖음 응답" 오디오 클립 녹음 또는 소스 확보해 접근 가능한 디렉터리(예: 데스크톱)에 배치. 다음 파이썬 스크립트 사용 가능, 깃허브에서 전체 저장소 복제도 가능.
# Bark Back: Monitor & Interact with Pets!
# -----------------------------------------------------
# Author: jenfoxbot <[email protected]>
# License: Coffee/Beer-ware – 이 헤더 유지 시 사용 허용.
# Libraries
import spidev
from threading import Thread
import subprocess
import paho.mqtt.client as paho
import random, time, os, urlparse
# 설정 가능한 리스트와 인증 정보
songList = [
"/home/pi/Desktop/SongFile1.mp3",
"/home/pi/Desktop/SongFile2.mp3",
"/home/pi/Desktop/SongFile3.mp3",
"/home/pi/Desktop/SongFile4.mp3"
]
creds = {
'CloudMQTT URL': 'https://m10.cloudmqtt.com',
'user': 'INSERT_CLOUDMQTT_USERNAME',
'password': 'INSERT_CLOUDMQTT_PASSWORD',
'host': 'INSERT_CLOUDMQTT_SERVER',
'port': 'INSERT_CLOUDMQTT_PORT',
'topic': 'INSERT_ACL_TOPIC'
}
# --- SPI / MEMS 마이크 ----------------------------------------
spi = spidev.SpiDev()
spi.open(0,0) # CE0
def read_spi(channel):
spidata = spi.xfer2([96,0])
data = ((spidata[0] & 3) << 8) + spidata[1]
return data
def PTPAmp():
sampleTime = 0.05
startTime = time.time()
PTPAmp = 0
maxAmp = 0
minAmp = 1023
while(time.time() - startTime < sampleTime):
micOut = read_spi(0)
if micOut < 1023:
if micOut > maxAmp:
maxAmp = micOut
elif micOut < minAmp:
minAmp = micOut
PTPAmp = maxAmp - minAmp
return PTPAmp
def VolumeUnit(data, fromLow, fromHigh, toLow, toHigh):
return (data - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow
# --- OMXPlayer 래퍼 ---------------------------------------------
class OMXPlayer:
def __init__(self, file_path):
self.file_path = file_path
self.is_running = False
self.play_song()
def call_omxplayer(self):
print(f"Playing {self.file_path}\n")
subprocess.Popen(["omxplayer", "-o", "local", self.file_path],
stderr=subprocess.PIPE, stdout=subprocess.PIPE)
self.is_running = False
def play_song(self):
if not self.is_running:
self.song_thread = Thread(target=self.call_omxplayer)
self.song_thread.start()
self.is_running = True
def pickRandom(songList):
return random.choice(songList)
# --- MQTT 콜백 -----------------------------------------------
def on_connect(mosq, obj, rc):
print(f"rc: {rc}")
def on_message(mosq, obj, msg):
print(f"{msg.topic} {msg.qos} {msg.payload}")
def on_publish(mosq, obj, mid):
print(f"mid: {mid}")
def on_subscribe(mosq, obj, mid, granted_qos):
print(f"Subscribed: {mid} {granted_qos}")
def on_log(mosq, obj, level, string):
print(string)
# --- 메인 루프 ----------------------------------------------------
def main():
mqttc = paho.Client()
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe
# mqttc.on_log = on_log # 디버깅 시 활성화
url_str = os.environ.get(creds['CloudMQTT URL'], 'mqtt://localhost:1883')
url = urlparse.urlparse(url_str)
mqttc.username_pw_set(creds['user'], creds['password'])
mqttc.connect(creds['host'], creds['port'])
mqttc.subscribe(creds['topic'], 0)
while True:
PTPamp = PTPAmp()
PTPampV = round(((PTPamp * 3.3) / 1024), 2)
VolUnit = VolumeUnit(PTPamp, 0, 700, 0, 10)
print(PTPamp, VolUnit)
if VolUnit > 7:
playBack = pickRandom(songList)
OMXPlayer(playBack)
time.sleep(0.1)
mqttc.publish("Volume", str(VolUnit))
rc = True
while rc:
rc = mqttc.loop()
time.sleep(0.1)
print(f"rc: {rc}")
try:
while True:
pass
except KeyboardInterrupt:
pass
if __name__ == '__main__':
main()
songList와 creds의 플레이스홀더 값을 실제 파일 경로와 CloudMQTT 인증 정보로 교체하세요.
스크립트 자유롭게 커스터마이즈하세요 – 예: 볼륨 임계값 조정, 로깅 추가, 추가 센서 통합.
다음 단계
추가 개선 사항 탐색:
- 실시간 볼륨 레벨 표시용 터치스크린 디스플레이 통합.
- 반려동물 시각 모니터링용 카메라 피드 추가.
- 원격 모니터링용 웹 대시보드 구현.
추가 리소스는 SparkFun MEMS 마이크 데이터시트, MCP3002 ADC 데이터시트, Eclipse Paho MQTT 클라이언트 문서 참조.
해피 해킹, 여러분의 반려견이 더 조용하고 행복한 환경을 누리길!