jueves, 24 de marzo de 2011

Emisor Receptor RF con Arduino (III): Conclusiones

Los tutoriales que encontré por internet trataban el tema a tan bajo nivel que se me hacía imposible seguirlos. Esta librería te abstrae completamente de todo y sólo te tienes que preocupar practicamente de la función enviar mensaje y recibir mensaje. Te lo dan todo hecho. Aunque esto, para gente que le guste trastear más, pueda ser un inconveniente. Yo, sólo puedo decir cosas buenas de VirtualDrive para Arduino.

He probado el alcance, y a unos tres metros, que es lo máximo que me dan los cables usb, funciona igual de bien. No estoy usando antenas de ningún tipo. Debería buscar como alimentar al Arduino con una base de pilas. De este modo no estaría limitado al cable conectado al ordenador.

Lo siguiente que voy a intentar hacer en esta línea, es conectar el Arduino emisor al ordenador que leerá órdenes de un joystick, y un Arduino receptor al Lego(C) Mindstorms y tratar de manejarlo remotamente, al más puro estilo coche teledirigido.

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.

Emisor Receptor RF con Arduino (I): Introducción

Durante un arrebato consumista estas navidades, hice un pedido a una tienda de electrónica de un montón de cachirulos. Una de las cosas que pedí, fueron un par de módulos emisor y receptor de radiofrecuencia.

Y como el pedido me vino muy bien, rápido y no tengo ninguna queja, os he enlazado los productos a la tienda.

Lo que pretendo conseguir es conectar un Arduino a un emisor, y otro Arduino al receptor, y tratar que se comuniquen entre si utilizando la magia de las ondas.

Aprovecho para contar, que en mi arrebato consumista navideño, cayó un Arduino Uno. Para que juege con el Arduino Duemilanove que ya tenía, que estaba muy sólo ultimamente.

¿Cómo voy a probar que mis dos Arduinos se llevan bien, y hablan entre si? El Arduino emisor leerá los valores de dos botones, y el Arduino receptor encenderá un par de leds según el botón pulsado.