Bark Back:スマート音響管理のためのIoTペットモニター
どこからでもペットの行動をリアルタイムで把握。Bark BackシステムはIoTを活用して自宅の環境騒音レベルを記録し、データをクラウドにアップロードし、音がユーザー定義の閾値を超えるとカスタム音声ファイルを自動再生します。
Raspberry Pi上に構築されたこのプロジェクトは、SparkFun MEMSマイクロフォンをMCP3002 ADC経由で読み取り、MQTTでCloudMQTTに音量データをストリーミングし、OMXPlayerインスタンスをトリガーしてプリセットの「吠え返し」クリップを再生します。
学べること
- SparkFun MEMSマイクロフォンをRaspberry Pi 3に接続して読み取り。
- リアルタイム音量レベルをCloudMQTTに送信。
- 音量閾値を設定し、カスタム音声ファイルを自動再生。
前提条件
このチュートリアルを進めるには、Raspbian OS搭載のRaspberry Pi 3(以降)、Wi-Fi接続、基本的なPython知識が必要。GPIO、MQTT、アナログ信号変換の知識があれば有利ですが必須ではありません。
MQTT通信プロトコル
MQTT(Message Queuing Telemetry Transport)は軽量IoTメッセージングプロトコル。このガイドではEclipse Paho PythonクライアントとCloudMQTTブローカーを使用。
- IoT通信プロトコルの理解。
- CloudMQTTアカウントのセットアップ(無料「Cute Cat」プランで十分)。
- Paho MQTT Pythonライブラリのインストールと使用。
MEMSマイクロフォンブレークアウト
SparkFun MEMSマイクロフォンはアナログセンサー。MCP3002 ADCがその出力をRaspberry Piで読み取り可能なデジタル信号に変換。
- SparkFun MEMS Microphone Breakoutの入門。
- MEMSマイクロフォンデータシートの確認。
- MCP3002 ADCデータシートの確認。
材料
プロジェクトに必要なコンポーネントの包括的なリスト。すべてSparkFunやその他の小売店で入手可能。
- Bark Back: Monitor & Interact with Pets! SparkFun Wish List
- アナログ-デジタルコンバーター - MCP3002
- SparkFun MEMS Microphone Breakout - INMP401 (ADMP401)
- ブレッドボード - 自己接着式(白)
- ジャンパーワイヤー - 6インチ(M/M、20パック)
- 壁面アダプター電源 - 5V DC 2A(USB Micro-B)
- Raspberry Pi GPIOリボンケーブル - 40ピン、6インチ(Pi 3、Pi 2、B+互換)
- Raspberry Pi 7インチタッチスクリーンLCD
- Raspberry Pi 3
- Raspberry Pi - 16GB MicroSD NOOBSカード
- Raspberry Pi 3 + カメラエンクロージャー - クリア
追加周辺機器:
- MicroUSB電源ケーブル
- HDMIケーブル
- USBキーボード
- USBマウス
- 1/8インチヘッドホンポート付きスピーカー
ハードウェア接続
PiをマイクロフォンとADCに接続。配線図をクリックで拡大。
参照用にRaspberry Pi 2/3 Model Bピンアウト図を参照してください。
1. MCP3000をRaspberry Piに接続
MCP3002は4つのSPIピンを使用:SCLK、MISO、MOSI、CS。これらはPi GPIOピン11(SCLK)、9(MISO)、10(MOSI)、8(CE0)にマッピング。
ピン接続:
- ピン1 → Raspberry Pi GPIO 8 (CE0)
- ピン2 → MEMSマイクロフォンアナログ出力
- ピン4 → GND
- ピン5 → Raspberry Pi GPIO 10 (MOSI)
- ピン6 → Raspberry Pi GPIO 9 (MISO)
- ピン7 → Raspberry Pi GPIO 11 (SCLK)
- ピン8 → Raspberry Pi 3.3V出力
2. MEMSマイクロフォンブレークアウトボードを配線
- Vcc → Raspberry Pi 3.3V
- GND → Raspberry Pi GND
- AUD → MCP3002ピン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システムには2つの核心機能があります:(1)犬の吠え声で音声ファイルをトリガー、(2)音量データをクラウドに送信。
コーディング前に、「吠え返し」音声クリップを録音または入手し、アクセス可能なディレクトリ(例:Desktop)に配置。以下のPythonスクリプトはすぐに使用可能。GitHubから完全なリポジトリをクローンすることもできます。
# 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
# 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 # デバッグ用に有効化
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認証情報に置き換えてください。
スクリプトを自由にカスタマイズしてください。例えば、音量閾値の調整、ログ追加、追加センサーの統合など。
次のステップ
更なる拡張として以下を検討:
- リアルタイム音量レベル表示用タッチスクリーンディスプレイの統合。
- ペットを視覚的に監視するカメラフィードの追加。
- リモート監視用Webダッシュボードの実装。
追加リソースとして、SparkFun MEMSマイクロフォンデータシート、MCP3002 ADCデータシート、Eclipse Paho MQTTクライアントドキュメントを参照してください。
ハッピーハッキング、そしてあなたの犬がより静かで幸せな環境を享受できますように!
製造プロセス
- Raspberry Piで構築する空気質・気象ステーション:InfluxDB & Grafana活用
- Raspberry Pi温度・湿度ネットワークモニター – DIYセットアップガイド
- Raspberry Pi & Webダッシュボードで自宅温度・湿度監視 – リアルタイムリモート追跡
- Raspberry PiとDS18B20によるプロフェッショナルな温度監視
- Raspberry Pi 2とADS-WS1で屋外気象観測ステーションを構築
- Raspberry Piでサーバークローゼットの温度を正確に監視
- OpenCVでRaspberry Pi上級卓球球追跡
- LIRCでプロフェッショナルなRaspberry Piユニバーサルリモコンを構築
- Raspberry PiでPIRモーションセンサーとLEDを制御
- Raspberry PiでRFをDCに変換: エンベロープ検波器の構築とトラブルシューティング
- Cycle Chaser: Raspberry Piで自転車をナイトタイムライトショーに変身