Incompatibilidad puerto serie XBee

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);*
    }

Hola!

Yo no los he utilizado, pero el propietario del siguiente google-site, se está fabricando un kuadricoptero con Arduino t explica parte a parte. Sé que se compró 2 módulos Xbee y puso un par de códigos para aprender a usarlos. Échale un ojo al siguiente enlace...

http://sites.google.com/site/mikuadricoptero/home/descripciones/1-00-guia-por-temas

He estado mirando tú código, y me he quedado intrigado con las instrucciones del GPS y el ultrasonido. Me podrías decir que modelo de GPS y Ultrasonido estás empleando? Estoy interesado en un código para mi GPS, pero no entiendo el tuyo...sobre todo las instrucciones mySerial.println() del void setuo()..

Un saludo!

Las funciones del mySerial.print del void setup son la manera con que se permite que el sistema funcione mientras el receptor GPS no reconozca la señal real, y hasta que eso ocurre muestra continuamente la linea de código GPGGA (protocolo NMEA) en que se muestran las coordenadas 41º 40.00' N y 0º 53.000' Oeste que es donde se encuentra la empresa donde se fabricó el receptor creo recordar, aunque el código original no es mío.

El modelo de la antena no te lo puedo decir porque ahora mismo no tengo la caja y en la antena propiamente no pone el fabricante.

El ultrasonido es un LV-MaxSonar-EZ0 y el código básicamente captura los instantes en que los pulsos varían de amplitud (utiliza una PWM). Restando los tiempos se obtiene el intervalo que tarda en rebotar y ese tiempo es proporcional a la distancia a la que se encuentra el objeto detectado.

Gracias por el link, aunque no me ha servido de ayuda ya que el hombre que fabrica el kuadricóptero no se encuentra con el mismo problema.

¡Que vaya bien!

Jo…lo siento!

Gracias por la informacion, Héctor!