又是一年中的那個時候,社會上普遍認為嚇壞年幼的孩子并給他們糖果。哦,高興。我在這里通過向您展示如何制作一個簡單的動作感應(yīng)Raspberry Pi Halloween音箱來使您的工作更輕松。這是一個演示:
這就是您所需要的
可能您唯一還沒有的部分是運動傳感器,這是您應(yīng)該能夠找到的小巧而廉價的部分
Raspberry Pi(任何型號都可以)。
運動傳感器(?3美元)。
連接線。
有線揚聲器(大多數(shù)藍牙揚聲器都可以選擇使用輸入)。
3.5毫米立體聲電纜,公對公。
完成后,您可能還想添加一些同步的燈光效果,但是在本教程中,我們將僅涵蓋一些令人恐懼的聲音!
設(shè)置
我們正在使用Raspbian Jessie Lite和Python 2.7,但是在您的Pi上運行的任何Linux發(fā)行版都應(yīng)該可以。我已將其保留在標準主機名“ raspberrypi.local”上,因此首先使用SSH遠程登錄(如果您使用的是Mac,請打開“終端”窗口。以下是在Windows中執(zhí)行相同操作的方法)-或選擇使用帶有桌面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中具有許多內(nèi)置類型的GPIO引腳-在傳感器和按鈕中。用GPIO4上的信號引腳,VCC連接至5V以及GND連接至GND的方式連接傳感器。這可能會因您的確切模型而異,因此請使用引腳圖進行確認。
《圖id =“ attachment_598229” aria- describeby =“ caption-attachment-598229” class =“ wp-caption aligncenter”》
圖片來源:raspberrypi.org
我的Pimoroni的Pi 2外殼上有一個直接激光蝕刻的引腳圖。
現(xiàn)在,讓我們制作運動檢測腳本。
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
您應(yīng)該會在屏幕上看到重復的“ no motion”消息,直到您的手在傳感器前面揮動,直到它停留在“ Motion Detected!”上。
如果該消息完全不變,則說明您的連接錯誤。
如果您有興趣了解更多有關(guān)這個簡單的GPIOZero庫,看看這個奇妙的備忘單。
Pla Sound聲音
連接便攜式揚聲器,并在需要時確保已接通電源。我們將使用 pygame 庫播放聲音,因此請繼續(xù)安裝它:
sudo apt-get install python-pygame
首先,我們需要一個聲音文件來播放。如果您是在桌面環(huán)境中執(zhí)行此操作,請繼續(xù)從某個位置下載 WAV 或 OGG 文件(我在這里找到了很多免費的萬圣節(jié)聲音) ,并將其放在您的主目錄中。我建議先進行降采樣,然后再轉(zhuǎn)換為OGG格式。
如果您是遠程連接且僅使用命令行,則由于 wget 命令可能無法獲取實際文件。相反,我們可以將其本地下載到我們的桌面,然后使用 scp (安全副本)命令在命令行上進行復制。您可以在此處了解有關(guān)scp的更多信息,但現(xiàn)在,打開一個新的Terminal選項卡,然后鍵入:
scp thunder.ogg pi@raspberrypi.local:
根據(jù)需要重命名thunder.ogg,但是不要忘記最后一個:(該命令將在沒有它的情況下完成,但不會執(zhí)行我們想要的操作)。默認情況下,這會將文件傳輸?shù)絇i用戶的主目錄。
現(xiàn)在,讓我們修改腳本以播放聲音。首先導入一些新模塊:
import pygame.mixer
from pygame.mixer import Sound
然后,在現(xiàn)有import語句之后,我們將一遍又一遍循環(huán)相同的聲音以進行測試。剩下的動作感測代碼保持原樣-它不會運行,因為它將永遠停留在此聲音播放循環(huán)中。
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。使用上面鏈接到的轉(zhuǎn)換器將其縮減到16位,一切正常,并且大小減小到260KB!
如果您在運行Python應(yīng)用程序時發(fā)現(xiàn)揚聲器發(fā)出嘶嘶聲,但不要其他方式,鍵入:
sudo nano /boot/config.txt
,然后在最后添加此行:
disable_audio_dither=1
重新啟動更改生效。還是不要打擾,因為無論如何我聽起來還是下雨了。
最后,讓我們修改主運動檢查循環(huán),以在檢測到運動時播放聲音。我們將使用15秒的延遲,以便可以播放整個循環(huán),并在出現(xiàn)大量不停運動時充當垃圾郵件緩沖區(qū)。
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”)
自動啟動
我們可能希望將其設(shè)置為帶電池且沒有互聯(lián)網(wǎng)連接的地方,因此腳本需要在重新啟動時運行,而不必打開命令行。為此,我們將使用最簡單的方法:crontab。輸入:
sudo crontab -e
如果這是第一次運行此命令,首先會詢問您要使用的編輯器。我為nano選擇了選項2。它將啟動到您選擇的編輯器中,因此添加以下行:
@reboot python /home/pi/motion.py &
這意味著您的motion.py腳本將在每次啟動時運行,并以靜默方式運行(因此
如果盡管有任何動作都沒有播放任何內(nèi)容,或者聽到一點點點擊,則可能未使用完整的文件路徑,或者您的文件可能需要轉(zhuǎn)換為較低的比特率和較小的文件大小。
添加更多聲音
一遍又一遍地播放相同的效果有點無聊,所以讓我們添加一些隨機性。下載更多萬圣節(jié)聲音,記得將其縮小到合理的大小和比特率,然后像以前一樣使用 scp 將它們發(fā)送到您的Pi。我添加了三種不同類型的尖叫聲。
修改代碼,以使我們實際上沒有創(chuàng)建一個 array 《數(shù)組,而沒有定義一個 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
現(xiàn)在修改主運動感應(yīng)環(huán),如下所示:
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 函數(shù)從聲音數(shù)組中選擇隨機聲音,然后播放。
以下是完整代碼,以防您遇到問題:
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怪物眼睛將它藏在灌木叢中,您應(yīng)該能夠為自己節(jié)省一些糖果,因為所有孩子甚至在上門之前都尖叫著逃走。還是躲在壁櫥里,因為在你讓約翰尼哭泣之后生氣的媽媽已經(jīng)流血了。
責任編輯:wv
-
音箱
+關(guān)注
關(guān)注
36文章
644瀏覽量
68514 -
樹莓派
+關(guān)注
關(guān)注
121文章
1932瀏覽量
106926
發(fā)布評論請先 登錄
樹莓派“吉尼斯世界記錄”:將樹莓派的性能發(fā)揮到極致的項目!

能夠精準定位的樹莓派機器人!

用意念控制燈光亮度?這個樹莓派項目有點意思...

超酷的樹莓派智能鏡項目,快來了解!

評論