MCLC ist ein OpenSource Projekt um ein WS2811 RGB LED Strip mit einem Arduino zu steuern. Das Hauptziel ist die Darstellung und Steuerung von unterschiedlichen Lichteffekten für MultiCopter. Allerdings kann es auch mit wenigen Code-Anpassungen für andere Projekte genutzt weden, wie z.B. MoodLamps. Das Projekt befindet sich noch in der Entwicklungsphase, in welcher der Fokus auf der Entwicklung von neuen Features liegt und nicht auf der Benutzerfreundlichkeit.
Ich habe mich entschieden, die Bibliothek FastSPI_LED2 zu benutzen, von der es mit der Weile einen Release Candidate 1 gibt. Die Bibliothek im direkten Vergleich zum Vorgänger wesentlich schlanker und die Timings sind näher an den Spezifikationen der LED-Strips. Nach dem Umstieg der Beta zum RC1 der Bibliothek, kann ich auf eine eigene Definition der Strukturen für RGB bzw. HSV Farben verzichten. Mein Resepkt und Dank gilt dem Entwickler dieser Bibliothek, da sie sehr einfach zu benutzen ist und ohne die Bibliothek hätte ich das Projekt nicht gestartet. https://code.google.com/p/fastspi/
Nun werde ich in Kürze die Anforderungen, die Code-Struktur, die Effekte und die Einstellungen erklären.
Um den Sketch zu kompilieren, sind neben der aktuellen Arduino IDE, zwei Bibliotheken erforderlich:
SerialCommand: https://github.com/kroimon/Arduino-SerialCommand
FastSPI_LED2: http://code.google.com/p/fastspi/
An Hardware wird neben einem Arduino natürlich auch ein WS2811 RGB_LED-Strip benötigt. Optional werden momentan ein RC-Empfänger und eine MultiWii-FC als Steuerung unterstützt.
Ich persönlich benutzte einen Arduino Nano v3, einen kleinen 6-Kanal DSM2 Empfänger und eine MultiWii-FC mit Gyro, Accelerometer, Magnetometer und Barometer. Als Test-Konfiguration benutzte ich einen Quadrocopter mit jeweils 6 LEDs pro Arm.
Am MultiCopter sollte der LED-Strip mit einem BEC mit 5V versorgt werden. Je nach Anzahl der LEDs ist die maximale Stromstärke des BEC zu wählen. Maximal braucht jede LED bei voller Helligkeit und weisser Lichtfarbe 60mA. D.h. in meiner Test-Konfiguration mit 4 Armen mit je 6 LEDs (=24 LEDs) werden 24*60mA = 1440 mAh, also etwa 1,5 A benötigt. Zum Testen und Entwickeln am PC benutzte ich ein 5V Steckernetzteil mit 2,5 A, da die Leistung eines USB-Ports mit maximal 500mA (USB2) bzw. 900mA (USB3) nicht ausreicht.
Wie die RGB-Strips genau verkabelt werden, dazu gibt es im Internet genügend Informationen. Hier kann ich z.B. auf die gute Kurzanleitung von MWC-Light RGB verweisen. Dort wird sehr schön und bebildert erklärt, wie die RGB-LED-Strips zu verkabeln sind.
Nun auch von mir eine Zeichnung, wie die LED-Strips als auch ein MultiWii-Board oder ein RC-Empfänger anzuschliessen sind.
Die Zeichnung verwendet die Standard-Pins in der 'config.h'.
Der LED-Pin als auch der RC-Pin können in der 'config.h' angepasst werden.
Der Anschluss eines RC-Empfängers oder MultiWii-boards ist optional.
Der Quellcode ist in mehere Dateien unterteilt.
MultiCopterLightControl.ino
Hauptdatei mit setup() und loop() Methoden. Hier werden auch die Lichteffekte aufgerufen.
In dieser Datei sind auch die grundlegenden Methoden zur Ansteuerung der LEDs implementiert.
LedEffects.ino
Diese Datei beinhaltet die Methoden, welche spezielle Lichteffekte realisieren.
Colors.ino
Hier wird die Farbverwaltung realisiert.
Das Projekt verwendet eine Farbpalette von maximal 16 Farben.
Diese 16 Farben können vollkommen frei definiert werden.
Zusätzlich können 8 verschiedene Led-Konfigurationen gespeichert werden.
Jeder LED wird hier jeweils ein Farbe aus der Farbpalette zugeordnet.
Diese Art der Farbverwaltung benötigt sehr wenig Speicherplatz und ermöglicht in Zukunft einige interessante Effekte.
config.h
Diese Datei ist angelehnt an die MultiWii Software.
Diese Datei muss entsprechend euren Anforderungn angepasst werden.
Die folgenden Dateien implementieren jeweils eine mögliche Variante, die LEDs und die Lichteffekte zu steuern.
InputGUI.ino
Diese Option ist standardmässig aktiviert, wenn ihr den Quellcode aus dem GitHub ladet.
Hier wird die Konfiguration über eine GUI implementiert.
D.h. ihr ladet den Sketch per USB auf den Arduino und könnt dann mit der GUI die Farben konfigurieren.
Die GUI findet ihr im Ordern 'MclcConf'.
Dort gibt es für die Betriebssysteme Windows, Linux und MacOS jeweils einen Unterordner.
In diesen Unterordnern ist jeweils eine ausführbare Datei, welche die GUI für die Konfiguration startet.
Bitte schliesst den Arduino mit dem Sketch VOR dem Start der GUI an den PC an.
In der GUI müsst ihr dann den Port des Arduinos wählen.
InputTerminal.ino
Hier wird die Konfiguration über ein Serial Terminal implementiert.
D.h. ihr ladet den Sketch per USB auf den Arduino und könnt dann mit dem Serial Monitor der Arduino IDE alles konfigurieren.
Die Baud Rate beträgt 115200.
InputRC.ino
Hiermit kann ein Kanal eines RC-Empfänger als Steuerung benutzt werden.
Dazu wird der Empfänger an den entsprechen Pin angeschlossen, welcher in der Datei config.h eingestellt werden kann.
Es gibt dann einen Modus für LOW (650 >= rc > 1350), MID (1350 >= rc < 1700), HIGH (rc >= 1700) und NO_CONNECTION (rc < 650).
InputMSP.ino
Hier wird die Kommunikation mit dem MultiWii Serial Protocol implementiert.
Die MultiWii FC wird an die RX und TX Pins des Arduino angeschlossen.
Dazu entsprechend RX vom Arduino an TX der FC anschliessen und TX vom Arduino an RX der FC.
Falls eurer Arduino oder euere FC mehere RX/TX Pins hat, müsst ihr euch entsprechend erkundigen, welche ihr benutzten müsst.
Generelle Einstellungen
NUM_ARMS = Anzahl der Arme eures Multikopters
LEDS_PER_ARM = Anzahl der LEDs pro Arm
LED_PIN = Digitaler Arduino PIN, an welcher der erste LED-Strip angeschlossen werden muss
Steuerungs-Einstellugnen (nur jeweils ein Modus gleichzeit wählbar)
INPUT_TERMINAL = Konfiguration / Steuerung der LEDs über den Serial Monitor
INPUT_GUI = Konfiguration / Steuerung der LEDs über die GUI MclcConf
INPUT_RC = Steuerung der LEDs über einen Kanal eines RC-Empgängers
INPUT_MSP = Steuerung der LEDs über das MultiWii Serial Protocol
RC_PIN = Digitaler Arduino Pin, an welcher ein Kanal des Empfängers angeschlossen werden muss
REQUEST_DELAY = Intervall in Millisekunden, in welcher die MultiWii-FC nach neuen Werten gefragt wird
REQUEST_MOTORS = Falls aktiviert, werden zusätzlich zu dem Flugmodus, auch die Motoroutputs abgefragt
Zusätzlich können die unterschiedlichen Modi der unterschiedlichen Steuerungs-Varianten auf einheitliche Modi MODE_0 bis MODE_3 gemappt werden. In der loop()-Methode in der Datei "MultiCopterLightControl.ino" können dann grundsätzlich die Modi MODE_0 bis MODE_3 benutzt werden.
Per Terminal:
setR N : setzt den Rot-Wert für die aktuelle Farbe, 0 <= N < 256
setG N : setzt den Grün-Wert für die aktuelle Farbe, 0 <= N < 256
setB N : setzt den Blau-Wert für die aktuelle Farbe, 0 <= N < 256
setColor N : weist die aktuelle Farbe dem N.ten Platz in der Farbpalette zu, 0 <= N < 16
getColor N : setzt die aktuelle Farbe auf die N.te Farbe der Farbpalette, 0 <= N < 16
printColor : gibt die aktuelle Farbe in der Konsole aus
setConfig N : wählt die aktuelle LED-Konfiguration, 0 <= N < 8
saveColors : Speichert die aktuelle Farbpalette im EEPROM
saveLeds : Speichert die aktuellen Led-Konfigurationen
clearEeprom : Löscht das EEPROM und löscht damit die Farbpalette und LED-Konfiguartionen im Speicher
setArm N : weist die zuletzt gesetzte/geladene Palettenfarbe dem N.ten Arm zu, 0 <= N < NUM_ARMS
setLed N : weist die zuletzt gesetzte/geladene Palettenfarbe der N.ten LED zu, 0 <= N < NUM_LEDS
m+ : Wählt den nächsten Modus
m- : Wählt den vorherigen Modus
d N : Setzt die Verzögerung eines Effekts auf N Millisekunden
Bei der Erst-Konfigurationen solltet ihr wie folgt vorgehen:
- Zuerst einmal den Speicher löschen mit "clearEeprom"
- Dann kann die Farbpalette erstellt werden
- Die aktuelle Farbe mit "setR", "setG" und "setB" auf die gewünschte Farbe setzten
- Die aktuelle Farbe einem Paletten-Platz zuordnen mit "setColor"
- Die beiden Schritte solange wiederholen, bis entweder alle 16 Palettenplätze belegt sind oder alle benötigten Farben gespeichert sind
- Die Farbpalette speichern mit "saveColors"
- Nachdem die Farbpalette erstellt ist, können LED-Konfigurationen bzw. Muster erstellt werden
- Mit "setConfig" die aktuelle LED-Konfiguration wählen
- Mit "getColor" eine Farbe der Palette wählen
- Die Farbe mit "setArm" oder "setLed" einem Arm oder einer LED zuweisen
- Die Schritte solange wiederholen, bis alle LEDs und alle gewünschten Konfigurationen eingerichtet sind
- Die LED-Konfigurationen speichern mit "saveLeds"
Per GUI:
- Im Sketch INPUT_GUI aktivieren und alle anderen INPUT Varianten deaktivieren und den Sketch auf den Arduino laden
- Den Arduino mit MCLC an den USB-Port anschliessen, warten bis er vom Betriebssystem erkannt wurde und anschliessend MclcConf starten
- Dann den Port des Arduino auswählen, z.B. COM 6
- Sobald die Verbindung aufgebaut wurde, werden die Einstellungen aus MCLC ausgelesen und angezeigt
- Mit einem Klick auf einen farbigen Button aus der Farbpalette (oben) können die entsprechenden Farben ausgewählt und mit dem ColorPicker verändert werden
- Wenn die Farben wie gewollt eingestellt sind, kann man sie mit "Set Colors" übertragen und testen oder mit "Save Colors" ins EEPROM speichern
- Danach kann man den LEDs diese Farben zuordnen
- Mit einem Klick auf eine Palettenfarbe, wird diese ausgewählt
- Mit einem Klick auf eine LED (unten) kann die ausgewählte Farbe der LED zugeordnet werden
- Analog zu den Farben, kann die aktuelle Konfiguration mit "Set Config" auf den Arduino übertragen oder mit "Save Config" im EEPROM gespeichert werden.
- Mit "Get Colors" bzw. "Get Configs" können wieder die Farben/Konfigurationen aus dem Arduino EEPROM geladen werden.
- Mit "Next Mode/Config" und "Prev Mode/Config" kann der nächste Lichtmodus bzw. LED-Konfiguration geladen werden
oneColor(CRGB color, int DELAY)
Auf allen LEDs wird eine Farbe dargestellt.
showCurrentColors(int iConfig, int DELAY)
Die LEDs leuchten in den Farben entsprechend der gewählten Konfiguration.
police(CRGB color1, CRGB color2, int DELAY)
Die LEDs blinken (pro Arm) abwechseln in den beiden angebenen Farben.
runningLed(int iConfig, CRGB* blinkColor, int blinkDelay, boolean bounce, int length, int DELAY)
Ein LED-Streifen läuft von aussen nach innen (auf jedem Arm) bzw. wieder zurück.
Es muss eine LED-Konfiguration angegeben werden, sodass die LEDs in den entsprechenden Farben leuchten.
"blinkColor" kann NULL sein, oder man gibt explizit eine Farbe an.
Falls "blinkDelay" > 0 ist, wird am Ende einer Animation (wenn der LED-Streifen die Arm-Enden erreicht) ein Blitz ausgelöst.
Falls "blinkColor" NULL ist, wird für den Blitz die Farben der Konfiguration benutzt, ansonsten blitzen alle LEDs in der gewählten Farbe auf.
"bounce" gibt an, ob der Streifen hin und her laufen soll, oder nur von innen nach aussen.
"length" gibt die Länge des LED-Streifens an, welcher hin und her läuft.
showBrightness(int iConfig, int brightness, int DELAY)
Stellt die Farben der gewählten Konfiguration mit einer gewählten Helligkeit dar.
pulseBrightness(int iConfig, int startBrightness, int endBrightness, int steps, int DELAY)
Fadet die Helligkeit der LEDs zwischen den beiden gewählten Werte.
Auch hier muss wieder eine Konfiguration angegeben werden.
"steps" gibt an, wie fein/grob das Fading sein soll.
Falls die LEDs andere Farben anzeigen als per Terminal oder GUI eingestellt, dann ist die interne Verdrahtung des eures LED-Strips anderes als bei den von mir verwendeten.
Es gibt wohl keine Norm oder einige Hersteller halten sich nicht daran.
Die von mir verwendeten LED-Strips verwenden die Reihenfolge GRB.
Falls eure eine andere interne Reihenfolge haben könnt ihr das in der Datei 'MultiCopterLightControl.ino' anpassen.
Dort müsst ihr die Zeile
LEDS.addLeds<WS2811, LED_PIN, GRB>(leds, NUM_LEDS);
z.B. ersetzen durch
LEDS.addLeds<WS2811, LED_PIN, RGB>(leds, NUM_LEDS);
, falls die Reihenfolge bei euch RGB ist.
Welche Reihenfolge bei euch die richtigen Farben erzeugt, könnt ihr einfach austesten.
Es gibt lediglich 6 möglichen Reihenfolgen: RGB, RBG, GRB, GBR, BRG und BGR.
Evtl. werde ich diese Konfiguration in Zukunft ebenfalls in die 'config.h' aufnehmen.