Multiple DMX Port output
4smd opened this issue · 3 comments
Hallo. Ich möchte mehrere DMX ausgänge haben. Die DMX ausgänge können hintereinander oder gleichzeitig aussenden.
wie sollte ich vorgehen. einen einfache beispiel währe mir reichen
Hello. I would like to have several DMX outputs. The DMX outputs can emit consecutively or simultaneously.
how should I proceed. a simple example would be enough for me
DMX is a serial signal and the hardware responsible for producing serial pulses is a UART. To help you understand about serial ports on the ESP32, take a look at https://hackaday.com/2017/08/17/secret-serial-port-for-arduinoesp32/
In the LXESP32DMX library, a hardware UART is encapsulated in LXHardwareSerial. An LXHardwareSerial object is used as a global variable in the LXESP32DMX code. Line 23 of LXESP32DMX.cpp is where this happens:
LXHardwareSerial LXSerial2(2); //must be initialized before ESP32DMX
The 2 parameter passed to this constructor is the UART number. The UART number is which actual silicon peripherial on the chip to use. You could also use UART 1. But, you would need to map the input/output to some pins that you are not using. On most modules, the default pins for UART 1 are not brought out where you can get to them, as explained in the article mentioned above.
In order for the library to support another UART output, it would need to pass around a reference to an LXHardwareSerial object. Its not theoretically impossible to make this work. The task functions are passed a reference to the LX32DMX object and it could hold an LXHardwareSerial object as a member variable. But, for some reason, there was a problem with this. So, the current library bypasses the problem and uses global variables.
The quickest way to get a second DMX output is to duplicate the LXESP32DMX.h and LXESP32DMX.cpp file and call them LXESP32DMX1.h and LXESP32DMX1.cpp.
Do a global search and replace as follows:
Find Replace
LXSerial2 LXSerial1
LXESP32DMX LXESP32DMX1
ESP32DMX ESP32DMX1
You'll also need to change LXHardwareSerial LXSerial2(2); to LXHardwareSerial LXSerial1(1); You'll be able to use the ESP32DMX1 object in your sketch as a second DMX output. Be sure to specify the pins when calling startOutput/startInput/startRDM.
So, having done all that. You'll need to test your use case and see if the performance is acceptable. The ESP32 may not be up to supporting 2 DMX outputs while also doing networking for example. One reason the library does not support multiple DMX outputs is that ESP32s are so inexpensive that it makes sense to simple use another chip to get another universe. But, if you want to experiment, there's an additional output class now in the "extras" folder. Move the header and cpp files to the src folder to use them. Note that the pin defaults are used by the first output. So, you MUST change them when calling startOutput/startInput/startRDM.
DMX ist ein serielles Signal und die für die Erzeugung serieller Impulse verantwortliche Hardware ist ein UART. Um zu verstehen, was serielle Schnittstellen auf dem ESP32 sind, schauen Sie unter https://hackaday.com/2017/08/17/secret-serial-port-for-arduinoesp32/ nach.
In der LXESP32DMX-Bibliothek ist ein Hardware-UART in LXHardwareSerial gekapselt. Ein LXHardwareSerial-Objekt wird als globale Variable im LXESP32DMX-Code verwendet. In Zeile 23 von LXESP32DMX.cpp geschieht dies:
LXHardwareSerial LXSerial2 (2); // muss vor ESP32DMX initialisiert werden
Der an diesen Konstruktor übergebene Parameter 2 ist die UART-Nummer. Die UART-Nummer gibt an, welche Silizium-Peripherie auf dem Chip verwendet werden soll. Sie können auch UART 1 verwenden. Sie müssen jedoch die Ein- / Ausgänge einigen nicht verwendeten Pins zuordnen. Bei den meisten Modulen werden die Standard-Pins für UART 1 nicht an den richtigen Ort gebracht, wie in dem oben genannten Artikel beschrieben.
Damit die Bibliothek eine andere UART-Ausgabe unterstützt, muss eine Referenz auf ein LXHardwareSerial-Objekt übergeben werden. Es ist theoretisch nicht unmöglich, dies zu erreichen. Den Taskfunktionen wird eine Referenz auf das LX32DMX-Objekt übergeben, und es kann ein LXHardwareSerial-Objekt als Membervariable enthalten. Aber aus irgendeinem Grund gab es ein Problem damit. Die aktuelle Bibliothek umgeht also das Problem und verwendet globale Variablen.
Die schnellste Möglichkeit, eine zweite DMX-Ausgabe zu erhalten, besteht darin, die Dateien LXESP32DMX.h und LXESP32DMX.cpp zu duplizieren und sie LXESP32DMX1.h und LXESP32DMX1.cpp zu nennen.
Führen Sie eine globale Suche durch und ersetzen Sie sie wie folgt:
Ersatz finden
LXSerial2 LXSerial1
LXESP32DMX LXESP32DMX1
ESP32DMX ESP32DMX1
Sie müssen auch LXHardwareSerial LXSerial2 (2) ändern. an LXHardwareSerial LXSerial1 (1); Sie können das ESP32DMX1-Objekt in Ihrer Skizze als zweite DMX-Ausgabe verwenden. Stellen Sie sicher, dass Sie die Pins angeben, wenn Sie startOutput / startInput / startRDM aufrufen.
Also das alles getan. Sie müssen Ihren Anwendungsfall testen und prüfen, ob die Leistung akzeptabel ist. Das ESP32 unterstützt möglicherweise nicht die Unterstützung von 2 DMX-Ausgängen, während Sie beispielsweise auch Netzwerke betreiben. Ein Grund dafür, dass die Bibliothek mehrere DMX-Ausgänge nicht unterstützt, ist die Tatsache, dass ESP32s so kostengünstig sind, dass es sinnvoll ist, einen anderen Chip für ein anderes Universum zu verwenden. Wenn Sie jedoch experimentieren möchten, gibt es jetzt eine zusätzliche Ausgabeklasse im Ordner "Extras". Verschieben Sie die Header- und CPP-Dateien in den SRC-Ordner, um sie zu verwenden. Beachten Sie, dass die Pin-Standardwerte vom ersten Ausgang verwendet werden. Sie MÜSSEN sie also beim Aufruf von startOutput / startInput / startRDM ändern.
Vielen Dank für diese Arbeit und aufklärung.
Eigentlich brauche ich genau 8 dmx ausgänge.
Meine Lösung ist langsam, aber ich kann ohne große Modifikation
8 oder mehr DMX-Ausgänge verwenden. ich kann nicht elektrisch full
kontrollieren. Meine Sorge ist dass es flimmert wird. Man sollte
irgendwie die DMX funktion aus und ein salten
ich möchte sie bitten, diese beispiel zu checken ob da probleme
gibt die ich nicht sehe.
hier das beispiel.
#include <LXESP32DMX.h>
#include "esp_task_wdt.h"
uint8_t DMX_PIN[8] {13, 15, 14, 27, 26, 25, 33, 32}; //OUTPUT PIN
uint8_t level;
uint8_t dmxbuffer[8][DMX_MAX_FRAME];
int i, x, Renk ;
void DMXToOutput(void) {
for (i = 0; i <= 7; i++) {
ESP32DMX.startOutput(DMX_PIN[i]);
xSemaphoreTake( ESP32DMX.lxDataLock, portMAX_DELAY );
for (int x = 1; x < DMX_MAX_FRAME; x++) {
ESP32DMX.setSlot(x , dmxbuffer[i][x]);
}
xSemaphoreGive( ESP32DMX.lxDataLock );
esp_task_wdt_feed();
vTaskDelay(10);
}
}
void setup() {
//Serial.begin(115200);
for (i = 0; i <= 7; i++) {
pinMode(DMX_PIN[i], OUTPUT);
}
}
void loop() {
for (Renk = 1; Renk < 255; Renk = Renk + 5) {
for (x = 1; x < 50; x = x + 3) {
dmxbuffer[0][x] = Renk;
dmxbuffer[0][x + 1] = 0;
dmxbuffer[0][x + 2] = 0;
dmxbuffer[1][x] = 0;
dmxbuffer[1][x + 1] = Renk;
dmxbuffer[1][x + 2] = 0;
dmxbuffer[2][x] = 0;
dmxbuffer[2][x + 1] = 0;
dmxbuffer[2][x + 2] = Renk;
}
DMXToOutput();
}
}
This is an interesting solution. It might work for some purposes.
You'll need to call ESP32DMX.stop() to balance the ESP32DMX.startOutput(pin).
The startOutput method creates an RTOS task. You need to delete the task or eventually (or, rather quickly) you'll run out of processing time and memory. I just added a call to vTaskDelete in the stop method that should take care of this.
The best that you could possibly hope for with this is output at 1/8th full speed DMX, about 5 frames/sec. But, there is a time cost for calling start and stop so you actually will end up with less than that. You'd need to use a Logic Analyzer and take a look at the timing to know for sure. My guess would be in the neighborhood of 3-4 frames a second. So, a fading signal might exhibit some flicker or jump in level from frame to frame.
Dies ist eine interessante Lösung. Es könnte für einige Zwecke funktionieren.
Sie müssen ESP32DMX.stop () aufrufen, um den ESP32DMX.startOutput (Pin) auszugleichen.
Die startOutput-Methode erstellt eine RTOS-Aufgabe. Sie müssen die Aufgabe löschen, oder irgendwann (oder eher schnell) gehen Ihnen die Verarbeitungszeit und der Speicher aus. Ich habe gerade einen Aufruf von vTaskDelete zu der stop-Methode hinzugefügt, die sich darum kümmern sollte.
Das Beste, auf das Sie möglicherweise hoffen können, ist die Ausgabe mit 1/8 Full Speed DMX, etwa 5 Frames / Sek. Es gibt jedoch einen Zeitaufwand für den Aufruf von start und stop, so dass Sie tatsächlich weniger bekommen. Sie müssen einen Logic Analyzer verwenden und sich den Zeitablauf genau ansehen, um es genau zu wissen. Meine Vermutung wäre in der Nähe von 3-4 Frames pro Sekunde. Ein Fading-Signal kann also von Bild zu Bild etwas Flimmern oder Sprung in der Ebene aufweisen.