Motiviert durch den komplizierten Farbwechsel meiner Burg wollte ich schon immer verstehen, wie der viel einfachere Farbwechsel mit HSV-Farben umzusetzen ist. Dank Norberts Hilfe beim Oktober-Stammtisch 2023 konnte ich das Rätsel nun endlich knacken und lasse euch wie im Forum versprochen daran teilhaben.
— Michael 2023/11/07
Der HSV-Farbraum beschreibt den Ort einer Farbe innerhalb eines Kegels. Zum besseren Grundverständnis eignet sich der entsprechende Artikel auf Wikipedia.
Da bei der MobaLedLib keine Werte in Prozent eingeben werden können, wird dieses Farbsystem mit den 8bit (0-255) umgesetzt, die die FastLED Bibliothek* zur Verfügung stellt. Daraus ergeben sich dann folgende Werte:
*) Link zur FastLED-Beschreibung: FastLED-HSV-Colors
Der wichtigste Wert ist selbstverständlich der Farbwert selbst (Hue), denn Helligkeit und Sättigung beeinflussen jeden Farbwert in gleichem Maße.
Der folgende Verlauf zeigt, mit welchem Wert eine bestimmte Farbe zu erzielen ist. Für alle im Verlauf dargestellten Farben sind sowohl Sättigung als auch Helligkeit auf 255 eingestellt.
Mithilfe der HSV-Werte lassen sich alle Farben für eine RGB-LED sehr schnell definieren. Eine gute Hilfe bietet dabei das Farbtestprogramm von Harold.
Hier kann man Farbe und Sättigung durch Verschieben des Fadenkreuzes und die Helligkeit mithilfe des Reglers über dem Farbkreis einstellen. Die drei Werte kann der Pattern Configurator im Mode PM_HSV dann direkt interpretieren.
Gerade Farbverläufe, wie sie heute vielerorts zur Effektbeleuchtung eingesetzt werden, belegen mit RGB Farben etwas mehr Speicher auf dem Arduino. Zudem ist das ständige Hantieren mit den ganzen RGB-Werten (jeweils drei pro Farbe) viel umständlicher als mit einem Hue-Wert.
Ein ganz besonderer Vorteil ist es beispielsweise, sechs Einzel-LEDs im Pattern Configurator anzulegen und diese in sechs Zeilen des Programm Generators zu kopieren. Will man beispielsweise 18 LEDs damit ansteuern, kann man die jeweiligen Farben mit dem „Copy LED“-Befehl verfielfachen.
Nur Farbwert einstellen
Wenn man nur die Farbwerte programmieren möchte (Hue), kann man im Pattern Configurator etwas Speicher sparen (2), indem man nur einen Ausgabekanal angibt (1). In dem Fall steuert man mit dem ersten Ausgabekanal nicht wie sonst üblich den roten Chip auf einer WS2812, sondern den Farbwert aller drei Chips. Die fehlenden Ausgangskanäle Saturation und Value werden bei nur einem Ausgabekanal automatisch auf 255 (100%) gesetzt. Konkret sieht das so aus:
Alle Werte einstellen
Will man den Farbwert (Hue) und die Sättigung (Saturation) einstellen, wählt man zwei Ausgabekanäle, will man alles einstellen, wählt man alle drei Ausgabekanäle (1).
Eine Besonderheit stellt die Steuerung von Farbwert (Hue) und Helligkeit (Value) dar. Wer nur diese beiden Werte einstellen will, muss alle drei Ausgabekanäle auswählen, weil die Sättigung (Saturation) immer an Stelle zwei steht. In dem Fall muss bei der Sättigung auch ein Wert eingetragen werden (3), denn wenn die Zeile leer bleibt, geht das Programm vom Wert 0 aus. Die LED wäre also aus.
Vor- und Nachteile beider Methoden
Der Vorteil von Variante 1 liegt in der Einfachheit und beim Speicherbedarf der Programmierung. Schwierig wird es, wenn man diese Variante beispielsweise mit einer Goto-Tabelle ein- und ausschalten will.
Da die Ausgabekanäle 2 und 3 nicht programmiert sind, stehen diese immer auf 255, unabhängig vom Schaltzustand der Goto-Tabelle. Man wird die RGB-LED mit Variante 1 also nie ausschalten können. Entweder sie macht den definierten Farbton bzw. Farbwechsel (an) oder sie leuchtet rot (aus). Das liegt daran, dass der Hue-Wert „0“ in der oben gezeigten Skala der Farbe Rot entspricht.
Will man erreichen, dass die LED nach einer gewissen Zeit einfach ganz ausgeht, benötigt man die zusätzliche Zeile „Helligkeit“, die man dann entsprechend auf „0“ setzt. Es empfiehlt sich daher in den meisten Fällen, mit Variante 2 zu arbeiten.
Der automatische Farbwechsel startet beim eingegebenen Hue-Wert, läuft dann in der vorgegebenen Zeit zum nächsten Hue-Wert. Hat er diesen erreicht, wechselt die LED in umgekehrter Reihenfolge ihre Farbe zurück zum Startwert. Der Farbwechsel pendelt. Dieser Effekt eignet sich beispielsweise für eine gleichmäßige Beleuchtung eines Objekts, bei der man den Farben nicht „hinterher“ schaut.
Will man einen Farbwechsel erzeugen, bei dem alle Farben nacheinander an einem Objekt „vorbeiziehen“, eignet sich diese Methode nicht, da die Farben auf dem Objekt hin und her wandern würden. In dem Fall bedient man sich eines einfachen Tricks. Nach erfolgtem Farbwechsel von beispielsweise 0 nach 255 in zehn Sekunden lässt man die Farbe von 255 nach 0 in null Sekunden wechseln. Der Farbwechsel rotiert.
Da in dem Fall die Farben 0 (rot) und 255 (rot) annähernd identisch sind, kann das Auge diesen Sprung nicht erfassen. Dasselbe gilt selbstverständlich für einen Wechsel von 43 (gelb) über 255 (rot) nach 42 (gelb). Damit der Verlauf im Anschluss nicht über 255 zurück nach 43 wandert, definiert man diesen Vorgang mit null Sekunden.
Beispiel mit identischer Sättigung und Helligkeit:
Im Folgenden sind die sechs Grundfarben Rot (0), Gelb (42), Grün (84), Cyan (127), Blau (169) und Magenta (211) als Farbwechsel mit jeweils zwei Sekunden pro Farbton und einer Wechseldauer von 12 Sekunden je Durchgang dargestellt.
Das hier gezeigte Prinzip stellt alle Farben mit gleicher Sättigung und mit gleicher Helligkeit über den gesamten Farbwechsel dar. Will man die verschiedenen Farben in ihrer Helligkeit beeinflussen, muss man sie im Pattern Configurator vereinzeln. Ein Beispiel dazu folgt weiter unten.
Rotierender Farbwechsel beginnend mit Rot (255):
Rotierender Farbwechsel beginnend mit Gelb (42):
Rotierender Farbwechsel beginnend mit Grün (84):
Rotierender Farbwechsel beginnend mit Cyan (127):
Rotierender Farbwechsel beginnend mit Blau (169):
Rotierender Farbwechsel beginnend mit Magenta (211):
Beispiel mit unterschiedlicher Helligkeit:
Im folgenden Beispiel sind die Hue-Werte in 42er Schritte aufgeteilt, um jedem Farbwert eine andere Helligkeit zuzuordnen. Selbstverständlich ließen sich in dem Beispiel einige Spalten wieder zusammenlegen. Das Beispiel soll aber verdeutlichen, wie man parallel zum Farbverlauf einen angepassten Helligkeitsverlauf anlegen kann. So kann man beispielsweise einen Ausgleich zwischen intensivem Rot und schwachem Blau schaffen.
Mit diesem Verfahren ließe sich auch die Heartbeat-LED erstellen. Dazu müsste lediglich die Helligkeit pulsieren, während der Farbwert wechselt.
Richtung des Farbwechsels:
Im Programm Generator werden nun die sechs Pattern untereinander mit derselben Adresse angesteuert. Beginnt man mit Rot, so läuft der Farbwechsel von rechts nach links.
Stellt man Rot ans Ende, so läuft der Farbwechsel von links nach rechts.
Soll der Farbwechsel beispielsweise auf elf LEDs verteilt werden, bei denen die Farbe von der mittleren LED in beide Richtungen nach außen läuft, so kann man den eingangs erwähnten „Copy-LED“ Befehl nutzen, um Speicher zu sparen.
Dazu nimmt man den Verlauf von rechts nach links und setzt die Copy-Befehle in umgekehrter Reihenfolge drunter. Selbstverständlich lassen sich „Copy-LED“-Befehle auch zwischen die einzelnen LEDs setzen, um beispielsweise immer ein Pärchen mit derselben Farbe anzusteuern.
Wichtig: Die „Copy LED“-Befehle werden ohne Adresse im Programm Generator eingegeben.