Bark Back: IoT-монитор питомцев для умного управления звуком
Получайте понимание поведения питомцев в реальном времени из любой точки. Система Bark Back использует Интернет вещей для записи уровня окружающего шума в доме, загрузки данных в облако и автоматического воспроизведения пользовательского аудиофайла, когда звук превышает заданный пользователем порог.
Построенная на Raspberry Pi, проект читает MEMS-микрофон SparkFun через АЦП MCP3002, стримит данные громкости в CloudMQTT через MQTT и запускает экземпляр OMXPlayer для воспроизведения предвыбранного клипа «ответного лая».
Что вы узнаете
- Подключение и чтение MEMS-микрофона SparkFun с Raspberry Pi 3.
- Передача уровней громкости в реальном времени в CloudMQTT.
- Настройка порога громкости для автоматического воспроизведения пользовательского аудиофайла.
Предварительные требования
Для этого туториала понадобятся Raspberry Pi 3 (или новее) с Raspbian OS, Wi-Fi и базовые знания Python. Знакомство с GPIO, MQTT и аналогово-цифровым преобразованием полезно, но не обязательно.
Протокол связи MQTT
MQTT (Message Queuing Telemetry Transport) — легковесный протокол обмена сообщениями для IoT. В руководстве используется Eclipse Paho Python клиент и CloudMQTT как брокер.
- Понимание протоколов IoT-коммуникации.
- Настройка аккаунта CloudMQTT (бесплатный план «Cute Cat» достаточно).
- Установка и использование библиотеки Paho MQTT Python.
MEMS-микрофон Breakout
SparkFun MEMS-микрофон — аналоговый датчик; АЦП MCP3002 преобразует его выход в цифровой сигнал, читаемый Raspberry Pi.
- Начало работы с MEMS-микрофоном SparkFun.
- Изучение даташита MEMS-микрофона.
- Изучение даташита АЦП MCP3002.
Материалы
Ниже полный список компонентов. Все элементы доступны в SparkFun и других ритейлерах.
- Bark Back: Monitor & Interact with Pets! SparkFun Wish List
- Аналого-цифровой преобразователь – MCP3002
- SparkFun MEMS Microphone Breakout – INMP401 (ADMP401)
- Макетная плата – Self-Adhesive (White)
- Перемычки – 6″ (M/M, 20 шт.)
- Блок питания – 5V DC 2A (USB Micro-B)
- Raspberry Pi GPIO Ribbon Cable – 40-pin, 6″ (совместим с Pi 3, Pi 2, B+)
- Raspberry Pi 7″ Touchscreen LCD
- Raspberry Pi 3
- Raspberry Pi™ – 16GB MicroSD NOOBS Card
- Raspberry Pi 3 + Camera Enclosure – Clear
Дополнительные периферия:
- MicroUSB кабель питания
- HDMI кабель
- USB клавиатура
- USB мышь
- Динамики с разъемом 1/8″
Подключение железа
Подключение Pi к микрофону и АЦП. Кликните на схему для приближения.
Ориентируйтесь по диаграмме распиновки Raspberry Pi 2/3 Model B.
1. Подключение MCP3002 к Raspberry Pi.
MCP3002 использует четыре SPI-пина: SCLK, MISO, MOSI, CS. Они соответствуют GPIO Pi 11 (SCLK), 9 (MISO), 10 (MOSI), 8 (CE0).
Соединения пинов:
- Pin 1 → Raspberry Pi GPIO 8 (CE0)
- Pin 2 → аналоговый выход MEMS-микрофона
- Pin 4 → GND
- Pin 5 → Raspberry Pi GPIO 10 (MOSI)
- Pin 6 → Raspberry Pi GPIO 9 (MISO)
- Pin 7 → Raspberry Pi GPIO 11 (SCLK)
- Pin 8 → Raspberry Pi 3.3V out
2. Подключение платы MEMS-микрофона.
- Vcc → Raspberry Pi 3.3V
- GND → Raspberry Pi GND
- AUD → MCP3002 Pin 2
Конфигурация Pi
Убедитесь, что Raspberry Pi полностью обновлен и 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 предустановлен в Raspbian. Проверьте воспроизведение:
omxplayer /home/pi/…/SongFilePath/SongFileName.mp3
# При необходимости форсируйте локальный вывод:
omxplayer -o local /home/pi/…/SongFilePath/SongFileName.mp3
Шаг 4: Настройка CloudMQTT
- Создайте аккаунт CloudMQTT (бесплатный план «Cute Cat»).
- Создайте новый экземпляр MyCloud.
- В консоли добавьте правило ACL для разрешения publish/subscribe.
- Используйте WebSocket UI для мониторинга сообщений.
- Установите Paho MQTT клиент:
pip install paho-mqtt
Настройка ПО
Система Bark Back имеет две основные функции: (1) запуск аудиофайла при лае собаки, и (2) отправка данных громкости в облако.
Перед кодированием запишите или найдите свои аудиоклипы «ответного лая» и поместите в доступную директорию (например, Рабочий стол). Следующий Python-скрипт готов к использованию; также можно клонировать полный репозиторий с GitHub.
# Bark Back: Monitor & Interact with Pets!
# -----------------------------------------------------
# Author: jenfoxbot <[email protected]>
# License: Coffee/Beer-ware – keep this header if you use it.
# Libraries
import spidev
from threading import Thread
import subprocess
import paho.mqtt.client as paho
import random, time, os, urlparse
# Configurable lists and credentials
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 Microphone ----------------------------------------
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 wrapper ---------------------------------------------
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 callbacks -----------------------------------------------
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)
# --- Main loop ----------------------------------------------------
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 # enable for debugging
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.
Не стесняйтесь настраивать скрипт — например, регулировать порог громкости, добавлять логирование или интегрировать дополнительные датчики.
Дальнейшие шаги
Исследуйте дальнейшие улучшения:
- Интеграция сенсорного дисплея для отображения уровней громкости в реальном времени.
- Добавление видеопотока для визуального мониторинга питомца.
- Реализация веб-панели для удаленного мониторинга.
Для дополнительных ресурсов обратитесь к даташиту MEMS-микрофона SparkFun, даташиту АЦП MCP3002 и документации клиента Eclipse Paho MQTT.
Удачного хакинга и пусть ваш пёс насладится более тихой, счастливой средой!
Производственный процесс
- Сборка станции качества воздуха и погоды на Raspberry Pi с InfluxDB и Grafana
- Raspberry Pi сетевой монитор температуры и влажности — руководство по DIY сборке
- Домашний монитор температуры и влажности на Raspberry Pi с веб-дашбордом — удаленный трекинг в реальном времени
- Профессиональный мониторинг температуры на Raspberry Pi с датчиком DS18B20
- Сборка уличной метеостанции на Raspberry Pi 2 и ADS‑WS1
- Точный мониторинг температуры в серверной на Raspberry Pi
- Продвинутое отслеживание теннисного мяча на Raspberry Pi с OpenCV
- Создание профессионального универсального пульта на Raspberry Pi с LIRC
- Управление светодиодом с PIR-датчиком движения на Raspberry Pi
- Преобразование RF в DC с Raspberry Pi: сборка и отладка детектора огибающей