Go Down

Topic: [Problema] comunicaciones XBEE (Read 985 times) previous topic - next topic

Mar 30, 2013, 11:19 pm Last Edit: Mar 31, 2013, 10:14 pm by Arduteka Reason: 1
Hola.

Necesito saber en mi código ¿por qué cuándo envío datos analógicos entre dos arduinos no responde como se esperaría?
Probado con dos arduinos uno conectados por TX RX y también, con dos uno arduinos UNO con sus correspondientes XBEE.
El emisor tiene dos pulsadores digitales y un potenciómetro analógico (pin 2 y pin 3 digital pulsador - pin A0 analógico potenciómetro).
El receptor tiene dos leds para comprobar que responden a los pulsadores del emisor (pin 7 digital led // pin 12 digital led).

Si solo actuamos sobre los pulsadores, los leds responden correctamente.
Pero al actuar sobre el potenciómetro, no se que ocurre pero no responde al código programado al 100% como inicialmente empezamos, ya que después de actuar sobre el potenciómetro los leds no se encienden cuando activamos los pulsadores del emisor. También ocurre que al actuar sobre el potenciómetro los leds parpadean secuencialmente.
Y curiosamente en el monitor del receptor todo se visualiza correctamente.

##################################################################################################

CÓDIGO del emisor

int valorAnalogicoA0 = 0;
int valorAnalogicoA1 = 0;

void setup()
 {
   Serial.begin(19200);  // declaramos la velocidad del puerto

   pinMode(2, INPUT);
   pinMode(3, INPUT);
   
 }
 
void loop()               // entramos en el bucle
 {
       valorAnalogicoA0 = analogRead(0);
       valorAnalogicoA1 = analogRead(1);
       analogWrite(6, valorAnalogicoA0/4);
       Serial.print(digitalRead(2));     // primer dato enviado (leemos el valor de la entrada 2)
       Serial.print(',');                // separamos por una coma
       Serial.print(digitalRead(3));   // tercer dato enviado (leemos el valor de la entrada 3)
       Serial.print(',');                // separamos por una coma
       Serial.println(valorAnalogicoA0/4);
     delay(100);     // retardo de 10 msegundos
 }

########################################################################

CÓDIGO del receptor

#include <Servo.h>

int count = 0;
int a = 0, b = 0, c = 0, d = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;
int LEDpin7 = 7;
int LEDpin12 = 12;
int valorservo = 0;
Servo myservo; // crea un objeto tipo servo para controlar el servo


void setup()
 {
   Serial.begin(19200);  // declaramos la velocidad del puerto
   pinMode(LEDpin7, OUTPUT);
   pinMode(LEDpin12, OUTPUT);
   myservo.attach(8);    // En EduBasica el servo se conecta al pin 8

 }
 
void loop()               // entramos en el bucle
 {
    if (Serial.available() > 0)
   {                
               if (count < 7)      // si el dato leido es menor que 7, saca por pantalla e incrementa
                 {

                   count++;            // incrementa el contador
                   //Serial.print(count);
                   
                   switch (count)      // analiza cada valor enviado por el puerto serie
                     {
                       case 1:                // contador a 1 sera el primer dato
                         a = Serial.read();   // lee ese dato y lo asigna a a                          
                         break;
                       
                       case 2:                 // contador a 2 sera el segundo dato
                         b = Serial.read();    // lee ese dato y lo asigna a b (es una ',')                        
                         break;
                       
                       case 3:                 // contador a 3 sera el tercer dato
                         c = Serial.read();    // lee ese dato y lo asigna a c                          
                         break;
                         
                       case 4:                 // contador a 2 sera el segundo dato
                         d = Serial.read();    // lee ese dato y lo asigna a d (es una ',')                        
                         break;
                       
                       case 5:                 // contador a 2 sera el segundo dato
                         e1 = Serial.read();    // lee ese dato y lo asigna a e1 (bit analogico 2)                        
                         break;
                       
                       case 6:                 // contador a 2 sera el segundo dato
                         e2 = Serial.read();    // lee ese dato y lo asigna a e2 (bit analogico 1)                        
                         break;
                         
                       case 7:                 // contador a 2 sera el segundo dato
                         e3 = Serial.read();    // lee ese dato y lo asigna a e3 (bit analogico 0)        
                         break;                        
                     }
                     
                     if (a == '1')        // analiza si a es 1
                           {
                             digitalWrite(LEDpin7, HIGH);  // activa el led salida 7
                           }
                     else digitalWrite(LEDpin7, LOW);  // en caso contrario lo desactiva                          
                     Serial.print (char(a));     // saca por pantalla el valor de a en ASCII
                     
                     Serial.print (char(b));   // saca por pantalla ","
                     
                     if (c == '1')         // analiza si c es 1
                           {
                             digitalWrite(LEDpin12, HIGH);  // activa el led salida 12
                           }
                     else digitalWrite(LEDpin12, LOW);  // en caso contrario lo desactiva
                     Serial.print (char(c));     // saca por pantalla el valor de c en ASCII
                     
                     Serial.print (char(d));   // saca por pantalla ","
                     
                     Serial.print (char(e1));   // saca por pantalla bit 2 analogico
                     
                     Serial.print (char(e2));   // saca por pantalla bit 1 analogico
                     
                     Serial.print (char(e3));   // saca por pantalla bit 0 analogico
                     
                     valorservo = char(e1)+char(e2)+char(e3);
                     myservo.write(valorservo);
                     
                 }
               else         // en caso contrario salto de linea y comienza la cuenta
                 {
                   Serial.println("");  // salta a la siguiente linea en pantalla
                   count = 0;           // pone el contador a 0
                 }
                 
   }
 }

#############################################################################################


Conguito

Donde pones
if (a == '1')
creo que deberías poner
if (a == 1)
no estás leyendo datos de tipo char del puerto serie, sino bits y bytes.........ya que estás enviando las lecturas digitales y anañlógicas.
Salu2.

Gracias por tu respuesta pero eso ya lo he probado y hace lo mismo.

Conguito

Viendo un poco más a fondo el código del receptor veo que usas el mismo puerto serie para el XBee y para el monitor serial..........es conveniente que no uses el mismo puerto para las dos cosas, puedes crear un puerto en cualquier otra pareja de pines con la librería software serial y usar ese puerto hecho por software para el XBee ya que la conexión al pc de la placa de aruduino no la puedes cambiar y a la fuerza será la de los pines 0 y 1.
Salu2.

Perdona por tardar en responder, tenías toda la razón, así si funciona.

Mil gracias y saludos.

Go Up