Go Down

Topic: Sensordaten mit Xbee senden und empfangen erzeugt Fehler (Read 1 time) previous topic - next topic

dingeldongel

Hallo Arduinogemeinde,
Ich bin erst seit wenigen Wochen mit Microcontrollern und deren Programmierung befasst und desshalb leider noch im Anfängerstadium.
Dennoch bin icht total begeistert von der perfekten Dokumentation und den möglichkeiten des Selbststudiums, die diese Entwicklungsplattform bietet.
Leider bin ich nun auf ein Problem gestoßen, bei dem ich wohl ohne Hilfe nicht weiterkomme.

Ich versuche die Daten eines Gravitationssensors (ADLX335) per Xbee von einem Arduino zum anderen zu übertragen. Die Daten werden auf dem Sender-Arduino als Float werte von 0.01-360.00 ausgegeben. Ich möchte diese Daten dann auswerten und damit zwei servos steuern.

Ich kann die Daten problemlos als interger verschicken (z.B. so: 23, 345)  und empfange sie auch über die parseInt-Funktion auf dem Empfänger-Arduino. Auch die Zuordnung zu X-Achse (23) und Z-Achse (345) funktioniert, wenn das Programm sehr kurz ist und ich z.B nur die Daten Empfange und seriell wieder ausgebe.

Wird das Programm aber länger entstehen Fehler beim Einlesen (mind 30% aller Werte sind falsch). Z.B werden die Werte der X-Achse denen der Z-Achse zugeordnet. Teilweise werden auch nur eine oder zwei Zahlen einer Dreistellingen Zahl eingelesen. Das Auslesen der Float Werte (z.B 345.67) habe ich überhaupt nicht hinbekommen.

Hat einer von euch eine Idee wie man die Daten für die Übermittlung am besten aufbereitet und mit welchem Algorithmus ich sie ganz sicher wieder auslesen kann.
Das einlesen er Daten am Empfänger-Arduino erfolgt bei mir direkt am Anfang der Loop Methode.


Vielen Dank und Beste Grüße
dingeldongel

pylon

Dein Code fehlt noch (Code-Tags nichts vergessen!). Ich schätze, dass Du die Synchronisation bzw. Datensatz-Trennung vergessen hast.

dingeldongel

Hab die Daten z.B so versendet:

Serial.print("B");    //Initiator senden
Serial.print(val_x);  // Daten der X-Achse
Serial.print(",");
Serial.println(val_z);  //Daten der Y-Achse
Serial.print(",");


Sieht dann ja z.B so aus:   B123,234,
Und das ganze alle 50mS.

Der Empfänger hatte folgenden Code:
void loop()
{
if( Serial.available()) {
  char ch = Serial.read ();
  if (ch == 'B'){
  for(fieldIndex = 0; fieldIndex < 2; fieldIndex ++)
{
values[fieldIndex] = Serial.parseInt(); // Numerischen Wert einlesen
}
Serial.print( fieldIndex);
Serial.println(" Felder empfangen:");
//for(int i=0; i < fieldIndex; i++)
//{

angle_x = values
  • ;     //WErte von 0 - 360
    angle_z = values [1] ;     //WErte von 0 - 360
    fieldIndex = 0; // und von vorn anfangen
    }
    }
    Serial.print("angle_x");
    Serial.print(angle_x);
    Serial.print("       angle_z");
    Serial.println(angle_z);
    xservo.write(angle_x / 2);   // Servo X
    zservo.write(angle_z / 2);    // Servo Z
    delay(50);
    }

    Das ganze funkioniert, wenn ich  Den Z servo auskommentiere.
    Aber ist er mit drin gibt es nur noch ein hinundherrattern des Servos
    Es werden dann teilweise viestellige Werte an die servos ausgegeben.

    Hab auch noch andere Varianten versucht. Ergebnis immer gleich.

markbee

Versuch' mal nach dem ersten Servo einen kurzen delay (5ms) und nach dem zweiten auch 5ms. Vielleicht gehts dann...

dingeldongel

Hier nochmal der geänderte Empfängercode:
#include <Servo.h>

Servo xservo;
Servo zservo;
const int NUMBER_OF_FIELDS = 2; // Wie viele kommaseparierte Felder erwarten wir?
int fieldIndex = 0; // Das aktuell empfangene Feld
int values[NUMBER_OF_FIELDS]; // Array mit den Werte aller Felder
int angle_x , angle_z;
void setup()
{
Serial.begin(9600); // Serieller Port sendet und empfa¨ngt mit 9600 Baud
  xservo.attach(9);
  zservo.attach(10);
}
void loop()
{
if( Serial.available()) {
  char ch = Serial.read ();
  if (ch == 'B'){
  for(fieldIndex = 0; fieldIndex < 2; fieldIndex ++)

  values[fieldIndex] = Serial.parseInt(); // Numerischen Wert einlesen


angle_x = values
  • ;
    angle_z = values [1] ;




    fieldIndex = 0; // und von vorn anfangen
    }
    }
    Serial.print("angle_x");
    Serial.print(angle_x);
    Serial.print("       angle_z");
    Serial.println(angle_z);
    delay(5);
    xservo.write(angle_x / 2);
    delay(5);
    zservo.write(angle_z / 2);
    delay(50);
    }



    Bei still stehendem Senssor erhalte ich folgende Ausgaben des Empfängers:
    angle_x6       angle_z67
    angle_x69       angle_z141
    angle_x69       angle_z141
    angle_x69       angle_z141
    angle_x69       angle_z141
    angle_x69       angle_z1409
    angle_x69       angle_z1409
    angle_x69       angle_z1409
    angle_x69       angle_z1409
    angle_x69       angle_z1409
    angle_x69       angle_z1409
    angle_x69       angle_z141
    angle_x140       angle_z68
    angle_x140       angle_z68
    angle_x68       angle_z140
    angle_x68       angle_z141
    angle_x1       angle_z67
    angle_x1       angle_z67
    angle_x1       angle_z67
    angle_x1       angle_z67
    angle_x1       angle_z67
    angle_x1       angle_z67
    angle_x1       angle_z67
    angle_x1       angle_z67
    angle_x69       angle_z4
    angle_x69       angle_z141
    angle_x69       angle_z141
    angle_x69       angle_z141
    angle_x69       angle_z141
    angle_x69       angle_z141
    angle_x69       angle_z141
    angle_x69       angle_z141
    angle_x69       angle_z69
    angle_x69       angle_z69


    Gesendet wird: 
    B70,144,
    B69,144,
    B69,144,
    B70,143,
    B71,143,
    B70,143,
    B69,144,
    B70,143,
    B70,143,
    B70,143,
    B69,143,
    B70,144,
    B69,144,
    B70,144,
    B68,145,
    B69,143,
    B69,144,
    B69,144,
    B70,143,
    B70,143,

    Servos zappeln wie wild.

Go Up