Pages: [1]   Go Down
Author Topic: Señales analogicas y digitales de Tx XBee a Rx XBee, tipo array.  (Read 954 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola de nuevo Compañeros.

Después de un tiempo desconectado por falta de tiempo, hoy me pico el gusanillo de volver a coger el hilo de lo que andaba tramando hace ya un tiempo.

Os cuento, tengo dos arduinos con sus respectivos xbees y comunican de maravilla, les he montado un código para poder enviar señales analogicas y digitales de uno a otro, en cuanto a las digitales me funciona todo bien, cuando pulso interruptor en el emisor, se cambia de estado de 0 a 1 y como consecuencia se me enciende el led correspondiete y se apaga al dejar de pulsar.

Pero ando un poco despistado con las analógicas ya que a pesar que en el receptor se  monitoréa correctamente lo que está pasando en el emisor, algo así:

/0,0,0,0
/0,0,0,0
/0,1,0,0     //cuando actúo en la segunda posición en el pulsador me pasa de 0 a 1 y se enciende el led.
/0,0,235,0 //cuando actúo en el poti del emisor, monitoreo esto en la tercera posición pero no consigo mover el servo.

Pues eso es lo que me pasa, las lineas que leo en el monitor serie en tiempo real me funcionan correctamente, todos los estados analogicos y digitales cambian en las posiciones correspondientes de 0 a 1 en el caso de las digitales y de 0 a 255 en las analógicas, pero en estas últimas no se como tengo que hacer para que el servo se posicione en el valor leido de 0 a 255.

aquí os dejo mi código 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(smiley-cool; // 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
}
}
}
 smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ey, no hay nadie que me oriente con el tema que expongo en el post anterior ????

Gracias y saludos compañeros.

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yo también tuve problemas con la transmisión por Xbee no lograba leer la trama de forma correcta, ayer por fin conseguí una solución, la recepción de la señal analógica es bastante precisa y limpia. 
Al principio estaba utilizando el "switch" pero de esa manera no me funcionaba bien, dejo parte de mi código de prueba.

Code:
// Transmisor
int JoystickPan = 0;
int JoystickTilt = 1;
int JoystickVert = 2;
int JoystickHorz = 3;
 
int ValposPan;
int ValposTilt;

int ValVert;
int ValHorz;

byte ValPanSerial;
byte ValTiltSerial;

byte ValVertSerial;
byte ValHorzSerial;


void setup() {
  Serial.begin(9600);                 // Inicia el puerto serial 9600bps
 
}

void loop() {
  ValVert = analogRead(JoystickVert);
  ValHorz = analogRead(JoystickHorz);
 
  ValVertSerial = map(ValVert, 0, 1023, 0, 180);
  ValHorzSerial = map(ValHorz, 0, 1023, 0, 180);
 
  Serial.write('<');
  Serial.write(ValVertSerial);
  Serial.write(',');
  Serial.write(ValHorzSerial);
  Serial.write('>');
 
  delay(20);
 
 
 
 
 }
 

Code:
//Receptor
#include <Servo.h> // Carga la librería Servo.h que contiene métodos para trabajar con

#define Byte_Inicio 60             // Valor en decimal de nuestro Byte_Inicio(60 == '<')

Servo ServoDer;   
Servo ServoIzq; 
Servo ServoPant;                     // Control de camara horizontal
Servo ServoTilt;                     // Control de camara vertical

int valDer;                         // variable para leer el valor del pin analógico
int valIzq;                         // variable para leer el valor del pin analógico
int Pant;
int Tilt;

int Adelante;
int Atras;
int Derecha;
int Izquierda;

int i;
int Inicio_Byte;
byte Trama[5];

void setup() {
  ServoDer.attach(3);                   // asocia el servo al pin 3 pinza
  ServoIzq.attach(5);                   // asocia el servo al pin 5 muñeca vertical
  ServoPant.attach(6);
  ServoTilt.attach(9);

  Serial.begin(9600);                   // set up Serial library at 9600 bps

}
void loop() {
 
 if (Serial.available() > 4){           // Comprobamos que el canal serie XBee está disponible

Inicio_Byte = Serial.read();            // Leemos el valor que nos envia inalámbricamente Emisor Xbee
if (Inicio_Byte == Byte_Inicio) {       //Se comprueba que es el byte de inicio

for (i = 1; i < 5; i++) {
Trama = Serial.read();
}
valDer = Trama[1];

valIzq = Trama[3];

}
}

ServoDer.write(valDer);
ServoIzq.write(valIzq);

}


Aunque en el transmisor utilices "," y ":" para separa los datos transmitidos, en el receptor no almacenes en variables estos byte, hazlo solo con las señales que te interesan, por eso ves que en la lectura serial de la trama solo guardo en variables los byte de la Trama[1] y Trama[3] que son las dos señales analógicas que quería probar.   
Logged

Pages: [1]   Go Up
Jump to: