Standalone Ambilight-Clone mit Banana PI und Hyperion
Seit einiger Zeit bastel beschäftige ich mich schon mit einem Ambilight-Clone. Das von Phillips entwickelte System beleuchtet, abhängig vom Bild auf dem Fernseher, die Wand hinter dem Gerät, um den sichtbaren Bildschirm optisch zu vergrössern. Da ich keinen Phillips Fernseher habe und so einen Effekt gerne bei uns zu Hause sehen wollte, habe ich mir selber was gebastelt.
Der Anfang
Angefangen hat alles mit einer IKEA-Lichtleiste “Dioder“. Die vier LED-Stäbe habe ich hinter den Fernseher geklebt, die kabelgebundene Fernbedienung lag darunter und passend zum Fernsehprogramm konnte ich die Hintergrundfarbe wählen. “Grün” für Fußball, “Blau” für Science-Fiction usw.
Schon nicht schlecht, aber das musste auch besser und vor allem automatisch und ohne Aufstehen gehen…
Step 2: IKEA + Arduino + HTPC
Der nächste Schritt war also die Ansteuerung der IKEA-LED-Stäbe über einen Arduino, der wiederum an meinem HTPC (KleinPC mit Linux, VDR, XBMC am Fernseher) gesteuert wurde. Der Arduino schaltet die drei Farben (Rot, Grün, Blau) der LEDs über jeweils einen MOSfet. Auf dem Linux-PC habe ich eine kleine Webanwendung laufen gelassen, mit der man die gewünschte Farbe einstellen konnte und die Information wurde an den Arduino geleitet und der hat per PWM die Farben gesteuert.
Besser, aber immer noch nicht perfekt
Step 3: ALDI LED-Streifen + Arduino + HTPC
Dann gab es beim ALDI vor einiger Zeit einen 5 Meter LED-Streifen zu kaufen, bei der jeweils drei RGB-LEDs individuell gesteuert werden konnten. Der mitgelieferte Controller konnte damit schon Lauflichter und andere Effekte erzeugen. Also: kaufen, die IKEA-Lichtstäbe vom Fernseher runter und den neuen LED-Streifen einmal rund um der Fernseher befestigt. Der Fernseher ist ein 40 Zoll Gerät, d.h. ich brauche ca. 1 m + 50 cm + 1 m + 50cm = 3 Meter der LEDs. Leider sind die verwendeten Controll-ICs auf dem Teil nicht besonders leicht anzusteuern, da es nur eine Datenleitung, aber kein Taktsignal dafür gibt. Der Controller muss also die Informationen für die einzelnen LED-Gruppen im exakten Timing liefern. Zum Glück gibt es Lady Ada, und die hat bereits LEDs im Angebot, die die gleichen Controll-ICs enthalten. Im Internet gab es dann auch gleich noch die Anpassung für die Bibliothek für den Arduino und die ALDI-LEDs 🙂
Zur Steuerung der LEDs kam damit ebenfalls eine Software auf dem HTPC zur Anwendung: “Boblight” https://code.google.com/archive/p/boblight)
Boblight kann eine Vielzahl unterschiedlicher LED-Streifen ansteuern und bekommt seine Informationen dabei über die Abtastung des Bildschirms (über X11) , über ein V4L-Device oder per XBMC-Plugin geliefert. Nachdem ich das XBMC sowieso schon im Einsatz hatte, war das genau das Richtige.
Da das Timing sehr genau sein muss, kann weder der HTPC noch ein sonstiger Rechner mit einem Multitasking-Betriebssystem die Ansteuerung exakt genug machen, daher bleibt der Arduino zur Ansteuerung die einzige Möglichkeit. Wenn man andere LEDs mit einer Taktleitung nimmt, kann ein Raspberry PI oder Banana PI die Ansteuerung problemlos übernehmen!
Dieses Setup hat dann ziemlich lange sehr gut gearbeitet, ausser, dass ich beim Fernsehschauen kein Hintergrundlicht hatte. Der einzige Workaround hierfür ar, über den HTPC und VDR über XBMC und das XBMC-PVR-Plugin zu schauen, was aber zu kompliziert für die Familie war.
Step 4: ALDI LED-Leiste + Arduino + RaspberryPI + HTPC
Dann kam irgendwann der RaspberryPI ins Haus. Nachdem der XBMC da drauf zwar lief, aber nicht so performant war wie auf dem HTPC, war der Raspi im Prinzip “frei”, und ist damit zum Boblight-Server geworden. Ansonsten erstmal noch alles wie gehabt: HTPC liefert über Boblight-Plugin im XBMC die Infos an den Boblight-Server auf dem Raspi, der schickt die Infos über USB an den Arduino, der schaltet die LEDs.
Step 5: Amazon FireTV und Plex tauchen auf
Dann kam Amazon mit dem FireTV auf den Markt (bzw. mit der Ankündigung – ich bekomme meinen erst Mitte November 🙁 ) und damit fiel die Entscheidung, den HTPC in den Keller zu verbannen, um das Wohnzimmer etwas schöner zu bekommen. Also den Plex-Media-Server darauf installiert, alles was an Aufnahmen existiert darin importiert und Wiedergabe über Rechner, iPad usw. getestet. Schaut gut aus, Streaming über AirPlay an das AppleTV geht auch und sobald das FireTV da ist, kann das als Plex-Client die Aufgabe übernehmen.
Aber: was ist dann mit dem Ambilight? Ohne den HTPC bzw. XBMC funktioniert das ja alles nicht!
Step 6: Standalone-Lösung
Zwischenzeitlich habe ich im Internet Lösungen gefunden, die das ganze Thema ohne Plugins oder sonstiges Zeug realisieren:
Das habe ich dann entsprechend gemacht…
Hier die Materialliste:
- HDMI-Splitter
- HDMI -> AV Wandler
- Framegrabber
- aktiver USB-Hub
- HDMI-Kabel
- Scart-Adapter mit AV-Out
- Relais zur Umschaltung der Videoquellen
Und bereits vorhanden:
- Arduino zur LED-Ansteuerung
- LED-Streifen
- HAMA-Fernbedienung, bisher am HTPC
Und noch als Ersatz für den RaspberryPI und Boblight:
- Banana PI
- Netzteil
- SD-Karte
- Gehäuse
- Hyperion statt Boblight
Eine schöne Übersicht, wie sowas aufgebaut sein kann, findet man unter anderem hier:
- http://bite-in.com/?p=9
Im Prinzip schaut es also so aus:
- HDMI vom AV-Receiver
- -> HDMI-Splitter
- -> TV
- -> HDMI – AV- Wandler
- -> AV-Umschalt-Relais
- -> USB-Framegrabber
- -> Banana PI
- -> USB-Framegrabber
- -> AV-Umschalt-Relais
- -> HDMI-Splitter
Weiterhin wird das Video-Signal vom Scart-Anschluss ebenfalls auf das AV-Umschalt-Relais geleitet und dessen Ausgang an den Framegrabber angeschlossen. Alle Komponenten habe ich mit Klettband auf einer Platte befestigt und diese an der Rückseite des Fernsehers an den Befestigungen für eine Wandhalterung montiert.
Und so sieht das fertige Teil aus:
Schauen wir uns einige Teile im Detail an:
Banana PI
Der Banana PI ist, ähnlich dem Raspberry PI, ein Kleincomputer auf dem Linux und Android laufen kann. Er soll ein “besserer” Raspberry PI sein, ist allerdings nur bedingt kompatibel. Er braucht einen angepassten Kernel, damit laufen die SD-Karten aus dem Raspi nicht direkt. Vom Hersteller gibt es aber bereits eine Vielzahl von unterschiedlichen Distributionen. Ich habe mich für “Banaian” entschieden, da diese noch sehr junge Distribution auf Debian basiert und an den Banana PI angepasst ist. Ansonsten ist der Banana PI um einiges schneller als der Raspi: er hat eine Dual-Core CPU mit 1GHz, 1 GB Speicher und noch so nette Sachen wie einen SATA-Anschluss, einen IR-Empfänger und ein Mikrofon on Board.
Links:
Leider ist der Kernel nicht gerade der aktuellste (3.4.90), was im weiteren dann noch zu kleinen “Herausforderungen” führt… Aber dazu später mehr.
AV-Umschalt Relais
Nachdem der Fernseher über seinen Scart-Anschluß das laufende Tuner-Bild ausgibt, wollte ich das Signal dann auch für das Ambilight nutzen. Um nicht zwei Framegrabber verwenden zu müssen, habe ich mit einem Umschalt-Relais mit Schutzdiode und einem Transistor mit Widerstand einen elektronischen Umschalter gebaut. Dieser wird an eine der GPIO-Leitungen des Banana PI angeschlossen und somit kann ich über aktivieren / deaktivieren des GPIO-Pins das Relais – und damit die Videoquelle – umschalten. Der Aufbau ist natürlich nicht optimal, da FBAS-Signale irgendwo im 10 MHz-Bereich sind, aber da das Signal danach nur auf den Framegrabber geht und mir die Videoqualität dort total egal ist, ist das kein Problem.
In der /etc/rc.local wird das initialisiert:
echo 4 > /sys/class/gpio/export echo "out" > /sys/class/gpio/gpio4/direction echo 0 > /sys/class/gpio/gpio4/value und dann über "Keybinder" (siehe unten) umgeschaltet.
USB-Framegrabber
Als Framegrabber kommt ein ganz einfacher Easycap-Grabber zum Einsatz. Diese Geräte gibt es unter jeweils gleichem Namen in verschiedenen Bauarten – auch mit unterschiedlichen Chipsätzen darin. Eine Suche bei Amazon hat mir aber einen gebracht, von dem Anwender berichtet haben, dass er am Raspberry PI und unter Linux funktioniert.
Der Framegrabber verwendet den stk1160 Chipsatz, für den es in aktuellen Linux-Kerneln einen neuen Treiber gibt. Leider ist der erst in 3.7.X dazu gekommen. Mit meinem 3.4.90 muss ich also noch den “alten” easycap-Treiber verwenden. Das ist bisher kein echtes Problem, der neue Treiber soll nur etwas stabiler sein. Aber im wenn der Treiber geladen ist, dann läuft er auch…
Hyperion
Zur Steuerung der LEDs habe ich dann ausserdem noch von Boblight zu Hyperion gewechselt. Hyperion soll um einiges weniger Ressourcen verbrauchen und hat ausserdem nette Effekte eingebaut, die man über das Kommandozeilentool “hyperion-remote” aktivieren kann.
Links:
HAMA-Fernbedienung und Keybinder.pl
Der Banana PI hat eine Infrarot-Empfänger “on Board” und natürlich habe ich dann auch gleich probiert, ob ich den verwenden kann. Leider hat nur die TV-Fernbedienung da irgendwas ausgegeben und da sind ja alle Tasten belegt. Also habe ich die HAMA-Fernbedienung, die einen USB-Empfänger mitbringt, vom HTPC an den Banana PI angeschlossen.
Auf dem entsprechenden Input-Device kann ich dann die Tastendrücke auslesen. Leider liefert die Fernbedienung nicht einfach nur Tastendrücke, sondern diese auch noch mit SHIFT, CTRL, ALT, META und ähnlichen Zusatzkeys. Und natürlich: die reinene Keycodes kommen mehrfach vor 🙁
Also musste eine Lösung her, um die Tastendrücke in Befehle umzusetzen: mein eigenes “keybinder”-Programm. Nachdem noch immer Perl die Programmiersprache meiner Wahl für kleine Hacks ist, habe ich mit “evtest” die Signale analysiert und das ist dabei herausgekommen: Keybinder.pl
Keybinder.pl verwendet eine YAML-Konfigurationsdatei. Der relevante Abschnitt für die Relais-Steuerung ist:
--- below blue: - /usr/bin/hyperion-remote --clearall - echo 1 > /sys/class/gpio/gpio4/value below yellow: - /usr/bin/hyperion-remote --clearall - echo 0 > /sys/class/gpio/gpio4/value
Fazit von Step6
Im Moment schaut es so aus, als wäre der aktuelle Zustand perfekt! Der HTPC kann nun in den Keller und macht hier keinen Lärm mehr, das Ambilight funktioniert und der Banana PI kann noch für andere Dinge dienen, da er schnell genug ist.
Aber wie ich mich kenne, wird mir schon noch was neues einfallen… 😀