Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Bark Back: IoT-монитор питомцев для умного управления звуком

Получайте понимание поведения питомцев в реальном времени из любой точки. Система Bark Back использует Интернет вещей для записи уровня окружающего шума в доме, загрузки данных в облако и автоматического воспроизведения пользовательского аудиофайла, когда звук превышает заданный пользователем порог.

Построенная на Raspberry Pi, проект читает MEMS-микрофон SparkFun через АЦП MCP3002, стримит данные громкости в CloudMQTT через MQTT и запускает экземпляр OMXPlayer для воспроизведения предвыбранного клипа «ответного лая».

Что вы узнаете

Предварительные требования

Для этого туториала понадобятся Raspberry Pi 3 (или новее) с Raspbian OS, Wi-Fi и базовые знания Python. Знакомство с GPIO, MQTT и аналогово-цифровым преобразованием полезно, но не обязательно.

Протокол связи MQTT

MQTT (Message Queuing Telemetry Transport) — легковесный протокол обмена сообщениями для IoT. В руководстве используется Eclipse Paho Python клиент и CloudMQTT как брокер.

  1. Понимание протоколов IoT-коммуникации.
  2. Настройка аккаунта CloudMQTT (бесплатный план «Cute Cat» достаточно).
  3. Установка и использование библиотеки Paho MQTT Python.

MEMS-микрофон Breakout

SparkFun MEMS-микрофон — аналоговый датчик; АЦП MCP3002 преобразует его выход в цифровой сигнал, читаемый Raspberry Pi.

  1. Начало работы с MEMS-микрофоном SparkFun.
  2. Изучение даташита MEMS-микрофона.
  3. Изучение даташита АЦП MCP3002.

Материалы

Ниже полный список компонентов. Все элементы доступны в SparkFun и других ритейлерах.

Дополнительные периферия:

Подключение железа

Подключение 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).

Соединения пинов:

2. Подключение платы MEMS-микрофона.

Конфигурация 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

  1. Создайте аккаунт CloudMQTT (бесплатный план «Cute Cat»).
  2. Создайте новый экземпляр MyCloud.
  3. В консоли добавьте правило ACL для разрешения publish/subscribe.
  4. Используйте WebSocket UI для мониторинга сообщений.
  5. Установите 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.

Удачного хакинга и пусть ваш пёс насладится более тихой, счастливой средой!

Производственный процесс

  1. Сборка станции качества воздуха и погоды на Raspberry Pi с InfluxDB и Grafana
  2. Raspberry Pi сетевой монитор температуры и влажности — руководство по DIY сборке
  3. Домашний монитор температуры и влажности на Raspberry Pi с веб-дашбордом — удаленный трекинг в реальном времени
  4. Профессиональный мониторинг температуры на Raspberry Pi с датчиком DS18B20
  5. Сборка уличной метеостанции на Raspberry Pi 2 и ADS‑WS1
  6. Точный мониторинг температуры в серверной на Raspberry Pi
  7. Продвинутое отслеживание теннисного мяча на Raspberry Pi с OpenCV
  8. Создание профессионального универсального пульта на Raspberry Pi с LIRC
  9. Управление светодиодом с PIR-датчиком движения на Raspberry Pi
  10. Преобразование RF в DC с Raspberry Pi: сборка и отладка детектора огибающей