Ayuda con XBee y GPS!!!

Hola, soy nuevo en el foro y me ha surgido un problema a la hora de combinar el uso de dos puertos serie en la misma placa Arduino Duemilanove.

En la misma placa tengo incorporados varios sensores, uno de ellos un receptor GPS para el cual he creado un puerto “MySerial” en lo pines 10 y 11. Tanto la gestión del GPS como la del resto de sensores funciona perfectamente cuando tengo la placa conectada directamente al ordenador a través del USB, sin embargo quiero incorporar la placa a un pequeño MAV y por tanto la transmisión de los datos debe ser inalámbrica. Para ello utilizo un módulo XBee que funciona bien porque lo he comprobado con programas sencillos, pero a la hora de enviar la información de sensores y el GPS no la muestra bien, y aparecen en pantalla símbolos incomprensibles.

Ya he comprobado que no se trate de ajustar la frecuencia, ya que está a 19200 baudios que es como corresponde. Los “jumpers” del módulo XBee también están correctamente conectados, así que sólo me queda pensar que es una especie de incompatibilidad entre el uso de un puerto serie por parte del GPS y el que necesita XBee para mandar la información.

Por ahora no se resolverlo, si alguien me puede ayudar se lo agradecería enormemente, ya que lo necesito para el trabajo de final de carrera.

Gracias!

P.D. Adjunto el código que tengo subido a la placa, aunque ya digo que no da problemas cuando está conectada directamente el USB:

// libreria para agregar puertos serie
#include <SoftwareSerial.h>

// declaracion pines del nuevo puerto serie
#define rxPin 11
#define txPin 10

// declaracion del nuevo puerto serie
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);

// variables GPS
byte byteGPS = 0;
int i = 0;
int indices[13];
int cont = 0;
int conta = 0;
char inBuffer[300] = “”;
int k = 0;

//entradas aceleraciones
int pinPortX1 = 2;
int pinPortY1 = 3;
int pinPortX2 = 4;
int pinPortY2 = 5;

//variables Ultrasonido
unsigned long micro1,micro2;
unsigned long ultr;
int pinPortUS = 9;

void setup(){

//setup de los puertos serie
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
mySerial.begin(4800);
Serial.begin(19200);

//setup GPS
Serial.println(“Configurando GPS…”);
delay(1000);
mySerial.println("$PSTMNMEACONFIG,0,4800,1,1"); // configure NMEA sentences to show only GGA sentence
delay(100);
// command for setting time and position
mySerial.println("$PSTMINITGPS,4140.000,N,00053.000,W,0197,22,10,2007,11,40,00")
;
// “4140.000,N” means: Latitude 41º40’00.0" North
// “00053.000,W” means: Longitude 0º53’00.0" West
// “0197” means 197 m elevation
// “22,10,2007,11,40,00” means date and time (October 22, 2.007 - 11h 40min 00sec UTC time)
}

void loop(){

//variables aceleraciones
int valueX1=0;
int valueY1=0;
int valueX2=0;
int valueY2=0;

//variable Ultrasonido
int value=0;

//lectura GPS
byteGPS = 0;
i = 0;
while(byteGPS != 42){ // read the GGA sentence
byteGPS = mySerial.read();
inBuffer*=byteGPS; *

  • i++; *
    }

//gestion aceleracion
valueX1=analogRead(pinPortX1);
valueY1=analogRead(pinPortY1);
valueX2=analogRead(pinPortX2);
valueY2=analogRead(pinPortY2);

//lectura Ultrasonido
value=digitalRead(pinPortUS);

while (value==HIGH) //espera a que vaya a LOW
{

  • value=digitalRead(pinPortUS);*
    }
    while(value==LOW) // captura el ultimo momento conocido en LOW
    {
  • value=digitalRead(pinPortUS);*
  • micro1 = micros();*
    }
    while(value==HIGH) // captura el ultimo momento conocido en HIGH
    {
  • value=digitalRead(pinPortUS);*
  • micro2 = micros();*
    }
    ultr = ((micro2 - micro1)/147.0)*2.54;

//escritura en el puerto serie
k = 1;
while(inBuffer[k] != 42){

  • Serial.print(inBuffer[k]); // write the GGA sentence*
  • k++;*
    }
    Serial.println();
    delay(500);
    Serial.print(“A,”);
    Serial.print(valueX1);
    Serial.print(",");
    Serial.print(valueY1);
    Serial.print(",");
    Serial.print(valueX2);
    Serial.print(",");
    Serial.print(valueY2);
    Serial.print(",");
    Serial.println(ultr);
    delay(500);
    }

Hector,

Entiendo que utilizas dos módulos Xbee y que has comprobado los parámetros de la UART entre el que comunica con la placa Arduino.

¿Los has comprobado en el que comunica con el PC? ¿Utilizas las mismas velocidades? si no estás utilizando el protocolo hardwire y las velocidades son diferentes puedes tener problemas de pérdida de datos, el buffer de los Xbee no es muy grande.

http://www.zigbe.net

Utilizo dos placas Arduino, cada una de ellas con un módulo XBee. Una de ellas se encuentra a bordo del MAV, y la otra conectada al PC sin el microcontrolador. Con programas sencillos funciona perfectamente. Las velocidades son correctas.
Lo que me desconcierta es que cuando conecto la placa con los sensores directamente sobre el PC sin pasar por XBee, también funciona bien.
Es al incorporar al software la parte del GPS y transmitirla inalambricamente cuando la información no llega bien.

Gracias

Hector,

la verdad es que es difícil llegar a conclusiones. lo que te quería decir es que al emular el puerto serie con las Xbee tienes dos configuraciones de velocidad y protocolo, entre el PC y el Xbee por un lado y entre el otro Xbee y el Arduino por el otro. Fíjate bien que te coincidan en los dos lados.

Para hacer un poco de diagnóstico yo probaría con esa misma configuración, conectando los dos Xbee al PC y con dos sesiones del terminal para ver si lo que mandas por uno sale por el otro. Debes de configurarlos terminales en "modo bloque" para que lo que escribas se envie de golpe al pulsar enviar, solo de esta forma podrás ver si lo que tienes son problemas de protocolo en el puerto serie.

Esto último es un poco "raro" porque las tramas que envía el GPS no son muy grandes, no deberías de tener problemas de desbordamiento del buffer, menos comunicando con el GPS a 4800 y con el Xbee a 19200.

http://www.zigbe.net/