如何制作动作感应树莓派Halloween音箱

电子说

1.3w人已加入

描述

又是一年中的那个时候,社会上普遍认为吓坏年幼的孩子并给他们糖果。哦,高兴。我在这里通过向您展示如何制作一个简单的动作感应Raspberry Pi Halloween音箱来使您的工作更轻松。这是一个演示:

这就是您所需要的

可能您唯一还没有的部分是运动传感器,这是您应该能够找到的小巧而廉价的部分

Raspberry Pi(任何型号都可以)。

运动传感器(〜3美元)。

连接线。

有线扬声器(大多数蓝牙扬声器都可以选择使用输入)。

3.5毫米立体声电缆,公对公。

完成后,您可能还想添加一些同步的灯光效果,但是在本教程中,我们将仅涵盖一些令人恐惧的声音!

设置

我们正在使用Raspbian Jessie Lite和Python 2.7,但是在您的Pi上运行的任何Linux发行版都应该可以。我已将其保留在标准主机名“ raspberrypi.local”上,因此首先使用SSH远程登录(如果您使用的是Mac,请打开“终端”窗口。以下是在Windows中执行相同操作的方法)-或选择使用带有桌面GUI的完整Raspbian,请随时跳过更新。

ssh pi@raspberrypi.local

(enter raspberry as the password)

sudo apt-get update

sudo apt-get install python-pip

sudo pip install gpiozero

这会安装一个简单的库,用于处理Python中具有许多内置类型的GPIO引脚-在传感器和按钮中。用GPIO4上的信号引脚,VCC连接至5V以及GND连接至GND的方式连接传感器。这可能会因您的确切模型而异,因此请使用引脚图进行确认。

《图id =“ attachment_598229” aria- describeby =“ caption-attachment-598229” class =“ wp-caption aligncenter”》

图片来源:raspberrypi.org

我的Pimoroni的Pi 2外壳上有一个直接激光蚀刻的引脚图。

现在,让我们制作运动检测脚本。

nano motion.py

粘贴:

from gpiozero import MotionSensor

pir = MotionSensor(4)

while True:

if pir.motion_detected:

print(“Motion detected!”)

else:

print (“No motion”)

按CTRL-X,然后按Y保存并退出,然后运行:

python motion.py

您应该会在屏幕上看到重复的“ no motion”消息,直到您的手在传感器前面挥动,直到它停留在“ Motion Detected!”上。

如果该消息完全不变,则说明您的连接错误。

如果您有兴趣了解更多有关这个简单的GPIOZero库,看看这个奇妙的备忘单。

Pla Sound声音

连接便携式扬声器,并在需要时确保已接通电源。我们将使用 pygame 库播放声音,因此请继续安装它:

sudo apt-get install python-pygame

首先,我们需要一个声音文件来播放。如果您是在桌面环境中执行此操作,请继续从某个位置下载 WAV 或 OGG 文件(我在这里找到了很多免费的万圣节声音) ,并将其放在您的主目录中。我建议先进行降采样,然后再转换为OGG格式。

如果您是远程连接且仅使用命令行,则由于 wget 命令可能无法获取实际文件。相反,我们可以将其本地下载到我们的桌面,然后使用 scp (安全副本)命令在命令行上进行复制。您可以在此处了解有关scp的更多信息,但现在,打开一个新的Terminal选项卡,然后键入:

scp thunder.ogg pi@raspberrypi.local:

根据需要重命名thunder.ogg,但是不要忘记最后一个:(该命令将在没有它的情况下完成,但不会执行我们想要的操作)。默认情况下,这会将文件传输到Pi用户的主目录。

现在,让我们修改脚本以播放声音。首先导入一些新模块:

import pygame.mixer

from pygame.mixer import Sound

然后,在现有import语句之后,我们将一遍又一遍循环相同的声音以进行测试。剩下的动作感测代码保持原样-它不会运行,因为它将永远停留在此声音播放循环中。

pygame.init()

pygame.mixer.init()

#load a sound file, in the home directory of Pi user (no mp3s)

thunder = pygame.mixer.Sound(“/home/pi/thunder.ogg”)

while True:

thunder.play()

sleep(10)

thunder.stop()

请注意,当我最初尝试此过程时,声音拒绝播放,而是单击了。罪魁祸首是文件大小或比特率:它是24位,并且15秒剪辑超过5 MB。使用上面链接到的转换器将其缩减到16位,一切正常,并且大小减小到260KB!

如果您在运行Python应用程序时发现扬声器发出嘶嘶声,但不要其他方式,键入:

sudo nano /boot/config.txt

,然后在最后添加此行:

disable_audio_dither=1

重新启动更改生效。还是不要打扰,因为无论如何我听起来还是下雨了。

最后,让我们修改主运动检查循环,以在检测到运动时播放声音。我们将使用15秒的延迟,以便可以播放整个循环,并在出现大量不停运动时充当垃圾邮件缓冲区。

while True:

if pir.motion_detected:

print(“Motion detected!”)

thunder.play()

# ensure playback has been fully completed before resuming motion detection, prevents “spamming” of sound

sleep(15)

thunder.stop()

else:

print (“No motion”)

自动启动

我们可能希望将其设置为带电池且没有互联网连接的地方,因此脚本需要在重新启动时运行,而不必打开命令行。为此,我们将使用最简单的方法:crontab。输入:

sudo crontab -e

如果这是第一次运行此命令,首先会询问您要使用的编辑器。我为nano选择了选项2。它将启动到您选择的编辑器中,因此添加以下行:

@reboot python /home/pi/motion.py &

这意味着您的motion.py脚本将在每次启动时运行,并以静默方式运行(因此

如果尽管有任何动作都没有播放任何内容,或者听到一点点点击,则可能未使用完整的文件路径,或者您的文件可能需要转换为较低的比特率和较小的文件大小。

添加更多声音

一遍又一遍地播放相同的效果有点无聊,所以让我们添加一些随机性。下载更多万圣节声音,记得将其缩小到合理的大小和比特率,然后像以前一样使用 scp 将它们发送到您的Pi。我添加了三种不同类型的尖叫声。

修改代码,以使我们实际上没有创建一个 array 《数组,而没有定义一个 pygame.mixer.Sound 变量。/em》的声音。对于Python来说这很简单,只需用方括号将它们的逗号分隔列表括起来,如下所示:

sounds = [

pygame.mixer.Sound(“/home/pi/thunder.ogg”),

pygame.mixer.Sound(“/home/pi/scary_scream.ogg”),

pygame.mixer.Sound(“/home/pi/girl_scream.ogg”),

pygame.mixer.Sound(“/home/pi/psycho_scream.ogg”)

接下来,使用以下命令将随机库导入文件中:/p》 import random

现在修改主运动感应环,如下所示:

while True:

if pir.motion_detected:

print(“Motion detected!”)

playSound = random.choice(sounds)

playSound.play()

# ensure playback has been fully completed before resuming motion detection, prevents “spamming” of sound

sleep(15)

playSound.stop()

else:

print (“No motion”)

请注意小改动:而不是播放单个Sound变量,我们使用 random.choice 函数从声音数组中选择随机声音,然后播放。

以下是完整代码,以防您遇到问题:

import pygame

from pygame.mixer import Sound

from gpiozero import MotionSensor

from time import sleep

import random

pygame.init()

pygame.mixer.init()

#load a sound file, same directory as script (no mp3s)

sounds = [

pygame.mixer.Sound(“/home/pi/thunder.ogg”),

pygame.mixer.Sound(“/home/pi/scary_scream.ogg”),

pygame.mixer.Sound(“/home/pi/girl_scream.ogg”),

pygame.mixer.Sound(“/home/pi/psycho_scream.ogg”)

pir = MotionSensor(4)

while True:

if pir.motion_detected:

print(“Motion detected!”)

playSound = random.choice(sounds)

playSound.play()

# ensure playback has been fully completed before resuming motion detection, prevents “spamming” of sound

sleep(15)

playSound.stop()

else:

print (“No motion”)

只有四个样本,每次重复的可能性很高,但是如果您很烦,您可以添加更多样本。

而已!用一些吓人的LED怪物眼睛将它藏在灌木丛中,您应该能够为自己节省一些糖果,因为所有孩子甚至在上门之前都尖叫着逃走。还是躲在壁橱里,因为在你让约翰尼哭泣之后生气的妈妈已经流血了。

责任编辑:wv

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分