miércoles, 12 de enero de 2011

Arduino Xbee SoftwareSerial

Tal como comenté en un anterior post, el shield Xbee de Libelium tiene el problema de no poder trazar la comunicación que estamos haciendo con el módulo xbee a través del puerto USB y por tanto, a un terminal del PC.

Una posible solución para ello es implementar una soft-UART con dos pines del micro. De forma que la UART del micro esté enteramente dedicada a la comunicación con el PC, y la soft-UART sea la que se comunique con el módulo xbee.

El objetivo de este post es explicar cómo se implementa esto.

Para empezar, necesitamos descargarnos la última versión de la librería de SoftwareSerial. Es la librería con la que implementaremos la UART soft en el micro de Arduino. La podeís encontrar aquí. Tenéis que instalaros esta librería en el directorio de librerías del IDE de Arduino, borrando (haciendo un backup previamente) el directorio Softwareserial que encontréis.

Para probarlo necesitamos:
- Arduino + Xbee shield Libelium, lo llamo Emisor
- Arduino + Xbee shield Libelium, lo llamo Receptor
Grabamos el Emisor con una aplicación sencilla que se limite a enviar por la UART al modulo xbee, dos caracteres H y L con una pausa de 1 segundo entre envíos.
 void setup()


{
Serial.begin(9600);
}
void loop()
{
Serial.print('H');
delay(1000);
Serial.print('L');
delay(1000);
}
En el Receptor, antes de nada vamos a hacer un cambio en el hardware. Queremos comunicarnos a través de dos pines configurados del micro como puerto serie (en el ejemplo serán los pines DIO2 y DIO3 de Arduino) con el modulo xbee, de forma que la uart del micro sea sólo de comunicación con el USB.


Adecuando el programa de arduino para ello, podremos ver lo que el micro recibe de xbee y lo que le enviamos al xbee, y también podremos programar el micro, sin necesidad de quitar y poner jumpers (cosa que es un poco engorroso).

Vamos a puentear las señales de comunicación serie de la uart del micro de arduino con la uart del módulo xbee. Quitamos, por supuesto, los jumpers, y puenteamos DIO2 con DIN del xbee (cable rojo foto), y DIO3 con DOUT de Xbee (cable negro foto). La siguiente mediocre foto ilustra el cambio:



El Receptor lo grabamos con una aplicación que implemente la uart soft, la implementación software de una uart en los pines 2 y 3.

//libreria softwareSerial.h se puede encontrar en: http://arduiniana.org/2011/01/newsoftserial-11-beta/
#include < SoftwareSerial.h >

SoftwareSerial XbeeSerial(3, 2);

const int ledPin = 13; // pin del LED

int incomingByte; // variable para los datos serie de entrada

void setup() {
          Serial.begin(9600); //conexion al PC
          Serial.println("Xbee Software Serial Test!");
          XbeeSerial.begin(9600); //conexion al Xbee shield
          // inicializa pin LED como salida
         pinMode(ledPin, OUTPUT);
         }

void loop()
{
         if (XbeeSerial.available()) {
         // leer el byte más antiguo del buffer serie
         incomingByte = XbeeSerial.read();
         // Si es H (ASCII 72), enciende el LED:
         if (incomingByte == 'H') {
               digitalWrite(ledPin, HIGH);
         }
         if (incomingByte == 'L') {
              digitalWrite(ledPin, LOW);
         }
        Serial.print((char)incomingByte); //envia dato de Xbee a PC
        }
        if (Serial.available()) {
             XbeeSerial.print((char)Serial.read()); //envia dato de PC a Xbee
        }
}



Si abrís un terminal en el equipo Receptor deberiáis ver como Arduino traza el mensaje enviado por el Emisor y cambia el estado del LED según el mensaje recibido.

Hasta pronto.

No hay comentarios:

Publicar un comentario