Buenas tardes. Actualmente estoy trabajando con dos módulos Serie 1 802.15.4 de XBee, configurados como
Coordinator y
End Device respectivamente. Ambos fueron configurados por la plataforma de XCTU en el mismo CANAL CH y Red PAN ID, y el modo
API 2. Para la aplicación de estos dispositivos, utilizó un Arduino Nano en cada uno de los módulos. En el Arduino del
XBee Coordinator conecté un potenciómetro a su entrada analógica (A0). El objetivo de esta práctica es enviar al módulo
End Device la información leída en el ADC (0 - 1023) del
Coordinator. Anexo los códigos utilizados para cada sistema:
CÓDIGO EN EL SKETCH DE ARDUINO DEL XBEE SERIE 1 COMO COORDINADOR
#include <SoftwareSerial.h> // Incluyo librería para la configuración Serial default de Arduino.
#include <XBee.h> // Incluyo librería XBee de Arduino.
SoftwareSerial myXBeeC(2, 3); // Configuro el Pin 2 como Rx, y el Pin 3 Tx del Arduino Nano.
XBee myXBee = XBee(); // Declaro un objeto de tipo XBee.
XBeeAddress64 addr64 = XBeeAddress64(0x0013A200, 0x40D82C62); // Declaro las direcciones del módulo XBee End Device
int sensor = 0; // Variable para lectura del puerto analógico A0 del Arduino Nano.
String valor; // Variable auxiliar para operación de conversión de tipo entero a cadena de caracteres.
int longitud = 0; // Variable para determinar y conocer la longitud de la cadena de caracteres.
void setup() {
Serial.begin(9600); // Baudios para el puerto Serial de Arduino.
myXBeeC.begin(9600); // Baudios para el puerto Serial seleccionado para trabajar la información.
myXBee.setSerial(myXBeeC); // Declaro el puerto Serial a trabajar.
}
void loop() {
sensor = analogRead(A0); // Lectura del puerto analógico del Arduino Nano.
valor = String(sensor); // Conversión de tipo entero a tipo cadena.
longitud = valor.length() + 1; // Declaración de la longitud de valores de la cadena.
char bufer[longitud]; // Declaro una variable para convertir de tipo String a tipo Char Array.
valor.toCharArray(bufer, longitud); // Conversión de tipo String a tipo Char Array.
uint8_t payload[longitud]; // Variable que guardará la cadena para enviar por Tx del módulo XBee del Coordinador.
for (int i = 0; i < longitud; i++){
if (bufer[i] > 0x10 && bufer[i] < 0xE9){
payload[i] = bufer[i]; // Igualo valores de un vector de valores almacenado el valor ADC leído con el potenciómetro, a otro vector de valores en las mismas posiciones de dirección.
}
}
Tx64Request tx = Tx64Request(addr64, payload, sizeof(payload)); // Empaquetado de información.
myXBee.send(tx); // Envío información del módulo XBee Coordinador al módulo XBee Dispositivo Final.
}
CÓDIGO EN EL SKETCH DE ARDUINO DEL XBEE SERIE 1 COMO DISPOSITIVO FINAL
#include <SoftwareSerial.h> // Incluyo librería para la configuración Serial default de Arduino.
#include <XBee.h> // Incluyo librería XBee de Arduino.
SoftwareSerial myXBeeE(2,3); // Configuro el Pin 2 como Rx, y el Pin 3 Tx del Arduino Nano.
XBee myXBee = XBee(); // Declaro un objeto de tipo XBee.
XBeeResponse respuesta = XBeeResponse(); // Declaro un objeto de tipo XBee Response.
Rx16Response rx16 = Rx16Response(); // Para 16 bytes
Rx64Response rx64 = Rx64Response(); // Para 64 bytes
uint8_t option = 0; // Variable utilizada en la lógica.
uint8_t data = 0; // Variable utilizada en la lógica
void setup() {
Serial.begin(9600); // Baudios para el puerto Serial de Arduino.
myXBeeE.begin(9600); // Baudios para el puerto Serial seleccionado para trabajar la información.
myXBee.setSerial(myXBeeE); // Declaro el puerto Serial a trabajar.
}
void loop() {
myXBee.readPacket(); // Recibo el paquete de datos enviado.
if (myXBee.getResponse().isAvailable()){
if (myXBee.getResponse().getApiId() == RX_16_RESPONSE || myXBee.getResponse().getApiId() == RX_64_RESPONSE){
if (myXBee.getResponse().getApiId() == RX_16_RESPONSE) {
myXBee.getResponse().getRx16Response(rx16);
option = rx16.getOption();
data = rx16.getData(0);
}
else {
myXBee.getResponse().getRx64Response(rx64);
option = rx64.getOption();
data = rx64.getData(0);
}
Serial.print("Dato: "); Serial.println(data, HEX); // Imprime el valor en el dato en hexadecimal.
}
}
else if (myXBee.getResponse().isError()){ }
}
PROBLEMÁTICA
El error se encuentra en la captación de información del módulo XBee End Device. Cuando envío la información del módulo XBee Coordinator, he rectificado que valla completa la cadena de caracteres leídos en el ADC. Pero cuando recibe el módulo XBee End Device esté solo lee el primer byte de la cadena. Ejemplo de algunos resultados obtenidos:
Antes que nada, cabe aclarar que la conversión de carácter a entero, o proceso similar; o de decimal a hexadecimal, o proceso similar, no es problema ahorita, en eso tengo previsto cómo manejarlo.
Sí envío un "1", recibo y solo se muestra un "1" en hexadecimal (por la conversión que tengo al imprimir el valor recibido).
Sí envío un "10", recibo y solo se muestra un "1" en hexadecimal (por la conversión que tengo al imprimir el valor recibido).
Sí envío un "25", recibo y solo se muestra un "2" en hexadecimal (por la conversión que tengo al imprimir el valor recibido).
Sí envío un "47", recibo y solo se muestra un "4" en hexadecimal (por la conversión que tengo al imprimir el valor recibido).
Sí envío un "534", recibo y solo se muestra un "5" en hexadecimal (por la conversión que tengo al imprimir el valor recibido).
Sí envío un "899", recibo y solo se muestra un "8" en hexadecimal (por la conversión que tengo al imprimir el valor recibido).
Sí envío un "1015", recibo y solo se muestra un "1" en hexadecimal (por la conversión que tengo al imprimir el valor recibido).
Y no encuentro cómo corregir este fallo. Supuse que esta librería << XBee.h >> de forma "automática" determinaría el inicio y final del paquete de información enviado, eliminando los demás bytes de la estructura del modo API 2, pero pareciera que sólo lee el primer byte de la cadena de información.
POSIBLE SOLUCIÓN ANALIZADA, PERO NO ENCUENTRO SOLUCIÓN
Mientras analizaba la lógica del código del Arduino del módulo XBee End Device encontré que el comando variable.getData(); en realidad imprimir la posición del byte que se coloca entre los "paréntesis", es decir. En el código del sketch de Arduino que anexe aquí, tengo data = rx64.getData(0), y por eso imprime solo la primera posición o el byte en la posición 0 de la cadena, porque cambiaba ese número para realizar pruebas, y el valor que imprimía ahora el modulo XBee End Device correspondía a la ubicación en la cadena del número colocado en los paréntesis del get.Data(). Entonces, no encuentro la manera de lograr hacer que se pueda imprimir toda la cadena completa y no sólo un byte, puesto que la longitud de la cadena puede ser desde un byte hasta cuatro bytes (0 - 1023), y no podría declarar un array con una dimensión de longitud fija.