budo's Web
Hier findet ihr einiges zu meinen Hobbies

LED-Strip

RGB-LED-Streifen (LED stripes) gibt es viele. Die billigeren davon sind passive RGB-LEDS oder mit einzelnen Farb-LEDs, bei denen man die Farbe aller LEDs auf einmal verändern kann. RGB-LED-Streifen mit Einzelansteuerung haben pro LED oder LED-Gruppe eine intelligente Steuerung, über die man jede einzelne LED oder LED-Gruppe steuern kann. Nachfolgende Beschreibung basiert auf einem 1m langen RGB-LED-Streifen mit WS2812B Elementen, d.h. die 5050-RGB-LED-Komponenten beinhalten eine WS2811 ähnliche Steuerung. Angesteuert wird der LED Streifen über eine einzelne Datenleitung, auf der die Daten aller LEDs hintereinander durch die sequentiellen LEDs durch geschoben werden. Mit einem Reset-Signal (LOW ≥ 50μs) werden die Daten übernommen und angezeigt. Die Daten beinhalten die 3 Farben (3x 8 Bit) pro LED für alle LEDs hintereinander. Bei dem mir verfügbaren Streifen sind dies 60 RGB-LEDs auf einem Meter. D.h. es wird ein Datenblock von 8x 8 Bit x 60 = 3840 Bit übertragen. Ein High-Bit entspricht dabei einem Puls mit 400ns high und 850ns low, ein Low-Bit einem Puls mit 800ns high und 450ns low. Ein Bit entspricht folglich einer Übertragungsdauer von 1.25μs, was einer Frequenz von 800kHz entspricht. Mit Arduino "C" läßt sich dies nicht mehr erzeugen, auch wenn man als Delay Assembler NOP-Befehle benutzt. Eine FOR-Schleife und eine IF-Abfrage (für Low/High) sprengen schon den vorgegebenen Zeitrahmen, obwohl die Tests hierfür auf einem 20MHz budoino durchgeführt wurden. D.h., die komplette Übertragung muss in Assembler realisiert werden, wie man das auch bei den diversen Libraries (z.B. von Adafruit, Pololu, u.a.) sehen kann. Die Lösungen sind alle sogenannte bitbanging Lösungen, bei denen Assemlerbefehle mit einer festen Laufzeit zum gewünschten Protokoll zusammengefügt wurden. Interrupts sind dabei natürlich gesperrt. Die Übertragung einer Zeile mit 60 LEDs, d.h. im vorliegenden Fall um 1m Länge, dauert 3 x 8 x 1.25μs x 60 = 1.8ms.

Möchte man nun bei den zu erzeugenden Farb-Szenarien auch die Farb-Sättigung und die Helligkeit direkt einstellen, so sind die RGB-Werte hierzu nicht ideal. Besser geeignet hierfür sind HSV oder HSL Farbwerte, die nicht aus rot, grün, blau, sondern aus einem Farbwert (hue), einer Sättigung (saturation) und des Hellwerts (value) bzw. der Lichtintensität (intensity) besteht. HSV/HSL-Werte und RGB-Werte lassen sich beliebig konvertieren. Konverter gibt es hierzu genügend (z.B. RGBConverter). So lassen sich die Farb-Szenarien mit Farb-Sättigung und Helligkeit mit z.B. HSV berechnen und die konvertierten Werte als RGB an die LEDs übertragen.

do

do

LED-Strip (Ausschnitt) mit RGB-LEDS mit integriertem Controller WS2812B

Einzelne RGB-LED mit den sichtbaren LEDs bei sehr dunkler Einstellung, damit der Foto nicht überstrahlt wird

Verwendet habe ich letztlich einen Arduino Nano (ATmega328 / 16MHz) und ein altes Schaltnetzteil, das ich über eine kleine Adapterplatine in der Spannung etwas reduziert habe, da die Spannungsdaten im Datenblatt des WS2812B widersprüchlich sind. Der Nano wird auch von dem Schaltnetzteil mit 12V versorgt. Softwaremäßig habe ich auf der Library von Pololu aufgebaut, die ohne jeglichen Schnickschnack daher kommt. Da das Pololu-Beispiel ledStripXmas.ino in etwa dem entsprach, was ich mir als Patterngenerator vorstellt habe, war es Ausgangspunkt meiner Software. Ich hab vor allem die RGB-Manipulationen durch HSV-Manipulationen ersetzt. Dies ergibt insbesondere beim herunter dimmen schönere Farben und weniger Farbfehler bei fast dunklen LEDs. Zusätzlich hab ich neue Pattern hinzugefügt und die Pattern parametrisiert, so dass man diese schneller ändern kann und gleiche Pattern mit unterschiedlichen Parametern hintereinander abspielen kann.

do

LED-Strip Muster

LED-Strip, mit ATtiny gesteuert

Für die Ansteuerung eines LED-Strip aus WS2812B RGB-LEDs genügt ein Prozessor mit 8 MHz, d.h. ein Attiny müsste bezüglich der Geschwindigkeit ausreichen. Hierzu musste aber die Pololu-Library angepasst werden, um die ATtiny-Bausteine Atiny24/44/84 und ATtiny 25/45/85 hinzuzufügen, damit die Library den Zusammenhang zwischen Arduino Pin-Nummer und der Hardware Port-Bezeichnung kennt, z.B. beim Attiny84 D10 -> Port PB0. Verwendet habe ich hier die Pinbezeichnungen des ATtiny-CORE und nicht die des Tiny-CORE (Board-Namen mit @), die sich leider unterscheiden. Als Hardware habe ich einen ATtiny85 mit internem 8 MHz Takt verwendet und mit einem selbstgebauten LED-Strip aus 5 einzelnen WS2812B-LEDs getestet.
Auf die Funktion delay() muss man aber verzichten und delayMikroseconds() verwenden, da delay() durch den Pololu-Treiber auf dem ATtiny nicht ordentlich funktioniert.

do

do

Budoini mit ATtiny85

"LED-Strip" aus einzelnen WS2812B-LEDs

do

LED-Ring mit rotierenden LED-Mustern mit ATtiny45 an 4,5V Batterie und mit Helligkeiteinstellung per Poti

Nachtrag

Für eine mögliche Batterie betriebene Anwendung habe ich 1 LED an einem ATtiny85 mit 8 MHz (kleinere Frequenzen lässt der Pololu Treiber nicht zu) mit permanentem Farbwechsel betrieben und dabei die Versorgungsspannung langsam herunter gedreht. Die LED-Ansteuerung hat sogar noch bei 2.1 V noch funktioniert. Allerdings leuchtete die grüne und die blaue LED nicht mehr, aufgrund ihrer etwas größeren Durchlass-Spannungen. Bei 2.7 V leuchten noch alle 3 Farben.

do

3V-RGB-LED Aufbau mit ATtiny45 8MHz und 3V Batterie und mit Helligkeiteinstellung per Poti

LED-Adaption

Für die Adaption einzelner WS2812B-RGB-LEDs eignen sich SOP-DIL Adapter hervorragend.

do

WS2812B LED im SOP-DIL-Adapter


Nach Oben