电子说
又是一年中的那个时候,社会上普遍认为吓坏年幼的孩子并给他们糖果。哦,高兴。我在这里通过向您展示如何制作一个简单的动作感应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
全部0条评论
快来发表一下你的评论吧 !