Scare Trick-or-Treaters con una caja de resonancia activada por movimiento DIY

Es esa época del año cuando se considera socialmente aceptable aterrorizar a los niños pequeños y darles dulces. Oh Alegría.

Es esa época del año cuando se considera socialmente aceptable aterrorizar a los niños pequeños y darles dulces.  Oh Alegría.
Anuncio

Es esa época del año cuando se considera socialmente aceptable aterrorizar a los niños pequeños y darles dulces. Oh Alegría. Estoy aquí para facilitarte el trabajo, mostrándote cómo crear una caja de resonancia Raspberry Pi Halloween. Aquí hay una demostración:

Esto es lo que necesitarás

Probablemente, la única parte que todavía no tiene es el sensor de movimiento, una pieza pequeña y económica que debería encontrar en su Microcenter o Maplin local.

  • Raspberry Pi (cualquier modelo funcionará).
  • Sensor de movimiento (~ $ 3).
  • Cables de conexión.
  • Altavoz con cable (la mayoría de los altavoces con Bluetooth tendrán la opción de usar línea de entrada).
  • Cable estéreo de 3.5 mm, de hombre a hombre.

Una vez que haya terminado, es posible que desee agregar algunos efectos de iluminación sincronizados Cómo sincronizar las luces y la música para Halloween Cómo sincronizar las luces y la música para Halloween Ya sea que esté organizando una fiesta en la casa de Halloween o que desee la casa embrujada más genial en el vecindario, haciendo que sus luces destellen al ritmo de la música y los efectos de sonido es esencial. Lea más también, ¡pero en este tutorial solo cubriremos los sonidos de miedo!

Configurando

Estamos usando Raspbian Jessie Lite y Python 2.7, pero cualquier distribución de Linux que se ejecute en tu Pi debería estar bien. Lo dejé en el nombre de host estándar "raspberrypi.local", así que empiece iniciando sesión de forma remota utilizando SSH (abra una ventana de Terminal si está en Mac. He aquí cómo hacer lo mismo en Windows 4 Maneras fáciles de usar SSH In Windows 4 Maneras fáciles de usar SSH En Windows SSH es la solución de facto para acceder de manera segura a terminales remotas en Linux y otros sistemas similares a UNIX. Si tiene un servidor SSH remoto al que desea acceder, tendrá que descargar un cliente SSH .... Leer más) - o si ha optado por utilizar un Raspbian completo con la GUI de escritorio, no dude en omitir la actualización.

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

Esto instala una biblioteca simple para trabajar con los pines GPIO en Python con muchos tipos de sensores y botones integrados. Conecta tu sensor con el pin de señal en GPIO4, el VCC conectado a 5V y el GND conectado a GND. Esto puede variar de acuerdo con su modelo exacto, así que confirme con un diagrama de pinout.

Diagrama de GPIO de Raspberry Pi
Crédito de la imagen: raspberrypi.org

De manera útil, mi funda Pi 2 de Pimoroni tiene un diagrama de pinout grabado con láser directamente en él.

Etiquetado Raspberry Pi Case

Ahora hagamos nuestro script de detección de movimiento.

 nano motion.py 

Pegar en:

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

Presiona CTRL-X y luego Y para guardar y salir, luego ejecuta con:

 python motion.py 

Debería ver el mensaje "sin movimiento" repetido en la pantalla hasta que agite su mano en frente del sensor, cuando se quede en el "Movimiento Detectado".

Movimiento detectado en la terminal

Si el mensaje no cambia en absoluto, lo ha cableado mal.

Si está interesado en obtener más información sobre esta sencilla biblioteca GPIOZero, eche un vistazo a esta fantástica hoja de trucos.

Reproducción de sonido

Conecte su altavoz portátil y asegúrese de que esté alimentado si es necesario. Usaremos la biblioteca de pygame para reproducir sonidos, así que adelante e instálalo:

 sudo apt-get install python-pygame 

Primero, necesitamos un archivo de sonido para jugar. Si está haciendo esto desde el entorno de escritorio, siga adelante y descargue un archivo WAV u OGG de alguna parte (aquí encontré una buena selección de sonidos gratuitos de Halloween) y póngalo en su directorio de inicio. Sugeriría la reducción de resolución primero y la conversión a un pequeño formato OGG de todos modos.

Si te estás conectando de forma remota y solo usando la línea de comando, tenemos un poco más de dificultad con algunos sitios, ya que el comando wget puede no capturar el archivo real. En su lugar, podemos descargarlo localmente en nuestro escritorio y usar el comando scp (copia segura) para copiar a través de la línea de comando. Puede obtener más información sobre scp aquí, pero por ahora, abra una nueva pestaña Terminal y escriba:

 scp thunder.ogg [email protected]: 

Cambie el nombre de thunder.ogg según corresponda, pero no olvide que final : (el comando se completará sin él, pero no hará lo que queremos que haga). Por defecto, esto transferirá el archivo al directorio de inicio del usuario de Pi.

Ahora modifiquemos la secuencia de comandos para reproducir un sonido. Comience por importar algunos módulos nuevos:

 import pygame.mixer from pygame.mixer import Sound 

Luego, justo después de las declaraciones de importación existentes, repetiremos el mismo sonido una y otra vez para fines de prueba. Deje el resto de su código de detección de movimiento como está por ahora; simplemente no se ejecutará, ya que quedará atrapado en este ciclo de reproducción de sonido para siempre.

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

Tenga en cuenta que cuando originalmente probé este proceso, el sonido se negó a reproducir y simplemente hizo clic en su lugar. El tamaño del archivo o la tasa de bits fue el culpable: fue de 24 bits y más de 5 MB para un clip de 15 segundos. Escalar eso a 16 bits usando el convertidor al que he vinculado hace que todo funcione bien, ¡y el tamaño se redujo a solo 260KB!

Si notas un silbido desagradable en tus parlantes cuando tu aplicación Python se está ejecutando, pero no de otra manera, escribe:

 sudo nano /boot/config.txt 

Y agrega esta línea al final:

 disable_audio_dither=1 

Reinicie para que los cambios surtan efecto. O no te molestes, ya que de alguna manera sonaba como lluvia para mí.

Finalmente, modifiquemos el ciclo principal de control de movimiento para reproducir el sonido cuando se detecte movimiento. Usaremos un retraso de 15 segundos para que se pueda reproducir todo el ciclo, y para que actúe como un buffer de spam para cuando hay mucho movimiento sin parar.

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

Comience automáticamente

Es probable que deseemos configurar esto en algún lugar con una batería y sin conexión a Internet, por lo que la secuencia de comandos debe ejecutarse al reiniciar sin tener que abrir una línea de comandos. Para hacer esto, usaremos el método más simple posible: el crontab Cómo programar tareas en Linux con Cron y Crontab Cómo programar tareas en Linux con Cron y Crontab La capacidad de automatizar tareas es una de esas tecnologías futuristas que ya está aquí . Todos los usuarios de Linux pueden beneficiarse del sistema de programación y las tareas de los usuarios, gracias a cron, un servicio en segundo plano fácil de usar. Lee mas . Tipo:

 sudo crontab -e 

Si esta es la primera vez que ejecuta este comando, comenzará preguntándole qué editor usar. Elegí la opción 2, para nano. Se iniciará en el editor elegido, así que agregue la siguiente línea:

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

Esto significa que su script motion.py se ejecutará en cada inicio, y lo hará en silencio (por lo que se ignorará cualquier resultado del script). Reiniciar para probarlo.

Si no se reproduce nada a pesar de que hay movimiento, o si oye un pequeño clic, es posible que no haya utilizado la ruta completa del archivo, o que su archivo deba convertirse a una menor velocidad de bits y a un tamaño de archivo más pequeño.

Añadir más sonidos

Jugar el mismo efecto una y otra vez es un poco aburrido, así que agreguemos algo de aleatoriedad. Descarga algunos sonidos de Halloween más, recordando escalarlos a un tamaño y bitrate sensatos, y luego envíalos a tu Pi usando scp como antes. Agregué tres tipos diferentes de gritos.

Modifique el código para que en lugar de definir una sola variable pygame.mixer.Sound, en realidad estamos creando una matriz de sonidos. Esto es simple con Python, simplemente rodee una lista separada por comas de ellos con corchetes, así:

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

A continuación, importe la biblioteca aleatoria en su archivo, con:

 import random 

Ahora modifique el lazo principal de detección de movimiento de la siguiente manera:

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

Tenga en cuenta el pequeño cambio: en lugar de reproducir la única variable de sonido, estamos utilizando la función random.choice para elegir un sonido aleatorio de nuestra matriz de sonidos, y luego reproducirlo.

Aquí está el código completo en caso de que tenga problemas:

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

Con solo cuatro muestras, hay una alta probabilidad de repetición cada vez, pero puede agregar más muestras si eso es molesto.

¡Eso es! Esconderlo en los arbustos con algunos monstruosos ojos de monstruo LED Cómo hacer Spooky Halloween Ojos brillantes por menos de $ 5 Cómo hacer Halloween Spooky Ojos brillantes por menos de $ 5 ¿Quieres darle vida a tus decoraciones de Halloween este año? Aprenda cómo hacer ojos LED por menos de $ 5 en este proyecto de electrónica para principiantes. Lea más, y debería poder ahorrarse unos dulces mientras todos los niños huyen gritando antes de llegar a la puerta. O ve a esconderte en el armario porque una madre enojada busca sangre después de hacer llorar al pequeño Johnny.

Descargo de responsabilidad: ¡MakeUseOf no es responsable de ninguna lesión personal que pueda resultar de su uso de este proyecto!

¿Estarás haciendo esta caja de resonancia activada por movimiento para asustar a los trick-or-treaters locales? ¿Has configurado algún efecto aterrador con una Raspberry Pi este Halloween? Por favor, háganos saber al respecto en los comentarios a continuación!

In this article