Go Down

Topic: Lectura XBee Receptor para poder gobernar mi mountainboard (Read 4 times) previous topic - next topic

yOPERO

#10
Nov 10, 2012, 12:35 pm Last Edit: Nov 10, 2012, 12:41 pm by yOPERO Reason: 1
Creo que el problema esta en la forma en la que envías y recibes datos.

Tienes que crearte un mini protocolo con un carácter de inicio y fin

eg:
Desde el emisor:
Si quieres que el buzzer suene por 2 segundos  debes enviar el comando para el buzzer "B" el comando de high "1" y el tiempo "2" quedando la cadena en B12

Si quieres un motor tendrás que enviar el comando para el motor "M" luego quizás el valor como 255 quedando la cadena en M255

Tu protocolo tiene que ser siempre de la misma longitud:
B120 //anado un 0 para hacerlo de 4 caracteres
M255 //no hay cambios

Para hacerlo aun mas estable añades un carácter de inicio  "<" y fin ">"

Tu protocolo de envió quedaría  "<XNNN>" donde X es una letra y N un numero.

En el receptor:
Tienes que desgranar el protocolo
si recibo "<" y recibo "X " y recibo "N" y "N" y "N" y ">" almaceno XNNN en un array luego en función de este array mandas ordenes:

if array[0] = B y array[1]= 1
{
pinbuzeer = high;
delay(array[2]);
}
Esa es la idea general.
Trabaja en ello y si quieres y necesitas mas ayuda el fin de semana que viene tendré mas tiempo que este.(hacemos un hackaton virtual)


 
Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

anonimator

Hola yOPERO.

Después de algunos días desconectado debido al currillo, hoy por fin me puedo dejar ver por aquí para leer toas las cosas interesantes que hay por aqui, esto es como cuando llevabas varios días sin ir a jugar al futbolin por que tenias examenes, jijiji.

YOPERO así como lo cuentas lo entiendo y lo comprendo perfectamente lo esplicado en el post anterior, el problema es que intentado crear algún protocolo, perdiendome debido a mi poca experiencia con este lenguaje de programación arduino.

Te estaria super agradecido si así como me transmites podemos hacer un hackaton virtual este finde, ya que estoy deseando seguir aprendiendo y por supuesto llegar a terminar mi proyecto.

Voy a ver si abanzo algo y te cuento.

Abrazotes compis... :smiley-mr-green:

yOPERO

Debido a la huelga he tenido un hueco, he escrito el código de abajo para el receptor
El emisor tendrá que enviar algo  como:
Code: [Select]
Serial.print('/')//El byte de incio de  la trama
Serial.print(1)//el servo a controlar
Serial.print(150)//el angulo del servo


Y este el codigo del receptor:
Code: [Select]
/*! \mainpage Mountain_Board Index Page
*
* \section intro_sec Descripcion
*
  Mountain_Board_rx.ino v1.0
  \n Leemos el puerto Serie y esperamos por 3 bytes. Comprobamos si el primer byte es el "Byte_Inicio" si asi fuese almacenamos los dos siguientes bytes como
  "servo" y "pos" usando como intermediario el array  "userInput[2]".
  \n\n eg comando para mover servo1 180 grados ==  /1180.
  \n eg comando para mover servo2   5 grados == /25.
*/

/** Incluimos la libreria  <Servo.h>. */
#include <Servo.h>
/**create servo object to control a servo*/
Servo servo1;

/**create servo object to control a servo*/
Servo servo2;

/*--Variables y constantes para manejar los bytes que recibimos---*/
/**Valor en decimal de nuestro Byte_Inicio*/
#define Byte_Incio 47 //Valor en decimal de nuestro Byte_Inicio(47 = '/')

/**Almacena primer Byte*/
int first_Byte;

/**Almacena el servo*/
int servo;

/**Almacena la posicion*/
int pos;

void setup()
{
  Serial.begin(9600);
  servo1.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop()
{
  Leer_Serial();
  Switch_Servo();
  //DEBUG();
  delay(10);//10-20ms
}

/** \brief Leer datos recibidos del Serial */
void Leer_Serial(){
  /**
    \details Esperamos por 3 bytes y comprueba si el primer byte es el
    Byte_Inicio, luego almacena los dos siguientes bytes.
  */
  if (Serial.available() > 2)//Esperar a tener por lo menos 3 bytes
{
    // Leer el primer byte
    first_Byte = Serial.read();
    // Si es realmente el first_Byte (47) ... '/'
    if (first_Byte == Byte_Incio)
      {
      int i;
      int  userInput[2];// ... entonces almacenar los 2 siguientes bytes
      for (i=0;i<2;i++) {
        userInput[i] = Serial.read();
      }
        // Primer byte =  que servo a mover
        servo = userInput[0];
        // Segundo byte = a que posicion
        pos = userInput[1];
       }
   }

}

/** \brief Para manejar mas de un servo si fuese necesario*/
void Switch_Servo(){
  /**
    \details Para manejar mas de un servo si fuese necesario.
    \n Escoge que servo mover segun lo recibido en leer_serial().
  */
   
  switch (servo) {
    case 1:
      servo1.write(pos);    // mover servo1 a 'pos'
      break;
    case 2:
      servo2.write(pos);
      break;
    default:
      break;
      } 
}
/**\brief DEBUGGING.....*/
void DEBUG(){
  Serial.print(first_Byte);//DEBUG
  Serial.print(servo);//DEBUG
  Serial.print(pos);//DEBUG
}


Con esto ya puedes adaptar el código a tus necesidades.
Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

yOPERO

#13
Nov 15, 2012, 12:38 pm Last Edit: Nov 15, 2012, 12:42 pm by yOPERO Reason: 1
Dado que usamos comunicaciones inalámbricas
//ToDo:  error checking(enviar datos normal e inverso)
Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

anonimator

Hola yOPERO.

Este fin de semana me pongo con este  código el cual me pondrá a estudiar para ver que puedo hacer e ir dándole forma.

Un saludo y gracias.

Go Up