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 🙂

16 Kommentare

  1. Hallo Patrik,

    es freut mich, dass du aus dem Projekt etwas Schönes bauen konntest.
    Deinen detaillierten Blogbeitrag verlinke ich gerne auf der Projektseite. Der kann einigen Nutzern sicher weiterhelfen.
    Eigene Boards zu produzieren ist super, da reichen meine Skills nicht aus. Sollte es mal welche geben, hätte ich sicher Verwendung dafür.
    Eine Installation mit 1600 Pixeln an einem Board gab es bisher auch noch nicht, soweit mir bekannt ist. Hätte ehrlich gesagt auch nicht gedacht, dass das noch läuft (wg. Rechenpower und Speicher). Würde man den Code noch effizienter schreiben, könnte sogar das noch klappen. Krass.

    Viele Grüße
    Tobias

    1. So ab 600-700 Pixeln funktioniert das JSON was die Modes liefert nicht mehr. Steuerung per Websocket geht aber noch. Wie geschrieben, ohne OTA und MQTT. Mit so vielen Pixeln wird es auch wirklich sehr sehr langsam – nicht von der Reaktion, aber von der Animationsgeschwindigkeit. Bei 1600 Pixeln ist das RAM laut Arduino IDE bei ~71%.

      Ohne McLightning wäre das natürlich nicht möglich gewesen. Also gilt der Dank in erster Linie dir.
      Natürlich aber vielen Dank für dein Lob und ich freue mich über den Link.

      Ach, eine Sache die mir aufgefallen ist: Dinge wie „Theater Chase“ sieht man durch die indirekte Beleuchtung nicht. Es ist ja immer nur ein Pixel in einer Farbe. Da wäre es gut, wenn es drei Pixel wären um von der Entfernung den Effekt noch wahrzunehmen.

  2. Hallo, bin seit längerem dabei etwas ähnliches zu realisieren (für Fußboden, Treppenstufen und einen Schriftzug), allerdings nur mit max 671 WS2812 an einem Strang. Habe mir dazu ein kleines Shield für den Wemos D1 Mini gebaut, mit 1000µF (16V – kleineren hatte ich nicht) Elko, und 470 Ohm Widerstand, jedoch ohne Levelshifter. In meinen Versuchen klappte das auch ganz gut (mit deutlich weniger LEDs) Bei der großen Installation habe ich jedoch diverse probleme wie z.B. wenn ich mit der Helligkeit (je nach FX) _unter_ ein bestimmten Niveau komme, fängt alles an zu flackern. Ich habe bei den ca. 15m Stripe je eine Einspeisung am Anfang, in der Mitte und am Ende (hatte bei etwas ähnlichen mit einem Arduino Mega (ohne Elko/Widerstand) bei ca. 9,5m nur eine am Anfang und Ende und das Ding rennt… ).
    Nun bin ich mir nicht sicher, wo meine Probleme herrühren: vom 16V Elko, vom nicht vorhandenen Levelshifter, von der Einspeisung…

    Grüße aus Wunstorf
    Swen

    1. Hey Swen,

      der 16V Elko ist es auf jeden Fall nicht 😉 Da ist immer die maximale Spannung spezifiziert, funktioniert hier sogar mit der 50V Variante. Der fehlende Levelshifter kann es schon eher sein: Die Neopixel erwarten 5V Logik wenn sie mit 5V versorgt werden, du gibst ihnen aber 3,3V-Logik bei 5V Versorgung. Jeder WS2812 bereitet das Signal aber neu auf, wodurch du quasi ein Pixel opfern kannst und das dann zum „übersetzen“ degradieren kannst: https://hackaday.com/2017/01/20/cheating-at-5v-ws2812-control-to-use-a-3-3v-data-line/

      Bis dahin,
      Patrik

      1. Danke, sehr interessanter und hilfreicher Artikel. Ich habe es eben noch mal getestet mit einem Nano (schafft nur ca 350 WS2812) und einem Mega (schafft alle). Mit diesen liefen die WS2812FX Demos problemlos durch. Muss ich also noch einen Levelshifter mit einbauen.
        Glaub ich mach mal ein PCB für Wemos + WS2812…

  3. Hallo,
    Jetzt gibt es Sketches/Binaris für umterschiedliche ESP8266-Boards
    Programiert von einem Entwickler der sich auf github.com Aircoookie nennt.
    Das Lrojekt heißt WLED
    Unterstützt werden folgende Boards:

    – NodeMCU,Wemos D1 mini, ESP-12, alle
    ESP8266 mit 4Mb flash.

    – Alle ESP32 Boards

    – ESP01(PCB schwarz), die meisten
    Sonoff-Boards,
    ESP8265, alle ESP8266 mit 1MB-Speicher,

    – ESP01(PCB blau), ältere Sonoff-Boards,
    alle 8266-Boards mit 512KB-Speicher

    Features:
    – WS2812FX library
    – Über 100 Effekte
    – Farbpaletten, Kontraste, Geschwindigkeit
    … einstellbar
    – Unterstützt WS2812B, WS2813, SK2812,
    APA102, WS2801, LDP8806, TM1814,
    WS2811, WS2815, GS8208
    – WLED-App für Android und IOS
    – Webinterface
    – Integrierbar in Home Assistant
    – JSON und Web request APIs
    – MQTT
    – Blynk IoT
    – E1.31
    – Hyperion
    – UDP realtime
    – ALEXA
    – Synkronisiert Philips Hue Lights
    – Adalight
    – Synkronisation der Farben von mehreren
    WLED-Devices über UDP Notifier möglich
    – Infrarot fernbedienbar
    – Timers, Schedules, Makros, NTP, DSP
    – Anbindung eines Tasters mit Multifunktion
    – Ansteuerbar mit XLights
    – Unterstützung von Cronixie kit von Diamex
    – AP oder WLAN-Mode

    https://github.com/Aircoookie/WLED

    1. Hey Bernahrd. Danke, das weiß ich. Wir sind gerade dabei zu WLED für Loxone zu erweitern und haben auch schon eine neue Controller-Platine entwickelt.
      Oder was meintest du mit deinem Kommentar?

  4. Hallo Zusammen,

    das Projekt sieht Super aus, bin gerade dabei ein ähnliches auf die Beine zu stellen oder besser gesagt zum Laufen zu bringen. Ich habe 3200 RGBW LED´s und würde sie gerne mit einem Regenbogen Effekt betreiben. Das funktioniert soweit, leider musste ich dann feststellen das die WS2812FX bzw. Neopixel Library die Interrupts sperrt und somit der Serial Buffer nicht funktioniert. Somit kann ich vom KNX das am Serial Port angeschlossen ist nichts Lesen bzw. nichts sinnvolles. Hättet ihr da einen Ansatz für mich. Im Moment Setzte ich eine Teensy 3.2 ein.

    1. Hey Dennis,

      leider keinen direkten Vorschlag. Gibt es die Möglichkeit über UDP/MQTT/Websockets irgendwie ran zu kommen?
      Wir bauen gerade einen neuen Controller auf Basis von WLED zusammen mit dem Loxone-Forum: https://www.loxforum.com/forum/german/software-konfiguration-programm-und-visualisierung/260948-wled-projekt?p=262687#post262687

      Gäbe es vielleicht die Möglichkeit einen anderen GPIO am Teensy zu nehmen, damit der Interrupt frei wird? WLED nimmt GPIO2…

      Gruß,
      Patrik

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.