LED-Strip mit WS2811
Idee
Bei einem chinesisichen Veresndeportal gibt es seit kurzer Zeit LED-Strips zu bestellen, welche mit RGB-LEDs ausgestattet sind (60 Stück pro Meter Strip), die selbst wiederum mit einem WS2811 - LED-Treiber ausgestattet sind. Dieser LED-Treiber kann digital angesteuert werden und jede Farbe (R, G und B) jeweils individuell in 255 Helligkeitswerten leuchten lassen. Im Rahmen dieses Projektes soll eine Elektronik gebaut werden, mit der der LED-Schlauch angesteuert werden kann.
Geplante Umsetzung
Da wir uns gerade auch mit neuen Mikrocrontroller-Evaluation-Boards auf Basis des STM32F4 beschäftigen, soll diese Ansteuerung eben mit diesem Controller erledigt werden. Sobald wir grundlegend in der Lage sind, den LED-Strip anzusteuer, wollen wir die gewählten STM32F4 Discovery-Boards noch um Ethernet erweitern, um den LED-Strip mit Artnet ansteuern zu können.
Technische Beschreibung
WS2811
Bei dem Controller-Chip WS2811, der in die jeweiligen LEDs eingebaut ist, handelt es sich um einen kleinen LED-Treiber, welcher die Farbkanäle der RGB-LEDs jeweils mit PWM in 255 Helligkeitswerten leuchten lassen kann. Diese Controller-Chips sind auf dem LED-Strip alle in Reihe geschaltet: Jeder Chip hat einen Steuersignaleingang Din und einen Ausgang Dout, welcher wiederum an Din des folgenden Chips angeschlossen ist. Das Datenblatt des Chips liefert Informationen über die notwendige Ansteuerung: Zur Ansteuerung des Controllers schickt man über einen "One-Wire-Bus" ein digitales Signal in den ersten Chip. Dieses Signal enthält eine Bitfolge mit den jeweils mit 8-bit codierten Helligkeitswerten. Pro Chip sind also 24 Bit notwendig, um jeweils 8-bit pro LED zur Verfügung zu haben. Die Controller arbeiten hierbei in der Art, daß Sie von der gesendeten Bitfolge die ersten 24 Bit abschneiden und zur internen Ansteuerung verwenden. Die verbliebene Bitfolge wird neu aufbereitet und an den jeweils folgenden WS2811 weitergegeben. Bei 10 LEDs wäre also eine Bitfolge mit 240 bit notwendig.
Gemäß Datenblatt ist die Reihenfolge der zu sendenden Daten: 8-bit Rot, 8-bit Grün und 8-bit Blau im Little Endian-Format
Der Chip kann entweder für den Low-Speed-Modues (400kbit/s) oder im Highspeed-Modues (800kbit/s) beschaltet. Auf unserem LED-Schlauch wurde vom Hersteller für den High-Speed-Modues verdrahtet. Um den Chip anzusenden, muss alsomit einer festen Frequenz von 800 kbit/s gesendet werden. Jedes Bit hat damit einen Zeitschlitz von exakt 1,25 Mikrosekunden (ja wirklich!). Die Codierung von binären Werten erfolgt hier wie folgt:
Bitwert "1" | 0,25us high(+-75ns) | 1us low (+-75ns) |
Bitwert "0" | 0,6us high(+-75ns) | 0,65us low (+-75ns) |
Am Ende der Bitfolge (also die Bitfolge für alle in Reihe geschalteten WS2811 wurde gesendet), ist ein Reset-Signal zu senden. Nach diesem Signal leuchten die LEDs dann eben mit der gesendeten Helligkeit. Das Resetsignal besteht einfach aus 50us aus
Ansteuerung mit STM32F4
- Erzeugung des Steuersignals mit PWM (mit Timern auf 800kHz) gestellt. - Die "High"-Zeit innerhalb jedes Bits wird mit einem Counter des Timers erstellt. Das Counter-Register bekommt hierbei den jeweils aktuellen Wert per DMA - Beispielcode im GIT
Genauere Doku folgt noch...
Erstes Ergebnis
Der Treiber steht und wir können ein Lauflicht mit dem LED-Strip erzeugen: