Ambilight in Hardware

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche


von Martin Antoni

Einleitung

Dieses Projekt ist ein Nachbau des bekannten AmbiLights von Philips. Ambilight steht für Umgebungslicht und soll den Bildschirm optisch vergrößern, indem es die Bildfarben an die Wand projeziert. Mit Hilfe eines kleinen Mikrocontrollers habe ich die Bildinhalte ausgewertet und per PWM an RGB-LEDs geschickt.

Features

  • günstiger MC ATMega48
  • kein Computer notwendig
  • 8*8 Matrix Bildauswertung
  • 128 Farbstufen (noch erweiterbar)

Hintergrund

Im Internet habe ich schon einige Varianten gefunden, welche z. B. mit einer Software den Bildinhalt auswerten und dann an einen Mikrocontroller mit RGB-LED schicken. Dabei ist das Problem der Verzögerung und man braucht einen Computer zum Auswerten. Bei diesem Projekt kann direkt ein S-Video-Signal oder ein FBAS-Signal (siehe Ausblick) angeschlossen werden.

Grundlagen

FBAS

Das FBAS-Signal setzt sich aus dem Schwarz-Weiß-Signal (BAS) und dem Farbsignal zusammen. Das Farbsignal ist auf dem Schwarz-Weiß-Signal aufmoduliert.

Ein Bild ist in 625 Zeilen aufgeteilt, jede Zeile ist 64µs lang. Die Übertragung geschieht in Halbbildern. Zuerst werden die ungeraden Zeilen(1, 3, 5, 7, ...) übertragen, im Anschluss kommen die geraden Zeilen (2, 4, 6, ...). Zusätzlich zu den Bildzeilen sind noch Synchronsignal im BAS-Signal moduliert. Eine genaue Beschreibung lässt sich auf folgenden Seiten finden:

Wikipedia Fernsehsignal

Fernsehtechnik

Das Farbsignal kann man unterteilen in Farbart und Farbsättigung. Diese beiden Informationen sind Quadraturamplitudenmoduliert. In der Phase steckt die Farbart und in der Amplitude die Farbsättigung. Dieses modulierte Signal ist bei einer Frequenz von 4,433MHz auf das BAS-Signal moduliert. Mit einem Tiefpassfilter lässt sich das BAS-Signal herausfiltern, mit einem Hoch- oder Bandpass lässt sich das Farbsignal herausfiltern.

YUV

YUV ist ein Farbraum, mit einem Helligkeitssignal (Y) und zwei Farbsignalen (U + V). Dieser wird bei FBAS verwendet, das Y-Signal wird als BAS-Signal übertragen und die U- und V-Signale werden QAM auf das BAS-Signal moduliert als FBAS.

YUV auf Wikipedia

Hardware

Die Hardware kann in logische Blöcke aufgeteilt werden.

  • Integrator
  • Demodulator
  • Auswertung
  • Farbhilfsträger

Integrator

Ich habe das Bild in 64 Felder unterteilt, sozusagen eine 8*8-Matrix, für jedes Feld steht der RGB-Wert zur Verfügung. Damit können Lichter an verschiedenen Positionen hinter dem Fernseher angesteuert werden. Es müssen nur die richtigen Felder ausgewertet werden. Z.B. Feld 0 - 7 für die obere Bildkante.

Jede Zeile ist in 8 Felder unterteilt. Ich integriere jeweils über 1/8 der Zeile, der Endwert wird dann mit einer Sample-&-Hold-Schaltung so lange gehalten, bis der AD-Wandler fertig ist. In der nächsten Zeile wird dann das nächste Achtel integriert. Nach 8 Zeilen habe ich somit eine komplette Zeile analysiert.

Integrator.png

Insgesamt werden 512 Zeilen pro Bild analysiert, 8 Zeilen braucht man um eine komplette Zeile zu analysieren, das macht dann 64 wirkliche Bildzeilen. Da eine 8*8-Matrix verwendet wird, addiere ich immer 8 Zeilen. Jedes Feld besteht aus 8 Bildzeilenabschnitten aufaddiert.

Für die Integratorschaltung verwende ich eine abgewandelte Negativ-Impedanz-Schaltung. Diese, mit einem RC-Glied voran, bildet einen nichtinvertierdenden Integrator.

Ich verwende 3 Integratoren, für das Helligkeitssignal Y, das U- und das V-Signal.

Der Eingang jedes Integrators ist mit einem Mosfet (BS170) gegen Masse versehen. Wenn dieser Mosfet einschaltet, ist der Eingang auf Masse gelegt und somit wird eine Spannung von 0V integriert. 0 Integriert ergibt 0, somit ist das eine Sample-&-Hold-Schaltung.

Demodulator

Um aus dem Quadraturamplitudenmodulierten Signal wieder das U- und das V-Signal zuerhalten, verwende ich einen Produkt-Detektor. Das Hauptelement ist ein Balanced Modulator (MC1496). Im Datenblatt ist auf Seite 10 ist die Schaltung zu sehen. Ich habe die Schaltung übernommen und hab die Werte der Bauelement angepasst. An den Ausgang habe ich einen Differenzverstärker mit einem Verstärkungsfaktor 2 und einer Offsetspanung von 2,5V gebaut.

Für das U-Signal brauche ich 0° Phasenverschiebung vom Referenzoszillator und für das V-Signal brauche ich 90° Phasenverschiebung. Beide Sinussignale kommen vom Referenzoszillator (siehe Farbhilfsträger).

Die Ausgänge der Modulatoren gehen an die Eingänge der Integratoren.

Auswertung

Das Herz der Schaltung ist der ATMega48. An PORTC hängen die ADC-Ports.

  • PC0 - U-Integrierer
  • PC1 - V-Integrierer
  • PC2 - Y-Integrierer
  • PC3 - Sample-&-Hold U
  • PC4 - Sample-&-Hold V
  • PC5 - Sample-&-Hold Y

Im Kapitel Software ist beschrieben, wie die Ports angesteuert werden müssen, um die Signale zu integrieren.

Farbhilfsträger

Für eine korrekte Demodulation des Quadratursignales muss ein Referenzsignal in korrekter Phase und Frequenz zur Verfügung stehen.

Der Farbhilfsträger wird von einem Quarzoszillator erzeugt, welcher über eine PLL an die Farbfrequenz des Fernsehsignales angepasst wird.

Der Oszillator ist ein Colpitts-Quarzoszillator. Um den Oszillator abzustimmen, wird normalerweise eine Kapazitätsdiode verwendet. In meiner Schaltung verwende ich jedoch eine 1N4001. Diese hat eine geringere Kapazitätsänderung, reicht aber völlig aus. Je nach Sperrspannung verändert sich die Diffusionskapazität. Damit wird der Quarz gezogen.

Der Abgleich findet mit dem Burst statt. Der Burst ist ein Paket von Sinusschwingungen am Anfang (fast) jeder Zeile. Die Phase des Burst wird bei jeder Zeile um 90° hin- und hergeschaltet. Somit verwende ich nur jeden zweiten Burst, um den Referenzoszillator abzustimmen.

Die Ausgangsspannung des Colpitts-Oszillators ist mit Oberwellen übersäht. Um eine reine Sinusschwingung zu erzeugen, habe ich ein LC-Tiefpassfilter mit eingebaut.

Wie schon im Kapitel Demodulator erwähnt, braucht man zwei um 90° phasenverschobene Signale. Ich nutze den Fakt, dass der Burst immer um 45° phasenverschoben ist. Ein zweites Tiefpassfilter erzeugt nochmal 45° Phasenverschiebung, somit habe ich 90°. Für die 0° Phasenverschiebung habe ich ein Hochpassfilter eingebaut. Dieses Filter erzeugt -45° Phasenverschiebung. Damit werden die 45° des Bursts kompensiert. Am Ausgang kommt jeweils ein Emitterfolger, um das Tief- bzw. Hochpassfilter nicht zu belasten.

Dieses Bild zeigt die um 45° verschobenden Sinen.

Oszillator.png

Software

Die Software ist komplett in Assembler geschrieben. Nur so habe ich die komplette Kontrolle über das Timing.

Die Hauptaufgabe wird in Interrupts abgearbeitet, welche durch Timer ausglöst werden. Die Berechnung der RGB-Signale erfolgt in der Main Loop.

H-Sync und V-Sync

Frame odd.png Frame even.png

Die beiden Bilder zeigen die Sync-Signale des BAS-Signales bei Zeile 1 und Zeile 313. Bei Zeile 1 fängt ein Even Frame an, bei Zeile 313 fängt ein Odd Frame an.

Um die Sync-Signale auszuwerten ist am Pin PD.2 der Komparator angeschlossen, welcher ein High-Signal erzeugt, sobald das BAS-Signal unter 0,1V geht. Am Pin PD.2 ist außerdem der Pullup eingebaute Pullup eingeschaltet, um sich einen externen Widerstand zu sparen.

Der externe Interrupt ist auf steigende Flanke eingestellt. Dann wird der Timer2 im CTC-Modus gestartet. Überlaufzeit beträgt 24µs. In den Bildern erkennt man die Überläufe des Timers 2. Bei jedem Überlauf wird geschaut, ob ein V-Sync Signal vorliegt. Wenn beim ersten Überlauf der Syncwert gleich dem Syncwert des zweiten Überlaufes ist, beginnt ein Odd Frame (Bild links). Bei unterschiedlichen Syncwerten beginnt ein Even Frame (Bild rechts). Die Aufgabe des Timers 2 ist nur das Sync-Signal zu extrahieren und die aktuelle Zeilennummer zu bestimmen.

Messung der Helligkeits- und Farbsignale

Der Timer1 ist für den Burst-Gate-Impuls und für die Integration über die Zeile zuständig. Wenn ein H-Sync-Impuls (ext. Int0) kommt, wird der Timer1 gestartet. Beim ersten Überlauf wird der Burst-Gate-Impuls generiert. Beim zweiten mal Überlaufen wird die Integration gestartet und beim dritten Überlaufen wird die Integration gestoppt und die Sample-&-Hold-Schaltungen alle gleichzeitig gestartet. Anschließend wird der AD-Wandler gestartet, welcher nacheinnander alle 3 Signale wandelt. Die Wandlung von allen 3 Signalen dauert ca. 33µs.

Integrate.png

Dieses Bild zeigt 4 Linien mit dem BAS-Signal (blau). Das pinke Signal ist die Integration mit Sample & Hold. Man erkennt, dass bei hellerem Bild (höhere blaue Linie) der Endwert der Integration höher ist. Außerdem erkennt man gut, dass bei der nächsten Linie ein Achtel weiter hinten integriert wird. Die Länge der S-&-H-Phase ist die AD-Wandlung, ca. 11µs pro Wandlung.

Um eine Messung zu starten, setze ich das DDRC-Register auf Ausgang, damit wird der Integrator-Kondensator entladen und die Schaltung auf Null gesetzt. Dann wird für 1/8 der Zeit integriert, indem das DDRC-Register auf Eingang und die Sample-&-Hold-Schaltung auf aus gesetzt wird.


Berechnung der RGB-Werte

In Zeile 10 des Bildes werden die Y-, U- und V-Matrix auf Null gesetzt. Bis zur Zeile 620 werden alle Integrationswerte gespeichert und aufaddiert. Bei Zeile 620 beginnt nun die Berechnung.

Der Y-Wert wird auf 127 normiert, somit hat er einen Wertebereich von 0-127. Das geschieht mit der Multiplikation vom Matrixwert mit 0,1875. Der Wert wurde durch ausprobieren herausgefunden. Die Multiplikation wird mit fractional numbers durchgeführt. Die Normierung ist nötig, da mit Vorzeichen gerechnet wird und höhere Zahlen dann negativ wären.

Anschließend wird der U-Wert normiert und mit 0,25 multipliziert. Dieser Wert wurde auch durch ausprobieren herausgefunden. Nun wird der U-Wert und der Y-Wert addiert und das Blausignal ist fertig.

Das Rotsignal wird ähnlich berechnet, nur dass die V-Matrix verwendet wird und der Multiplikant ist 0,22. Auch hier wird der V-Wert und der Y-Wert addiert und man erhält das Rotsignal.

Das Grünsignal muss mit Y-, U- und V-Signal berechnet werden. Die U- und V-Signale werden wieder normiert und diesmal von Helligkeitssignal Y abgezogen. Damit erhält man das Grünsignal. Der Multiplikant für U ist 0,047 und für V ist er 0,078.

Ausblick

Die Schaltung funkioniert gut. Es gibt aber noch einige Verbesserungsmöglichkeiten.

Die Kondensatoren bei den Integratoren sind zu klein, damit wird das Signal verfälscht, sobald der Mega48 seine interne S-&-H-Schaltung aktiviert. Je nachdem, ob der interne Kondensator voller oder leerer als der vom Integrator, gibt es Ausgleichvorgänge, welche nicht unerheblich sind. Am besten wäre eine 10-50 höhere Kapazität beim Integrator. Dann müssten die Widerstände noch angepasst werden.

Die PLL-Schaltung schwingt etwas, das Tiefpassfilter müsste noch optimiert werden.

Zur Zeit verwende ich Soft-PWM, da ich nur noch einen Timer übrig habe, das heißt nur 2 PWM-Kanäle. Besser wäre es, einen größeren Mega zu nehmen oder externe PWM-Bausteine zu verwenden.

Die Schaltung lässt sich nur mit einem S-Video mit getrennten Farb- und Helligkeitsignal betreiben. Wenn ein FBAS-Signal angeschlossen werden soll, müssen noch ein Tiefpass und ein Hochpass eingebaut werden.

Der Burst-Detektor arbeitet noch nicht zuverlässig, da ich nur den internen Pullup-Widerstand verwendet habe. In der nächsten Version muss ein externer Widerstand hin und das Poti kann durch ein Festwiderstand ersetzt werden.

Zur Zeit gebe ich nur ein Feld an die LEDs aus. Man müsste noch über mehrere Felder mitteln, dann würde die LEDs nicht so stark reagieren auf Bildänderungen.

Downloads