Ambilight en ODROID-C2 Usando LibreElec: Adaptando Ambilight al ODROID-C2

En este artículo, me gustaría compartir cómo llegué a montar un sistema Ambilight funcional con un ODROID-C2 y LibreElec. Previamente localicé otras guías que se centraban principalmente en la Raspberry Pi, así que tuve que recopilar información usando Google y recurrir al método ensayo y error.

El diseño de alto nivel utiliza Hyperion instalado como complemento para Kodi, desde el repositorio de LibreElec instalar HyperCon no es posible debido a que la CPU es desconocida, y un Arduino para controlar los LED usando la librería FastLED. Arduino está conectado al ODROID-C2 a través de un cable USB (el Arduino tiene un conversor USB a serie). Mi TV es FullHD, así que no necesite recurrir a la magia (es decir, hacer overclock de RAM y cosas así) para el 4K.

Utilicé las siguientes guías como base para el montaje y la configuración. Pero como estas guías están hechas para usarse con la Raspberry Pi, necesitaba adaptarlas al ODROID-C2.

Raspberry Pi 3 Mediacenter + Hyperion Ambilight + NO soldering: https://goo.gl/q8q6PK Amblight project/guide - Hyperion - WS2801/ WS2812B / APA102: https://goo.gl/CEgT1U

Resulta que mi configuración está afectada por un error bastante molesto, el cual se describe aquí: https://goo.gl/HUwa2k

La reproducción de video empieza a ralentizarse transcurrido un periodo de tiempo arbitrario (entre 30-70 minutos en mi caso) mientras que el audio continúa reproduciéndose a una velocidad adecuada, lo que provoca que el audio y el video no estén sincronizados. Después de 30-60 segundos se produce una pequeña pausa y salto, el audio y el video vuelven a sincronizarse, hasta que vuelva a suceder a los 30-70 minutos.

En el foro de LibreElec aún no está resuelto este tema, ya que el problema está resultando bastante complicado de solucionar. Si alguien tiene un sistema en funcionamiento (ODROID-C2 con LE8/Kodi 17 con Hyperion) que no se vea afectado por este error, ¡Que no dude en contribuir con el archivo de configuración de Hyperion! Tengo pensado retocar la configuración de Hyperion para ver si se puede hacer algo, pero esto me puede llevar bastante tiempo

Hardware

  • ODROID-C2 mas carcasa y fuente de alimentación de Hardkernel, que me costó alrededor de 72€ cuando lo comprés en https://www.pollin.de el pasado año
  • Tarjeta MicroSD Kingston 16GB Clase 10, que cuesta alrededor de 8€ en eBay
  • Clon chino de la placa Arduino Uno R3 más carcasa y cable USB, que cuesta alrededor de 8,50€ en eBay
  • Tira LED RGB WS2812B de 3 pin, 30 LEDs por metro, 5m de rollo, que costó alrededor de 13.50€ en eBay
  • Fuente de alimentación 5V 10A. Tenía una por ahí, así que no me supuso ningún coste, pero puedes encontrar una por unos 10-20€ en eBay o Aliexpress
  • Clavija de alimentación DIN, que cuesta alrededor de 1,50€ en eBay
  • Cables conector JST macho y hembra de 3 pines, que cuestan aproximadamente 1,50€ en eBay 5 piezas
  • Conectores de 3 pines de 10 mm para el conjunto WS2812, que cuestan aproximadamente 2€ en eBay 5 piezas
  • Cables jumper macho Dupont, que cuestan aproximadamente 1€ en eBay 40 piezas
  • Tubos termo-contraíbles, que cuestan aproximadamente 1€ en eBay 70 piezas
  • Resistencia de 500 ohmios o resistencias de 2x1K ohmmios cableadas en paralelo
  • Cable HDMI
  • Soldador eléctrico para soldar los conectores y los cables

Software

  • Imagen LibreElec 8.2.1 MR para ODROID-C2 descargada desde https://libreelec.tv
  • Complemento Hyperion para Kodi del repositorio de LibreElec
  • Herramienta HyperCon para Hyperion (https://goo.gl/7F5fDc)
  • IDE Arduino (https://goo.gl/wqP28G)
  • Librería FastLED para Arduino (descargar ZIP - - https://github.com/FastLED/FastLED)
  • Esquema de control (script) para Arduino (https://pastebin.com/2L9ZBhYe)

 
#include "FastLED.h"

// How many leds in your strip?
#define NUM_LEDS 92

// For led chips like Neopixels, which have a data line, ground, and power, you just
// need to define DATA_PIN. For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
#define DATA_PIN 12
//#define CLOCK_PIN 13

#define COLOR_ORDER GRB

// Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data
uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i;

// Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
#define serialRate 115200

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() {
 // Uncomment/edit one of the following lines for your leds arrangement.
 // FastLED.addLeds<TM1803, DATA_PIN, RGB>(leds, NUM_LEDS);
 // FastLED.addLeds<TM1804, DATA_PIN, RGB>(leds, NUM_LEDS);
 // FastLED.addLeds<TM1809, DATA_PIN, RGB>(leds, NUM_LEDS);
 // FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
 // FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
 FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
 // FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
 // FastLED.addLeds<UCS1903, DATA_PIN, RGB>(leds, NUM_LEDS);
 // FastLED.addLeds<UCS1903B, DATA_PIN, RGB>(leds, NUM_LEDS);
 // FastLED.addLeds<GW6205, DATA_PIN, RGB>(leds, NUM_LEDS);
 // FastLED.addLeds<GW6205_400, DATA_PIN, RGB>(leds, NUM_LEDS);

 // FastLED.addLeds<WS2801, RGB>(leds, NUM_LEDS);
 // FastLED.addLeds<SM16716, RGB>(leds, NUM_LEDS);
 // FastLED.addLeds<LPD8806, RGB>(leds, NUM_LEDS);

 // FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
 // FastLED.addLeds<SM16716, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
 // FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);

 // initial RGB flash
 LEDS.showColor(CRGB(255, 0, 0));
 delay(500);
 LEDS.showColor(CRGB(0, 255, 0));
 delay(500);
 LEDS.showColor(CRGB(0, 0, 255));
 delay(500);
 LEDS.showColor(CRGB(0, 0, 0));

 Serial.begin(serialRate);
 Serial.print("Ada\n"); // Send "Magic Word" string to host
}

void loop() {
 // wait for first byte of Magic Word
 for(i = 0; i < sizeof prefix; ++i) {
 waitLoop: while (!Serial.available()) ;;
 // Check next byte in Magic Word
 if(prefix[i] == Serial.read()) continue;
 // otherwise, start over
 i = 0;
 goto waitLoop;
}

// Hi, Lo, Checksum

while (!Serial.available()) ;;
 hi=Serial.read();
 while (!Serial.available()) ;;
 lo=Serial.read();
 while (!Serial.available()) ;;
 chk=Serial.read();

// if checksum does not match go back to wait
 if (chk != (hi ^ lo ^ 0x55))
 {
  i=0;
  goto waitLoop;
 }

memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
// read the transmission data and set LED values
for (uint8_t i = 0; i < NUM_LEDS; i++) { byte r, g, b; while(!Serial.available()); r = Serial.read(); while(!Serial.available()); g = Serial.read(); while(!Serial.available()); b = Serial.read(); leds[i].r = r; leds[i].g = g; leds[i].b = b; } // shows new values FastLED.show(); }

Montaje de la tira LED

La tira LED que compré ya tenía un conector hembra JST de 3 pines integrado en el extremo de inicio, más dos cables adicionales (sin enchufe) para 5V y GND. Soldé los dos últimos cables a la toma de corriente DIN para poder alimentar los LED desde la fuente de alimentación. ¡Asegúrate de usar una clavija que sea compatible con tu fuente de alimentación!

Cogí un cable conector macho JST y soldé cables Dupont al extremo de los cables GND y DATA para poder conectarlos a los pines de la placa Arduino. El cable de 5V no se utiliza aquí, ya que no está conectado, de modo que se puede cortar y/o aislar. Soldé la resistencia de 500 ohmios entre el cable DATA y el cable Dupont para que las señales de control puedan atravesarlo. Todos los puntos de soldadura han sido asegurados con tubos termo-contraíbles.

Inicié HyperCon en mi ordenador y planifiqué la configuración y el diseño del LED en el televisor, asegurándome de medir las dimensiones de mi TV. Estudie otras opciones de configuración en el sitio de la Wiki de Hyperion y guardé la configuración LED en el archivo hyperion.config.json. Luego utilicé los números LED calculados para cortar la tira en piezas con el tamaño adecuado y utilicé los cables del conector de 3 pines para unirlos entre sí. Los cables del conector de 3 pines son necesarios para las esquinas del televisor, ya que la tira de LED por sí sola no se puede doblar para llegar a los 90 grados.

Ten en cuenta que estas tiras LED tienen una dirección. Solo el extremo inicial se puede usar para los controles de entrada y los distintos LED se direccionan uno después del otro. Busqué la marca "DI (Entrada de datos) en la tira, cerca de los LEDs. El otro extremo tiene marcado "DO (Data Out). Puedes usar Google para localizar las especificaciones WS2812b.

Mi experiencia me dice que los conectores de 3 pines no pueden sujetar la tira con demasiada fuerza, así que ten cuidado a la hora de montarla en la parte posterior de tu televisor. Si tiene experiencia con la soldadura de precisión, puede que sea mejor soldar los cables para conectar las partes de la tira en lugar de utilizar los conectores de 3 pines.

Instalé LibreElec en la tarjeta micro SD siguiendo las instrucciones de https://libreelec.tv, luego la monté el ODROID-C2 y configuré Kodi a mi gusto. Entre a Settings -> Services -> Control in Kodi interface, y habilité tanto “Allow remote control from applications on this system” como “Allow remote control from applications on other systems”. Instalé IDE Arduino en mi ordenador, luego extraje el archivo ZIP de la librería FastLed en una subcarpeta independiente bajo la carpeta \libraries. Cuando inicié IDE Arduino después, la librería FastLED aparecía disponible en el menú Sketch -> Available libraries.

Conecté la placa Arduino a mi ordenador con el cable USB. Copié el esquema en el IDE Arduino, fijé el número de LED de la tira en la fila n. ° 4 (tendrá este número de HyperCon) y el pin utilizado para el control de LED en la fila n. ° 9. Luego cargué el esquema en la placa Arduino, que solo tardó unos segundos.

Montaje

Utilicé adhesivo en la parte posterior de la tira LED para pegarlo a la parte posterior de mi televisor. Necesite algo de adhesivo adicional en algunas zonas para que se adhiriera con firmeza. Desconecté la placa Arduino de mi PC y la conecté a uno de los puertos USB del ODROID-C2. Conecté el jumper del cable Dupont soldado al cable GND de la tira al pin GND y el jumper del cable Dupont soldado al cable DATA de la tira al pin 12 del Arduino. Finalmente, conecté la fuente de alimentación a la clavija de potencia soldada al final de la tira.

Configuración del software

LibreElec cargó el módulo CH341 automáticamente al conectar la placa Arduino a USB, y apareció el dispositivo /dev/ttyUSB0. Sin embargo, esto podría ser diferente en tu caso Instalé el complemento Hyperion bajo la interfaz de Kodi, desde el repositorio de LibreElec. Abrí el archivo hypercon.config.json previamente guardado en mi ordenador y lo edité en 3 lugares: device, frame-grabber y effects. La actualización de la carpeta de efectos es necesario porque es diferente cuando Hyperion es instalado como complemento, en lugar de instalarlo con HyperCon.

Ten en cuenta que en otras guías se menciona usar 100000, 200000, etc. para la tasa de baudios. En mi caso, esto derivo en un repetitivo mensaje de error "Unable to open RS232 device (IO Exception (25): Inappropriate ioctl for device" en el registro log de Hyperion. Cambiar a una velocidad de 115200 baudios hizo que el problema se solucionara. ¡Asegúrate de observar el orden del color invertido "GRB"!

// DEVICE CONFIGURATION
"device" :
 {
 "name" : "MyHyperionConfig",
 "type" : "adalight",
 "output" : "/dev/ttyUSB0",
 "rate" : 115200,
 "delayAfterConnect" : 0,
 "colorOrder" : "grb"
 },

"amlgrabber" :
 {
 "width" : 64,
 "height" : 64,
 "frequency_Hz" : 20.0,
 "priority" : 880
 },
 "framegrabber" :
 {
 "width" : 64,
 "height" : 64,
 "frequency_Hz" : 10.0,
 "priority" : 890
 },

"effects" :
 {
 "paths" :
 [
 "/storage/.kodi/addons/service.hyperion/effects"
 ]
 },
Cargué mi archivo hyperion.config.json actualizado en la carpeta /storage/.kodi/userdata/addon_data/service.hyperion/ en LibreElec. Esta es la carpeta donde el complemento Hyperion busca el archivo de configuración. El recurso compartido UserData se puede utilizar para la carga si el servidor SMB está habilitado. Luego reinicié LibreElec y, fue entonces cuando el sistema Ambilight funcionó correctamente. Espero no haber olvidado nada y que a alguien le sea útil esta información. ¡Cualquier comentario o sugerencia para mejorar será bienvenida!

Para comentarios, preguntas y sugerencias, visita el post original del foro en https://forum.odroid.com/viewtopic.php?f=144&t=29334.

Be the first to comment

Leave a Reply