산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Bark Back: 스마트 사운드 관리를 위한 IoT 펫 모니터

어디서든 반려동물 행동에 대한 실시간 통찰을 얻으세요. Bark Back 시스템은 사물인터넷을 활용해 집 안 주변 소음 수준을 기록하고, 데이터를 클라우드에 업로드하며, 소리가 사용자 정의 임계값을 초과하면 미리 선택한 오디오 파일을 자동 재생합니다.

라즈베리 파이 기반으로, SparkFun MEMS 마이크를 MCP3002 ADC로 읽고, MQTT로 CloudMQTT에 볼륨 데이터 스트리밍, OMXPlayer 인스턴스 트리거로 미리 선택한 "짖음 응답" 클립 재생.

배울 내용

사전 요구사항

이 튜토리얼을 따라하려면 라즈비안 OS가 설치된 라즈베리 파이 3(또는 이후 모델), 와이파이 연결, 기본 파이썬 지식이 필요합니다. GPIO, MQTT, 아날로그 신호 변환 익숙하면 도움되지만 필수는 아닙니다.

MQTT 통신 프로토콜

MQTT(Message Queuing Telemetry Transport)는 경량 IoT 메시징 프로토콜. 이 가이드는 Eclipse Paho 파이썬 클라이언트와 CloudMQTT 브로커 사용.

  1. IoT 통신 프로토콜 이해.
  2. CloudMQTT 계정 설정(무료 "Cute Cat" 플랜 충분).
  3. Paho MQTT 파이썬 라이브러리 설치 및 사용.

MEMS 마이크 브레이크아웃

SparkFun MEMS 마이크는 아날로그 센서, MCP3002 ADC가 출력을 라즈베리 파이 읽을 수 있는 디지털 신호로 변환.

  1. SparkFun MEMS Microphone Breakout 시작하기.
  2. MEMS 마이크 데이터시트 검토.
  3. MCP3002 ADC 데이터시트 검토.

자재

프로젝트에 필요한 구성품 종합 리스트. 모든 항목 SparkFun 등에서 구매 가능.

추가 주변기기:

하드웨어 연결

파이를 마이크와 ADC에 연결. 배선도 클릭으로 확대.

라즈베리 파이 2/3 모델 B 핀아웃 다이어그램 참조.

1. MCP3002를 라즈베리 파이에 연결

MCP3002는 4개 SPI 핀 사용: SCLK, MISO, MOSI, CS. 파이 GPIO 핀 11(SCLK), 9(MISO), 10(MOSI), 8(CE0)에 매핑.

핀 연결:

2. MEMS 마이크 브레이크아웃 보드 배선

파이 설정

라즈베리 파이가 완전히 업데이트되고 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 설정

  1. CloudMQTT 계정 생성(무료 "Cute Cat" 플랜).
  2. 새 MyCloud 인스턴스 생성.
  3. 콘솔에서 게시/구독 허용 ACL 규칙 추가.
  4. WebSocket UI로 메시지 모니터링.
  5. 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 클라이언트 문서 참조.

해피 해킹, 여러분의 반려견이 더 조용하고 행복한 환경을 누리길!

제조공정

  1. 라즈베리 파이 공기질·기상 관측소 구축: InfluxDB & Grafana 연동
  2. 라즈베리 파이 온습도 네트워크 모니터 DIY 구축 가이드
  3. 라즈베리 파이 웹 대시보드 홈 온습도 모니터 – 실시간 원격 추적
  4. 라즈베리 파이와 DS18B20을 이용한 전문적인 온도 모니터링
  5. 라즈베리 파이 2와 ADS-WS1로 야외 기상 관측소 구축하기
  6. 라즈베리 파이로 서버실 정확한 온도 모니터링하기
  7. 라즈베리 파이와 OpenCV로 탁구공 추적하기 – 고급 튜토리얼
  8. LIRC로 전문가급 라즈베리 파이 범용 리모컨 만들기
  9. 라즈베리 파이에서 PIR 모션 센서로 LED 제어하기
  10. 라즈베리 파이로 RF를 DC로 변환: 엔벨로프 검출기 제작 및 트러블슈팅