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.
Mathis S. schrieb:> Was mache ich falsch
Ich würde nur 1x den DMX-Wert inlesen, und dann darauf reagieren. Etwa
so:
1
voidloop(){
2
3
inti=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
intv=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
elseif(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
elseif(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
elseif(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...