Ambilight DIY

ambislide

Dieses Ambient Light, faszinierendes “Spielzeug”. Da man bei fertigen Lösungen meist an einen bestimmten Hersteller gebunden ist, musste eigenst gebaute Lösung her. Die vielen Videos auf Youtube sind schon beeindruckend. Aber die Komplexität des Aufbaus hat mich bis dato abgeschreckt.

Irgendwann habe ich es nicht ausgehalten ))

Mit RGB-Led’s habe ich ja schon experemntiert HIER. Dann bin ich auf ein interessantes Produkt im Netz gestossen: WS2812. Es ist eine LED mit integriertem WS2811 Kontroller.

Nach einiger Recherche fand ich heraus, daß es kein Hexenwerk ist daraus Ambilight zu bauen. Alles was benötigt wird sind Arduino (ober Clone, Hauptsache mit Atmega328 aufwärts), vieeeeele der besagten LED’s und viel Zeit.

Vorab muss bedacht werden: die Konstruktion funktioniert nur(!) in Verbindung mit einem Player auf PC-Basis.

Also lesgelegt:

Einen Relativ primitiven Schaltplan auf eine 10x16cm Platine geätzt. Näheres findet man im Datenblatt der LED. 90x LED und genauso viele Kondensatoren drauf gelötet und schon ist die ganze schaltung fertig:

al0001al0002al0003

 

Sofort alles an Arduino angeschlossen und ein Sketch von FUNKBOXING zum Testen drauf und siehe da, es funktioniert!:

 

al0004

 

Jetzt die eine Platine in 90 kleinere schneiden und auf Profile befestigen:

al0005al0006al0007al0008al0009

 

Und so schaut es aus, wenn man alle LED’s auf dem Boden ausgelegt testet:

 

Alles hinter den Fernseher montiert und los gehts mit Konfiguration.

Auf dem Arduino wird dieser Sketch  installiert:

 

#include <FastSPI_LED.h>

#define NUM_LEDS 90

struct CRGB { unsigned char g; unsigned char r; unsigned char b; };
struct CRGB *leds;

#define PIN 4
// specified under `rate` in the `[device]` section of /etc/boblight.conf
#define serialRate 115200

// boblightd sends a prefix (defined in /etc/boblight.conf) before sending the pixel data
uint8_t prefix[] = {0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA};

void setup()
{
  FastSPI_LED.setLeds(NUM_LEDS);
  FastSPI_LED.setChipset(CFastSPI_LED::SPI_WS2811);
  
  FastSPI_LED.setPin(PIN);
  
  FastSPI_LED.init();
  FastSPI_LED.start();

  leds = (struct CRGB*)FastSPI_LED.getRGBData(); 
  
  Serial.begin(serialRate);
}

void loop() { 
  // wait until we see the prefix
  for(byte i = 0; i < sizeof prefix; ++i) {
    waitLoop: while (!Serial.available()) ;;
    // look for the next byte in the sequence if we see the one we want
    if(prefix[i] == Serial.read()) continue;
    // otherwise, start over
    i = 0;
    goto waitLoop;
  }
  memset(leds, 0, NUM_LEDS * 3);
  // read the transmitted data
  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;
  }
  FastSPI_LED.show();
}

Als Player habe ich einen Kleinen HTPC auf Basis von OpenELEC. Vorteil dabei ist, daß die benötigten Extras einfach als Plugins installiert werden können und zwar aus der Entwickler eigener Repository.

Benötigt werden Boblight daemon und dessen Plugin für XBMC.

Hier ist die Config für Boblight mit der Anordnung 15x30x15x30x LEDs : boblight.conf

Und so sieht es aus, wenn es im Betrieb ist:

Hinterlasse eine Nachricht


*

Du kannst folgende HTML Tags nutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>