Ambilight mit dem RaspberryPi (2)

Ich habe dieses Jahr einen RaspberryPi 2 bekommen und habe mein Ambilight von meinem RaspberryPi (Model B) auf meinen RaspberryPi 2 aktualisiert. Dies möchte ich zum Anlass nehmen euch mit diesem Blog Eintrag mein Projekt vorzustellen.

Benötigt werden:

  • 1 RaspberryPi (2 oder Model B) ~ 41€ bei Amazon
  • 1 Netzteil für den RaspberryPi ~ 9 € bei Amazon
  • 1 MicroSD Karte für den RaspberryPi 2 bzw. SD-Karte für das Model B ~ ca. 8€ für 16GB bei Amazon
  • 3 50cm LED Streifen (für jede „freie“ Seite des Fernsehers einen, mir haben 50cm gereicht, ihr könnt aber auch längere benutzen) ~ 27€/Stück bei LEDs.de es gibt aber auch deutlich günstigere z.B. bei Amazon: 5m für 14€
  • 1 Netzteil für die LEDs (bei mir 12V, kommt auf die LED Streifen an, teilweise mitgeliefert)
  • 9 Widerstände mit 10kΩ ~ 0,1€/Stück
  • 9 Widerstände mit 180Ω (kommt auf die LED Streifen an) ~ 0,1€/Stück
  • 9 Transistoren vom Typ IRLIZ44N ~ 1€/Stück
  • 1 Erweiterungsplatine (auch Breakout Board genannt, optional 1 Steckboard) ~ 5€ bei Amazon
  • 1 Lötkolben mit Zubehör (vorhanden)
  • Jumper Kabel zur einfacheren Entwicklung 😉 ~ 8€ bei Amazon
  • 5-8 Stunden Zeit zum Basteln

Die Kleinteile würde ich gebündelt bei einem Händler im Internet oder beim Conrad um die Ecke abholen, sonst lohnt sich der Versand nicht …

Mein Projekt hat zunächst mit einem RaspberryPi Model B begonnen. Mittlerweile benutze ich aber einen RaspberryPi 2. Bei mir kommen drei 50 cm RGB LED Streifen mit jeweils fünf roten, grünen und blauen LEDs und einer Versorgungsspannung von 12V zum Einsatz. Einer ist über dem Fernseher platziert. Die anderen beiden an der Seite.

Um Filme abzuspielen bietet es sich an eine fertige Distribution für den RaspberryPi zu installieren, die Kodi oder ein anderes Mediencenter mit sich bringt. Ich habe mich für OSMC (https://osmc.tv/) entschieden (ich habe auch OpenELEC ausprobiert, jedoch können dort keine Pakete nachinstalliert werden) aber dazu später mehr. Zunächst geht es ans Basteln, danach kommt die Programmierung.

Basteln und Lö­ten

Ich habe mir ein Breakout Board für den RaspberryPi besorgt und dieses über den Steckverbinder der GPIO Ports mit meinem RaspberryPi verbunden. Ein Breakout Board ist eine Platine, auf der Widerstände und Kabel angelötet werden können. Teilweise sind diese bereits vorbestückt oder es sind schon Verbindungen zwischen einzelnen Stellen vorhanden, was einem teilweise erheblich den Lötaufwand sparen kann. GPIO steht für General Purpose Input Output; beim RaspberryPi stehen je nach Version mindestens 9 GPIO Ports zur Verfügung. Diese können mit verschiedenen Signalen beschaltet werden.

Während der Entwicklung bietet es sich an, das Breakout Board mit Male-Female Jumper Kabeln anzubinden. Der Vorteil ist, dass man mehr Platz hat und nicht direkt auf dem RaspberryPi arbeiten muss. Ich habe die Schaltung zunächst auf einem Steckboard realisiert und nachdem alles geklappt hat, auf das Breakout Board übertragen.

Meine LED Streifen verfügen über vier Anschlüsse. Drei für die Farben (Rot, Grün, Blau) und einen geteilten für die Versorgungsspannung (+). Am RaspberryPi werden daher pro Streifen drei Ports benötigt, sodass insgesamt zehn Ports (neun für die Farben der drei Streifen und einer für die Versorgungsspannung) benötigt werden.

Der Pi gibt eine Spannung von 3V – 5V aus. Meine LED Streifen benötigen jedoch 12V. Im Prinzip könnt ihr diese Anleitung aber auch für 24V LED Streifen benutzen. Da wir die LED Streifen offensichtlich nicht direkt an den Pi anschließen können brauchen wir, neben einem Netzteil zur Versorgung der LEDs, eine Schaltung, die die Signale des Pi auf die benötigte Spannung von 12V „transformiert“.

Dazu benutze ich MOSFETs vom Typ IRLIZ44N. Wie diese genau funktionieren kann man sich gut auf Wikipedia durchlesen/anschauen. Den Minus-Pol meines Netzteils verbinde ich mit dem Source-Pin der Transistoren. Der Gate-Pin wird jeweils mit einem GPIO Port des RaspberryPi verbunden. Damit der Transistor auch korrekt schaltet, wird zwischen dem Gate-Pin und dem GPIO Port noch ein 180 Ω Widerstand benötigt. Zuletzt wird der Drain-Pin mit jeweils einer Farbe eines LED-Streifen verbunden. Damit die LEDs nicht leuchten, während der RaspberryPi bootet, wird der Gate-Pin und der Source-Pin noch mit einem 10 kΩ Widerstand überbrückt.

Um die Potentiale des der RaspberryPi und des Netzteils auszugleichen (also beide den gleichen Ausgangspunkt für Spannungen haben), verbinde ich zusätzlich einen Ground-Pin des RaspberryPi mit dem Minus-Pol des Netzteils.

Ansteuerung

PWM

Damit die LED Streifen nicht nur in Rot, Grün, Blau und deren einfachen Mischfarben leuchten müssen die Farben mit unterschiedlicher Helligkeit ausgegeben werden. Um unterschiedliche Helligkeiten zu erreichen, können die einzelnen Kanäle mit unterschiedlich hohen Spannungen angesteuert werden. Dies ist jedoch relativ aufwendig zu realisieren. Daher wird meist ein pulsweitenmoduliertes Signal (PWM Signal) benutzt.

Ich möchte nicht auf die Details eingehen, dazu verweise ich lieber auf Wikipedia. Grundsätzlich funktioniert PWM so, dass die LED Streifen mit einem Rechtecksignal angesteuert werden. Wenn die Periode (also der Abstand zwischen zwei Rechtecken) kurz genug ist, dann blinkt die LED so schnell, dass es für das menschliche Auge so aussieht als wenn diese nur mit halber Helligkeit leuchtet. Damit lassen sich dann unterschiedliche Helligkeiten realisieren.

Realisierung

Die Ansteuerung der LED Streifen auf dem RaspberryPi ist momentan mit der Bibliothek WiringPi realisiert. Diese bietet unter anderem SoftPWMs an. Der RaspberryPi kann nativ/hardware unterstützt nur einen GPIO Pin (Pin 21) mit PWM Signalen versorgen. Die SoftPWMs in WiringPi sind über Threads und Sleep-Anweisungen realisiert. WiringPi setzt dann für bestimmte Zeitspannen den Pin auf HIGH und LOW, so dass eine Art PWM Signal entsteht, dass jedoch nicht besonders akkurat ist. Für das Ansteuern der LED Streifen reicht das jedoch aus.

Ambilight/Boblight

Ich habe einen Server in C++ geschrieben, der Befehle aus dem Netzwerk entgegen nimmt und in WiringPi Kommandos transformiert. Als ich mich ein bisschen über Ambilight mit dem RaspberryPi informiert habe, bin ich schnell auf Boblight gestoßen. Boblight besteht aus einem Server und einem Plugin für Kodi (ehemals XBMC, wird von OSMC verwendet), welches dem Server mitteilt wie die LEDs angesteuert werden sollen. Daher implementiert mein Server das Protokoll von Boblight.

Den Server findet ihr in meinem GitHub Repository. Über Ergänzungen und Anmerkungen freue ich mich sehr. Da ich persönlich die Netzwerk- und Threadprogrammierung unter Unix nicht ganz so attraktiv finde, habe ich boost benutzt um diese Teile zu realisieren.

Startet zunächst Putty und verbindet euch mit dem RaspberryPi.

Zunächst müssen einige Pakete nachinstalliert werden. Dazu gehören git, g++ und boost. Diese könnt ihr mit dem Befehl

installieren. Wenn ihr nicht besonders viel Platz auf dem Pi habt, könnt ihr auch nur die System und Thread Bibliotheken von boost installieren. Als nächstes wird WiringPi installiert:

Im Anschluss könnt ihr meinen Server kompilieren:

Falls ihr keine Fehlermeldungen bekommen habt, hat wahrscheinlich alles funktioniert. Zum Testen könnt ihr kurz das Kommando

ausführen. Falls ihr wieder keine Fehlermeldungen seht, könnt ihr das Programm mit der Tastenkombination [Strg]+[C] wieder beenden.

Als nächstes müssen wir boblight selbst installieren. Dazu könnt ihr folgende Kommandos verwenden (die Installationsanleitung des Plugins findet sich hier):

Im Anschluss müssen wir noch das Plugin für Kodi installieren:

  1. Settings öffnen
  2. Addons
  3. Install from Repository
  4. Kodi add-on repository
  5. Services
  6. XBMC Boblight
  7. Install

Wenn ihr nun wieder meinen Server startet, müssten eure LEDs einmal in jeder Grundfarbe (Rot, Blau, Grün) aufleuchten.

Damit der Server nicht immer von Hand gestartet werden muss, erstellen wir noch ein kleines Service Skript für systemd. Näheres dazu könnt ihr hier nachlesen.

Um das Skript zu erstellen führt einfach das folgende Kommando aus:

Dies öffnet den Texteditor nano und erstellt die richtige Datei. In diese könnt ihr nun das folgende Skript einfügen:

Nach einem beherzten

startet der RaspberryPi neu und wenn ihr alles richtig gemacht habt, seht ihr ab sofort eure Filme und Videos mit Ambilight J

Ausblick

Da auf dem RaspberryPi 2 auch Mono sehr gut läuft, werde ich demnächst noch versuchen den Server in C# umzusetzen. Zur Ansteuerung der LEDs gibt es zum einen WiringPi.net, aber auch raspberry-sharp-io (beide leider ohne SoftPWM Support).

Weiterhin gibt es eine nette kleine Erweiterungsplatine von Adafruit mit der man sich die meiste Lötarbeit ersparen kann: https://www.adafruit.com/products/1429. Dabei handelt es sich um einen LED Treiber, der über I2C angesprochen wird. Wenn ich mal wieder Zeit habe, werde ich eine Anleitung für die Portierung auf das neue Interface schreiben. Damit könnte wahrscheinlich auch Hyperion verwendet werden. Dies ist eine Alternative zu Boblight, die deutlich performanter sein soll.

Ich hoffe euch hat mein erster Artikel gefallen und ich konnte euch einige Anregungen für eure eigenen Projekte geben. Ich freue mich schon sehr auf eure Kommentare.

David Reher

David Reher

IT-Berater bei BROCKHAUS AG
David Reher ist IT-Berater bei der BROCKHAUS AG und ist besonders im Bereich Webentwicklung (Client & Server) engagiert. In seiner Freizeit beschäftigt er sich auch gerne mit kleineren Hardware-Spielereien vor allem im Bereich Heimkino und Audioverteilung.
David Reher
<< Vorheriger Beitrag
Nächster Beitrag >>

3 Gedanken zu „Ambilight mit dem RaspberryPi (2)“

  1. Hi,
    thanks for this one. This is exactly what i searched for.
    When kompiling your server i get the following error.
    system is a raspberry Pi 2 with OSMC

    osmc@osmc:~/boblight-server$ make all
    g++ -lwiringPi -lboost_system -lboost_thread main.o boblightServer.o ledController.o networkController.o -o boblight
    /usr/bin/ld: networkController.o: undefined reference to symbol ‚pthread_getspecific@@GLIBC_2.4‘
    //lib/arm-linux-gnueabihf/libpthread.so.0: error adding symbols: DSO missing from command line
    collect2: error: ld returned 1 exit status
    Makefile:11: recipe for target ‚boblight‘ failed
    make: *** [boblight] Error 1

    Can you help?

  2. Hi David,
    ich bin schon ein wenig weiter (packete nachinstalliert), scheitere aber immer noch am kompilieren deinses servers.

    osmc@osmc:~/boblight-server$ make all
    g++ -lwiringPi -lboost_system -lboost_thread main.o boblightServer.o ledController.o networkController.o -o boblight
    /usr/bin/ld: networkController.o: undefined reference to symbol ‚pthread_getspecific@@GLIBC_2.4‘
    //lib/arm-linux-gnueabihf/libpthread.so.0: error adding symbols: DSO missing from command line
    collect2: error: ld returned 1 exit status
    Makefile:12: recipe for target ‚boblight‘ failed
    make: *** [boblight] Error 1

    Kannst du helfen?
    Danke

    1. Hallo Stefan,

      ich habe einen Fehler im Makefile behoben. Wie schon in der Fehlermeldung zu erkennen, fehlte noch der Link zu pthread … Ich muss mal schauen, woran das jetzt genau liegt, eigentlich muss man das nicht mit linken …

      Wie auch immer. Nach einem git pull müsste alles klappen 😉

      Besten Gruß
      David

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.