Saludos al amable foro, tengo una duda que quizas sea mas obvia para los demas, el caso es que yo no entiendo porque sucede, aun cuando lo resolvi con un truco pero quisiera saber que es lo que no sé o porque sucede.
primero que nada el codigo tanto del Transmisor como el del Receptor
TRANSMISOR
RECEPTOR
Ahora explico: Se trata de hacer un radio control (R/C) para manejar algunos juguetes de hace mucho tiempo que ya no tienen su transmisor o receptor, asi que me dia a la tarea de traerlos a la vida fabricando mis propios controles de manera muy economica, de echo ya lo consegui y funcionan de maravilla. con estos modulos
SYN115 (transmisor) y SYN480r (Receptor) he alcanzado algo asi como 70 mts y en vista directa alcanzan hasta 100 metros lo cual para un juguete esta de sobra. Asi que recomiendo estos modulos para esos fines ya que en conjunto (ATMEGA+Modulos+otros pertrechos) resulta muy economico y eficaz lograr buena telemetria.
Pero vamos a mi duda, en estos ejemplos que pongo, reuduzco el codigo y me enfoco a transmitir tres Bytes y como podras ver estos estan contendios en:
byte Eje_X; //Variable para el potenciometro Eje X
byte Eje_Y; //Variable para el potenciometro Eje Y
byte Boton;//Variable para el Boton
Estas Variables ya con el contenido obtenido y listo para enviar, los convierto a un arreglo CHAR:
msg[0]=char(Eje_X);
msg[1]=char(Eje_Y);
msg[2]=char(Boton);
y por ultimo se envia via la funcion disponible en la Libreria VirtualWire.
Ahora bien, si compilan y ejecutan el codigo, podran ver que todo funciona a la perfeccion, pero OjO y ahi viene mi duda:
Esta la siguiente linea:
Boton=digitalRead(4)+1;//se suma un uno ya que el CHAR (que sera usado mas adelante) no soporta el cero
En la que obtengo el "estado" del PIN4 del arduino, que como sabemos solo puede ser 0 o 1, pero en este caso le sumo un Uno (para obtener 1 o 2. ¿Poque? porque si no le sumo el uno; al transmitir el dato con la funcion de VirtualWire pues simplemente no se ve reflejado en el codigo del receptor...y no entiendo porque sucede esto...como ya comente, al final lo resolvi con este truco, pero mi mente queda con la duda de saber porque. Ojala alguien me pueda quitar este trabucles.
Saludos y muchas gracias.
primero que nada el codigo tanto del Transmisor como el del Receptor
TRANSMISOR
C++:
/*
control remoto usando la libreria VirtualWire
en Modulos Inalambricos SYN115 / SYN480R 433MHZ
Este es el codigo del Transmisor
El PIN 12 del arduino es el que usa Virtual Wire para "TX"
y este, a su vez, se conecta a "Data" del Modulo SYN115 con una resistencia de 10Kohms
ya que el modulo SYN115 se alimenta con 3.3 volts
Por otro lado, se conectan 2 resitencias varibles de 10Kohms (Yoystick) a las entradas analogicas A0 y A1
y por ultimo un boton al Pin 4 del arduino.
*/
#include <VirtualWire.h>
//Declaramos las tres variables que vamos a enviar en el ejemplo
byte Eje_X; //Variable para el potenciometro Eje X
byte Eje_Y; //Variable para el potenciometro Eje Y
byte Boton;//Variable para el Boton
void setup()
{
pinMode(4,INPUT_PULLUP);//configuramos el pin4 como entrada y resistencia PullUp
Serial.begin(115200); // inicializamos puerto serie para monitoreo
Serial.println("Iniciando");
// se inicializan las interrupciones que ocupa la Libreria VirtualWire
vw_set_ptt_inverted(true); // esta linea no se ocupa ya que es usada en otras aplicaciones como WalkieTalkies
vw_setup(2000); //Configuramos los Bits por segundo
}
//funcion para mapear los valores obtenidos de los potenciometros
int mapJoystickValues(int val, int Bajo, int medio, int superior, bool invertir)
{
val = constrain(val, Bajo, superior);
if ( val < medio )
val = map(val, Bajo, medio, 0, 128);
else
val = map(val, medio, superior, 128, 255);
return ( invertir ? 255 - val : val );
}
void loop()
{
//declaramos la variable char usada para enviar los datos por Virtualire
char msg[VW_MAX_MESSAGE_LEN];
//Obtenemos los datos ya mapeados en sus respectivas variables
Eje_X=mapJoystickValues( analogRead(A0), 0, 512, 1023, true );
Eje_Y=mapJoystickValues( analogRead(A1), 0, 512, 1023, true );
Boton=digitalRead(4)+1;//se suma un uno ya que el CHAR (que sera usado mas adelante) no soporta el cero
//Monitoreamos los datos a enviar
Serial.println(String(Eje_X)+","+String(Eje_Y)+","+String(Boton));
//Formamos el mensage a enviar con los datos obtenidos
msg[0]=char(Eje_X);
msg[1]=char(Eje_Y);
msg[2]=char(Boton);
//Encendemos el Led del arduino para ver que inicia la transmision
digitalWrite(13, true);
vw_send((uint8_t *)msg, strlen(msg));//enviamos el mensage
vw_wait_tx(); // esperamos a que el mensage se halla enviado por completo
digitalWrite(13, false);//Apagamos el led al finalizar la transmision
}
RECEPTOR
C++:
/*
Control remoto usando la Libreria VirtualWire
En modulos inalambricos SYN115/SYN480r 433mhz
Codigo del receptor
El pin 11 en el arduino es ocupado como RX por la libreria VirtualWire
Y es ahi donde se conecta el pin "Data" del Modulo SYN480r
por el momento solo se reciben los caractares Char validos
*/
#include <VirtualWire.h>
void setup()
{
Serial.begin(115200); // inicializamos el puerto serie para monitore
Serial.println("Iniciando");
// Iniciamos las interrupciones ocupa la libreria VirtualWire
vw_set_ptt_inverted(true); // esta linea en realidad no se ocupa ya que sirve para Walkie Talkies
vw_setup(2000); // Configuramos los Bits por segundo
vw_rx_start(); // Iniciamos el servicio de "escucha" de la libreria
}
void loop()
{
//iniciamos las Variables usadas por la libreria y es donde se contiene la informacion recibida
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // si hay un mensage valido en el Buffer
{
digitalWrite(13, true); // Encendemos el Led del arduino para saber que inicio una recepcion
Serial.println("Informacion recibida: ");
//Mostramos el contenido del Buffer recibido
for (int i = 0; i < buflen; i++)
{
Serial.print((buf[i]),DEC);
Serial.print(" ");
}
Serial.println("");
digitalWrite(13, false);
}
}
Ahora explico: Se trata de hacer un radio control (R/C) para manejar algunos juguetes de hace mucho tiempo que ya no tienen su transmisor o receptor, asi que me dia a la tarea de traerlos a la vida fabricando mis propios controles de manera muy economica, de echo ya lo consegui y funcionan de maravilla. con estos modulos
SYN115 (transmisor) y SYN480r (Receptor) he alcanzado algo asi como 70 mts y en vista directa alcanzan hasta 100 metros lo cual para un juguete esta de sobra. Asi que recomiendo estos modulos para esos fines ya que en conjunto (ATMEGA+Modulos+otros pertrechos) resulta muy economico y eficaz lograr buena telemetria.
Pero vamos a mi duda, en estos ejemplos que pongo, reuduzco el codigo y me enfoco a transmitir tres Bytes y como podras ver estos estan contendios en:
byte Eje_X; //Variable para el potenciometro Eje X
byte Eje_Y; //Variable para el potenciometro Eje Y
byte Boton;//Variable para el Boton
Estas Variables ya con el contenido obtenido y listo para enviar, los convierto a un arreglo CHAR:
msg[0]=char(Eje_X);
msg[1]=char(Eje_Y);
msg[2]=char(Boton);
y por ultimo se envia via la funcion disponible en la Libreria VirtualWire.
Ahora bien, si compilan y ejecutan el codigo, podran ver que todo funciona a la perfeccion, pero OjO y ahi viene mi duda:
Esta la siguiente linea:
Boton=digitalRead(4)+1;//se suma un uno ya que el CHAR (que sera usado mas adelante) no soporta el cero
En la que obtengo el "estado" del PIN4 del arduino, que como sabemos solo puede ser 0 o 1, pero en este caso le sumo un Uno (para obtener 1 o 2. ¿Poque? porque si no le sumo el uno; al transmitir el dato con la funcion de VirtualWire pues simplemente no se ve reflejado en el codigo del receptor...y no entiendo porque sucede esto...como ya comente, al final lo resolvi con este truco, pero mi mente queda con la duda de saber porque. Ojala alguien me pueda quitar este trabucles.
Saludos y muchas gracias.