Arduino IR RGB Controller
In diesem Projekt habe ich mich daran versucht, einen gängigen RGB-Controller mit leichten Veränderungen nachzuprogrammieren. Diese RGB-Controller werden meist beim Bestellen von RGB-Bändern mitgeliefert und sind über eine ebenfalls mitgelieferte IR-Fernbedienung steuerbar. Es gibt zwei gängige Varianten: 24-Taste und 44-Taste. In diesem Projekt habe ich eine 24-Tasten Fernbedienung verwendet.
In das Programm habe ich einige Veränderungen gegenüber den bekannten RGB-Controllern eingebaut. Zum einen erfolgt der Farbwechsel immer über ein Crossfade von ca. einer Sekunde. Außerdem ist die Startfarbe immer ein Gelbton, ebenfalls innerhalb von einer Sekunde gefaded, um die Augen an den Lichtwechsel zu gewöhnen. Die automatischen Programme sind ebenfalls angepasst. Sie lassen sich im Programm einfach anpassen. Dazu später mehr.
Die Hardware
Im Folgenden werde ich die verwendete Hardware stichwortartig erläutern:
Controller
- Arduino Nano nachbau (XTWduino Nano)
- Mindestens Arduino Uno kompatibel
- Steckt auf einem angepassten Board, geht aber auch auf einem Steckboard
IR-Modul
- Typ: TSOP 31236
- Reichelt LINK
- A3 = Daten-Pin
- A0 = GND, Low geschaltet
- A1 = 5V, High geschaltet
RGB-Diode
- gemeinsamte Kathode an D8, D8 Low geschaltet
- Anoden an PWM Kanälen D5, D6, D9
RGB-Shield
- Link zur Bauanleitung
- Link zur Beschreibung
- Zum Anschluss von RGB-Bändern
- verbunden mit PWM Kanälen D5, D6, D9
- verbunden an PWM Kanal D10 (für PowerLED)
Fernbedienung
Die Software
Das Programm benötigt zwei Libraries:
- IR-Library (meist Vorinstalliert, bei Error siehe Anpassungen im Link)
- Crossfade-Library
Zu der IR-Library habe ich bereits einiges in dem verlinkten Artikel geschrieben. Eine wichtige Sache ist noch, dass die Library den Timer1 benutzt und auch resetet. Das wiederum bedeutet, das die ebenfalls an Timer1 hängenden PWM Kanäle D3 und D11 nicht verwendet werden können. Dies musste ich leidlich feststellen und mein Board anpassen. Der Timer ließe sich zur not auch auf Timer2 umstellen. Mehr dazu im verlinkten Artikel.
Die Crossfade-Library ist aus einem Arduino Artikel zum Thema Crossfade entstanden. Sie ermöglicht es unter anderem Farben zu definieren, und zwar nach dem Schema:
RGBColor white = RGBColor(100, 100, 100);
Die Werte werden in Prozent angegeben, das Maximum ist also 100.
Diese Farben können dann per Crossfade-Befehl oder per setColor-Befehl ausgegeben werden.
Funktionen der Library:
- RGBLED(int redPin, int greenPin, int bluePin, int hold, int wait, int commonAnode);
- void crossfade(RGBColor &color);
- void setColor(RGBColor &color);
- void setIntensity(int intensity);
- void setCrossfadeWait(int wait);
- void setCrossfadeHold(int hold);
In der Initialisierungsfunktion RGBLED werden in den ersten drei Parametern die einzelnen Pins angegeben, an denen die Farben liegen. Danach folgen die Festlegung der Standartwere für Hold und Wait. Zuletzt kann man noch festlegen ob die RGB-LED eine gemeinsame Anode (int = 1) oder Kathode (int = 0) hat. Dies ist wichtig, da bei einer gemeinsamen Anode die PWM-Werte umgekehrt werden müssen.
Mit Wait (gesetzt über setCrossfadeWait oder Standardwert) kann man die Länge eines Fadeübergangs einstellen. Diese Zeit ist ungefähr in Sekunden zu verstehen.
Mit Hold (setCrossfadeHold oder Standardwert) kann man eine Wartezeit nach einem Fadevorgang festlegen. In einem Programm mit mehren Fadevorgängen also nützlich, um die Farben eine weile Verweilen zu lassen.
Sowohl Wait als auch Hold verwenden Delays. Also sollte man vorsichtig bei zeitkritischen Vorgängen sein.
Mit setIntensity legt man die gesamte Helligkeit fest. Das Maximum ist 100. Die Änderungen der Helligkeit wird erst sichtbar, wenn ein neuer setColor oder crossfade Befehl ausgeführt wird.
Mögliche Anpassungen im Programm
Ich werde hier das Programm nicht im Detail analysieren, allerdings gebe ich hier ein paar Möglichkeiten an, das Programm nach persönlichen Wünschen anzupassen:
IR-Codes anpassen:
Vermutlich haben Sie eine andere Fernbedienung die Sie nutzen Möchten. Wenn die DEBUG-Defnition am Anfang 1 ist (Standardwert), werden verschiedene Meldungen über die serielle Schnittstelle an das Terminal übergeben. Unter anderem auch der Code eines empfangenen IR-Signals. Diesen Code können Sie dann einfach an die gewüschte Stelle der select Case-Abfrage in der sIRGet()-Routine einfügen.
Farben ändern:
Auf meiner verwendeten Fernbedienung sind verschiedene Töne zu den Grundfarben angegeben. Ich habe diese Töne in Arrays behandelt (z.B. toneRed[5]). Möchten Sie diese Töne anpassen müssen Sie die Farbe des entsprechenden Index verändern.
Ein Paar Farben sind ebenfalls als Fixwerte angegeben. Diese Farben lauten: black, white, red, green, blue, yellow.
Die Startfarbe yellow ist in der Setup-Routine festgelegt.
Programme:
Programme sind in Arrays von Farben angegeben. In diesem Programm gibt es vier Varianten (programmOne-programmFour). Die größe des Arrays sowieo die Farben in dem Array können leicht angepasst werden. Zusätzliche Parameter für die Programme sind (am Beispiel programmThree):
- Fadedauer: programmThreeWait = 30; //Speed of Programm (in ca. Seconds)
- Holddauer: programmThreeHold = 0; //Hold after Steps
- Wiederholung: programmThreeRepeat = false;
und stehen jeweils unter dem Programmarray.
Download des Arduino Programms
Ein Problem gibt es mit dem Programm. Wenn ein Programm gestartet wurde, lässt es sich aufgrund der delays nicht direkt unterbrechen. Das bedeutet, dass ein Fadevorgang, also ein Schritt eines Programms, erst durchlaufen werden muss, bevor der Programmdurchlauf unterbrochen werden kann. Die Dauer die gewartet werden muss hängt also vor allem von den Variablen Hold und Wait des Programms ab.