Hallo freundlicher Leser aus der Nachbarschaft,

ich finde es schön, dass dich mein Geschreibsel interessiert. Aber noch schöner fände ich es, wenn du diesen Blog unterstützen würdest, zum Beispiel könntest du deinen AdBlocker für meinen Blog deaktivieren. Das würde mir schon viel bedeuten und zum Erhalt dieses Blogs beitragen.

Mit freundlichen Grüßen J. Wiese

Fernsteuerbare LED-Strifen WS2811 & WS2812B

Fernsteuerbare LED-Strifen WS2811 & WS2812B

Bunte Lichtinstallationen mit selbst programmierten LED-Streifen sehen nicht nur genial aus, sie sind auch mit ein bisschen Verständnis für Technik einfach zu bauen und zu installieren. Alle benötigten Teile gibt es mit unter sehr günstig im Internet zu kaufen. Es wird im Folgenden gezeigt, wie dieses einfach mit einem Arduino umgesetzt werden kann.

In dem Video zu sehen ist der LED Streifen WS2811, welcher durch einen Arduino Nano angesteuert wird. Das Ganze lässt sich über eine Infrarot-Fernbedienung bedienen. Alternativ lassen sich auch andere Streifen verwenden, zum Beispiel den Nachfolger WS2812B, welcher mit 5V betrieben wird und bei dem jede LED einzeln angesteuert werden kann. Wo hingegen der WS2811 mit 12V läuft und 3 LEDs auf einmal angesteuert. Die 12V haben zum Beispiel den Vorteil, dass man diese einfach an eine Autobatterie anklemmen kann.

Schaltplan WS2811 (12V)

 Schema: Arduino Nano, WS2811, IR Empfänger (12V)

Schema: Arduino Nano, WS2811, IR Empfänger (12V)

In dem Plan wird diese für einen WS2811 mit 12V gezeigt. Die 12 Volt werden an den Arduino und den Streifen angeschlossen. Die Datenleitung des Streifens wird mit dem Arduino verbunden, sowie auch die Signalleitung vom Infrarotempfänger. Die 5V für den Infrarotempfänger erzeugt der Arduino.

Um die Haltbarkeit zu erhöhen, werden noch ein Widerstand und ein Kondensator hinzugefügt. Der Widerstand kommt zwischen den Streifen und den Arduino und der Kondensator wird vor dem Streifen zwischen plus und minus geklemmt. Er gleicht Spannungsschwankungen vom Streifen aus.

Weiterhin sollte bei der Installation der LED Streifen alle 150–300 LEDs eine Verbindung mit der Spannungsquelle hergestellt werden, damit der Spannungsabfall innerhalb der Streifen ausgeglichen wird und dieser überall gleich hell leuchtet.

Schaltplan WS2812B (5V)

 Schema: Arduino Nano, WS2812B, IR Empfänger (5V)

Schema: Arduino Nano, WS2812B, IR Empfänger (5V)

Es sind zwei Änderungen an dem Schaltplan nötig um die LEDs WS2812B zu verwenden.

Als Erstes muss die regulierte Spannungsquelle beim Nano an den 5V-Pin anstatt an den VIN-Pin angeschlossen werden, da der VIN-Pin erst ab einer Spannung von 7V funktioniert. Geh dabei sicher, dass es nicht zu einer Überspannung kommen kann, da diese die komplette Logik zerstören würde, da in diesem Fall der Spannungsregulator vom Nano übergangen wird.

Die zweite Veränderung für einen 5V-Betrieb ist, dass der Kondensator für eine niedrigere Spannung ausgelegt sein kann.

Wie viel Strom wird benötigt?

Eine LED besteht intern aus drei einzelnen LEDs: Rot Grün und Blau. Daraus setzt sich dann die Farbe zusammen. Der maximale Verbrauch einer internen LED liegt typischerweise bei 20mA. Somit verbraucht eine LED maximal 60mA. Nun kann man sich ausrechnen, wie viel Ampere das Netzteil benötigt. Bei dem WS2811(12V) ist zu beachten, dass immer 3 LEDs in Reihe geschaltet sind und somit wird nur ein Drittel der Ampere benötigt.

Da die Werte für den maximalen Stromverbrauch ziemlich hoch sein können, kann, wenn man sagt, dass nicht immer alle LEDs gleichzeitig an sind, der Stromverbrauch niedriger angesetzt werden. Das sollte am besten dann auch softwareseitig umgesetzt werden. Zum Beispiel mit dem Begrenzen der maximalen Helligkeit, wenn der Streifen weiß leuchtet. Netzteile lassen sich zwar bis zu einem gewissen Grad kurzzeitig überlasten.

Software

Die Ansteuerung der LEDs übernimmt der Arduino. Die Bibliothek Neopixel von Adafruit kümmert sich um das Speichern und Übertragen der Farbinformationen an den Strip. Das Dekodieren Infrarotsignale übernimmt die Bibliothek IRLremote. Somit bleibt für den Sketch das Übersetzen der Befehle in Farbinformationen übrig. Dazu habe ich die Gelegenheit genutzt, um mich ein bisschen in C++ einzuarbeiten. Das Ergebnis lässt sich auf Github finden.

Die maximale Anzahl an Pixeln ist durch den zur Verfügung stehenden RAM begrenzt. Der NANO hat 2k Byte RAM und für das Programm sollte so ca. 512 Byte frei bleiben. Das von mir geschriebene Programm verbraucht zwar weniger, aber falls mal doch zu wenig RAM vorhanden sein sollte, stürzt der Mikrocontroller „ab“ und es kommt zu unvorhersagbaren Zuständen. Gleichzeitig bleibt noch ein bisschen RAM übrig, um eigene Funktionen mit einzubringen. Somit bleiben für die Pixel 1.536 Byte. Da für jeden Pixel 3 Farbwerte â 1 Byte gespeichert werden müssen, ergibt sich eine maximale Pixelanzahl von 512.

Softwarekonfiguration

Knöpfe IR Fernbedienung

Knöpfe IR Fernbedienung

In Zeile 23 wird die Neopixel-Bibliothek initialisiert. Hier muss entsprechend des verwendeten Strips die RGB-Konfiguration (RGB,RBG,BRG..) und die Übertragungsgeschwindigkeit (400kHz, 800kHz) eingestellt werden. Je nachdem, wie der verwendete Strip intern verdrahtet ist, müssen die drei Farben RGB in unterschiedlicher Reihenfolge übertragen werden. Am Seicherlayout eines Pixels ändert sich dabei nichts. Falls die Übertragungsgeschwindigkeit nicht stimmt, erscheinen einfach nur merkwürdige Farbverläufe auf den Pixeln.

Auf Github ist die rechts zu sehende Fernbedienung, die ich noch von einem anderem Strip übrig hatte, vorkonfiguriert. Das Mapping wischen IR-Code und Lichtkonfiguration übernimmt die Funktion mapRemote(). Zum Konfigurieren einer neuen Fernbedienung müssen die neuen IR-Codes in einem neuem Mapping übersetzt werden. Um herauszufinden, welcher Code, hinter welchem Knof liegt, kann DEBUG auf true (Zeile 13) gesetzt werden. Dann wird jedes empfangene IR-Signal über den seriellen Monitor ausgegeben.

Softwareinstallation

Der Sketch sollte sich wie jeder andere installieren lassen. Der Compiler sollte selbständig den Code im src Verzeichnis finden und übersetzten.

Plattform spezifische Beschränkungen

Aus der Verbindung von WS281X und Arduino ergibt sich ein großer Nachteil: Während Daten auf den Strip geschrieben werden, müssen die Interrupts ausgeschaltet werden. Das liegt daran, dass der WS2811/12B nur drei Adern hat und somit die Bits nur durch ein genaues Timing der Flanken übertragen werden können. Jeder Interrupt würde diese Timing verändern, sodass der Strip nicht mehr die Daten vom Arduino entschlüsseln kann. Da nun aber das Empfangen der Infrarotsignale auf einem Interrupt basiert, kann immer nur eines zurzeit stattfinden. Als Folge hört das Programm auf den Strip zu aktualisieren, sobald Infrarotsignale empfange werden, oder, wenn er gerade Daten auf dem Strip schreibt, dann wird das Signal nicht empfangen.

Ein Lösungsansatz hierfür ist, die Aktualisierungsrate des Strips soweit zu verringern, dass die meisten Signale empfangen werden. Bei dem von mir verlinkten Code liegt die erfolgreiche Empfangsrate von IR-Signalen bei ca. 90%, was ich erstmal als akzeptabel ansehe. Eine andere Lösung wäre ein Upgrade der Hardware, was in jedem Fall teurer wird. Zum einen könnte ein Strip mit vier Adern verwendet werden. Bei diesen ist kein Abschalten des Interrupts notwendig, da die zusätzliche Leitung das Taktsignal übermittelt. Diese Strips sind aber mit unter doppelt so teuer, wie die WS2811/12B. Zum anderen könnte ein anderer Mikrocontroller verwendet werden, welcher entweder das PWM-Signal extern erzeugen lässt oder ein wesentlich schnellerer, welcher zwischen den Flanken genügend Rechenzeit für Interrupts hat.

Fazit

Obwohl nicht alle Signale von meiner Fernbedienung immer ankommen, bin ich mit dem Ergebnis sehr zu Frieden, vor allem im Hinblick auf Preis/Leistung. Meistens stelle ich eine Farbe und Modus ein und schalte dann nur noch ein und aus, weshalb das verloren gehen der Signale nicht wirklich zum Tragen kommt. Auch fällt es bei indirekter Beleuchtung nicht auf, ob jetzt nun 3 LEDs gleichzeitig oder jede LED einzeln angesteuert werden, was der Haupteinsatzzweck sein sollte.

Du willst einen Kommentar hinterlassen?
Dann schreibe bitte eine kurze Mail an: bloginput@jwiese.eu