Pages: [1]   Go Down
Author Topic: Processing und serielle Datenübertragung mittels xbee  (Read 432 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 5
Posts: 705
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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.
Code:
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:
Code:
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:
1) Ist "Else" die beste Lösung für den Fall oder kann man das besser/sicherer schreiben?
2) 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.
3) 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.
« Last Edit: April 15, 2013, 11:07:12 am by currymuetze » Logged

Offline Offline
God Member
*****
Karma: 5
Posts: 705
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Niemand hier der mir helfen kann?
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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:
Das ist keine gute Lösung, da Du nie wissen kannst, ob tatsächlich nur ein Byte (und damit ein Befehl) gesendet wurde, oder ob Du gerade mitten in der Übertragung von 2 Bytes das erste byte erwischt hast.
In 90% der Fälle wird das sicher funktionieren, aber nie 100%.

Das einfachste wäre doch sicher, IMMER 3 bytes zu übertragen. Das erste byte ist der Befehl und das 2. und 3. Byte sind dann Datenbytes. damit ist der Zustand immer definiert.

Beispiel:

1. Byte
F - Fader, die beiden Bytes danach werden als Daten interpretiert
A - On, die beiden folgenden Bytes werden zwar gelesen aber ignoriert
B - OFF, die beiden folgenden Bytes werden zwar gelesen aber ignoriert
Logged

Pages: [1]   Go Up
Jump to: