这又是每年的那个时候,社会上普遍认为吓坏年幼的孩子并给他们糖果。哦,高兴。我在这里通过向您展示如何制作一个简单的动作感应Raspberry Pi Halloween音箱来使您的工作更轻松。这是一个演示:
这就是您所需要的
可能您唯一还没有的部分就是运动传感器,这是您应该能够找到的小而便宜的部分
一旦您完成后,您可能还想添加一些同步的灯光效果,但是在本教程中,我们将仅涵盖可怕的声音!
设置
我们正在使用Raspbian Jessie Lite和Python 2.7,但是在您的Pi上运行的任何Linux发行版都应该可以。我将其保留在标准主机名“ raspberrypi.local"上,因此首先使用SSH远程登录(如果您使用的是Mac,请打开“终端"窗口。这是在Windows中执行相同操作的方法),或者选择使用带有桌面GUI的完整Raspbian,请随时跳过更新。
ssh [email protected](enter raspberry as the password)sudo apt-get updatesudo apt-get install python-pipsudo pip install gpiozero
这将安装一个简单的库,用于使用Python中的GPIO引脚以及多种类型的内置传感器和按钮。用GPIO4上的信号引脚,VCC连接至5V以及GND连接至GND的方式连接传感器。这可能会因您的确切型号而有所不同,因此请使用引脚图进行确认。
有帮助的是,我的Pimoroni Pi 2盒的引脚图直接被激光刻蚀到了它。 >现在让我们制作运动检测脚本。
nano motion.py
粘贴:
from gpiozero import MotionSensorpir = MotionSensor(4)while True: if pir.motion_detected: print("Motion detected!") else: print ("No motion")
先按CTRL-X,然后单击Y保存并退出,然后运行:
python motion.py
您应该会在屏幕上看到“无动作"消息重复出现,直到您的手在传感器前挥手为止,直到它停留在“检测到运动"!
如果该消息没有出现根本没有任何变化。
如果您想了解有关此简单GPIOZero库的更多信息,请查看此出色的备忘单。
播放声音
连接便携式扬声器,并在需要时确保已接通电源。我们将使用 pygame 库播放声音,因此请继续安装它:
sudo apt-get install python-pygame
首先,我们需要一个声音文件来播放。如果您是在桌面环境中执行此操作,请继续从某个位置下载 WAV 或 OGG 文件(我在这里找到了很多免费的万圣节声音) ,并将其放在您的主目录中。我建议先进行降采样,然后再转换为OGG格式。
如果您是远程连接且仅使用命令行,则由于 wget 命令可能无法获取实际文件。相反,我们可以将其本地下载到我们的桌面,然后使用 scp (安全副本)命令在命令行上进行复制。您可以在此处了解更多有关scp的信息,但现在,打开一个新的Terminal标签,然后输入:
scp thunder.ogg [email protected]:
根据需要重命名thunder.ogg,但不要忘记最后一个: (如果没有该命令,该命令将完成,但不会执行我们想要的操作)。默认情况下,这会将文件传输到Pi用户的主目录。
现在,让我们修改脚本以播放声音。首先导入一些新模块:
import pygame.mixerfrom 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") ]
下一步,将随机库导入文件中,
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 pygamefrom pygame.mixer import Soundfrom gpiozero import MotionSensorfrom time import sleepimport randompygame.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怪兽眼睛将其藏在灌木丛中,您应该能够为自己节省一些糖果,因为所有孩子甚至在进门前就尖叫着逃跑。还是躲在壁橱里,因为在约翰尼哭泣之后生气的妈妈已经被抽血了。
免责声明:PCPC.me对您因使用此项目而造成的任何人身伤害不承担任何责任!
您会制作这个动作激活的音箱来吓local当地的捣蛋鬼吗?这个万圣节你有没有用Raspberry Pi设置任何恐怖效果?请在下面的评论中告知我们!
标签: 万圣节 Raspberry Pi