¡¡¡¡¡Ayuda proyecto Xbee!!!!!!

Hola, estoy trabajando en un proyecto con xbee pro s2, la idea es que una arduino lea una serie de sensores (humedad, presion, lux, etc); transmita estos valores por xbee y la otra arduino los reciba por su xbee y los imprima por serial para poder verlas en el hyperterminal. Hasta ahora el código para leer sensores esta trabajando bien y logro que transmita los valores, recibo en la otra xbee los valores pero modificados, por ejemplo;

envió: 34,456,765,38,
recibo:5053534451495644484448444844131050535344514954444844484

Este es mi problema como recibir los datos tal cual los envió? aqui les dejo los codigos de emisor y receptor que estoy usando, si alguine me puede ayudar con esto se los agradeceria mucho. Saludos

//Emisor*****************//

int secuenciapeso = 0;
int Pinpeso = A0; // coloco en una variable el pin analogo de vapor
int valorpeso = 0; // variable que almacenará la lectura analóga de vapor
int valgas = 0; // variable que almacenará la lectura analóga de gas
int Pingas = A1; // coloco en una variable el pin analogo de gas
int vaporValue = 0;
int Pinvapor = A2;
int Pinsuelo = A4;
int valsuelo = 0;

void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);

}

void loop() {
valorpeso = analogRead(Pinpeso);
while (valorpeso > 600)
{
digitalWrite(3,LOW); //pin digital 3 en 0 lógico
delay (150);
digitalWrite(3,HIGH); //pin digital 2 en 1 lógico
delay (150);
valorpeso = analogRead(Pinpeso);
}
digitalWrite(3,LOW); //pin digital 3 en 0 lógico
for (secuenciapeso=0;secuenciapeso<6;secuenciapeso++)
delay (300);

{
valgas=analogRead(Pingas); //Read Gas value from analog 0
vaporValue = analogRead(Pinvapor); //connect Steam sensors to Analog 3
valorpeso = analogRead(Pinpeso)/4; // almacena en “valorpeso” la lectura analoga
valsuelo = analogRead (Pinsuelo)/10;

Serial.print (valgas, DEC);
Serial.print(",");
Serial.print(vaporValue);//print the value to serial port
Serial.print (",");
Serial.print(valorpeso, DEC);
Serial.print(",");
secuenciapeso=0;
Serial.print(valsuelo, DEC);
Serial.println(",");
delay(1000); // retardo 1.5 segundos
}
}

//********receptor//

int valsensores = 0;
int startbyte;
int i;
int mivalor = 0;

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

void loop()
{

if (Serial.available() > 0) { // si hay algún dato entrado por el serial empezamos
valsensores=Serial.read(); // se lee el dato se almacena
mivalor=valsensores; // Volcado del dato recibido del emisor
Serial.print(mivalor); //

}
}

Creo que estás cometiendo el error típico. Envías como cadena y recibes como valor. Lo que te muestra la salida son los códigos de los caracteres enviados. Prueba, en lugar de Serial.read Serial.parseint a ver si hay suerte.

noter gracias por tu respuesta pruebo la solución que me diste y te aviso. cuando funcione todo lo subo a ver si a alguien le sirve. Saludos cordiales.

noter me funciono perfecto tu consejo pasa los valores tal cual los transmito. Pero faltaría una sola cosa para que quede definitivamente bien, en mi código después del 4 valor imprimo un salto de linea; cuando recibo la información lo recibo como un 0. Podrías ayudarme con esto?. Lo necesito porque cuando leo los datos recibidos con el realterm los paso automáticamente a una tabla de excel, donde las comas separan las columnas y el salto de linea me permite separar por fila por grupo de datos recibidos o por cada transmisión. Saludos cordiales.

Nuevo código con correcciones:

//EMISOR********

nt secuenciapeso = 0;
int Pinpeso = A0; // coloco en una variable el pin analogo de vapor
int valorpeso = 0; // variable que almacenará la lectura analóga de vapor
int valgas = 0; // variable que almacenará la lectura analóga de gas
int Pingas = A1; // coloco en una variable el pin analogo de gas
int vaporValue = 0;
int Pinvapor = A2;
int Pinsuelo = A4;
int valsuelo = 0;

void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);

}

void loop() {
valorpeso = analogRead(Pinpeso);
while (valorpeso > 600)
{
digitalWrite(3,LOW); //pin digital 3 en 0 lógico
delay (150);
digitalWrite(3,HIGH); //pin digital 2 en 1 lógico
delay (150);
valorpeso = analogRead(Pinpeso);
}
digitalWrite(3,LOW); //pin digital 3 en 0 lógico
for (secuenciapeso=0;secuenciapeso<6;secuenciapeso++)
delay (300);

{
valgas=analogRead(Pingas); //Read Gas value from analog 0
vaporValue = analogRead(Pinvapor); //connect Steam sensors to Analog 3
valorpeso = analogRead(Pinpeso)/4; // almacena en “valorpeso” la lectura analoga
valsuelo = analogRead (Pinsuelo)/10;

Serial.print (valgas, DEC);
Serial.print(",");
Serial.print(vaporValue);//print the value to serial port
Serial.print (",");
Serial.print(valorpeso, DEC);
Serial.print(",");
secuenciapeso=0;
Serial.print(valsuelo, DEC);
Serial.println(",");
delay(1000); // retardo 1.5 segundos
}
}

//********RECEPTOR

int valsensores = 0;

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

void loop()
{

if (Serial1.available()) {
valsensores = Serial1.parseInt();
Serial.print (valsensores);
Serial.print (",");
}
}

Entiendo lo que pasa. Como lo último que envías es una coma y un salto de línea, el parseint entre estos dos caracteres devuelve cero. De todas formas, si te das cuenta, el arduino1 envía como caracteres, el arduino2 recibe los caracteres, los transforma en entero y vuelve a enviarlo como caracteres. Creo que entonces lo mejor será cambiar de estrategia y reenviar directamente los datos tal cual llegan al arduino2, salvo que necesitaras trabajar con los valores leídos, en cuyo caso arreglaríamos el código actual. Prueba en el receptor esto a ver:

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

Read y write leen/escriben un byte sin realizar ningún tipo ce conversión. ¡Ah! En el arduino emisor, tal vez deberías quitar la coma tras el último dato y enviar sólo el salto de línea, es decir, en lugar de Serial.println(",") sólo Serial.println()

noter muchas gracias por tu ayuda, y voy a probar tus consejos, aunque debo contarte que recién lo resolví de una manera menos elegante; envió los datos cada 100ms y leo los datos cada 1000ms pero cuando llega un cero la placa envía in Serial.println (""). Abajo pongo el código completo resuelto nuevamente. No quiero abusar de tu amabilidad pero resulta que tengo este codigo y por otro lado tengo un codigo de control de servos y quisiera unirlos para que funcionen juntos; el tema es que cuando los junto no funcionan ninguno de los dos aunque por separado funcionan perfectamente. Puedes aconsejarme de como hacerlo?

código corregido de sensores receptor:

int valsensores = 0;

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

void loop()
{

if (Serial1.available()) {
valsensores = Serial1.parseInt();
Serial.print (valsensores);
Serial.print (",");
}
else {
valsensores = 0;
Serial.println ("");
delay (1000);
}
}

aquí te dejo los códigos que tengo del proyecto completo como archivos adjuntos. Saludos cordiales.

rover_v3_0_router.ino (2.31 KB)

rover_v3_0_cordinador.ino (3.22 KB)

Buenas Estanoche, me podrias decir en donde has encontrado informacion para configurar las antenas Xbee, yo llevo unas semanas intentadolo y no logro comunicar las antenas.

Gracias

hola marcial te cuento que a mi me paso algo muy particular, porque compre los modulos xbee pro serie 2 que vienen con un adaptador de 2mm de pines (http://www.preciolandia.com/ar/modulo-rf-xbee-pro-s2-zigbee-50mw-hasta-71m123-a.html), el problema es que este modulo no se puede conectar a ninguna shield disponible, ni al explorer, ni al foca.

Lo que yo hice fue conectar la xbee directo a la arduino uno de la siguiente manera. (¡¡¡¡¡OJO!!!!!!PARA QUE FUNCIONE TENES QUE SACAR EL MICRO DE LA ARDUINO O PONERLA EN RESET puenteando el RESET y GND)

[u]XBEE[/u] [u]arduino[/u] vcc 3.3V gnd GND RTS 3.3V DTR GND TX(pin2) RX RX(pin3) GND

Mira este video ahi te explica muy bien, yo lo hice con este video y las tengo andando muy bien a las 2 xbee

https://www.youtube.com/watch?v=KamcI1wjNQ8

una vez que las configure, la conexión simple si no tenes ningún shield son las mismas que las de arriba pero sin conectar a nada el RTS y DTR.

Suerte y contame como te fue, Saludos.

Hola de nuevo. Aunque tengo un poco de lío sobre lo que intentas realizar, y no sé exactamente qué es lo que falla, quiero entender que lo que no te funciona es cuando implementas todas las comunicaciones, ¿no? Si no me equivoco, el programa router recibe una trama con los valores para establecer tres servos, y por otro lado envía una trama al coordinador que éste enviará al PC para guardar en csv o similar. Asimismo, el coordinador retransmite esta trama hacia el PC y envía instrucciones al router. Esto es lo que intuyo, ¿es más o menos así? Aunque de momento veo que en ambos programas tienes una función sensores que no es llamada en ningún punto del programa, y en coordinador, además tienes un if(Serial1.available()) y sin embargo no lees valores de él. La función sensores del router, yo remataría incluyendo un serial.println() después de enviar los valores. De esa forma, si la función sensores del coordinador lo único que ha de hacer es retransmitir al pc la misma secuencia que ha recibido, bastaría con las líneas que te decía antes: while (Serial1.available()) { Serial.write (Serial1.read()); } para repetir todo lo recibido por Serial1 (incluidas comas y salto de línea final) hacia Serial.

También se podría simplificar la rutina para tratar las tramas recibidas en router desde coordinador. Si los valores para los tres servos van a ir siempre en el mismo orden, podrías enviar una trama, tal que: Una letra (por ejemplo S de start) para iniciar la trama, los tres valores separados por coma, y finalmente un salto de línea. Por ejemplo, S13,15,7(y salto de línea). Para recibirlo, bastaría con algo como if (Serial.read()=='S') { // Si no recibimos una S, a saber qué estará llegando :) valorservo1=Serial.parseInt(); valorservo2=Serial.parseInt(); valorservo3=Serial.parseInt(); }

Gracias Noter por tus respuestas, en cuanto a mi proyecto te cuento, la idea es hacer un rover con brazo robot para tomar muestras (suelo y ambiente) y analizarlas insitu. Los servos manejan el brazo robot a distancia con un replicador (http://www.youtube.com/watch?v=-wqdzB0NF-A), algo asi que ya lo estoy fabricando con una impresora 3D rerap, y los sensores analizan la muestra (peso, humedad, gases) y toman lecturas de panel solar para saber los lux presentes. La idea es que pueda tomar la muestra con el brazo (controlado a distancia por el replicador) y depositarla en un recipiente en la estructura con los sensores, una vez que la muestra fue depositada comenzar el analisis de ella y transmitir los datos al centro de control que deben retransmitirse a la PC para alli poder tomar los datos y manejarlos en excel con tablas. Espero que mi explicación del proyecto no te haya confundido aun mas. ahora pruebo las posibilidades que posteastes y te cuento. una pregunta de puro ignorante del tema xbee, como yo necesito esa comunicación bidireccional constante, no puedo conectar el tx de la xbee a una arduino con el programa de servos y el rx a otra arduino con el programa de sensores? o es totalmente loco lo que digo?.

Saludos cordiales.

¿pero los servos y los sensores no van en el mismo arduino?¿o dices de usar tres arduino? De todas formas no te sabría decir, porque no he trabajado con xbee, pero es muy probable que aunque su interfaz se muestre como enviar / recibir, es muy probable que internamente haga ambas cosas constantemente, ya que al ser inalámbrica supongo que llevará algún control de errores y para ello es necesaria comunicación bidireccional.

Gracias por la respuesta Estanoche, pero lo que estaba buscando es la configuración de las antenas, no la conexion. Por cierto, para conectar si existen shields (depende para cual arduino...) http://www.ebay.es/itm/Arduino-Xbee-Pro-V3-Shield-/271245073483?pt=LH_DefaultDomain_186&hash=item3f27775c4b&_uhb=1 y tambien tienes el arduino fio que ya lo lleva incorporado.

Un saludo

ok gracias, lo tendré en cuenta. Saludos