Construyendo un Ambilight DIY con Hyperion y un Raspberry Pi - Retroiluminación inmersiva
Este proyecto empezó como muchas cosas en mi vida reciente (tal como que me pasó con la impresión 3D), entusiasmándome al ver un video de TikTok xD.
Un video con una secuencia de acción en el cual el efecto conseguido con la retroiluminación simplemente me pareció espectacular. Este blog post es menos un tutorial y más un relato de mi experiencia y los puntos que consideré a la hora de tomar las decisiones sobre cómo comprar los materiales y ensamblar un sistema similar al del video.
Cuando vi el video con retroiluminación, lo primero que hice fue mostrárselo a mi esposa (para asegurarme que le gustara también antes de modificar mi televisión) y luego comencé a informarme al respecto. Si bien al comienzo pensé que se trataba de algo solamente visual, resulta que tiene numerosas ventajas:
- Las luces que proyectan hacia atrás en tu televisión extienden la pantalla generando una experiencia más inmersiva
- Ver televisión en un ambiente oscuro genera fatiga en tus ojos, al aumentar la iluminación detrás del televisor disminuyes la fatiga sin distraer de la experiencia
- En caso de que no quieras extender la pantalla, puedes usarlo como una fuente tenue de luz blanca cálida en una habitación oscura, lo que dilata tus pupilas y mejora el contraste del contenido
Al ver estas ventajas pensé en adquirir el sistema, pero me vi espantado por el costo de todas las opciones excepto una. Estas son las principales opciones que barajé:
- Ambilight de Philips: Existen dos versiones, una está integrada en algunos de sus televisores y la otra se vende como un accesorio (Ambilight syncBox), en el caso de usar el SyncBox el contenido al que quieras aplicar la retroiluminación pasa por una caja con entrada y salida HDMI, lo que significa que no podrás usarlo con tus aplicaciones integradas en el Smart TV y se integra con el sistema de luces Philips Hue, el cual debe comprarse por separado. Lamentablemente su costo es el más elevado de todas las alternativas por mucho, tiene pocas opciones de personalicación y la luz proyectada tiene menos resolución que otras alternativas (En el video de arriba se observa que son 6 u 8 fuentes de luz discretas). Sin embargo, provee una experiencia sencilla y tiene la capacidad de integrarse con otras luces además de la pantalla.
- Govee: un sistema que captura la información de la pantalla usando una cámara 1080p y luces de una resolución considerablemente más alta que Ambilight y bastante más barata, tiene la gran ventaja de que no es necesario pasar por un cable HDMI para activar el efecto (es decir, puedes usar las aplicaciones de tu Smart TV)
- Project Hyperion: Este es un proyecto OpenSource que nos permite hacer nuestro propio sistema de retroiluminación por una fracción del costo de los otros y con una capa de personalización bastante más flexible, puede ser integrado usando Home assistant y existe un fork que permite trabajar con contenido HDR (Hyperion HDR). Permite conectar varias fuentes de luces al igual que Ambilight de Philips y además las luces pueden tener la resolución que nosotros queramos, lamentablemente también debe pasar por un puerto HDMI, pues hay que capturar el video del contenido de alguna forma para que se genere el efecto
Dado el costo de las dos primeras (y que no me agradaba la idea de poner una cámara frente a mi televisión) me decanté por hacer el sistema yo mismo usando Hyperion HDR, una Raspberry Pi y una cantidad no menor de compras en Aliexpress, las cuales describiré en detalle a continuación. Si quieres saltarte todo el proceso de compras y configuración, puedes ir directamente a la sección de resultados ;)
Capturadora de video y splitter HDMI
Uno de los grandes problemas a resolver es uno con el cual puedes estar familiarizado si alguna vez has utilizado una capturadora de video: protección de contenido. Generalmente al intentar capturar contenido, si tiene protección HDC (como es el caso de la mayoría del contenido de streaming) la capturadora de video solo mostrará una imagen negra, nosotros no queremos grabar el video, queremos utilizarlo para mejorar nuestra experiencia, pero esta protección nos genera una gran traba. Afortunadamente hay algunas maneras de resolver este problema:
- Conseguir una capturadora de video que sea compatible con HDCP 2.2, son escasos y caros, y algunos son de hecho ilegales, pero pueden comprarse fácilmente por Amazon o Aliexpress, en este caso también debes tener en cuenta que la capturadora debe soporta, al menos en la salida HDMI, todas las características que quieras usar en tus equipos (HDR, 4K, 60FPS, Dolby visión, etc).
- Utilizar un conversor HDMI a RCA y un capturador RCA: estos equipos, al pasar de HDMI a RCA, remueven todo tipo de protección digital junto con gran parte de la resolución del video (la cual en realidad no necesitamos), pero para esto se necesita un splitter HDMI que envíe la señal tanto al televisor como al conversor, lo que nos lleva a la siguiente opción.
- Splitter HDMI: Un efecto secundario de algunos (no todos) los splitter HDMI que sean capaces de entregar distintas resoluciones a la vez es que remueven la protección HDCP de la salida secundaria, por lo cual si usamos esto en conjunto con una capturadora de video, tenemos nuestra solución. En particular yo utilicé este splitter HDMI con una capturadora de video genérica
Tira de luces LED y fuente de poder
La elección de las luces LED es uno de los ámbitos menos complejos del proyecto, pero no deja de ser importante. Hay un requisito fundamental que debe cumplirse si queremos lograr el efecto deseado: que los LED sean individualmente direccionables, esto significa que debe existir la posibilidad de que cada LED de la tira pueda generar un color independiente del resto. En mi caso utilicé LEDs basados en el integrado WS2812B, que es de los más comunes en este tipo de aplicaciones.
Existen tiras LED direccionables de variada cantidad de LED por metro (15, 30, 60, 74, 96. 144, etc) y con o sin protección contra agua y polvo. En mi experiencia, 60 LED por metro es lo ideal, más que eso no añade al efecto y consume demasiada energía y menos que eso puede provocar que no se vea tan continuo el efecto, sin embargo creo que 30 LED por metro también genera un efecto bastante agradable y tiene la gran ventaja de que puedes utilizar una fuente de menos potencia. Creo que para la mayoría 30 LED por metro basta... hay que recordar que el video Ambilight que me inspiró a hacer este video tenía menos de 10 fuentes de luz totales, siendo que una tira de 30 LED por metro tendría más de 100 LEDs individuales para una televisión de 55 pulgadas.
Al medir el perímetro de mi televisor de 55 pulgadas, determiné que 4 metros de tiras LED serían suficiente, el exceso de tiras LED puede ser cortado o escondido detrás del televisor. Para la instalación misma en la televisión recomiendo además adquirir conectores de tira LED en L de 4 conexiones. En mi caso yo pequé de impaciente y pegué los LEDs sin usar los conectores y es una de las pocas cosas de las que me arrepiento en mi instalación.
Para mi televisión utilicé estas tiras LED de 4 metros, 60 led por metro y IP30, pues era la opción más barata que cumplía con mis requerimientos. En mi caso, esto se traducía a un total de 220 LED, con un consumo total de 15A máximo (todos los LED blancos al brillo máximo), lo cual es bastante elevado para un fuente de 5V. Sin embargo, éste número es bastante conservador, y terminé utilizando una fuente de 5V y 10A y bajando el brillo máximo de los LED a un 85%, esto me dio suficiente margen para también alimentar a una Raspberry Pi utilizando la misma fuente.
Raspberry Pi
Para controlar todo el sistema, necesitamos una Raspberry Pi, la elección de ésta es sencilla: una Raspberry pi 3 (en cualquiera de sus variantes), si bien puedes utilizar una Raspberry 1, Raspberry Zero (o Zero W), estas son extremadamente lentas y el proceso de manejar las pantallas de configuración llega a ser frustrante y la respuesta de las luces llega a 20 FPS máximo (puede ser más que suficiente si no te interesa una respuesta tan inmediata), una Raspberry Pi 2 podría llegar a 60 FPS con algunos ajustes y un manejo adecuado de la interfaz, pero no cuenta con WiFi por lo que necesitamos un adaptador para conectarnos a WiFi o un cable ethernet. Por último una Raspberry Pi 4 consume demasiada energía, y a menos que nos sobre potencia en nuestra fuente es una mala opción pues si no tendremos que buscar una fuente de más corriente o alimentarla con su fuente oficial de manera separada.
En el caso de la Raspberry Pi 3A+ está el inconveniente que como solo tiene un puerto USB, no podemos alimentar el splitter HDMI desde la misma Raspberry, pero se puede utilizar puertos USB típicamente disponible en el televisor para esto. Esta es la opción que yo utilicé pues normalmente se encuentra algo más barata.
Cabe por último destacar que con el reciente lanzamiento de la Raspberry Pi Zero 2, ésta se convierte en una opción atractiva pues tiene un desempeño similar a la Raspberry pi 3 con un factor de forma que lo hace más sencillo de ocultar en nuestro media center, sin mencionar que debería ser más barata.
Conexiones
Un apartado importante de este proyecto eran las conexiones. Muchas veces vi videos en Youtube donde simplemente pelaban los cables y hacían uniones detrás de la televisión, yo decidí hacer algo más limpio y diseñe una pequeña PCB que solo requeriría dos conexiones: La fuente de poder y los LED, además de abordar algunos de los problemas que vi con la mayoría de los tutoriales
Esta PCB aborda varios problemas y permite energizar de manera limpia desde un conector de barril estándar la Raspberry PI utilizando el conector USB. Alternativamente se puede soldar un jumper para alimentar desde el HAT, pero se debe asegurar que la fuente no excede los 5.2V (la mía marcaba 5.3V así que decidí alimentar por el puerto microUSB, que incorpora protecciones y reguladores adicionales). Además incorpora un traductor de voltaje para el pin GPIO18, esto porque la mayoría de las tiras LED direccionables trabajan con niveles lógicos de 5V y la Raspberry Pi trabaja con 3.3V. Si bien en muchos casos puede funcionar usando 3.3V, es posible que algunas veces genere problemas (especialmente en tiras LED largas).
La mayoría de las tiras LED vienen con un conector que puedes usar para realizar las conexiones, el cable blanco (también se ve en amarillo y negro) es GND o tierra, el verde corresponde a la señal PWM y el rojo a 5V
Para pegar los LED, tienes que empezar desde el lugar en que quieres que salga la conexión a la Raspberry Pi (en mi caso, el sitio más cercano al orificio en mi mueble) y ir pegando la tira alrededor del perímetro
En mi caso decidí doblar la tira sobre si misma, con cuidado, pero puedes cortarla y utilizar conectores en L si así lo prefieres.
La conexión de salida de la tira LED al resto del sistema se compone de un solo cable de 3 conductores, lo que en mi opinión queda bastante limpio:
Una cosa que descubrí posteriormente es que los LEDs del final de la tira se veían más amarillentos que al comienzo, esto es debido a la caída de voltaje que se produce al circular corriente por la tira. para solucionar esto, lo que hice fue soldar dos cables (5V y GND) entre el comienzo y el final de la tira para que la alimentación se distribuyera mejor. Finalmente tomamos el otro extremo del conector, alargamos un poco los cables y enchufamos todo a la Raspberry Pi, y nos queda este sistema que podemos ocultar donde estimemos conveniente:
Solo queda conectar el capturador HDMI al splitter y el splitter a la televisión y nuestra fuente de video (en mi caso un Google TV) para comenzar a configurar Hyperion HDR
Configuración de Hyperion HDR
El primer paso es preparar nuestra Raspberry Pi, para lo que descargamos Raspberry pi imager desde éste enlace. Luego de instalarlo y ejecutarlo, selecciona el botón "Choose OS"
Posteriormente seleccionamos Rasperry Pi OS (other) y luego seleccionamos Raspberry Pi OS Lite. Esto me permitió descargar un sistema más liviano que no tiene un entorno gráfico, pues necesitamos liberar la mayor cantidad de carga de la CPU para una experiencia agradable. Si lo deseas puedes utilizar otra versión, pero esto es lo que yo hice.
Luego selecciona el botón Choose Storage y selecciona tu tarjeta SD y por último presiona el botón WRITE (tu tarjeta será formateada, así que asegúrate de seleccionar el medio de almacenamiento correcto).
Una vez termine el proceso debemos hacer dos cosas antes de encender nuestra Raspberry: Habilitar SSH y configurar nuestra red Wi-Fi, para ello debemos crear dos archivos en la partición BOOT de nuestra SD, uno llamado wpa_supplicant.conf y el otro un archivo vacío llamado ssh (sin extensión)
El archivo wpa_supplicant.conf lo rellenamos con la siguiente información
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=CL
network={
scan_ssid=1
ssid="tuSSID"
psk="tuPASS"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
auth_alg=OPEN
}
Donde tuSSID y tuPASS los cambias por los parámetros de tu red Wi-Fi. Estos archivos serán eliminados automáticamente con el inicio del sistema operativo dedl a Raspberry, por lo que no presentan un problema de seguridad. Este proceso nos permitirá habilitar SSH y conectarnos a nuestra red wifi sin ejecutar ningún comando en la Raspberry Pi ni necesitar de una interfaz gráfica.
Una vez se encienda la Raspberry Pi, si tienes acceso a la configuración del router de tu hogar, puedes ver la dirección IP de la raspberry pi desde ahí, si no, deberás conectar un teclado y monitor y ejecutar ifconfig para obtener la dirección IP
Una vez tenemos la dirección IP nos podemos conectar por SSH, yo utilice putty pero puedes utilizar cualquier agente SSH (o el nativo si estás en Linux o MacOS). Las credenciales por defecto son usuario: "pi" y password: "raspberry" (sin comillas).
Luego debemos ejecutar los siguientes comandos:
sudo apt update && sudo apt upgrade -y
wget https://github.com/awawa-dev/HyperHDR/releases/download/v17.0.0.0/HyperHDR-17.0.0.0-Linux-`uname -m`.deb
sudo apt install ./HyperHDR-17.0.0.0-Linux-`uname -m`.deb
sudo sed -i '/^User/d' /etc/systemd/system/hyperhdr\@.service
sudo systemctl daemon-reload
sudo service hyperhdr@pi restart
sudo service hyperhdr@pi status
Si tienes una raspberry pi distinta a la Zero/Zero W o la original (la de la SD grande) debes además editar el archivo 99-com.rules ejecutando las siguientes líneas (alternativamente puedes instalar el servicio hyperhdr como root, reemplazando "pi" por "root" en las últimas dos líneas del bloque anterior pero no lo recomiendo)
sudo nano /etc/udev/rules.d/99-com.rules
pegar las siguientes líneas
SUBSYSTEM=="pwm", PROGRAM="/bin/sh-c '\
chown -R root:gpio /sys/class/pwm && chmod -R 770 /sys/class/pwm;\
chown -R root:gpio /sys/devices/platform/soc/*.pwm/pwm/pwmchip* && chmod -R 770 /sys/devices/platform/soc/*.pwm/pwm/pwmchip*\
sudo reboot now
Esto fue debido a que normalmente en modelos de Raspberry posteriores a la Raspberry pi 2, para utilizar PWM debes ser usuario root, con estas líneas cambiamos los permisos para que eso no sea necesario.
Ahora procedemos a configurar Hyperion HDR y empezamos por un paso muy entretenido... contar cuantos LED hay en cada lado de la televisión. Anotamos la cantidad de LEDs e ingresamos a la configuración de Hyperion. Para ello ingresa a https://ip_raspberry:8090
Al ingresar lo primero que haremos será ir a la pestaña LED hardware para configurar nuestra tira LED y seleccionamos el tipo de controlador ws281x
Luego en el campo Hardware LED count, ingresa la cantidad total de LEDs, presiona el botón para guardar y nos dirigimos a la pestaña LED layout donde ingresamos la cantidad de LED que hay en cada lado
Algo importante es que en mi caso tengo un segmento sin LED, para esto, hay que añadirle una cantidad de LEDs "falsos" en la porción que tiene el segmento vació, en mi caso tengo un gap de 11 LEDs, por lo cual si bien tengo 59 leds en el segmento inferior, pongo 70. Luego vamos a la pestaña de avanzados y seleccionamos RGB order wizard para calibrar el orden de los colores
Sigue las instrucciones de el wizard para configurar correctamente la tira LED, en este punto ya podemos probar nuestra tira LED, vamos a la pestaña Remote control y en el menú de colores y efectos podemos probar varios para ver que todo esté funcionando correctamente.
Finalmente debemos ir a la pestaña de captura, seleccionar nuestro dispositivo de video y los parámetros de captura. En mi caso tengo la resolución en 720x480, software frame skipping en 1 y todo el resto en sus valores por defecto. Para hacer que el equipo se apague correctamente cuando no hay una entrada de video podemos calibrar el sistema para detectar el video de "no hay señal". para ello desconectamos cualquier fuente HDMI que tengamos de la capturadora y presionamos Calibrate y habilitamos la opción Automatic signal detection
Esto permitirá que las luces se apaguen solas cuando no se están ocupando, lo que ahorra tener que hacer una integración con Home assistant o usar una API o querys para controlar las luces. Queda abarcar un par de detalle como calibración de colores, pero los menú son lo suficientemente intuitivos para que lo haga cualquiera y creo que está fuera del alcance de éste blog post ;)
Resultados
Los resultados fueron mucho mejor de lo que esperaba, el efecto en mi opinión es mucho mejor al que se observa en el video que subí usando Ambilight de Philips. Con Hyperion y la tira de 60 leds por metro incluso los pequeños hilos rojos que no generaban ningún cambio en Ambilight generan un efecto bastante impactante en Hyperion
Ahora dejó algunos videos y capturas para mostrar lo espectacular del sistema:
Hay algunas cosas que me hubiera gustado saber antes de hacer este proyecto, como por ejemplo que se pierde HDMI-CEC, es decir, no puedo controlar la televisión por HDMI (no puedo encenderla por ejemplo al encender mi nintendo switch), lo que puede ser un problema para personas que usan receivers que dependen de dicha capacidad. Otra cosa es que las superficies distintas reflejan colores de manera distinta, dado que hay dos superficies detrás de mi televisión, esto supuso un problema a la hora de calibrar, pero terminé dejando los colores en un termino medio entre los dos. Si tuviera que agregar algo, sería un switch HDMI para no tener que conectar el cable de mi Google TV o Nintendo Switch manualmente cada vez que quiero cambiar de entrada.
Estoy bastante contento con el resultado logrado y no puedo recomendarlo lo suficiente, ha transformado la experiencia de ver películas en mi hogar y no me sorprendería que se volviera algo más común en los hogares, pero hasta que eso ocurra, mi departamento se volverá el lugar por defecto de mi circulo más cercano a la hora de juntarse a ver películas :)
En su momento todo me salió cerca de $95.000 CLP, aunque ahora la mayoría de los productos, especialmente la Raspberry están bastante más caros. Para finalizar dejo una lista con todos los materiales que utilicé para este proyecto:
- Raspberry Pi 3A+
- Tira LED direccionable de 4 metros, 60 LED por metro
- Fuente de poder 5V, 10A
- PCB de conexión
- Conector rápido de tiras LED 3 pines, en L
- Capturadora HDMI generica
- Splitter HDMI
- Cables HDMI
- Tarjeta microSD de 4GB o más
Con esto termina esta guía, si te gustó 📢 corre la voz y comparte este link a alguien que le pueda interesar. Y si no te has suscrito al newsletter, 📩 anótate abajo para recibirlo en tu correo.
👋