Schrik Trick-or-Treaters af met een DIY Motion-Activated Soundbox

Het is weer die tijd van het jaar wanneer het sociaal aanvaardbaar wordt geacht om jonge kinderen bang te maken en ze snoep te geven. Oh vreugde.

Het is weer die tijd van het jaar wanneer het sociaal aanvaardbaar wordt geacht om jonge kinderen bang te maken en ze snoep te geven.  Oh vreugde.
Advertentie

Het is weer die tijd van het jaar wanneer het sociaal aanvaardbaar wordt geacht om jonge kinderen bang te maken en ze snoep te geven. Oh vreugde. Ik ben hier om je werk gemakkelijker te maken, door je te laten zien hoe je een eenvoudige motion-sensing Raspberry Pi Halloween-klankkast maakt. Hier is een demo:

Dit is wat je nodig hebt

Waarschijnlijk is het enige onderdeel dat je nog niet hebt, de bewegingssensor, een klein en goedkoop onderdeel dat je zou moeten kunnen vinden op je lokale Microcenter of Maplin.

  • Raspberry Pi (elk model zal het doen).
  • Bewegingssensor (~ $ 3).
  • Aansluitdraden.
  • Bedrade luidspreker (de meeste Bluetooth-luidsprekers hebben de optie om line-in te gebruiken).
  • 3, 5 mm stereokabel, mannelijk naar mannelijk.

Als je klaar bent, wil je misschien wat gesynchroniseerde lichteffecten toevoegen. Hoe Home Lights en Music voor Halloween te synchroniseren Home Lights en muziek voor Halloween synchroniseren Of je nu een Halloween-housefeest organiseert of je wilt het coolste spookhuis in de wereld buurt, waardoor je lichten op tijd knipperen naar muziek en geluidseffecten essentieel zijn. Meer lezen, maar in deze tutorial behandelen we alleen het enge geluid!

Opzetten

We gebruiken Raspbian Jessie Lite en Python 2.7, maar elke Linux-distro die op je Pi wordt uitgevoerd, zou goed moeten zijn. Ik heb het op de standaard hostnaam "raspberrypi.local" achtergelaten, dus begin met inloggen op afstand met behulp van SSH (open een Terminal-venster als je een Mac gebruikt.) Zo kun je hetzelfde doen in Windows 4 Eenvoudige manieren om SSH In te gebruiken Windows 4 Eenvoudige manieren om SSH te gebruiken In Windows SSH is de de facto oplossing voor veilige toegang tot externe terminals op Linux en andere UNIX-achtige systemen.Als u een externe SSH-server hebt waartoe u toegang wilt, moet u een SSH-client downloaden .... Lees meer) - of als u hebt gekozen voor een volledige Raspbian met een desktop-GUI, kunt u doorgaan met updaten.

ssh [email protected] (enter raspberry as the password) sudo apt-get update sudo apt-get install python-pip sudo pip install gpiozero 

Dit installeert een eenvoudige bibliotheek voor het werken met de GPIO-pinnen in Python met vele soorten ingebouwde sensoren en knoppen. Sluit uw sensor aan met de signaalpen op GPIO4, de VCC verbonden met 5V en de GND verbonden met GND. Dit kan variëren naargelang uw exacte model, dus bevestig met een pinout-diagram.

Raspberry Pi GPIO-diagram
Afbeelding: raspberrypi.org

Helemaal handig, mijn Pi 2-hoesje van Pimoroni heeft een pin-outdiagram dat direct op de laser is geëtst.

Gelabeld Raspberry Pi-hoesje

Laten we nu ons bewegingsdetectiescript maken.

 nano motion.py 

Plak in:

 from gpiozero import MotionSensor pir = MotionSensor(4) while True: if pir.motion_detected: print("Motion detected!") else: print ("No motion") 

Raak CTRL-X en vervolgens Y aan om op te slaan en af ​​te sluiten en voer dan uit met:

 python motion.py 

Het bericht "geen beweging" moet op het scherm worden herhaald totdat u met uw hand voor de sensor zwaait, wanneer deze blijft hangen op de "Bewegingsdetectie!"

Beweging gedetecteerd in terminal

Als het bericht helemaal niet verandert, heb je het verkeerd ingeplugd.

Als je meer wilt weten over deze eenvoudige GPIOZero-bibliotheek, bekijk dan deze fantastische cheatsheet.

Geluid afspelen

Sluit uw draagbare luidspreker aan en zorg ervoor dat deze wordt aangedreven als dat nodig is. We zullen de Pygame- bibliotheek gebruiken om geluiden af ​​te spelen, dus ga je gang en installeer het:

 sudo apt-get install python-pygame 

Ten eerste hebben we een geluidsbestand nodig om te spelen. Als je dit doet vanuit de desktop-omgeving, ga dan gang en download ergens een WAV- of OGG- bestand (ik vond hier een goede selectie gratis Halloweengeluiden) en stop het in je thuismap. Ik stel voor om eerst een downsampling te maken en toch naar een klein OGG-formaat te converteren.

Als u op afstand verbinding maakt en alleen de opdrachtregel gebruikt, hebben we wat meer moeite met sommige sites, omdat het wget- commando het daadwerkelijke bestand mogelijk niet haalt. In plaats daarvan kunnen we het lokaal downloaden naar onze desktop en de scp-opdracht (beveiligde kopie) gebruiken om over de opdrachtregel te kopiëren. U kunt hier meer informatie vinden over scp, maar nu opent u een nieuw tabblad Terminal en typt u:

 scp thunder.ogg [email protected]: 

Hernoem waar nodig donder.ogg, maar vergeet dat laatste niet : (het commando zal het zonder voltooien, maar het zal niet doen wat we willen dat het doet). Standaard wordt hiermee het bestand naar de basismap van de Pi-gebruiker overgebracht.

Laten we nu het script aanpassen om een ​​geluid af te spelen. Begin met het importeren van enkele nieuwe modules:

 import pygame.mixer from pygame.mixer import Sound 

Vervolgens, net na de bestaande importstatements, herhalen we hetzelfde geluid steeds opnieuw voor testdoeleinden. Laat de rest van je bewegingsdetectiecode liggen zoals het nu is - hij loopt gewoon niet, omdat hij voor altijd in deze sound-playing-lus blijft zitten.

 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() 

Merk op dat toen ik dit proces oorspronkelijk probeerde, het geluid weigerde te spelen en gewoon in plaats daarvan klikte. De grootte van het bestand of de bitsnelheid was de boosdoener: het was 24-bits en meer dan 5 MB voor een clip van 15 seconden. Door dat te schalen naar 16-bits met behulp van de converter die ik hierboven heb gekoppeld, is alles goed verlopen en is de grootte teruggebracht tot slechts 260 KB!

Als u een smerig gesis uit uw luidsprekers hoort wanneer uw Python-app actief is, maar niet anders, typt u:

 sudo nano /boot/config.txt 

En voeg deze regel aan het einde toe:

 disable_audio_dither=1 

Start opnieuw om de wijzigingen door te voeren. Of doe geen moeite, want het klonk sowieso voor mij als regen.

Laten we ten slotte de belangrijkste lus voor het controleren van de beweging aanpassen om het geluid af te spelen wanneer beweging wordt gedetecteerd. We gebruiken een vertraging van 15 seconden, zodat de hele lus kan worden afgespeeld en als een spambuffer fungeren voor wanneer er veel non-stop beweging is.

 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") 

Start automatisch

We willen dit waarschijnlijk ergens instellen met een batterij en geen internetverbinding, dus het script moet worden uitgevoerd bij het opnieuw opstarten zonder een opdrachtregel te hoeven openen. Om dit te doen, zullen we de eenvoudigste methode gebruiken: de crontab Hoe taken plannen in Linux met Cron en Crontab Hoe taken plannen in Linux met Cron en Crontab De mogelijkheid om taken te automatiseren is een van die futuristische technologieën die er al is . Elke Linux-gebruiker kan profiteren van planningssysteem- en gebruikerstaken, dankzij cron, een gebruiksvriendelijke achtergrondservice. Lees verder . Type:

 sudo crontab -e 

Als dit de eerste keer is dat dit commando wordt uitgevoerd, zal het u eerst vragen welke editor u wilt gebruiken. Ik koos optie 2, voor nano. Het start op in de door u gekozen editor, dus voeg de volgende regel toe:

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

Dit betekent dat uw motion.py-script bij elke start zal worden uitgevoerd en dit stil doet (zodat elke uitvoer van het script wordt genegeerd). Start opnieuw op om het uit te proberen.

Als er niets wordt weergegeven, ondanks dat er beweging is, of als u slechts een kleine klik hoort, hebt u mogelijk niet het volledige pad gebruikt of moet uw bestand mogelijk worden geconverteerd naar een lagere bitsnelheid en een kleinere bestandsgrootte.

Voeg meer geluiden toe

Herhaaldelijk hetzelfde effect herhalen is een beetje saai, dus laten we wat willekeur toevoegen. Download nog meer Halloween-geluiden, onthoud ze te schalen naar een redelijke grootte en bitrate en verzend ze vervolgens naar je Pi met scp als voorheen. Ik heb drie verschillende soorten schreeuwen toegevoegd.

Pas de code aan zodat in plaats van een enkele pygame.mixer.Sound- variabele te definiëren, we eigenlijk een array met geluiden maken. Dit is eenvoudig met Python, omring gewoon een door komma's gescheiden lijst met vierkante haken, zoals:

 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") ] 

Importeer vervolgens de willekeurige bibliotheek in uw bestand, met:

 import random 

Wijzig nu de belangrijkste bewegingsdetectielus als volgt:

 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") 

Let op de kleine wijziging: in plaats van de enkele variabele Sound af te spelen, gebruiken we de functie random.choice om een ​​willekeurig geluid uit onze array geluiden te kiezen en dat vervolgens af te spelen.

Hier is de volledige code voor het geval u problemen ondervindt:

 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") 

Met slechts vier voorbeelden is er elke keer een grote kans op herhaling, maar je kunt meer voorbeelden toevoegen als dat vervelend is.

Dat is het! Verberg het in de struiken met een paar enge LED-monsterogen. Spookachtige Halloween-gloeiende ogen maken voor minder dan $ 5. Spookachtige Halloween-gloeiende ogen maken voor minder dan $ 5 Wilt u uw Halloween-versieringen dit jaar spannender maken? Leer hoe je LED-ogen kunt maken voor minder dan $ 5 in dit elektronica-project voor beginners. Lees meer, en je zou jezelf wat snoep moeten kunnen besparen, want alle kinderen rennen schreeuwend weg voordat ze de deur al bereiken. Of ga je verstoppen in de kast, want een boze moeder is op zoek naar bloed nadat je de kleine Johnny hebt laten huilen.

Disclaimer: MakeUseOf is niet verantwoordelijk voor enig persoonlijk letsel dat kan voortvloeien uit uw gebruik van dit project!

Ga je deze door beweging geactiveerde soundbox maken om de lokale trick-or-treaters bang te maken? Heb je deze enge Halloween-effecten met een Raspberry Pi ingesteld? Laat het ons weten in de comments hieronder!

In this article