ESP8266 NeoPixel Controller

Update 2020:

Mittlerweile haben wir eine professionelle Variante des Pixel Controllers mit WLED als Software gebaut.

cod.m WLAN Pixel Controller in Gehäuse
cod.m WLAN Pixel Controller V0.4

Nähere Informationen bei uns im Webshop und demnächst im Blog.
https://shop.codm.de/automation/pixel/30/wlan-pixel-controller


In unserem Bürogebäude in Haiger befindet sich seit ein paar Jahren im untersten Stockwerk eine Event-Gastronomie: http://arnos-event.de/
Arno, Wirt und Namensgeber der Bar, wollte für seinen Loungebereich eine besonderere Beleuchtung als in den restlichen Räumen.

Die Wahl fiel auf die bekannten Neopixel (WS2812) in RGBW, von denen wir ~1600 Stück in der Lichtkante der Decke montierten. Die Steuerung für den Stripe lag einige Zeit brach, aber nun hatte ich endlich Zeit, etwas passenden zusammenzubauen. Eines der Hauptprobleme ist bis heute, dass es sehr wenige Neopixel-Projekte gibt, die den Warmweiß-Kanal (RGBW) mitbenutzen oder überhaupt mit so vielen Pixel klarkommen. Die Adafruit-Neopixel-Library unterstützt die Anordnung (GRBW) zum Glück… benutzt wird sie aber offenbar von keinem Projekt, was auch die Steuerung von Außen zulassen würde.

Leßt bitte in jedem Fall den wirklich sehr nützlichen und wichtigen Adafruit-Neopixel-Überguide. Hier ist alles erklärt, was ihr über das Arbeiten mit Neopixeln wissen müsst.

Hard- & Software

Meine ersten Versuche begannen auf einem Arduino Mega (ATMega 2560, 8kb SRAM) und ein wenig selbst programmierten Code. Der Mega deswegen, weil er einerseits die richtige Spannung (5V) hat und andererseits genügend Speicher für die ~1600 Pixel bietet.

Für jedes Pixel mit RGBW werden 4 Byte im RAM des Mikrocontrollers benötigt. Das heißt also: 4 x 1600 = 6,4kb. Ein Arduino Uno (ATMega 328p) mit seinem 2kb SRAM wäre damit schlicht überfordert. Ich hatte nur nicht bedacht, dass ich für Transistionen zum Beispiel von einer Farbe zur anderen ja minimum das doppelte an Speicher haben muss.
Die Pixel leuchteten also erst mal einfarbig. Durch ein Ethernet-Shield hatte ich zumindest schon ein krudes HTTP-Interface implementiert, um den Mega von „Außen“ zu steuern, das hat mich aber natürlich wieder Speicher gekostet.

Im Laufe des letzten Jahres habe ich dann immer wieder mal nach Software oder Controllern gesucht, die den Anforderungen genügen würden. Selbst im allseits bekannten chinesischen Warenhaus waren – wenn schon für ~2000 Pixel – nur RGB-Controller zu haben.
Irgendwann bin ich dann auf Tobias Blum’s MCLightning V2 für den ESP8266 gestoßen und war begeistert. Tobias setzt die Adafruit-Neopixel-Library ein, die ja mit RGBW Pixeln klarkommt. Er implementiert zwar auch keine Nutzung des Warmweißkanals, was ich aber für eine vernünftige Steuerung über Websockets oder MQTT fürs erste völlig in Kauf nehmen kann. Zusätzlich dazu hat Tobias die WS2812FX Library eingebunden, die einen netten Haufen an vorgefertigten Effekten mitbringt.

Da ich nicht wusste, wie viele Neopixel ein ESP8266 wirklich verkraften kann, plante ich die ~1600 Pixel auf 5-6 Controller aufzuteilen.

Die Spannungsversorung wird von sechs 10A/5V-Meanwell Netzteilen bereitgestellt. Alle 2,5-3m gibt es eine erneute Einspeisung der Versorgungsspannug um den Spannungsabfall im Stripe zu kompensieren, inklusive dem im Überguide empfohlenem 1000µF Kondensators,.

Controller

Die Idee, einen eigene Controller-Platine zu bauen war schon vor Längerem geboren, jetzt war dann auch die passende Software da. Bei der Hardware gab es folgende Punkte zu beachten:

  • Anpassung Logikpegel 3,3V zu 5V
  • 1000µF Kondensator zum Schutz der NeoPixel
  • Durchleitung von mehreren Ampere (5V) auf der Platine
  • leichte Programmierbarkeit (FOCA-Header, Flashtaster, etc.)

Neopixel werden mit 800kHz gepulst angesteuert, was einen einfachen Levelshifter für die Anbindung an 3,3V ausschließt. Der Adafruit Guide bot dafür zum Glück eine Lösung: 74HCT125 Logic-Level Line Driver. Damit ist es möglich, ohne jeglichen „Hack“, wie zum Beispiel die Nutzung einer Diode, die 5V-Neopixel direkt anzusteuern.

Basierend auf meinem esp2866-proto-board habe ich dann eine einfache Schaltung als Neopixel-Controller entworfen.

Schaltung ESP8266 Neopixel Controller V0.3
ESP8266 Neopixel PCB V0.2

Leider gibt es den 74HCT125 nur in einer Vierkanalvariante. Für die Produktion dieser Platine probierte ich zum ersten Mal Multi-Cicruit-Boards aus, die eine DRC-Datei für Eagle zur Verfügung stellen und somit das Layouten vereinfachen. Die Qualität der Boards ist überragend (HAL Bleifrei), der Silkscreen könnte allerdings etwas besser sein.
Als Controller kommt der bekannte ESP-12F zum Einsatz, der auf die „Mutterplatine“ aufgelötet wird. Die Bauteilegröße ist 1206, um Bestückung von Hand so einfach wie möglich zu machen. Die Kondensatoren und Widerstände sind entweder von Panasonic oder Murata. Den kleinen Preisunterschied zu China-Bauteilen macht die Qualität wieder wett.

Die Platine habe ich zum ersten Mal komplett alleine per Reflow mit Heißluft gelötet. Vielen Dank auch noch mal an Andreas Draxler von Draxler-Elektronik für die geduldige Beantwortung all meiner Fragen und die Hilfe.

Ich habe wie immer viel gelernt, vor allem was man beachten muss und wie schnell sich zum Beispiel zu viel Lötpaste unter dem ESP-12F rächen kann. Für solche Arbeiten ist in jedem Fall ein Solder-Stencil zu empfehlen, den ich aus Kostengründen hierfür gespart habe.

Auftragen von Lötpaste und Bauteilen für das händische Reflow-Löten
ESP8266 Neopixel Controller Platine fertig gelötet

Installation

Da im Gebäude der Installation eine Loxone zur Hausautomatisierung zum Einsatz kommt, stellt sich die Frage der Anbindung. McLightning erlaubt die Steuerung per Websocket, HTTP und MQTT. Da ich ja mehrere Controller gleichzeitig steuern wollte, war der Plan einen RaspberryPi 3 mit eigenem WLAN für die Controller und node-red einzusetzen. Die Verbindung zu den Controllern wird über Websockets hergestellt, weil ich durch das deaktivieren von MQTT und OTA noch mal Speicher spare.

Das bringt uns dann zu der Frage, wie viele Pixel denn nun mit dem Board angesteuert werden können?

EIN Controller (ESP-12F) kann ALLE ~1600 RGBW Pixel mit McLightning ansteuern! Allerdings funktioniert dann das Webinterface auf dem Mikrocontroller nicht mehr komplett, da anscheinend nicht mehr genug Speicher für die Bereitstellung des JSON zur Steuerung der Animationsmodi bereitsteht.
Außerdem ist mir aufgefallen, dass die Effekte dann – trotz maximaler Geschwindigkeitseinstellung – sehr langsam ablaufen.

Ich habe also die Pixel auf drei Controller aufgeteilt und diese dann per node-red vorerst provisorisch verbunden und ein node-red-dashboard zur Steuerung eingerichtet. Die gewünschten Befehle werden einfach nur an alle verbundenen Controller übertragen. Später ist dann die Anbindung an den Loxone-Miniserver per node-red-contrib-loxone geplant.

Conclusion

Auch wenn die Controller unterschiedlich schnell und nicht synchron laufen, kann sich das Ergebnis denke ich sehen lassen. Die unterschiedlichen Geschwindigkeiten kommen durch die unterschiedliche Anzahl an Neopixeln pro Controller zu Stande, ergeben aber bei „Breath“ und „Chasing Rainbow“ auch ganz nette Effekte 😉

Der Regenbogen ist im Beitragsbild oben zu sehen. Hier mal der „Fireworks“-Effekt in Aktion:

Wenn die Nachfrage hoch genug ist, produziere ich gerne ein Paar Platinen und packe sie in den kommenden cod.m-Webshop. Wer eine haben möchte, meldet sich einfach.

Fragen, Feedback? Meldet euch 🙂