WS8211 & QLC+

Warum?

Ich habe mir kürzlich ein paar LED-Spots zugelegt. Diese wollte ich natürlich auch irgendwie steuern. So kam es, dass ich dazu auch noch ein USB-DMX-Interface nebst Adapterkabel kaufte und begann mich mit QLC+ zu beschäftigen.

QLC+ ist eine OpenSource-Software zur Lichtsteuerung mittels DMX512 und anderen Protokollen.

Beim Spielen mit QLC+ stieß ich dann auf ein Video vom Hauptentwickler, wo zu sehen ist, wie man mit QLC+ eine LED-Matrix ansteuert. Und da dachte ich: Das will ich auch!

Die LED-Matrix

Ich schaute also, wo man günstig an LED-Streifen (Stripes) mit Einzelpunktansteuerung kommt. Bei eBay wurde ich fündig; es gibt im Wesentlichen Streifen mit 4 verschiedenen Chips:

  • WS8201
  • WS8211
  • WS8212
  • WS8212B

Der WS8201 kommuniziert per SPI. Wie man diesen Stripe mit einem Raspberry ansteuert, findet man hier beschrieben. Diese Art der Ansteuerung wurde auch vom QLC+-Entwickler Massimo Callegari verwendet.

Ich entschied mich aus Kostengründen für drei mal 5 m Stripe mit WS8211. Das sind 900 LEDs; ich wollte eine Matrix von 75x12 Pixeln bauen. Die Stripes kamen gleich am nächsten Tag, ich suchte eine passende Holztafel und klebte die Streifen parallel darauf.

Stromversorgung & Verkabelung

Auch wenn eine einzelne LED nicht viel Energie benötigt, so muss man doch sagen: Die Masse machts. 900 LEDs × 20 mA ergeben halt auch 18 A, oder – bei 12 V Betriebsspannung – 216 W. Deshalb war wichtig, dass jeder der 12 Stripes mit Strom versorgt wird und das Netzteil genug Leistung bringt. Ich hatte in einer Bastelbox noch ein altes Server-Netzteil und machte mich an die Verkabelung:

Da benachbarte Streifen gegenläufig sind, lagen jeweils gleiche Pole nebeneinander. Es bot sich also an, je zwei Streifen mit je einem Kabel für Plus und Minus an die Stromversorgung anzubinden:

Stromversorgung

Bei dem Netzteil handelt es sich um ein ATX-Netzteil, man muss am großen Stecker die grüne Leitung mit einer Masseleitung (schwarz) verbinden, um es einzuschalten.

Die Datenleitung ist einfach zu verkabeln: man muss nur den Pfeilen folgend die mittleren Pole des Stripes verbinden.

Datenleitung

Auf den Bildern ist zu sehen, dass ich bei manchen Stripes auch die Stromleitungen verbunden habe. Dies hatte ich angefangen, bevor ich über die Stromversorgung nachdachte und ist nicht notwendig.

Ansteuerung

Für einen ersten Test wollte ich meinen schon vorhandenen Raspberry Pi bemühen. Eine kurze Suche im Internet lieferte ein kleines Python-Programm, was genau für meinen Zweck zugeschnitten war:

WS2812 RGB LED Streifen per Raspberry Pi steuern¹.

Vorbereitungen

Dieser Anleitung folgend verband ich die Masse (Pin 6) des Raspberry mit dem Minuspol der LED-Stripes und Pin 12 (GPIO 18) mit der Datenleitung des ersten Stripes.

Dann folgende Schritte auf dem Raspberry:

sudo apt-get update
sudo apt-get install gcc make build-essential python-dev git scons swig
sudo echo "blacklist snd_bcm2835" > /etc/modprobe.d/snd-blacklist.conf
sudo nano /boot/config.txt

um die Zeile dtparam=audio=on nach #dtparam=audio=on zu ändern.

Dann neu starten und weiter:

Software-Installation

git clone https://github.com/jgarff/rpi_ws281x
cd rpi_ws281x/
sudo scons
cd python
sudo python setup.py build
sudo python setup.py install

Test-Script zur Steuerung mit python

Ich habe gemäß Anleitung einen Editor mit sudo nano examples/strandtest.py gestartet und die Zeile
LED_COUNT = 16 # Number of LED pixels. angepasst – ich habe ja 900 Pixel. Dann habe ich nochmal geprüft, dass der richtige Pin für die Daten konfiguriert ist:
LED_PIN = 18 # GPIO pin connected to the pixels (18 uses PWM!).

Schon konnte das Ganze getestet werden:

sudo PYTHONPATH=".:build/lib.linux-armv7l-2.7" python examples/strandtest.py

Und es begann zu leuchten! Dabei fiel mir auf, dass ich etwas übersehen hatte: Bei den von mir gekauften Stripes werden immer drei RGB-LEDs gemeinsam von einem Controller gesteuert; ich habe also effektiv nur 300 Pixel, die jeweils drei LEDs breit sind. Dammit!

„Na gut“ dachte ich mir, dann hat die Matrix halt nur 25x12 Pixel. Auch gut.

Also die eine Zeile nochmals angepasst: LED_COUNT = 300 # Number of LED pixels. Fertig.

Ansteuerung mittels QLC+

Das eigentliche Ziel war ja, die Matrix mit QLC+ verwenden zu können. Es war bekannt, dass dieses auf dem Raspberry lauffähig ist und dort per SPI Stripes mit dem WS8201-Chip steuern kann. Für meine WS8211-Stripes musste ich eine Lösung finden.

Hierfür hatte ich verschiedene Ansätze:

  1. SPI-Signal elektronisch konvertieren. Dazu fand ich zwei Schaltungen:
    1. SPI nach WS2811-Umsetzer mittels Standard-Logik
    2. WS2811 SPI Driver Using One Transistor And Passives
      Ich habe beides nicht versucht, da ich eine andere Lösung fand (siehe unten).
  2. SPI-Signal programmatisch umsetzen
    Hier war meine Idee einen Arduino als SPI-Slave zu benutzen, um die SPI-Signale zu empfangen und dann per Bit-Banging die LEDs zu steuern. Leider habe ich diesen Weg nicht hinbekommen; irgendwie hat der Arduino bei mir immer das erste Bit verschlafen. Außerdem ist die Taktrate des SPI-Signals zu groß.
  3. SPI softwareseitig umsetzen
    Die Idee hierbei wäre gewesen, QLC+ einen SPI-Port softwaremäßig vorzugaukeln, die Daten aber direkt im richtigen Format auszugeben. Ich hatte aber keinen Plan, wie dies zu implementieren sei.

Das alles wurde verworfen, als mir eine flexiblere Lösung einfiel:

Man kann mit Python problemlos ArtNet-Signale empfangen und mit einer modifizierten Version des strandtest.py-Programmes die Matrix steuern!

Quellcode-Schnipsel Das resultierende Python-Script kann dann einfach aufgerufen werden:

cd ~
sudo PYTHONPATH="rpi_ws281x/python/build/lib.linux-armv7l-2.7/" python artnet.py --brightness=255 -c

Dabei ist der Pfad rpi_ws281x/python/build/lib.linux-armv7l-2.7/ durch das entsprechende Verzeichnis (siehe → Software-Installation) zu ersetzen. Das Script ist auf meine Hardware zugeschnitten: Die LED-Matrix ist in QLC+ auf zwei Universen mit je 150 RGB-Spots verteilt, die als Art-Net-Universen 0 und 1 über das LAN bespielt werden. Das Script empfängt entsprechend nur Daten aus diesen Universen und schreibt für Universum 0 auf die LEDs 1-150 und für Universum 1 auf die LEDs 151-300.

Für andere Hardware muss das Script entsprechend angepasst werden.

Performance

Mein erster Aufbau nutzte einen Raspberry Pi Model 1. Hier musste ich leider feststellen, dass dieser zu langsam ist, um die Signale vom QLC+ in Echtzeit umzusetzen. Ich habe daraufhin das Ganze auf einem Raspberry Pi 3 eingerichtet. Und was soll ich sagen: es flutscht!

1) WS2811, WS2812 und WS2812B sind kompatibel. Es handelt sich um verschiedene Bauformen mit dem gleichen Controller

Neuen Kommentar hinzufügen

Eingeschränktes HTML

  • Erlaubte HTML-Tags: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Zeilenumbrüche und Absätze werden automatisch erzeugt.
  • Website- und E-Mail-Adressen werden automatisch in Links umgewandelt.