SSH a tu árbol de Navidad con Raspberry Pi

A principios de este año, escribí un artículo sobre cómo usar Raspberry Pi para crear un espectáculo de luces musicales con un proyecto de código abierto llamado Espectáculo de luzPi. Mi pequeño programa navideño fue tan popular que me invitaron a mostrárselo a un grupo de niños de secundaria en Carolina del Norte.

Lo que me lleva a esta temporada navideña. Coqueteé con la idea de tener un espectáculo de luces al aire libre, pero por la vida simplemente no tenía el tiempo (ni la motivación) para dar ese salto. Sin embargo, dediqué algo de tiempo a mejorar la configuración del año pasado.

En lugar de cinco canales funcionando con 500 luces, tengo ocho canales funcionando con 800 luces. También cambié la configuración de LightShowPi para ajustar un poco más la luz. Ejecuto todas las canciones en cuatro canales y muestro los otros cuatro canales. Esto hace que la luz sea un poco más divertida con menos silenciamientos de canales no utilizados durante algunas canciones.

Mi configuración ahora también es sin cabeza (es decir, sin monitor) y funciona en Raspberry Pi 2. La configuración sin cabeza es buena porque ya no necesito espacio debajo del árbol para el monitor. La Raspberry Pi 2 (en lugar de B+) no importa mucho, ya que el rendimiento de LightShowPi es excelente en cualquier versión. Con una clave Wi-Fi, solo me conecto SSH a Pi desde mi teléfono y enciendo / detengo las luces y la música en cualquier momento.

Finalmente, este año también pensé un poco más en elegir canciones, tratando de agregar a la lista de reproducción canciones un poco más variadas y divertidas.

Captura de pantalla de la lista de reproducción de Navidad

Aquí hay un ejemplo de cómo se ve el árbol este año:

Después de que el árbol de Navidad se encendió y "bailó", inmediatamente se hizo evidente un problema: mi esposa y mis hijos querían una manera fácil de cambiar entre el modo "sólido" y "baile".

Así que pasé por mi Raspberry Pi CanaKit y decidió intentar usar los botones que vienen con él para resolver este interesante problema.

Para ayudarme a ajustar los botones, usé este es un buen videotutorial. Aquí está el resultado.

Publicación de LightShowPi

Luego necesitaba escribir código para que funcionara. Al principio, basé mi código en el video de YouTube al que me referí anteriormente, pero no me gustó que tuviera tantos ciclos. Así que leí un poco más y pude encontrar una mejor pieza de código. Claro, estoy seguro de que el código se puede mejorar mucho, pero es suficiente para un pequeño proyecto personal/prueba de concepto.

#!/usr/bin/env python

import RPi.GPIO as gpio
import os
import time

gpio.setmode(gpio.BCM)
gpio.setup(4, gpio.IN, pull_up_down=gpio.PUD_UP)
gpio.setup(17, gpio.IN, pull_up_down=gpio.PUD_UP)
lights = 0

while True:
    b1 = gpio.input(4)
    b2 = gpio.input(17)
    #button 1 (solid lights)
    if (b1 == False):
       if lights == 0:
           os.system("export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi; sudo python /home/pi/lightshowpi/py/hardware_controller.py --state=on")
           lights = 1
       elif lights == 1:
           os.system("export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi; sudo python /home/pi/lightshowpi/py/hardware_controller.py --state=off")
           lights = 0

    #button 2 (dancing mode)
    if (b2 == False):
       if lights == 0:
           os.system("export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi; sudo lightshowpi/bin/start_music_and_lights")
           lights = 1
       elif lights == 1:
           os.system("export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi; sudo lightshowpi/bin/stop_music_and_lights")
           lights = 0

    # trying not to waste cycles on the pi
    time.sleep(0.2)

El código anterior usa principalmente la biblioteca python python RPi para interactuar con los dos contactos GPIO que uso para mis botones (pines 4 y 17), y cuando se presiona el botón y la luz de fondo está apagada, enciéndala y viceversa.

Finalmente - y me tomó un tiempo entenderlo - tuve que cambiar $SYNCHRONIZED_LIGHTS_HOME/bin/stop_music_and_lights un script que venía con LightShowPi porque tenía un archivo sudo killall python en él que matará mi secuencia de comandos de Python.

Así que cambié esta línea a:

sudo kill $(ps aux | grep 'synchronized_lights.py' | awk '{print $2}')

¡Eso es! Aquí hay un vistazo al resultado final:

Artículos de interés

Subir