Processing DMX Bridge
Um Daten von Processing an DMX (siehe Wikipedia) zu übergeben nutzen wir ein Arduino als Brücke. Auf das Arduino setzen wir das DMX Shield und programmieren es mit dem folgenden Code
...
language | java |
---|---|
title | Arduino DMX Bridge |
collapse | true |
...
Simple Example
The following example illustrates the usage of the DMX shield:
Code Block | ||
---|---|---|
| ||
// DMX Writer #include <DmxSimple.h> #define NUM_OF_VALUES 2 String incomingString = ""; int incomingValues[NUM_OF_VALUES]; void setup() { Serial.begin(9600115200); DmxSimple.usePin(11); } long long time = 0; int step = 0; void loop() { // wait 16ms readSerial();60/s) between animation steps if setDMX(incomingValues);time }< millis() void- readSerial(16) { // this is if (Serial.available() > 0) {necessary to give the interrupt routine // enough time to write the dmx messages Serial.println("stepstepstepstep"); // set time incomingStringtime = Serial.readStringUntil('\n'); split(incomingString, incomingValues, NUM_OF_VALUESmillis(); // set rgb DmxSimple.write(1, step); DmxSimple.write(2, step); } } void split(String inputString, int returnData[], int numOfValues) { int index = 0; int lastPos = 0; for (int i = 0; i < inputString.length(); i++) { if (inputString.charAt(i) == ',' && index < numOfValues) { String tempStr = inputString.substring(lastPos, i - 1); returnData[index] = tempStr DmxSimple.write(3, step); // increment step += 1; // handle wrapping if (step > 255) { step = 0; } } } |
Arduino DMX Bridge
Um Daten von Processing an DMX zu übergeben nutzen wir ein Arduino als Brücke. Auf das Arduino setzen wir das DMX Shield und programmieren es mit dem folgenden Code:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
// DMX Bridge // // Write messages in the form of "2:127\n" to forward // them to the connect DMX device. #include <DmxSimple.h> void setup() { Serial.begin(9600); DmxSimple.usePin(11); } void loop() { if(Serial.available() > 0) { int channel = Serial.readStringUntil(':').toInt(); int index++value = Serial.readStringUntil('\n').toInt(); lastPos = i + 1Serial.print("set "); Serial.print(channel); }Serial.print(" to "); } } void setDMX(int values[]) {Serial.println(value); DmxSimple.write(values[0]channel, values[1]value); } } |
Mit diesem Code werden alle Kommandos, welche über die serielle Serielle Schnittstelle (siehe Serielle Kommunikation) an das Arduino geschickt werden in DMX Nachrichten umgewandelt und über DMX verschickt. Dazu müssen wir auf der Seite von Processing folgendes Protokoll einhalten.
CHANNEL "," WERT "," CR
CHANNEL = Ein DMX Kanal (0...512)
WERT = Ein Wert (0...255)
Im Folgenden ein kleines Beispiel, welches einen RGB Wert an eine DMX Leuchte sendet:
Code Block |
---|
CHANNEL:VALUE\n |
- CHANNEL entspricht einem Wert von 0 - 512.
- VALUE entspricht einem Wert von 0 - 255.
Processing Beispiel
Das folgende Beispiel sender RGB Werte an eine DMX Leuchte:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
importimport processing.serial.*; // Import the Processing Serial Library for communicating with arduino Serial dmxPort; // The used Serial Port int[][] dmxValues; //First dimension = number of DMX channels //Second dimension = channel, value int amountOfDMXChannels = 3; Serial port; void setup() { background(0); size(500, 500); println(Serial.list())frameRate(5); // Prints the list of serial available devices (Arduino should be on top of the list) println(Serial.list()); dmxPortport = new Serial(this, Serial.list()[Serial.list().length-1]"/dev/tty.usbmodem1411", 9600); // Open a new port and connect with Arduino at 9600 baud dmxValues = new int[amountOfDMXChannels][2]; dmxValues[0][0] = 0; dmxValues[1][0] = 1; dmxValues[2][0] = 2; } void draw() { background(0); color c = color(map(mouseX,0,width,0,255),map(mouseY,0,height,0,255),0sendDMX(1, 0); sendDMX(2, 0); sendDMX(1, 255); } void draw(){ while(port.available() > 0) { print(port.readString()); } int red = int(map(mouseX, 0, width, 0, 255)); int green = int(map(mouseY, 0, height, 0, 255)); background(red, green, 0); stroke(255); text("RRed: " + red(c) + "\t - GGreen: " +green(c)+"\t B: "+blue(c) green, 20, 20); dmxValues[0][1] = intsendDMX(1, red(c)); dmxValues[1][1] = int(green(c)); dmxValues[2][1] = int(blue(c)sendDMX(2, green); sendDMX(dmxValues3, 0); } void sendDMX(int valuesToSend[][]) { for (int i=0; i<valuesToSend.length; i++) channel, int value) { dmxPort.writeprint(str(valuesToSend[i][0]channel)); dmxPort.writeprint(",:"); dmxPort.writeprint(str(valuesToSend[i][1]value)); dmxPort.write("print('\n"'); } } |
...
port.write(str(channel)); port.write(":"); port.write(str(value)); port.write('\n'); } |
Einstellungen an den DMX Empfängern (Leuchten, Scanner usw.)
Um die gesendeten Werte mit einem DMX Endgerät lesen zu können muss dieses über die entsprechende Konfiguration verfügen. Es sollte demnach die richtige Adresse und der Wertebereich bekannt sein. Wegen der Vielzahl unterschiedlicher DMX Geräte sei hier auf die Bedienungsanleitung oder das Datenblatt des jeweiligen Gerätes verwiesen. Dort finden sich Hinweise, wie sich die Adresse einstellen lässt und wie viele Kanäle ein Gerät besitzt.