Ambi-Light 2: 16bit PWM, 5 RGB-Kanäle

9. Software

In diesem Kapitel wird die Software-Ausstattung beschrieben. Bitte beachtet, dass die Firmware unter der Creative Commons Lizenz by-nc-sa steht. Ihr dürft die Daten nicht kommerziell verwenden und müßt den Urheber angeben. Eine Weitergabe zu den gleichen Bedingungen ist gestattet.

9.1 PC-Komponente

Am PC benötigen wir, wie bisher auch, einen Prozess, die die Farben aus dem Bildschirm ausliest und sie in einen seriellen Datenstrom verwandelt. Nachdem Boblight (ursprüngliche Seite, Google Code) hier sehr gute Dienste leistet, optimal unter Windows XP läuft und auch Standby/Resume überlebt, hat sich hier wenig getan. Wir müssen nur in der Konfiguration umstellen, dass wir jetzt 15 RGB-Kanäle statt drei haben. Hier noch einmal die Konfigurationsdatei.

9.2 MCU Firmware

Fast schon beschämend ist die Simplizität der Firmware. Mußte in der Soft-PWM-Variante noch jeder Taktzyklus gezählt werden, so können wir uns hier sehr entspannt zurücklehnen und einfach Bytes zwischen Hardware-Modulen hin- und herschieben. Nachdem es nicht viel Code ist, habe ich ihn hier kommentiert, wo notwendig.

Kurz zur Funktionsweise: Nach der Initialisierung der MCU wartet die USART-ISR auf ein ankommendes Byte. Je nach Jumper-Einstellung wird dann die entsprechende Zahl an Kanälen eingelesen, gamma-korrigiert und beim letzten Byte in die gepufferten PWM-Timer-Register übernommen.

Mittels der Hauptschleife habe ich einen Software-Timer realisiert, der eine Millisekunde nach dem letzten Byte den Kanalindex zurücksetzt. Zur Synchronisation wird also die Pause zwischen den Frames benutzt, welche bei 50 Hz ~20ms lang ist. Die Übertragung von 45 Bytes dauert knapp 8ms, damit haben wir also genug Zeit.

Mit dem Define-Statement kann schnell von einem USART zu einem noch freien auf Port C umgeschaltet werden. Ich hatte meinen auf Port D getoastet, nachdem ich beim Messen des USART-Signals am Stecker oben mit der Oszi-Spitze an 12V und das MCU_RX-Signal gekommen bin. Sowohl AVR-USART wie auch MAX3232 haben das nicht überlebt.

Ihr könnt mit dem Oszi an PORTA.3 und 4 Debug-Signale abnehmen: Das eine markiert den Reset des Index-Counters, das andere Beginn und Ende des eingestellten Frames, sollte also bei z.B. Byte 0 angehen und Byte 14 wieder auf 0 fallen.

Wie gesagt, beschämend simpel.

12 Kommentare zu “Ambi-Light 2: 16bit PWM, 5 RGB-Kanäle”

1.   Kommentar von Herman Oving
Erstellt am 22. März 2010 um 12:26 Uhr.

Hallo. Klasse gemacht. Wir überlegen ob wir die Daten nicht per PWM rausschicken, sondern als DMX. Der dmx receiver macht dann den PWM Teil, zB eine PAR oder moving head oder LED rgb light.
Ein Atmel mit dmx zu versehen ist nicht viel arbeit. Jedoch erst mal in dein Code einsteigen. Theoretisch brauche ich nur einen hex Wert zwischen 0 und 255 pro r,g oder b. Also 12 Kanäle( 4 * rgb) Mal sehen wo ich den am besten abgreife. Leider ist mein c nicht besonders gut. Bislang verwende ich nur assembler. Den PWM Teil werde ich dann weg lassen. Noch habe ich dein Code noch nicht mal detailliert angeschaut.
Vielen Dank und mal sehen ob das Projekt was wird.
Fabian & Herman Oving

2.   Kommentar von McSeven
Erstellt am 22. März 2010 um 14:59 Uhr.

Hi, Danke. Ich hab nur nicht genau verstanden, was ihr machen wollt? Soll es ein Seriell-zu-DMX-Konverter werden? Da schaut mal unter http://www.mikrocontroller.net, da gibt’s einiges zum Thema. Ziel dieses Projektes sollte ja genau die PWM-Ausgabe sein…

3.   Kommentar von hurra
Erstellt am 27. März 2010 um 15:12 Uhr.

Gibts den kompletten Quellcode auch nochmal zum Runterladen?

Danke

4.   Kommentar von McSeven
Erstellt am 27. März 2010 um 18:33 Uhr.

Hi, das versteh ich inhaltlich nicht. Auf Seite drei hast Du den gesamten Quelltext der Firmware. Mehr ist’s nicht. Und für die Sourcen von Boblight mußt Du auf seiner Seite schauen…

5.   Kommentar von hurra
Erstellt am 28. März 2010 um 13:39 Uhr.

c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avrxmega2/crtx16a4.o:(.init9+0x0): undefined reference to `main‘

Was mache ich falsch?

6.   Kommentar von McSeven
Erstellt am 05. April 2010 um 12:42 Uhr.

alles klar, es war ein dummer Fehler beim Kopieren und Einfügen, ich habe die neueste und vollständige Version eingebaut. Sollte funktionieren… Danke für den Hinweis.

7.   Kommentar von hurra
Erstellt am 03. Mai 2010 um 16:39 Uhr.

Hallo nochmal.

Ich konnte das Projekt erfolgreich nachbauen! Funktioniert super.

Die Schaltung hat aber imho noch ein Problem: Die Sende- und Empfangsleitung zwischen MAX und dem COM-Anschluß sind gekreuzt.
Darum wird im aktuellen Schaltplan ein Nullmodemkabel zwischen PC und Platine benötigt. Bei der Verwendung eines USB-Serial-Adapters muss das gekreuzte Nullmodemkabel zusätzlich noch eingefügt werden.

Ich würde die Kreuzung auf der Platine entfernen und Stattdessen eine normales Modemkabel verwenden (siehe hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART)

Bei mir funktioniert das ganze mit dem USB-Serial-Wandler problemlos

Danke!

8.   Kommentar von McSeven
Erstellt am 03. Mai 2010 um 19:22 Uhr.

Sehr schön, freut mich, wenn es klappt. Wegen des UART haste Recht. Hintergrund ist, dass ich noch ein paar dieser Kabel mit 5m Länge daheim liegen hatte und dafür das Gerät entworfen habe. Es ist so aber tatsächlich keine saubere Umsetzung. Danke für den Hinweis.

9.   Kommentar von hurra
Erstellt am 04. Mai 2010 um 00:20 Uhr.

Das einzige, was mir negativ auffällt ist die große Verzögerung. Gerade beim Filmen mit schnellen Farbwechseln ist dies stark zu bemerken. Es sind vielleicht 0.4 Sekunden. Konntes du dieses Delay auch feststellen? Woran liegt das? An der boblight-Software (1.3)? Gibt’s Abhilfe?

10.   Kommentar von McSeven
Erstellt am 04. Mai 2010 um 09:22 Uhr.

Hm, das kann imo an mehreren Dingen liegen:
a) USB2Seriell macht Ärger -> mit reiner HW-Schnittstelle testen.
b) Parameter „proportional“ in der boblight.conf steuert die Farbübergänge. Je größer, desto sanfter.
c) Desktop-Komposition in Vista und 7 aus?

Ansonsten schau Dir das Video an, so tuts bei mir; ich glaube nicht, dass es da Verögerungen gibt. Ich hab auch schon jerry bruckheimer filme gesehen auf dem system, da „klebten“ die LEDs an dem Blitz am Anfang. Sollte also kein Systemfehler sein.

11.   Kommentar von hurra
Erstellt am 05. Mai 2010 um 13:12 Uhr.

Ich konnte das Problem wesentlich kleiner machen. Das von mir verwendete boblight-X11 kennt einen Parameter -t, mit dem die Abtastzeit eingestellt wird. Standard sind 0.5 Sekunden. Wenn man den Wert kleiner macht reagiert er viel schneller, jedoch braucht er dabei auch ziemlich viel CPU-Leistung.

Etwas Verzögerung bleibt zwar trotzdem noch, damit kann man aber durchaus leben.

Außerdem hoffe ich, dass dies bei der neuen Version von boblight besser wird. Leider kann ich die Entwicklerversion derzeit nicht testen, da boblight-X11 immer mit ner Fehlermeldunng abschmiert (Bug ist reported bei google-code)

12.   Kommentar von hurra
Erstellt am 27. Mai 2010 um 11:55 Uhr.

Nochmal Feedback.

Hab jetzt doch die neue Version aus dem Google-Code-Repository zum laufen bekommen. Mit dieser Version sind wesentlich kleinere Abtastzeiten möglich. Standardmäßig sind 0.1 Sekungen eingestellt, aber auch 0.05s gehen bei mir problemlos.

Damit ists jetzt endlich so flott, wie von mir erwartet 🙂

Danke!

Einen Kommentar hinterlassen