jueves, 24 de marzo de 2011

Emisor Receptor RF con Arduino (II): Primer intento

He estado buscando por internet tutoriales sobre el tema y de todo lo que he encontrado, lo que más esperanzas me ha generado, ha sido VirtualWire para Arduino.

Como dicen los creadores, y yo traduzco, "VirtualWire es una librería para Arduino que permite enviar mensajes cortos, sin direccionamiento, retransmisión o confirmación, como un UDP inalámbrico, utilizando ASK"

VirtualWire is an Arduino library that provides features to send short messages, without
addressing, retransmit or acknowledgment, a bit like UDP over wireless, using ASK
(amplitude shift keying).


El enlace anterior apunta a un documento donde está explicada perfectamente toda la librería. Lo cierto es que la API que proporcionan es bastante limpia y parece sencilla. Así que manos a la obra.

Lo primero que vamos a programar es la parte emisora y el código que he escrito es el siguiente. Es realmente sencillo. Lee cada medio segundo el estado de los botones y lo envía.

#include 

int pinRojo = 2;
int pinVerde = 3;
// me he dado cuenta de que no hace falta
// configurarlo para salida o entrada
int pinTx = 4;

void setup(){
pinMode(pinRojo,INPUT);
pinMode(pinVerde,INPUT);

vw_set_tx_pin(pinTx);
vw_setup(2000);

Serial.begin(9600);
}//setup

void loop(){
delay(500);

int estadoRojo = digitalRead(pinRojo);
int estadoVerde = digitalRead(pinVerde);

char *mensaje = "VACIO";

if ( (estadoRojo == HIGH ) && (estadoVerde == HIGH) ){
mensaje = "A"; // rojo + verde = azul
}else if ( (estadoRojo == LOW) && (estadoVerde == LOW) ){
mensaje = "N"; // nada
}else if ( (estadoRojo == HIGH) && (estadoVerde == LOW) ){
mensaje = "R"; // rojo
}else if ( (estadoRojo == LOW) && (estadoVerde == HIGH) ){
mensaje = "V"; //verde
}

Serial.print("Enviado -> ");
Serial.println( mensaje );

vw_send( (uint8_t *) mensaje , strlen(mensaje) );
}//loop


Y aquí se puede ver el circuito que he montado para el emisor. Está hecho con Fritzing. Como no tenía un componente para el emisor, he dejado el cableado suelto y he añadido las patillas.



Y ahora, vamos a por la parte receptora. También sencilla, cada vez que recibe un mensaje, lo compara y enciende el LED correspondiente.

#include 

int pinRojo = 2;
int pinVerde = 3;
int pinRx = 4;

void setup(){
pinMode(pinRojo,OUTPUT);
pinMode(pinVerde,OUTPUT);

Serial.begin(9600);

vw_set_rx_pin(pinRx);
vw_setup(2000);
vw_rx_start();
}//setup

void loop(){
// esto es un poco engañoso porque sólo voy
// a recibir cosas de tamaño 0
uint8_t mensaje[VW_MAX_MESSAGE_LEN];
uint8_t longitud = VW_MAX_MESSAGE_LEN;

if (vw_get_message( mensaje , &longitud ) ){
Serial.print("Recibido -> ");
Serial.println( mensaje[0] );

if( mensaje[0] == 'A' ){
digitalWrite( pinRojo , HIGH );
digitalWrite( pinVerde , HIGH );
}else if( mensaje[0] == 'R' ){
digitalWrite( pinRojo , HIGH );
digitalWrite( pinVerde , LOW );
}else if( mensaje[0] == 'V' ){
digitalWrite( pinRojo , LOW );
digitalWrite( pinVerde , HIGH );
}else if( mensaje[0] == 'N' ){
digitalWrite( pinRojo , LOW );
digitalWrite( pinVerde , LOW );
}// if de caso de mensaje
}//if de he recibido un mensaje
}//loop


Y aquí se puede ver el circuito que he montado para el receptor. Está hecho con Fritzing. Como no tenía un componente para el receptor, he dejado el cableado suelto y he añadido las patillas.



Y me ha funcionado todo, más o menos a la primera, y no me lo creo todavía. He conseguido exactamente lo que pretendía en un principio. Aquí os dejo un video de esta maravilla funcionando.

4 comentarios:

Anónimo dijo...

si precionas los dos botones al mismo tiempo si encienden los 2?

aquel que desafía al sol dijo...

Aunque no se aprecia bien en el vídeo, sí.

Anónimo dijo...

que circuitos utilizas para el transmisor y receptor? son comprados? o tu los armaste?? gracias por tu respuesta!

aquel que desafía al sol dijo...

Buenas.

En el primer párrafo de la primera entrada del bloque Emisor Receptor RF con Arduino (I): Introducción comento en qué tienda les adquirí.

Un saludo y gracias