xSnowHeadx / ambi-tv

a flexible ambilight clone for embedded linux
7 stars 2 forks source link

ambi-tv

Eine Weiterentwicklung von gkaindl's Framework für ein Ambilight mit einem Embedded-Linux-System (z.B. Raspberry), einem USB-Framegrabber und adressierbaren RGB-LED-Stripes

Hier ist eine Video-Demonstration des Standard-Modus. Ein Beispiel für die zusätzliche Audio-Funktion findet Ihr hier.

ambi-tv basiert auf der Idee, einen HDMI-Splitter und einen HDMI-zu-CVBS-Umsetzer für das parallele Erfassen des angezeigten Bildes und dessen Darstellung auf einem LED-Stripe zu verwenden. Das funktioniert mit jeder HDMI-Quelle ohne die Notwendigkeit, einen zusätzlichen Computer zu verwenden.

Die Software ist für eine möglichst einfache Erweiterung und Anpassung ausgelegt.

Mit einem lauffähig zu kaufenden Raspberry Pi ist es sehr leicht, ein eigenständiges Ambilight aufzubauen.

Unterschiede zum Original-ambi-tv

Verwendete GIT-Projekte

Neben dem Grundgerüst von Georg Kaindl wurde auch auf die Vorabeiten von Karl Stavestrand (Spektrum-Analyzer mit fftw3 und ALSA-Quelle) und Jeremy Garff (Ansteuerung der WS281x-Chips über PWM und DMA) zurückgegriffen.

Hardware Setup

Für den Aufbau des eigenständigen Ambilights werden folgende Komponenten benötigt:

Hardwareaufbau:

Hier die Pinbelegung des Raspberry:

Raspberry Pi Wiring

Wie oben schon angemerkt, muß bei Verwendung von WS281x-LED das 3,3V-Ausgangssignal des Raspberry mit einem Transistor oder einem Pegelwandlerschaltkreis auf 5V angehoben werden. Ob man den Wandler invertierend oder nichtinvertierend aufbaut ist unerheblich. Man muß die mögliche Invertierung aber später in der Konfigurationsdatei berücksichtigen.

Das HDMI-Signal wird von der zentralen Quelle an den HDMI-Splitter geführt und von dort auf den Fernseher und unseren HDMI/Composite-Umsetzer aufgeteilt. Audio- und Videoausgänge des Umsetzers werden mit den zugehörigen Eingängen des USB-Grabbers verbunden, welcher im Raspberry steckt.
Leider kann der Umsetzer nur Stereo-PCM-Signale in ein für den Audio-Grabber verständliches Signal wandeln. Kommt über HDMI ein DTS-Digitalsignal, kann der Grabber mit dem Audiosignal des Umsetzers nichts anfangen. Wer also DTS-Sound nutzen möchte, sollte den Digitalausgang des Fernsehers auf PCM-Modus einstellen, dieses Signal mit dem oben aufgelisteten PCM/Analog-Wandler in ein für den Grabber nutzbares Signal umwandeln und dieses Signal statt des Umsetzer-Ausgangs verwenden. Der Fernseher übernimmt dabei die DTS-Decodierung und stellt gleichzeitig ein Signal mit konstanter Amplitude zur Verfügung.

Gehäuseteile

Auf prusaprinters.org sind 3D-Modelle verfügbar, mit welchen Gehäuse und Innenleben der Wordclock gedruckt werden können.

Software Installation

Bevor ambi-tv verwendet werden kann, werden für den Audio-Spektrum-Analyzer noch einige Bibliotheken und Tools benötigt. Diese kann man sich durch Eingabe von 'sudo apt-get install git libfftw3-dev libasound2-dev alsa-utils' installieren.
Um zu prüfen, ob nach dem Anstecken des USB-Grabbers alle Treiber geladen worden sind, schaut man mit 'ls /dev | grep video' ob das Gerät "video0" vorhanden ist. Ob der Audiograbber-Treiber geladen wurde, sieht man mit 'arecord -l'. Hier sollte der usbtv-Treiber angezeigt werden:

Liste der Hardware-Geräte (CAPTURE)
Karte 0: usbtv [usbtv], Gerät 0: USBTV Audio [USBTV Audio Input]
    Sub-Geräte: 1/1
    Sub-Gerät #0: subdevice #0

Die Kartenummer "0" und Subgerätenummer "0" merken wir uns.

Wird ein SPI-LED-Streifen verwendet, muß sichergestellt werden, daß der SPI-Treiber geladen wird. Das läßt sich am einfachsten über "raspi-config" einstellen.

Nun clonen wir das ambi-tv-Repository mit 'git clone http://github.com/xSnowHeadx/ambi-tv.git ambi-tv' in das Nutzerverzeichnis (in der Regel "pi"). Mit 'cd ambi-tv' wechseln wir in das ambi-tv-Verzeichnis und bauen das Projekt mit 'make'. Die ausführbare Datei finden wir nun im Verzeichnis "bin". Zum Installieren mit Autostart führt man 'sudo make install' aus. Nun wird ambi-tv bei jedem Start des Raspberry automatisch mit gestartet.

Folgende Parameter akzeptiert ambi-tv beim Start:

Wurde ambi-tv von der Konsole aus gestartet, kann mit der Leertaste zwischen den einzelnen Programmen in der Reihenfolge durchgeschaltet werden, in welcher sie im Konfigurationsfile definiert wurden.
Mit der t-Taste kann man zwischen Pause und Programmlauf hin- und herschalten. Im Pause-Modus sind alle Komponenten deaktiviert.

Mit dem über die Kommandozeile aktiviertem Taster kann durch einmaliges Klicken zwischen Pause und Programmlauf gewechselt werden. Ein "Doppelklick" schaltet ähnlich der Leertaste zwischen den definierten Programmen um.

Im Repository liegt eine Beispiel-Konfigurationsdatei mit einer Zusammenstellung möglicher Programme. Die Parameter der Konfigurationsdatei werden im Folgenden erläutert.

Konfigurationsdatei

ambi-tv verwendet eine Konfigurationsdatei für die Definition und Parametrierung von Komponenten und Programmen. Es können sogenannte components (also Funktionen) erstellt und parametriert sowie programs (also Programme), welche eine Zusammenstellung von Eingangs-, Verarbeitungs- und Ausgabefunktionen darstellen, festgelegt werden.

Eine Komponente ist ein Teil des Datenflusses in ambi-tv. Es gibt Quellen (Video-Grabber, Audio-Grabber oder einfache Binärdatengeneratoren), Prozessoren (Verarbeitungskomponenten, welche die Quelldaten auswerten) und Senken (geben die bearbeiteten Daten an den LED-String weiter). Die gleiche Komponente kann beliebig oft bei feststehendem Komponenten-Namen unter verschiedenen Instanzen-Namen und mit jeweils unterschiedlichen Parametern angelegt werden. Eine Komponentendefinition (zwei Instanzen der gleichen Komponente mit unterschiedlichen Parametern) sieht so aus:

component_name {
    name            instance_nameA
    settingA        valueA
    settingB        valueB
}

component_name {
    name            instance_nameB
    settingA        valueC
    settingB        valueD
}

Ein Programm besteht aus einer Kombination einzelner Komponenteninstanzen (im Normalfall eine Quelle, ein Prozessor und eine Senke). Es können beliebig viele Programme erstellt werden. Eine Programmdefinition sieht so aus (das "&" Zeichen am Anfang des Programmnamens ist zwingend notwendig):

&program_name {
    activate        instance_name_source
    activate        instance_name_processor
    activate        instance_name_sink
    ...
}

Am Einfachsten sieht man die Vorgehensweise in der Beispiel-Konfigurationsdatei.

Verfügbare Komponenten

Im Moment unterstützt ambi-tv folgende Komponententypen mit ihren Einstellungen:

v4l2-grab-source: Der Video-Grabber mit video4linux -> mmap()-basierender Erfassung.

audio-grab-source: Der Audio-Grabber über das ALSA-Device des USB-Grabbers.

timer-source: Diese Quelle schiebt nur zyklisch eine Prozessorkomponente an ohne selbst Daten zu liefern. Diese müssen in der Prozessorkomponente generiert werden (Beispiel Mood-Light)

avg-color-processor: Berechnet den Farbmittelwert des gesamten Bildes und stellt alle LED auf diese Farbe ein. Das kann verwendet werden wenn die unmittelbare Übertragung der Randfarben auf die LED beim edge-color-processor zu unruhig sein sollt. Außer dem Namen hat diese Komponente keine weiteren Parameter.

edge-color-processor: Bildet die Farben der Bildränder auf die LED ab. Das ist der klassische Ambilight-Effekt.

mood-light-processor: Erzeugt auch ohne Eingangsdaten ein Mood-Light, indem der komplette HSL-Farbraum dargestellt und langsam durchgeschoben wird.

audio-processor: Verarbeitet die erfaßten Audio-Daten mittels FFT und wandelt sie in Farben um.

ledstripe-sink: Die eigentliche Ansteuerung der LED Stripes.

ambi-tv erweitern

Aufgrund der komponentenbasierten Struktur von ambi-tv gestaltet sich die Erstellung eigener Komponenten (Quellen, Prozessoren und Sinks) relativ einfach. Aus der Datei component.h, wird ersichtlich, wie man diese in die Verwaltung einfügen kann. Die Komponenten selbst kommen nach src/components.

Die Grundidee dabei ist, daß jede Komponente nur eine bestimmte Anzahl Funktionen bedienen muß, welche in einer immer gleichen Struktur mi Funktionspointern zusammengefaßt werden. Ihre Konfiguration erfolgt über den Kommandozeilenmechanismus int argc, char** argv welcher es ermöglich, die komfortable Funktion getopt_long für die Parameterauswertung zu verwenden.

Neu geschriebene Komponenten müssen in registrations.c durch Hinzufügen zu Liste bekanntgemacht werden.

Web-Interface

Die Steuerung von ambi-tv über Webinterface funktioniert von jedem beliebigen Gerät mit Web-Client (Browser, wget, curl o.Ä.) aus. Hier eine Beschreibung der Befehle und Parameter für das Webinterface (statt "raspi" die IP des Raspi, statt "port" den beim Start in der Kommandozeile als optionalen Parameter angegebenen Port [default 16384] und statt "color" die gewünschten Farben "red", "green" oder "blue" verwenden. "n" wird durch die gewünschten Ziffern ersetzt. Die Kombination mehrerer Parameter in einem Aufruf wird noch nicht unterstützt). Um einen Wert abzufragen statt ihn zu setzen ist bei dem jeweiligen Aufruf hinter dem "=" nichts einzutragen. In diesem Fall antwortet ambi-tv statt mit "OK" oder "ERR" mit dem für diesen Parameter eingestellten Wert. "http://raspi:port?brightness=" würde dann zum Beispiel bei einer eingestellten Gesamthelligkeit von 90% mit "90" beantwortet werden.

Konfigurationsdatei auslesen:
http://raspi:port?getconfig

Aus dieser Datei kann man Anzahl, Anordnung und Namen der implementierten Programme sowie die nach dem Start eingestellten Werte für Helligkeit, Intensität und Gammawert der Farben auslesen. Auch die Einstellungen der Audiokomponenten sind so ermittelbar.

Modus setzen:
http://raspi:port?mode=n

Welche Modusnummer welches Programm aufruft und wieviele Modi es gibt, hängt von den Einträgen in der Config-Datei ab. Alle Werte, die größer als der maximal mögliche Modus sind schalten das Ambilight aus. Die Zählung beginnt dabei bei "0" für das erste Programm.

Gesamthelligkeit setzen (0...100%):
http://raspi:port?brightness=nnn

Intensität einer Farbe setzen (0...100%):
http://raspi:port?intensity-color=nnn

Gamma-Wert einer Farbe setzen (0.00 ... 9.99):
http://raspi:port?gamma-color=n.nn

Nicht vergessen: statt "color" die Farben "red", "green" oder "blue" einsetzen.

Audioempfindlichkeit setzen (0...1000%):
http://raspi:port?sensitivity=nnn

Spektrum-Filter setzen (0 - 7):
http://raspi:port?smoothing=n

Linear-Modus setzen (0, 1):
http://raspi:port?linear=n

Tools

Für Linux-Receiver mit Neutrino und installierten Plugins FlexMenü, Input und MessageBox liegt in "tools/" das Script "ambi-tv-config", mit welchem man ambi-tv vom Receiver aus menügesteuert kontrollieren und parametrieren kann. Einige Screenshots der Menüs, welche einige Möglichkeiten der Steuerung demonstrieren sind hier zusammengestellt. Receiver mit Neutrino und LUA-Unterstützung können das ebenfalls in "tools/" liegende LUA-Script verwenden.