Problem mit Datenübertragung per Xbee

Hallo Zusammen :wink:

Ich bin noch ganz neu bei Arduino.
Ich benutze die Plattform für meine Maturaarbeit, bei der ich selber ein Telemetriesystem für ein Modellflugzeug entwickle.

Hier kurz das Wichtigste zum Projekt:

Im Flugzeug werden die Daten über einen 10DOF IMU und einen BMP180 aufgennomen, auf einem Uno verarbeitet und per Xbee (24), auf einem XBee Adapter, versendet. Empfangen werden die Daten von einem zweiten XBee, ebenfalls auf einem XBee Adapter, und dann via einen Micro auf den PC übertragen. ( Siehe angehängtes Schema)

Hier der Code des Uno:

#include <Wire.h>
#include <I2Cdev.h>
#include <ADXL345.h>
#include <HMC5883L.h>
#include <Adafruit_BMP085.h>
#include <swI2C_BMP085.h>   // A2 = SDA, A3 = SCL
#include <I2cMaster.h>

const float alpha = 0.5;
const int qnh = 101900;

ADXL345 attitude;
HMC5883L compass;
Adafruit_BMP085 altimeter;
swI2C_BMP085 pitottube;

int roll;
int pitch;
int heading;
int alt;
float speed;
int verticalspeed;

void setup(){
  Serial.begin(9600);
  Wire.begin();
  
  attitude.begin();
  altimeter.begin();
  pitottube.begin();
  
  compass.initialize();
  
  
}

void loop(){
  get_attitude();
  get_heading();
  
  alt = 3.28*altimeter.readAltitude(101300);
  speed = sqrt( (2*(pitottube.readPressure()-altimeter.readPressure())/1.2))-18;
  
  int a0 = 3.28*altimeter.readAltitude(101300);
  verticalspeed = (3.28*altimeter.readAltitude(101300) - a0)*60000;
 
  
  Serial.print(pitch);
  Serial.print(':');
  Serial.print(roll);
  Serial.print(':');
  Serial.print(heading);
  Serial.print(':');
  Serial.print(alt);
  Serial.print(':');
  Serial.print(speed);
  Serial.print(':');
  Serial.println(verticalspeed);
    

 
}

void get_attitude(){
  double X, Y, Z;
  
  double Xr, Yr, Zr;
  
  attitude.read(&Xr, &Yr, &Zr);
  
  X = Xr * alpha + (X * (1.0 -alpha));
  Y = Yr * alpha + (Y * (1.0 -alpha));
  Z = Zr * alpha + (Z * (1.0 -alpha));
  
  roll = (atan2(-Y, Z) * 180)/M_PI;
  pitch = (atan2(X, sqrt(Y*Y + Z*Z))* 180) / M_PI;
}
  
  
void get_heading(){
  double X, Y, Z;
  
  int16_t Xr, Yr, Zr;
  
  compass.getHeading(&Xr, &Yr, &Zr);
  
  X = Xr * alpha + (X * (1.0 -alpha));
  Y = Yr * alpha + (Y * (1.0 -alpha));
  Z = Zr * alpha + (Z * (1.0 -alpha));
  
  if(heading < 0)
      heading += 2 * M_PI;
      
  heading = (atan2(Y,X)*180)/M_PI;
  
   if(heading < 0){
    heading = 360+heading;
  }
}

Und des Micro:

void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop()
{
  if(Serial1.available()){
  Serial.print(Serial1.read());
}

}

Nun zu meinem Problem:

Wenn ich den Uno direkt an den PC anschliesse funktioniert alles wunderbar. Aber wenn ich sie übertrage, empfange ich vom Micro nur unstrukturierte Zahlen und manchmal merkwürdige Zeichen z.B. ÿ .

An den XBee’s kanns nicht liegen, da ich schon versucht habe die Arduinos direkt zu verbinden.

Könnt ihr mir da helfen?? :sweat_smile:

Liebe Grüsse
Joachim

Aufbau.jpg

An den XBee's kanns nicht liegen, da ich schon versucht habe die Arduinos direkt zu verbinden.

Das solltest du zuerst in den Griff kriegen. Danach kannst du dich um die xbee kümmern.

Serial.print(Serial1.read());

Wenn am PC Zeichen wie ÿ ankommen, ist die Baudrate am PC falsch.

Danach sollten am PC Dezimalzahlen ankommen, z.B. "4858" statt "0:" Das kriegst du durch

   Serial.write(Serial1.read());

repariert.

Zur Erklärung: .read liefert ein int (-1 falls nichts da ist), das Gegenstück zu .read ist .write .print wandelt je nach Datentyp vor der Ausgabe.

Sind die XBee auf 9600 gestellt?

Grüße Uwe

Das ÿ ist schnell erklärt wenn man in die ASCII Tabelle schaut:

Das ist 255, also 1111 1111, d.h. -1 im Zweier-Komplement.