Software & Inbetriebnahme

Die LED Stripe-Platine erhält ihre Funktionalität erst durch die Programmierung des Mikrocontrollers. Daher muss einmalig die Software (auch Firmware genannt) mit Hilfe eines Programmieradapters in den ATTiny84 übertragen werden. Der Adapter ist unter Beachtung der Anschlussbelegung mit der Platine zu verbinden. Auf dieser Seite finden Sie die Software sowie Informationen zum Programmiervorgang.

Die Software für die LED-Stripe-Platine ist als Quellcode und in kompilierter Form als hex-Datei verfügbar. Entwickelt und getestet wurde die Software unter Linux mit dem frei verfügbaren Compiler avr-gcc in der Version 4.3.4 und der avr-libc Version 1.6.7. Die hex-Datei ist die fertig übersetzte Software und kann direkt zur Programmierung des Mikrocontrollers verwendet werden. Zum Programmieren kann z.B. das freie Tool avrdude verwendet werden. Eine übersetzte Windows-Version gibt es hier.

Neben der UART/RS232-Schnittstelle gibt es alternativ die Möglichkeit die Platine als I²C-Slave zu verwenden. Im Quellcode gibt es in der Datei main.h zwei Defines (USE_UART und USE_TWI bzw. USE_TWI_SLAVE und USE_TWI_MASTER), die festlegen, welche Schnittstelle verwendet werden soll. Wird  die Zeile „#define USE_UART 1“ einkommentiert, wird UART/RS232 verwendet. Entsprechend wird die I²C-Schnittstelle durch Einkommentieren der jeweiligen TWI-Defines (TWI=Two Wire Interface) aktiviert. Es kann jeweils nur eine der beiden Möglichkeiten gewählt werden. Für beide Schnittstellen gibt es eine fertig übersetzte hex-Datei. Weitere Änderungen sind in der Datei version.txt im Quellcode-Archiv nachzulesen.

Seit Version 2.0 gibt es die Möglichkeit alle Einstellungen und die Programmierung eigener Lichteffekte mit dem PC-Programm LED Stripe Tool vorzunehmen.

Eine Liste mit den Änderungen zwischen den Versionen gibt es in der Datei version.txt im Quellcode-Archiv.

LED-Stripe Firmware Quellcode Version 2.4

LED-Stripe Firmware UART Hex-Datei Version 2.4

LED-Stripe Firmware I2C Hex-Datei Version 2.4 (ungetestet)

avrdude für Windows mit UART-Firmware 2.4

(alte Versionen: Quellcode Version 2.3, UART Hex-Datei Version 2.3, I2C Hex-Datei Version 2.3, Quellcode Version 2.2, UART Hex-Datei Version 2.2, I2C Hex-Datei Version 2.2)

Programmieren und Fuse-Einstellungen

Damit der Mikrocontroller richtig arbeitet, muss sowohl die Software übertragen als auch die korrekte Einstellung der Fuses-Bytes vorgenommen werden. Letzere müssen wie folgt gesetzt werden:

Low-Fuse-Byte
CKDIV8 = unprogrammed Clock-Teiler aus
CKOUT = unprogrammed Clock-Ausgang aus
SUT1 = programmed Start-Up-Zeiten für BOD
SUT0 = programmed Start-Up-Zeiten für BOD
CKSEL3 = programmed 8 MHz internal RC oscillator
CKSEL2 = programmed 8 MHz internal RC oscillator
CKSEL1 = unprogrammed 8 MHz internal RC oscillator
CKSEL0 = programmed 8 MHz internal RC oscillator
High-Fuse-Byte
RSTDISBL = unprogrammed Reset ein
DWEN = unprogrammed DebugWire aus
SPIEN = programmed Programmierung per SPI ein
WDTON = unprogrammed Watchdog aus
EESAVE = programmed EEProm bei Chip-Erase erhalten
BODLEVEL2 = unprogrammed Brown-Out-Detection ein (4,3V)
BODLEVEL1 = programmed Brown-Out-Detection ein (4,3V)
BODLEVEL0 = programmed Brown-Out-Detection ein (4,3V)

Mit dem Kommandozeilen-Tool avrdude können Sie in einem Rutsch die Firmware übertragen und die Fuse-Bytes setzen. Der entsprechende Aufruf dafür hat die Form:

avrdude.exe -p attiny84 -c <programmer> -P <port> -U lfuse:w:0xC2:m -U hfuse:w:0xD4:m -U flash:w:firmware.hex

Bei Verwendung der SerCon von Mikrokopter als Programmieradapter an der ersten seriellen Schnittstelle (Com-Port 1) sieht der Aufruf wie folgt aus:

avrdude.exe -p attiny84 -c ponyser -P COM1 -U lfuse:w:0xC2:m -U hfuse:w:0xD4:m -U flash:w:ledstripe_uart.hex

Der Name der Hex-Datei sowie der Com-Port sind gegebenenfalls anzupassen. Sollte es zu Fehlermeldungen beim Programmiervorgang kommen, ist ggf. die Verkabelung zu überprüfen. Außerdem muss die LED Stripe Platine zum Programmieren mit Spannung versorgt sein.

Für Windows-Anwender habe ich eine ZIP-Datei zusammengestellt, welche neben avrdude die UART-Firmware sowie eine Batch-Datei zum Programmieren enthält. Entpacken Sie einfach die Datei und starten dann die Datei flash_ledstripe.bat. Sollten Sie nicht COM1 mit dem SerCon-Programmieradapter verwenden, müssen Sie die Datei entsprechend anpassen.

Hinweise: Für die Verwendung mit dem LED Stripe Tool muss die UART-Version der Software verwendet werden, andernfalls ist keine Kommunikation zwischen der Platine und dem Tool möglich. Weiterhin sollten Sie die Fuse-Bytes auf Tippfehler überprüfen, da falsche Fuse-Einstellungen dazu führen können, dass der Mikrocontroller nicht mehr (ohne weiteres) programmiert werden kann.

Beschreibung der UART-Schnittstelle

Folgende Beschreibung bezieht sich auf die Firmware Version 2.3 und ist der Vollständigkeit halber aufgeführt. Benutzen Sie bitte das LED Stripe Tool zum Konfigurieren der LED Stripe-Platine.

Die UART-Schnittstelle kann nur verwendet werden, wenn die Software mit UART-Unterstützung kompiliert bzw. die entsprechende hex-Datei verwendet wird.

Die LED-Stripe-Platine kann über die serielle Schnittstelle konfiguriert werden. Zum Anschluss an den PC ist dafür ein entsprechender Pegelwandler notwendig, der die 5V-Pegel auf RS232-konforme Pegel umsetzt. Die Übertragung arbeitet mit einer Baudrate von 9600 Baud ohne Flusskontrolle (8N1, 8 Datenbits, ohne Paritätsbit, 1 Stopp-Bit). Die gesendeten Kommandos müssen mit einem Linefeed (LF, \n) oder Carriage-Return + Linefeed (CR+LF, \r\n) abgeschlossen werden. Die eingestellten Parameter werden im EEProm des Mikrocontrollers dauerhaft gespeichert und beim Start automatisch geladen.

Folgende Kommandos sind implementiert:

mode <ziffer>: Stellt den Lichteffekt ein. Dabei sind folgende Werte möglich:

0: kein Effekt, alle LEDs aus:

1: Modus zum Testen der einzelnen LEDs. Es werden für einige Sekunden jeweils alle roten, grünen und blauen LEDs angeschaltet. In diesem Modus müssen jeweils alle LEDs mit der gleichen Farbe leuchten – bleibt eine LED dunkel, liegt ggf. ein Defekt oder Lötfehler vor.

2: Visualisierung der Akkuspannung als Bar-Graph. Je voller der Akku, desto mehr LEDs sind eingeschaltet. Bei vollem Akku (Schwellwert per akkuv-Kommando einstellbar) sind alle LEDs grün. Fällt die Spannung soweit, dass nur noch vier LEDs an sind, wechselt die Farbe zu rot. Bei leerem Akku (Schwellwert per akkul-Kommando einstellbar) blinken alle LEDs rot.

3: Spielt den im EEProm gespeicherten Lichteffekt ab. Bevor dieser Modus aktiviert wird, sollte sichergestellt werden, dass zuvor ein entsprechender Lichteffekt übertragen wurde. Dazu ist das LED Stripe Tool zu verwenden.

info: Zeigt die Software-Version sowie die eingestellten Werte an.

akkul <Spannung in Millivolt>: Setzt die Schwellwert-Spannung für einen leeren Akku. Fällt die Versorgungsspannung unter diesen Wert, wird ein leerer Akku durch blinkende LEDs signalisiert (sofern aktiviert, siehe akkuwarn-Kommando). Außerdem wird diese Spannung als untere Grenze für die Visualisierung der Akkuspannung via Bar-Graph-Anzeige verwendet. Die übergebene Spannung muss kleiner als der Schwellwert für einen vollen Akku sein (siehe akkuv-Kommando).

akkuv <Spannung in Millivolt>: Setzt die Schwellwert-Spannung für einen vollen Akku. Dieser Wert wird für die Visualisierung der Akkuspannung via Bar-Graph-Anzeige verwendet (entspricht alle LEDs an). Die übergebene Spannung muss größer als der Schwellwert für einen leeren Akku sein (siehe akkul-Kommando).

akkuwarn <ziffer>: Aktiviert (bei ziffer=1) oder deaktiviert (bei ziffer=0) die automatische Signalisierung eines leeren Akkus unabhängig vom Lichteffekt. Bei aktivierter Einstellung blinken unabhängig vom eingestellten Effekt alle LEDs in der eingestellten Farbe (per colorl-Kommando), sobald die Akkuspannung unter dem Schwellwert für einen leeren Akku (siehe akkul-Kommando) fällt. Wird diese Option abgeschaltet, so erfolgt keine Akku-Warnung.

color[v/k/l] <RGB>: Einstellen der Farbe für die Akkustand-Visualisierung. ‚colorl‘ stellt die Farbe ein, wenn die Spannung unter dem Schwellwert für einen leeren Akku liegt (LEDs blinken in dieser Farbe, sofern die Akku-Warnung eingeschaltet ist). ‚colork‘ und ‚colorv‘ legen die Farbe für die Visualisierung der Akkuspannung als Bargraph-Anzeige für den kritischen Bereich bzw. einen vollen Akku fest. Die Anzahl der LEDs für einen kritischen Akkustand kann per ledsk-Kommando festgelegt werden. Der Parameter RGB gibt jeweils die Farbe an und muss aus drei Ziffern zwischen 0 und 8 (Helligkeiten jeweils für die Farben Rot, Grün und Blau) bestehen. Beispiel: ‚colorv 880‘ für helles Gelb bei vollem Akku.

dim <ziffer>: Ermöglicht das Dimmen/Abdunkeln der Helligkeit im Testmodus (mode 1). Dadurch kann die Helligkeit reduziert werden, so dass man bei einer Fehlersuche nicht in die hellen LEDs schauen muss. Es sind Werte von 0-6 möglich (0 = kein Dimmen, 6 = maximale Dimmung).

ledsk <anzahl>: Setzt die Anzahl der LEDs für die Visualisierung des Akkustands als Bargraph ab der zwischen den Farben für vollen bzw. kritischen Akkustand gewechselt wird. Es sind Werte von 1-11 möglich.

delay <zeit>: Setzt das Blink-Intervall zur Signalisierung eines leeren Akkus. Die Zeit wird in Millisekunden angegeben und muss zwischen 30 und 5000 liegen. Ein höherer Wert führt zu einer langsameren Blink-Sequenz.

celldet <ziffer>: Schaltet die automatische Erkennung der Zellenanzahl ein (ziffer=1) bzw. aus (ziffer=0). Bei eingeschalteter Erkennung wird anhand der Spannung beim Einschalten ermittelt, ob es sich um einen 3S oder 4S-LiPo handelt. Die Schwellwerte für die Visualisierung des Akkustands sind in dem Fall für 3S anzugeben und werten automatisch für 4S umgerechnet (*4/3).

sync <ziffer>: Aktiviert (ziffer=1) bzw. deaktiviert (ziffer=0) die Generierung eines Synchronisationsimpulses. Nur relevant, falls Sie mehrere LED Stripes synchronisieren möchten. In dem Fall muss diese Option bei genauer einer Platine aktiv sein.

twi 0x??: Setzt die I²C-Adresse (TWI = two wire interface). Die 7-Bit-Adresse ist dabei als Hexzahl anstelle der Fragezeichen einzutragen (>0 und <127). Durch Ändern der Slave-Adresse können mehrere Platinen an  einen I2C-Bus angeschlossen werden. Standard-Adresse ist: 0x69.

data …: Dieser Befehl dient zum Übertragen der selbst erstellter Lichteffekte in den Speicher des Mikrocontrollers. Details werden hier nicht beschrieben. Bitte verwenden Sie das LED Stripe Tool.

Beschreibung der I²C-Schnittstelle

Die I²C-Schnittstelle kann nur verwendet werden, wenn die Software mit I²C-Unterstützung kompiliert bzw. die entsprechende hex-Datei verwendet wird.

Die LED Stripe-Platine kann mit entsprechender Programmierung als I²C-Slave angesprochen werden. Ein I²C-Bus mit 5V Spannungspegel ermöglicht die Ansteuerung einer oder auch mehrerer LED Stripes durch einen I²C-Master. Dazu werden die beiden Leitungen SDA und SCL verwendet. Falls am Bus noch keine Pullup-Widerstände vorhanden sind, müssen ggf. R1 und R2 auf den Platinen bestückt werden. Die I2C-Adresse kann über die UART-Schnittstelle (nach Aufspielen der UART-Software) verändert werden und lautet standardmäßig 0x69. Die Kommunikation wurde erfolgreich mit einem I²C-Takt von 400 kHz (Fast Mode) getestet.

Über I²C können alle Einstellungen vorgenommen werden, die auch per UART-Schnittstelle verändert werden können (Ausnahme: die I²C-Adresse kann via I²C nicht verändert werden). Dabei gibt es für die veränderbaren Parameter jeweils zwei Versionen der Befehle: zum einmaligen Ändern und zum dauerhaften Ändern. Die Befehle mit dem Suffix _P speichern den geänderten Parameter dauerhaft im EEProm, ohne dieses Suffix wird die Änderung nicht gespeichert. Neben der Änderung der Einstellungen können per I²C auch direkt die Farben der einzelnen LEDs gesetzt werden. Auf diese Weise können mit mehreren LED Stripes an einem I²C-Bus sehr flexibel verschiedenste Lichtspielereien realisiert werden, indem ein I²C-Master alle LED Stripes entsprechend ansteuert (siehe Video unten).

Die I²C-Kommunikation läuft wie folgt ab: Der Master generiert eine Start-Bedingung und schreibt die Slave-Adresse (7 Bit) gefolgt vom Write-Bit (1) auf den Bus. Als nächstes folgt ein Kommando-Byte auf welches ggf. ein oder mehrere Datenbytes folgen können. Mit der Stopp-Bedingung endet die Übertragung. Das Kommando-Byte gibt an, welche Einstellung geändert werden soll und legt die Anzahl und das Format der Datenbytes fest. Die Einstellungen können per I²C nur geschrieben und nicht gelesen werden. Momentan kann nur die Akku-Spannung per I²C ausgelesen werden. Zum Lesen schreibt der Master zunächst den Befehl (wie oben beschrieben, ohne Datenbyte). Nach der Stopp-Bedingung muss dem Slave ein Moment Zeit für die Verarbeitung der Daten gegeben werden, bevor der Master wie folgt die Akkuspannung lesen kann: Generierung der Start-Bedingung, Senden der 7-Bit Slave-Adresse gefolgt vom Read-Bit (0), Lesen der zwei Datenbytes (=Akkuspannung in Millivolt) und Generierung einer Stopp-Bedingung.

Die folgende Auflistung beschreibt kurz die implementierte Befehle:

Schreibende Befehle

Alias / Kommando Beschreibung
TWI_MODE / 1
TWI_MODE_P / 2
Einstellen des Lichteffekts (siehe UART-Beschreibung), 1 Datenbyte = Effekt (0-3)
TWI_AKKU_LEER / 5
TWI_AKKU_LEER_P / 6
Schwellwert für leeren Akku setzen, 2 Datenbytes (Schwellwert in Millivolt, MSB zuerst)
TWI_AKKU_VOLL / 7
TWI_AKKU_VOLL_P / 8
Schwellwert für vollen Akku setzen, 2 Datenbytes (Schwellwert in Millivolt, MSB zuerst)
TWI_AKKU_WARN / 9
TWI_AKKU_WARN_P / 10
Warnung bei leerem Akku (de-)aktivieren, 1 Datenbyte (1 = an, 0 = aus)
TWI_DIM / 14
TWI_DIM_P / 15
Einstellen der Dimmung/Abdunkelung, 1 Datenbyte (V1.2: 0-6, 0 = nicht dimmen, 6 = maximale Dimmung; bezieht sich nur auf den Testmodus)
TWI_DIRECT_COL / 16 Direktes Setzen der LED-Farben, 18 Datenbytes (für jede der 12 LEDs jeweils 4 Bit (=Helligkeit 0-8) für die Farben Rot, Grün und Blau)
TWI_CELLDETECTION_P / 17 Automatische Erkennung der Akku-Zellenzahl, 1 Datenbyte (0 = aus, 1 = an)

Lesende Befehle

Alias / Kommando Beschreibung
TWI_READ_AKKU / 101 Akku-Spannung lesen, 0 Datenbytes. Liefert als Antwort beim Lesen 2 Datenbytes (Akkuspannung in Millivolt, MSB zuerst)

Demo-Video mit 5 LED Stripe-Platinen an einem I²C-Bus

Das folgende Video zeigt wie 5 LED Stripe-Platinen über den I²C-Bus von einem Master (ein ATmega8) angesteuert werden. Die Effekte werden dabei vom Master berechnet und via I²C an die Slaves gesendet. Die typischen Streifen im Bild werden durch die hellen LEDs bei der Aufnahme mit einer CCD-Kamera verursacht.