Forum: Mikrocontroller und Digitale Elektronik Problem mit DMXSerial.h als DMXReceiver Arduino Uno


von Mathis S. (mathis_s)


Lesenswert?

Hallo,
ich möchte mit einem UNO einen DMX Receiver realiseren. Dazu verwende 
ich die DMXSerial.h von http://www.mathertel.de. Anhand seines 
Beispielcodes, DMX zu Empfangen und eine LED am PinOut zu dimmen habe 
ich mein Programm geschrieben. Der Kompiler schließt erfolgreich ab. 
Jedoch tut sich auf meinem Arduino, bzw an den Relais leider überhaupt 
nichts Undecided Was mache ich falsch? Hab ich etwas bei der Software 
übersehen oder ist die soweit okay?
Zum Hardwareaufbau: SN75176 auf einem Breadboard, Pin1 geht an den RX 
vom Arduino. Stromversorgung und Masse sind auch vorhanden. Hänge ich 
ein DMX Pult 
(http://www.thomann.de/de/stairville_ddc6_dmx_controller.htm?gclid=CKGM3eyf4MoCFYidGwodG10Nog) 
an den SN75176 (pin 6 und 7) leuchtet auch sofort die RX LED am Arduino 
auf. Nur wenn ich die Fader bewege passiert nichts. Das Pult habe ich an 
einem "Kauf-Gerät" getestet. Funktion ist gegeben.
1
//Arduino DMX_Receiver zur Relaisansteuerung.
2
//Benötigt einen DMX Kanal.
3
//Kanalwerte: 0-20 - Beide Relais aus
4
//            21-117 - Relais 1 an
5
//            118-137 - Beide Relais aus
6
//            138-235 - Relais 2 an
7
//            236-255 - Beide Relais aus
8
9
10
11
12
#include "DMXSerial.h" //DMXSerial.h library einfügen.
13
14
15
const int Relais1 =    A0; //Relais Anschlusspins deklarieren.
16
const int Relais2 =    A1;
17
  
18
void setup () {
19
  
20
  pinMode(Relais1,   OUTPUT); //Anschlusspins als Output setzen.
21
  pinMode(Relais2,   OUTPUT);
22
  
23
  DMXSerial.init(DMXReceiver); //DMXSerial als Receiver initialisieren, lauscht auf dem Bus.
24
25
  DMXSerial.write(1, 0); //Vor Start den Wert auf 0 setzen, damit ein ungewolltes Schalten der Relais 
26
                         //verhindert wird.
27
  
28
  digitalWrite(A0, LOW); //Beide Pins zusätzlich ersteinmal auf LOW setzen.
29
  digitalWrite(A1, LOW);
30
31
}
32
33
34
void loop() {
35
  
36
int i = 2; //Variable i erzeugen und als DMX Kanal 2 festlegen. 
37
           //Im späteren Programm soll diese Variable in der loop 
38
           //jedes mal neu gesetzt werden, damit es möglich ist, 
39
           //die Adresse von 1 - 512 zu vergeben. 
40
           //Das Teilprogramm existiert bereits und ist lauffähig.
41
42
  
43
if (DMXSerial.read(i) <= 20){ //Wenn DMX Kanal(i) unter Wert 20 ist, dann...
44
  digitalWrite(Relais1, LOW); //Setze beide Relais auf LOW (aus)
45
  digitalWrite(Relais2, LOW);
46
}
47
if((DMXSerial.read(i) >= 21) && (DMXSerial.read(i) < 118)){ //Wenn DMX Kanal(i) über/gleich Wert 21 ist und unter Wert 118, dann...
48
  digitalWrite(Relais1, HIGH);//Setze Relais1 auf HIGH (an)
49
  digitalWrite(Relais2, LOW); //Setze Relais2 auf LOW (aus)
50
}
51
if((DMXSerial.read(i) >= 118) && (DMXSerial.read(i) < 138)){ //Wenn DMX Kanal(i) über/gleich Wert 118 ist und unter Wert 138, dann...
52
  digitalWrite(Relais1, LOW); //Setze beide Relais auf LOW (aus).
53
  digitalWrite(Relais2, LOW);
54
}
55
if((DMXSerial.read(i) >= 138) && (DMXSerial.read(i) < 236)){ //Wenn DMX Kanal(i) über/gleich Wert 138 ist und unter Wert 236, dann...
56
  digitalWrite(Relais1, LOW); //Setze Relaiis1 auf LOW (aus)
57
  digitalWrite(Relais2, HIGH); //Setze Relais2 auf HIGH (an)
58
}  
59
if(DMXSerial.read(i) >= 236){ //Wenn DMX Kanal(i) über/gleich Wert 236 ist, dann...
60
  digitalWrite(Relais1, LOW); //Setze beide Relaus auf LOW (aus)
61
  digitalWrite(Relais2, LOW);
62
}
63
64
65
}

Ich bitte um Hilfe

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


Lesenswert?

Mathis S. schrieb:
> Was mache ich falsch
Ich würde nur 1x den DMX-Wert inlesen, und dann darauf reagieren. Etwa 
so:
1
void loop() {
2
  
3
int i = 2; //Variable i erzeugen und als DMX Kanal 2 festlegen. 
4
           //Im späteren Programm soll diese Variable in der loop 
5
           //jedes mal neu gesetzt werden, damit es möglich ist, 
6
           //die Adresse von 1 - 512 zu vergeben. 
7
           //Das Teilprogramm existiert bereits und ist lauffähig.
8
9
int v = DMXSerial.read(i);
10
  
11
if (v <= 20){                 // Wenn DMX Kanal(i) unter Wert 20 ist, dann...
12
  digitalWrite(Relais1, LOW); //Setze beide Relais auf LOW (aus)
13
  digitalWrite(Relais2, LOW);
14
}
15
else if(v < 118)){            // Wenn DMX Kanal(i) über/gleich Wert 21 ist und unter Wert 118, dann...
16
  digitalWrite(Relais1, HIGH);//Setze Relais1 auf HIGH (an)
17
  digitalWrite(Relais2, LOW); //Setze Relais2 auf LOW (aus)
18
}
19
else if(v < 138)){            // Wenn DMX Kanal(i) über/gleich Wert 118 ist und unter Wert 138, dann...
20
  digitalWrite(Relais1, LOW); //Setze beide Relais auf LOW (aus).
21
  digitalWrite(Relais2, LOW);
22
}
23
else if(v < 236)){            // Wenn DMX Kanal(i) über/gleich Wert 138 ist und unter Wert 236, dann...
24
  digitalWrite(Relais1, LOW); //Setze Relaiis1 auf LOW (aus)
25
  digitalWrite(Relais2, HIGH); //Setze Relais2 auf HIGH (an)
26
}  
27
else {                        // Wenn DMX Kanal(i) über/gleich Wert 236 ist, dann...
28
  digitalWrite(Relais1, LOW); //Setze beide Relaus auf LOW (aus)
29
  digitalWrite(Relais2, LOW);
30
}
31
32
33
}
Das ändert zwar (sehr wahrschienlich) noch nichts an deinem Problem 
(obwohl man sich bei dem laufenden Einlesen schon Probleme und 
Race-Conditions[*] vorstellen könnte). Aber es gibt dem Programm auf 
jeden Fall eine Struktur...

[*]
Durch das laufende Einlesen könnte es in deinem Programm sein, dass 
nacheinander alle IF-Abfragen mit "true" durchlaufen werden. Und zwar, 
wenn DMXSerial.read() immmer ein DMX-Paket abwartet und der DMX-Sender 
z.B. die Reihenfolge 10, 50, 120, 150, 240 sendet...

: Bearbeitet durch Moderator
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.