Bark Back 交互式宠物监视器
离家出走时,揭开宠物滑稽动作的神秘面纱(呃,声音)!这个物联网 (IoT) Bark Back 项目会监控您家中的噪音水平并将其上传到云端,以便您可以查看您心爱的宠物。最好的部分:如果声音太大(即 Fido 正在吠叫或制造其他骚动),程序会播放您自己的“吠叫”音频文件,以帮助分散小狗的注意力并使其安静下来。
该项目使用 Raspberry Pi 读取 SparkFun MEMS 麦克风分线板并触发音频播放器。数据通过MQTT通信协议上传到CloudMQTT服务。
如需演示,请查看下面的视频!
包含在本教程中
本教程将向您展示如何执行以下操作:
- 使用 Raspberry Pi 3 连接并读取 SparkFun MEMS 麦克风
- 将卷级别上传到 CloudMQTT 服务
- 如果他/她太吵,请使用音量阈值来触发您对您的狗的“吠叫”
推荐阅读
要构建这个项目,你需要一个完全配置的、连接 WiFi 的 Raspberry Pi 3 和 Raspbian 操作系统。了解一些 Python 编程以及以下三件事也很有帮助:(1) 使用和控制 Raspberry Pi GPIO 引脚,(2) MQTT 通信和 (3) 模拟信号。如果您不熟悉其中任何一个,或者您只是好奇(好奇!)
MQTT 通信协议
MQTT(消息查询遥测传输)是一种流行的物联网通信协议。我们将使用 Paho Client Python 库和名为 CloudMQTT 的 MQTT 服务。
- 探索物联网通信协议
- 开始使用 CloudMQTT
- Eclipse Paho MQTT Python 客户端库概述
MEMS 麦克风分线板
MEMS 麦克风是一个模拟麦克风,因此您需要 MCP3002 模数转换器 (“ADC”) 来读取带有 Raspberry Pi 数字 GPIO 引脚的模拟信号。
- SparkFun MEMS 麦克风分线板使用入门
- MEMS 麦克风数据表
- MCP3002 ADC 数据表
材料
您需要以下材料才能继续学习。
Bark Back:监控宠物并与宠物互动! SparkFun 愿望清单
您还需要以下内容:
- MicroUSB 电源线
- HDMI 线
- USB 键盘
- USB 鼠标
- 带 1/8 英寸耳机端口的扬声器
硬件连接
将 Pi 连接到其他硬件。点击接线图仔细查看。
这是 Raspberry Pi 2(和 3)B 型引脚图:
1.将 MCP3002 连接到 Raspberry Pi。
MCP3002 特写
SPI 通信有四个 SPI 引脚:串行时钟(“SCL”)、主输入从输出(“MISO”)、主输出从输入(“MOSI”)和片选(“CS”)。这些引脚分别对应于树莓派 GPIO 引脚 11 (SCLK)、GPIO 引脚 9 (MISO)、GPIO 引脚 10 (MOSI) 和 GPIO 引脚 8 (CE0)。
这是 MCP302 引脚排列图:
与 MCP3002 引脚进行以下连接:
- 将引脚 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 麦克风分线板。连接到 MCP3002 和 Raspberry Pi。
- 将 Vcc 连接到 Raspberry Pi 3.3V。
- 将 GND 连接到 Raspberry Pi GND
- 将 AUD 连接到 MCP3002 引脚 2
Pi 配置
RPi 连接起来了!
第 1 步:检查和安装更新
检查并安装更新:
sudo apt-get update
sudo apt-get upgrade
sudo reboot
第 2 步:为 MEMS 麦克风 + MCP3002 设置 SPI 接口
安装 Python 开发包:
sudo apt-get install python-dev
创建一个子文件夹并安装串行端口接口(“SPI”):
mkdir py-spidev
git clone git://github.com/doceme/py-spidev
sudo python setup。 py安装
如果您遇到任何问题,请参阅 SPI-Dev 文档。
第 3 步:使用 OMXPlayer 播放声音
OMXPlayer 是一个预装在 Raspbian 操作系统上的音频和视频播放器(哇!)。它适用于大多数声音文件类型,包括:.wav、.mp3 和 .m4a。我们将使用它来播放我们的“bark back”声音。
在终端中,使用以下命令测试 OMXPlayer:
omxplayer /home/pi/.../SongFilePath/SongFileName.mp3
如果这不起作用,请尝试将其强制通过本地音频输出设备:
omxplayer -o local /home/pi/.../SongFilePath/SongFileName.mp3
第 4 步:配置 CloudMQTT 服务器
现在我们设置了一个 MQTT 服务器!要使用 CloudMQTT 执行此操作,请执行以下操作:
- 设置 CloudMQTT 帐户(“Cute Cat”计划是免费的)。
- 创建一个新的 MyCloud 实例。
- 在控制台中,创建一个新的 ACL 规则。
- 您可以在 CloudMQTT 控制台的“Websocket UI”中监控已发布的消息。
最后,安装 MQTT Paho Client Python 库:
pip install paho-mqtt
软件设置
Bark Back 的目标有两个:(1) 在狗吠时触发音频文件;(2) 将音量级别数据发送到服务器。
但首先我们需要播放一些“bark back”的声音!您可以轻松地在 GarageBand(或智能手机)中录制声音并将它们发送到 Raspberry Pi。将文件保存在易于访问的位置(例如桌面)。
现在您已准备好编写 Bark Back Python 程序! ……或者就用我的:
这是该项目的 GitHub 存储库。您也可以复制并粘贴下面的代码(请记住这是 Python!)。
######################### ########################
#Bark Back:监控和与宠物互动!##
##### ############################################
# jenfoxbot 编写的代码 <[email protected]>
# 代码是开源的,咖啡/啤酒制品许可证。
# 如果您喜欢内容,请保留标题 +,
#如果你遇到我,请给我买杯咖啡和/或啤酒!
############################## #####################
# 非常感谢创建和记录本项目中使用的库
# 和函数的人们。
#Libraries
#SPI
import spidev
#OMXPlayer
from threading import Thread
import subprocess
#MQTT
import paho.mqtt.client as paho
#Other
import random, time, os, urlparse
import time
SongList =[“SongFile1”, #e.g. “/home/pi/Desktop/SongFile.mp3”
“SongFile2”,
“SongFile3”,
“SongFile4”]
creds ={
‘CloudMQTT URL’:‘INSERT_CLOUDMQTT_URL’, #e.g. 'https://m10.cloudmqtt.com'
'用户':'INSERT_CLOUDMQTT_USERNAME',
'密码':'INSERT__CLOUDMQTT_PASSWORD',
'主机':'INSERT_CLOUDMQTT_SERVER'
'端口':'INSERT_CLOUDMQTT_PORT',
'主题':'INSERT_ACL_TOPIC'
}
############################################### ######
# 阅读 SparkFun MEMS 麦克风分线板
########################### ##########################
#启动SPI协议。
spi =spidev.SpiDev()
spi.open(0,0) #这是树莓派上的CE0 Pin (GPIO 08),对于CE1,使用(0,1)
#读取CE0通道的函数
def read_spi(channel):
spidata =spi.xfer2([96,0]) ##发送2个字节的数据(96和0)
data =((spidata[0] &3) <<8) + spidata[1]
返回数据
#从MEMS麦克风计算峰峰值幅度的函数
def PTPAmp():
sampleTime =0.05 #Sample Rate of 50 ms
startTime =time.time()
PTPAmp =0
maxAmp =0
minAmp =1023
while(time.time() – startTime
if(micOut <1023):#防止错误读数
if(micOut> maxAmp):
maxAmp =micOut
elif(micOut
PTPAmp =maxAmp – minAmp #计算峰峰值。
返回PTPAmp
#函数将峰峰值放大器映射到 0 到 10 之间的音量单位
def VolumeUnit(data, fromLow, fromHigh, toLow, toHigh):
return (data – fromLow) * (toHigh – toLow) / (fromHigh – fromLow) + toLow
############################################### ######
# 用于控制音频的 OMXPlayer 的类
########################### #########################
class OMXPlayer():
def call_omxplayer(self):
打印(“播放” + self.file_path + '\n')
pid =subprocess.Popen(['omxplayer', '-o', 'local',
self.file_path], stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
self.is_running =False
def play_song(self):
如果不是 self.is_running:
self.song_thread =Thread(target=self.call_omxplayer, args=())
self.song_thread.start()
self.is_running =True
def __init__(self, file_path):
self.file_path =file_path
self.is_running =False
self.play_song()
#从列表中随机选择歌曲的函数
def pickRandom(songList):
return(random.choice(songList))
############################################### ######
# CloudMQTT 服务器
############################### ######################
# 定义事件回调
def on_connect(mosq, obj, rc):
print (“rc:” + str(rc))
def on_message(mosq, obj, msg):
print(msg.topic + ” “ + str(msg.qos) + ” “ + str(msg.payload))
def on_publish(mosq, obj, mid):
print(“mid:” + str(mid))
def on_subscribe(mosq, obj, mid, grant_qos):
print(“订阅:” + str(mid) + ” “ + str(granted_qos))
def on_log(mosq, obj, level, string):
print(string)
############################################### ######
# 主要功能
############################## ######################
def main():
#Call Paho Python 客户端服务器
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
# 解析 CLOUDMQTT_URL(或回退到本地主机)
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’])
# 开始订阅,QoS级别为0
mqttc.subscribe(creds[‘topic’], 0)
虽然是真的:
#1。找到 MEMS 麦克风峰峰值放大器的 ADC 值
PTPamp =PTPAmp()
#2。计算 ptp amp (Volts)
PTPampV =round(((PTPamp*3.3) / 1024), 2)
#3。将 ptp amp(ADC 值)映射到 0 到 10 之间的 Volume Unit
VolUnit =VolumeUnit(PTPamp, 0, 700, 0, 10)
#用于调试目的
print(PTPamp, VolUnit)
#4.如果 Volume Unit 大于 7,则播放其中一首歌曲
if(VolUnit> 7):
playBack =pickRandom(songList)
OMXPlayer(playBack)
time.sleep( 0.1)
#5.上传数据到 CloudMQTT 服务器
mqttc.publish(“Volume”, str(VolUnit))
rc =True
while rc:
rc =mqttc.loop()
time.sleep(0.1)
print(“rc:” + str(rc))
try:
while True:
pass
除了KeyboardInterrupt:
myprocess.kill()
if __name__ ==‘__main__’:
main()
为了让 Bark Back 系统正常工作,请填写以下内容:
- 歌曲列表 :为您要播放的每首歌曲输入文件路径和文件名。
- 信用 :在此字典中输入您的 CloudMQTT 信息。
随意(并且请这样做)调整和修改代码 - 查看资源和进一步 项目变化和补充部分。
阅读更多信息...
Bark Back 交互式宠物监视器
制造工艺