Problem mit DMXSerial.h als DMXReceiver Arduino Uno

OP #4455578
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
Moderator (Firma: Titel) Persönliche Seite #4455767
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...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.