XBee + XBee lectura codigos ascill

Hola amigos.

Tengo dos Xbee comunicando uno coordinador y otro router end, los comunico con el propósito de enviar por puerto serie control de servo y boton de encendido, siendo satisfactoria la comunicación y obedeciendo el router las ordenes de coordinador.

Cuando envío desde el coordinador el carácter “D” para que cuando lo recepcione el router end (receptor) por puerto serie me encienda un led y así es ya que me funciona de maravilla,

lo que pasa y el problema es que cuando mando los datos para gobernar el servo desde el potenciometro del coordinador y en la lectura por puerto serie del receptor coincide el carácter D de la lectura del pontenciometro con el del led me lo enciende y no se como corregir este problema.

Ya que si no voy equivocado la recepción de potenciometro por puerto serie del receptor son todos los caracteres del codigo ascill.

Se puede hacer algún tipo de filtro?
Se puede sustituir un carácter por una palabra para que no coincidan?

Gracias compañeros, al menos por leerme.

COORDINADOR

int val = 0;
byte mapVal = 0;
int potPin = 0;
int botonbuzzer = 5;

void setup()COORDINADOR

int val = 0;
byte mapVal = 0;
int potPin = 0;
int botonbuzzer = 5;

void setup()
{
Serial.begin(19200);
pinMode(potPin, INPUT);
pinMode(botonbuzzer, INPUT);
}

void loop()
{
val = analogRead(potPin);{
mapVal = map(val,0,1023,0,179);
Serial.write(mapVal);
delay(2);
}
{
if(digitalRead(botonbuzzer)== HIGH) {
Serial.print('D'); }

}
}

ROUTER END

#include <Servo.h>

Servo scottServo; // create servo object to control a servo
int servoPin = 9; // analog pin used to connect the potentiometer
int servoValue = 0; // variable to read the value from the analog pin
int buzzer = 5;

void setup()
{
Serial.begin(19200);
scottServo.attach(9); // attaches the servo on pin 9 to the servo object
pinMode(buzzer,OUTPUT);
}

void loop()
{
if(Serial.available()> 0)

servoValue = Serial.read();
scottServo.write(servoValue);

if(Serial.read()== 'DZUB') {
digitalWrite(buzzer,HIGH);
delay(10);
digitalWrite(buzzer,LOW); }

}
8)

Tienes que hacerte un pequeño protocolo. Por ejemplo envías un byte de inicio, otro con el estado del led, otro con el valor para el servo y un último byte como fin de la trama. En el receptor lees los bytes en un array y operas en consecuencia.

Ahora que caigo si no tienes intención de enviar más información puedes seguir haciéndolo igual. Para el servo estás enviando un byte desde 0 hasta 189. Te quedan los bytes 190 hasta 255 para enviar información adicional como el estado del led.

Hola Cheyene.

Ante todo darte las gracias por el interés.

Algo de lo que me indicas había leído pero el problema es que no se crear ese protocolo,
Me puedes orientar y ayudar de cómo crearlo.

Por otro lado si que quiero enviar mas datos.

Saludos.

El protocolo dependerá de los datos que quieras enviar. Suponiendo que lo que envíes son datos muy sencillos, es decir que cada dato lo puedas enviar mediante un byte (sólo necesitas como información un número de 0 a 255 para cada dato) puedes hacer algo así para el envío de 4 datos (esta es una forma muy sencilla dentro de las muchísimas posibilidades que hay). No los he compilado y no están enteros a nivel de definir variables y demás.

//Emisor

  Serial.print("!");     //identificador inicio de trama
  Serial.write(Byte1);
  Serial.write(Byte2);
  Serial.write(Byte3);
  Serial.write(Byte4);
  Serial.println();    //identificador final de trama, tener en cuenta que son dos bytes
//Receptor

byte Trama[7];
boolean ErrorTrama = false;

void loop() {
  if (Serial.available() > 6) {
    
while (Serial.available() > 6) {
  Trama[0] = Serial.read();

  if (Trama[0] = '!' && Serial.available() > 5) {
    
    for (int i=1; i < 7; i++) {
      Trama[i] = Serial.read();
    }
    
  if (Trama[5] == '\r' && Trama[6] == '\n') {     //Los dos bytes que envía Serial.println()
    ErrorTrama = false;
  }
  else {
    ErrorTrama = true;
  }
  
  }

}

  if (ErrorTrama == false) {
    Byte1 = Trama[1];
    Byte2 = Trama[2];
    Byte3 = Trama[3];
    Byte4 = Trama[4];
  }

}
}

Hola Cheyenne y demás compañeros.

Buenos yo sigo dándole a la neurona a ver si me sale la parte de mi código receptor por puerto serie.

Os he adjuntado por un lado mi código emisor el cual funciona correctamente, como podéis observar en la foto la lectura es correcta ya que estoy actuando en ese preciso momento en los potenciomentros (A1 y A2) y al mismo tiempo en el rec. Con lo cual obtengo esos valores dos de ellos analogicos y uno digita.

Pues bien haciendo caso a los consejos de nuestro amigo Castillo me he preparado el código receptor para poder extraer por el char array los datos del puerto serie, pero claro no iba a ser tan fácil me me empieza a que no he declarado Servo eje_yPin en el ambito y la verdad es que me crea dudas de como tengo que hacerlo y por ello os escribo para que me deis sugerencias.

Por otro lado si creéis o observais que he cometido algún error en dicho codigo os agradeceré que me corrijais ya que me considero novato en esto de la programación y estoy aprendiendo.

Gracias compeñeros

Estás haciendo la lectura en el receptor como te he dicho yo, es decir, leyendo una trama de longitud fija. Para que te funcione lo que tienes que enviar los datos con una trama fija. Para ello tienes que convertir tus variables a tipo byte (ya que todas están en el rango 0 - 255) y enviarlas como te indicaba con Serial.write().

Hola Cheyenne.

Gracias por contestar, podrías detallarme mas sobre como son esas lineas de código.

Me pierdo en segun que puntos como tengo que convertir esas variables en tipo byte? ya que me considero bastante novato.

Gracias.

Crea una variable en array como la que tienes pero como tipo byte, por ejemplo: byte MapeoSensores[4];
Y en ese array almacenas los valores mapeados. Luego no tienes más que enviar Serial.write(MapeoSensores*);*