Guten Morgen,
folgendes Problem: Ich kommuniziere mittels TouchOSC mit Processing (WLAN) und sende die Daten über die serielle Schnittstelle weiter an den Arduino (Xbee).
Das ganze soll wie folgt ablaufen: In TouchOSC/Processing habe ich einen Button, der dem Arduino mitteilen soll, ob die Steuerung mittels TouchOSC aktiv ist oder nicht.
Je nach Status wird dann 'a' oder 'b' übermittelt.
Das sieht so aus:
void oscEvent(OscMessage theOscMessage) {
String addr = theOscMessage.addrPattern();
float val = theOscMessage.get(0).floatValue();
if(addr.equals("/0/button")) {
button = (int) val;
if (val==1) myPort.write('a');
if (val==0) myPort.write('b');
println(val);
}
for (int i=1; i<17; i++) {
if(addr.equals("/1/fader/"+i)) fader[i-1] = (int) val;
}
}
Wenn die Steuerung aktiv ist, werden jeweils 2 Bytes übermittelt: Kanal und Wert. In TouchOSC habe ich dafür Fader eingebaut.
void draw() {
while (button==1) {
for (int i=0; i<16; i++) {
if (fader[i] != out[i]) {
out[i] = (int) (fader[i]);
myPort.write(i);
myPort.write(out[i]);
}
}
}
}
AUf dem Arduino sieht es empfangsseitig folgend aus:
Ich prüfe zunächst, ob ich mehr als 1 byte empfange (bedeutet, steuerung aktiv und fader wird bewegt). Wenn nur 1 Byte empfangen wird, handelt es sich um den Wert des Buttons:
void readXBEE() {
if (mySerial.available() >= 2) {
incomingByte[0] = mySerial.read();
incomingByte[1] = mySerial.read();
valueLight[incomingByte[0]]=map(incomingByte[1],0,255,4095,0);
printout();
}
else {
if (mySerial.read() == 'a') {
modus=5;
Serial.println("on");
}
if (mySerial.read() == 'b') {
modus=0;
Serial.println("off");
}
}
}
Ein paar Fragen:
- Ist "Else" die beste Lösung für den Fall oder kann man das besser/sicherer schreiben?
- Wenn ich den button drücke, erhalte ich im Print/SerialMonitor ein "On", wenn ich den dann wieder deaktiviere, erhalte ich leider KEIN "off". Leider kann ich keinen Fehler entdecken.
- Wenn ich die Fader schnell bewege (0-255, werden im Arduino gemapped auf 0-4095) kommt es manchmal vor, dass ich dann ein "off" erhalte und auch die Steuerung deaktiviert wird. Ich vermute (oder es war Zufall??) das liegt am ASCII Wert? 'a' ist ja 97 und 'b' 98 => und zufällig war auch der letzte Wert der angeziegt wurde 97 und beim nächsten Wert ein off. Wenn das so sein sollte, wie könnte ich das abfangen?
Gibt es eine bessere/sicherere Möglichkeit, on/off zu kommunizieren, und nicht über 'a' und 'b'?
Hoffe ihr könnt mir helfen
Vielen Dank
Thorsten
//EDIT: Es gilt noch zu erwähnen, dass ich nicht mit der HArdware Serial sondern SoftwareSerial arbeite.