DMX RGB LED im Freien
Komponenten und Verbrauchsmaterialien
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Apps und Onlinedienste
| ||||
|
Über dieses Projekt
Hallo Leute, ich habe schon viele DMX-gesteuerte Lichter im Haus, wollte aber auch einige draußen haben. Da diese RGB DMX Lampen recht teuer sind (eine ca. 200 - 300€) habe ich nach Alternativen gesucht.
Was ich gefunden habe, waren diese wirklich billigen RGB-LED-Fluten mit IR-Steuergeräten. Das sind etwa 8€ / 10W RGB.
Also musste ich diese nur umwandeln, um DMX zu verstehen.
Um die Kosten und den benötigten PCB-Platz gering zu halten, haben alle 5 Floods nur ein Arduino-Gehirn in einer separaten Box. Jede Leuchte verfügt über eine 3-Kanal-PWM-getriggerte Konstantstromquellen-Leiterplatte und ein D-Sub-9-Anschlusskabel. Diese Platine passt perfekt in das kleine Fach an der Unterseite der Leuchte. Jeder Kanal für die LED ist auf 350mA eingestellt.
Alle 5 Lichter sind mit dem Arduino und dem drahtlosen DMX-Empfänger an eine zentrale Box angeschlossen
In dieser Box befinden sich:
- 12V 3,5A Netzteil
- 12V - 5V Handyladegerät
- Ardunino Nano auf eigener Platine für DMX (RS485) Konverter
- Ardufruit 16-Kanal-PWM-Erweiterung über I2C
- Drahtloser DMX-Empfänger
- Verteilerplatinen für D-Sub-Flachbandkabel
- Viel Heißkleber, um es wasserdicht zu machen
Es hat bisher 3 Wochen bei starkem Regen überstanden, der Karton näht und die Versiegelung ist wasserdicht.
Die Platine, auf der ich den Nano montiert habe, ist universell für alle meine DMX-Projekte, kann die DMX-Bus-Signale auf den Ardunio umwandeln und ist auch ein Breakout für den I2C-Bus und / oder alle 6 PWM-Kanäle mit MosFETs (BUZ11). Ich habe es auch mit den MosFETs verwendet, um interne Lampen auf DMX zu aktualisieren.
Insgesamt ergeben sich also 5 einzeln ansteuerbare Lampen (hier für mein Glasgeländer), die per Wireless DMX über einen PC / Handy angesteuert werden.
In den Downloads findet ihr die Eagle-Dateien für die Platinen, meinen Copy&Paste Arduino Sketch und die Definitions-Datei für die Lampe in der PC-Steuerungssoftware Freestyler.
Die DMX-Adressen sind hartcodiert auf Startadresse 200 und dann 5x 3 Kanäle R, G und B ohne Dimmerkanal.
In der Arduino-Sketch musste ich die Werte für die roten Kanäle manipulieren, da die rote LED viel heller ist als grün und blau und sich daher nicht zu reinem Weiß mischen würde.
Alternativ gibt es eine Skizze zum Testen / Bugfixing, bei der man die RGB-Werte direkt über das Ardunio IDE-Terminal einstellen kann
Insgesamt liegen die Gesamtkosten für 5 Lampen bei ca. 110€, alle Teile (außer Leuchtmittel) stammen von Reichelt.de, alle Platinen von platinenbelichter.de (große Empfehlung!)
Fühlen Sie sich frei, alles zu ändern oder zu optimieren!
Tschüss,
Sebastian
Code
- DMX-Version
- Version mit USB-Eingang
- Gerät für Freestyler
DMX-VersionArduino
Steuerprogramm für 5x 3Kanal RGB Lichter// 15 PWM auf 5 RGBs LEDs / DMX Start-Adresse 200 / 5x 3Kanal RGB#include#include #include Adafruit_PWMServoDriver pwm =Adafruit_PWMServoDriver();#define DMX_SLAVE_CHANNELS 15DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS );int channel[16];int channelOut[16];int value[16];int ch =0;int red =0;int green =0;int blue =0;void setup() { Wire.begin(); // i2c-Bus beitreten (Adresse optional für Master) pwm.begin(); pwm.setPWMFreq(120); // Dies ist die maximale PWM-Frequenz#ifdef TWBR // I2C-Bitrate speichern uint8_t twbrbackup =TWBR; // muss nach Aufruf von Wire.begin() geändert werden (innerhalb von pwm.begin()) TWBR =12; // auf 400KHz upgraden!#endif // DMX einrichten dmx_slave.enable(); dmx_slave.setStartAddress (200); // setze alle PWM auf hoch -> LEDs aus pwm.setPWM (0, 4096, 0); pwm.setPWM(1, 4096, 0); pwm.setPWM(2, 4096, 0 ); pwm.setPWM(3, 4096, 0 ); pwm.setPWM(4, 4096, 0); pwm.setPWM(5, 4096, 0); pwm.setPWM(6, 4096, 0); pwm.setPWM(7, 4096, 0); pwm.setPWM(8, 4096, 0); pwm.setPWM(9, 4096, 0); pwm.setPWM(10, 4096, 0); pwm.setPWM(11, 4096, 0); pwm.setPWM(12, 4096, 0 ); pwm.setPWM(13, 4096, 0 ); pwm.setPWM(14, 4096, 0);}void loop() { // DMX-Eingang für (int j =0; j <=14; j++) { channel[j] =dmx_slave.getChannelValue (j+1); } // Feinabstimmung der Farbe channelOut [0] =map (channel [0], 0, 255, 0, 1400); // rote LED reduzieren 1 channelOut[1] =map(channel[1], 0, 255, 0, 4095); channelOut[2] =map(channel[2], 0, 255, 0, 4095); channelOut[3] =map(channel[3], 0, 255, 0, 1400); // rote LED reduzieren 2 channelOut[4] =map(channel[4], 0, 255, 0, 4095); channelOut[5] =map(channel[5], 0, 255, 0, 4095); channelOut[6] =map(channel[6], 0, 255, 0, 1400); // rote LED reduzieren 3 channelOut[7] =map(channel[7], 0, 255, 0, 4095); channelOut[8] =map(channel[8], 0, 255, 0, 4095); channelOut[9] =map(channel[9], 0, 255, 0, 1400); // rote LED reduzieren 4 channelOut[10] =map(channel[10], 0, 255, 0, 4095); channelOut[11] =map(channel[11], 0, 255, 0, 4095); channelOut[12] =map(channel[12], 0, 255, 0, 1400); // rote LED reduzieren 5 channelOut[13] =map(channel[13], 0, 255, 0, 4095); channelOut[14] =map(channel[14], 0, 255, 0, 4095); // Werte zuweisen für (int i =0; i <=14; i++) { if (channelOut[i] ==0) { pwm.setPWM(i, 4096, 0); aufrechtzuerhalten. Else { pwm.setPWM (i, 0, 4095 - channelOut[i]); } }}
Version mit USB-EingangArduino
Debug-Version mit direkter Eingabe für Lampen-Nr. und RGB-Werte// 15 PWM auf 5 RGBs LEDs#include#include // So genannt, verwendet es die Standardadresse 0x40Adafruit_PWMServoDriver pwm =Adafruit_PWMServoDriver();// Sie können Rufen Sie es auch mit einer anderen gewünschten Adresse auf //Adafruit_PWMServoDriver pwm =Adafruit_PWMServoDriver(0x41);int channel[15];int channelOut[15];int value[15];int ch =0;int red =0;int green =0;int blau =0;void setup() { Wire.begin(); // i2c-Bus beitreten (Adresse optional für Master) Serial.begin (9600); Serial.println ("Warten auf Eingabe:LED, R, G, B, [jeweils 0-255]"); pwm.begin(); pwm.setPWMFreq(120); // Dies ist die maximale PWM-Frequenz // Wenn Sie das Zeug wirklich beschleunigen möchten, können Sie in den Modus "schneller 400-kHz-I2C" wechseln // einige i2c-Geräte mögen das nicht so sehr, also wenn Sie den Bus teilen, sehen Sie sich an / / out for this!#ifdef TWBR // I2C-Bitrate speichern uint8_t twbrbackup =TWBR; // muss nach Aufruf von Wire.begin() geändert werden (innerhalb von pwm.begin()) TWBR =12; // Upgrade auf 400KHz!#endif // setze alle PWM auf hoch -> LEDs aus pwm.setPWM(0, 4096, 0); pwm.setPWM(1, 4096, 0); pwm.setPWM(2, 4096, 0 ); pwm.setPWM(3, 4096, 0 ); pwm.setPWM(4, 4096, 0); pwm.setPWM(5, 4096, 0); pwm.setPWM(6, 4096, 0); pwm.setPWM(7, 4096, 0); pwm.setPWM(8, 4096, 0); pwm.setPWM(9, 4096, 0); pwm.setPWM(10, 4096, 0); pwm.setPWM(11, 4096, 0); pwm.setPWM(12, 4096, 0 ); pwm.setPWM(13, 4096, 0 ); pwm.setPWM (14, 4096, 0);}void loop () {//Eingabefarbe while (Serial.available ()> 0) { ch =Serial.parseInt (); rot =Serial.parseInt(); grün =Serial.parseInt(); blau =Serial.parseInt(); if (Serial.read() =='\n') {} ch =einschränken(ch, 0, 4); rot =einschränken (rot, 0, 255); grün =einschränken (grün, 0, 255); blau =einschränken (blau, 0, 255); // drucke die drei Zahlen:Serial.print ("neue Werte:"); Seriendruck ("LED="); Serial.print (ch, DEZ); Serial.print (" R ="); Serial.print (rot, DEZ); Serial.print (", G="); Serial.print (grün, DEZ); Serial.print (", B="); Serial.println (blau, DEZ); } Schalter (ch) { Fall 0:channel[0] =rot; Kanal[1] =grün; Kanal [2] =blau; brechen; Fall 1:Kanal [3] =rot; Kanal[4] =grün; Kanal[5] =blau; brechen; Fall 2:Kanal[6] =rot; Kanal[7] =grün; Kanal[8] =blau; brechen; Fall 3:Kanal[9] =rot; Kanal[10] =grün; Kanal[11] =blau; brechen; Fall 4:Kanal[12] =rot; Kanal[13] =grün; Kanal[14] =blau; brechen; } // Feinabstimmung der Farbe channelOut [0] =map (channel [0], 0, 255, 0, 1400); // rote LED reduzieren 1 channelOut[1] =map(channel[1], 0, 255, 0, 4095); channelOut[2] =map(channel[2], 0, 255, 0, 4095); channelOut[3] =map(channel[3], 0, 255, 0, 1400); // rote LED reduzieren 2 channelOut[4] =map(channel[4], 0, 255, 0, 4095); channelOut[5] =map(channel[5], 0, 255, 0, 4095); channelOut[6] =map(channel[6], 0, 255, 0, 1400); // rote LED reduzieren 3 channelOut[7] =map(channel[7], 0, 255, 0, 4095); channelOut[8] =map(channel[8], 0, 255, 0, 4095); channelOut[9] =map(channel[9], 0, 255, 0, 1400); // rote LED reduzieren 4 channelOut[10] =map(channel[10], 0, 255, 0, 4095); channelOut[11] =map(channel[11], 0, 255, 0, 4095); channelOut[12] =map(channel[12], 0, 255, 0, 1400); // rote LED reduzieren 5 channelOut[13] =map(channel[13], 0, 255, 0, 4095); channelOut[14] =map(channel[14], 0, 255, 0, 4095); // Werte zuweisen für (int i =0; i <=14; i++) { if (channelOut[i] ==0) { pwm.setPWM(i, 4096, 0); aufrechtzuerhalten. Else { pwm.setPWM (i, 0, 4095 - channelOut[i]); } }}
Gerät für FreestylerBatchFile
Definition der Kanäle Beschreibung für das DMX-Steuerungsprogramm auf dem PCBuzzComments:""Outdoor LED3 0 0 RBG Outdoor.gif0000000 1 123RedGreenBlueMacros 2 0 0 0 1 0 0255000000255025502550255025502550255000-0-0-0-1Sliders 0
Schaltpläne
universelle Nano-Basis mit DMX-Eingang und PWM / I2C-Ausgang universaldmx_2ixt4yqoce.sch universaldmx_a0KdrmJqGU.brd5x 3 ch. (15x PWM) Verteilung mit 12V (+/-) Eingang verteiler_dmx_a0M4khDOMv.sch verteiler_dmx_P6etUU6zsN.brd3x 350mA / 12V Quelle mit PWM-Eingängen 3xksq_rework_2VYUHjd5Xl.sch 3xksq_rework_4rpvCLaFrs.brd 3xksq_rework_qp87kzXQGy.txt universaldmx_GtNeOjMWZL.txtHerstellungsprozess
- DIY LUMAZOID Arduino Music Visualiser
- Webbetriebener DMX-Controller
- Gestengesteuerte interaktive Tischleuchte
- Arduino mit Bluetooth zur Steuerung einer LED!
- Arduino-Vierbeiner
- Bekämpfen Sie das Coronavirus:Einfacher Handwasch-Timer
- Arduino RGB-Farbmischer
- Steuerung einer LED-Matrix mit Arduino Uno
- DIY Arduino RADIONICS-Behandlungsmaschine
- LED-Roulette-Spiel