Forum: Mikrocontroller und Digitale Elektronik Arduino DMX->Artnet Übertrager


von Christian M. (mane_on_air)


Angehängte Dateien:

Lesenswert?

Servus zusammen,

ich habe ein Problem und komme nicht weiter. Vermutlich ist es wie immer 
nur eine kleinigkeit bzw ein denkfehler, aber ich komme einfach nicht 
drauf.

Was ich realisieren möchte:
Via Arduino mit DMX und Ethernet Shield einen umsetzer der die 512 
Kanäle des DMX Protokolls auf Artnet umsetzt. Die hälfte funktioniert 
bereits, sprich der Arduino empfängt DMX und ich kann die einzelnen 
Kanäle auch auswerten. Nur bekomme ich es nicht hin die Daten mit einer 
for Schleife in ein Array zu schreiben und diese dann per Artnet zu 
Senden.

Aus irgendeinem Grund wird die for Schleife nicht ausgeführt.

1
void OnFrameReceiveComplete (void) {      //wird ausgeführt wenn ein komplettes DMX frame empfangen wurde
2
  dmxinit = false;
3
  if (debug) {
4
    Serial.print(dmx_slave.getChannelValue (1));    //hier bekomme ich werte ausgegeben
5
    Serial.print("-");
6
    Serial.print(dmx_slave.getChannelValue (2));
7
    Serial.print("-");
8
    Serial.print(dmx_slave.getChannelValue (3));
9
    Serial.print("-");
10
    Serial.println(dmx_slave.getChannelValue (4));
11
  }
12
  for ( int i = 0; i == 512; i++) {
13
    dmxdata[1] = dmx_slave.getChannelValue(1);   //DMX Daten in puffer kopieren
14
    artnet.send(target_ip, uni, dmxdata, 512);   //Daten an Artnet Client Senden
15
  }
16
  if (debug) {
17
    Serial.print("dmxdata");
18
    Serial.print("-");
19
    Serial.print(dmxdata[1]);  //hier komt nur 0 als wert
20
    Serial.print("-");
21
    Serial.print(dmxdata[2]);
22
    Serial.print("-");
23
    Serial.print(dmxdata[3]);
24
    Serial.print("-");
25
    Serial.println(dmxdata[4]);
26
  }
27
}

Vielleicht hat ja jemand von euch eine Idee wo mein Denkfehler liegt.

Danke schonmal für die Hilfe.
Gruß

: Verschoben durch Moderator
von Jens (Gast)


Lesenswert?

Du kopierst 512 mal das erste Element deines DMX Buffers in das erste 
Element deines Artnet Buffer, wozu?

von Jens (Gast)


Lesenswert?

Und ohne den Rest des Programm zu kennen, aber Pointer, Derefrenzierung 
und Variablenübergabe sind dir bekannt?

von Jens (Gast)


Lesenswert?

Eieiei,

ich habe mir jetzt mal den restlichen Unfall namens Code angeschaut. Da 
ist soviel Murks drin, dass ich gar keine Lust mehr habe das zu 
kommentieren.

onReceiveComplete
enable
init

in der Reihenfolge, ernsthaft?

Auch sendest du 512 mal die 512 mal kopierten ersten Einträge des Arrays 
in 512 Byte langen DMX Botschaften.

von Christian M. (mane_on_air)


Angehängte Dateien:

Lesenswert?

Jens schrieb:
> Du kopierst 512 mal das erste Element deines DMX Buffers in das erste
> Element deines Artnet Buffer, wozu?

Das ist natürlich ein Fehler. Allerdings habe ich jetzt gesehen das der 
grund dafür das die schleife nicht ausgeführt wird in der deklaration 
liegt.

Christian M. schrieb:
> for ( int i = 0; i == 512; i++)

So funktioniert es jetzt:
for ( byte i = 0; i < size ; i++)

Jens schrieb:
> Auch sendest du 512 mal die 512 mal kopierten ersten Einträge des Arrays
> in 512 Byte langen DMX Botschaften.

der Befehl artnet.send gehört da auch nicht hin, das ist richtig.

Jens schrieb:
> ich habe mir jetzt mal den restlichen Unfall namens Code angeschaut. Da
> ist soviel Murks drin, dass ich gar keine Lust mehr habe das zu
> kommentieren.
>
> onReceiveComplete
> enable
> init
>
> in der Reihenfolge, ernsthaft?

Ja, genau in der reihenfolge ist es in der Vorlage der Bibliothek 
angegeben. Derjenige der das Entwickelt hat wird schon seine Gründe 
haben sonst wärs nicht in der Vorlage. Oder gibt es nen Grund das anders 
zu machen?

Hab das ganze nochmal überarbeitet und jetzt läuft das programm wie 
gewollt. Aber vieleicht hat ja noch jemand nen tipp wie ichs besser 
machen könnte.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jens schrieb:
> Du kopierst 512 mal das erste Element deines DMX Buffers in das erste
> Element deines Artnet Buffer, wozu?
Es geht hier um das zweite Element...   ;-)

Christian M. schrieb:
> Allerdings habe ich jetzt gesehen das der grund dafür das die schleife
> nicht ausgeführt wird in der deklaration liegt.
> for ( int i = 0; i == 512; i++)
Ja klar, da steht ja: (setze i auf 0; durchlaufe die Schleife nur dann 
wenn i gleich 512 ist; incrementiere i).
Nach kurzem Nachdenken wird klar: die Schleife wird niemals durchlaufen, 
weil i schon beim ersten Durchlauf ungleich 512 ist.

> Derjenige der das Entwickelt hat wird schon seine Gründe haben sonst
> wärs nicht in der Vorlage.
Das ist eine solide Entwicklereinstellung. So ähnlich wie wenn ein 
Layouter einfach ungesehen fremden Makros traut. Damit fliegt man halt 
dann&wann auf die Nase.

: Bearbeitet durch Moderator
von Jens (Gast)


Lesenswert?

Wo ist das Beispiel für die Lib her?

https://github.com/alfo/arduino-libraries/blob/master/Conceptinetics/examples/DMX_Slave_Signal_Timeout/DMX_Slave_Signal_Timeout.ino

hier ist die Reihenfolge eine andere, die auch mehr Sinn macht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Christian M. schrieb:
> So funktioniert es jetzt:
> for ( byte i = 0; i < size ; i++)

Allerdings passt in ein Byte keine 512. Muss also doch int sein.

von Christian M. (mane_on_air)


Lesenswert?

Matthias S. schrieb:
> Christian M. schrieb:
>> So funktioniert es jetzt:
>> for ( byte i = 0; i < size ; i++)
>
> Allerdings passt in ein Byte keine 512. Muss also doch int sein.

Mein Fehler. Hatte das gestern Abend mit dem Lumidesk Nano getestet der 
kann nur 128 Kanäle und dazu ware die "size" auf 128 gestellt.
Wäre mir dann am DMX512 Interface wieder um die Ohren geflogen.
for ( uint16_t i = 0; i <= size ; i++)
So is besser.


Jens schrieb:
> Wo ist das Beispiel für die Lib her?
>
> 
https://github.com/alfo/arduino-libraries/blob/master/Conceptinetics/examples/DMX_Slave_Signal_Timeout/DMX_Slave_Signal_Timeout.ino
>
> hier ist die Reihenfolge eine andere, die auch mehr Sinn macht.

Macht es denn einen unterschied ob die Funktion vor dem starten des DMX 
Empfangs deklariert wird oder erst danach? Ich verwende die Bibliothek 
schon seit Jahren allerdings nur in kombination mit fastled und hat 
bisher  immer problemlos funktioniert.

von Jens (Gast)


Lesenswert?

Wenn du dir mal die Lib und deren Funktionen angeschaut hättest, ja die 
Reihenfolge ist wichtig.

Das enable aktiviert den entsprechende Interrupt und stellt zum Beispiel 
auch die Baudrate für den UART Empfang ein, der hier zum Empfang der DMX 
Daten "misbraucht wird".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.