Pages: [1]   Go Down
Author Topic: Sensordaten mit Xbee senden und empfangen erzeugt Fehler  (Read 1167 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 112
Posts: 5281
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 6
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 92
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo dingeldongel,

wie pylon schon schrieb, solltest du code-Tags verwenden, dann wird der Code übersichtlicher präsentiert.

Jetzt zu deinem Code:

Nach der Abfrage, ob ein Zeichen an der seriellen Schnittstelle anliegt, liest du die beiden folgenden Werte aus - das sieht soweit erst mal ok aus. Allerdings zeigst du dann das Ergebnis an, egal ob du wirklich was von der seriellen Schnittstelle gelesen hast oder nicht. Daher solltest du die Ausgabe udn Servosteuerung noch in den Zweig mit der Bedingung aufnehmen.
Also in etwa so:

Code:
#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[0];
  angle_z = values [1] ;
}
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);
}
}

Schau doch mal, ob das funktioniert - den Code habe ich nicht getestet, daher könnten noch Syntaxfehler drin sein.

Rudi
Logged

Pages: [1]   Go Up
Jump to: