En el siguiente tutorial veremos como hacer un sencillo mando de control remoto por radiofrecuencia.
Para ello nos vamos a servir de un emisor y un receptor de 433MHz como los que se muestran en la foto. Los módulos tienen un precio muy bajo, menos de 3 euros y aunque las prestaciones son modestas, son servirán para proyectos que no requieran de gran precisión y rapidez en las comunicaciones.
Conectaremos cada uno a una tarjeta Arduino. El emisor consistirá en una botonera con seis pulsadores y a la salida del receptor colocaremos seis leds para verificar el funcionamiento.
Como indicaba más arriba, el transmisor consiste en una botonera con seis pulsadores que bien puede servir en un futuro, para controlar un coche de radiocontrol.
La conexión del módulo es muy sencilla, solo necesita tres hilos: +5V, GND y el pin DATA al D13 del Arduino. Se puede usar cualquier otro pin digital dependiendo de las necesidades de cada uno.
Los condensadores y resistencias colocados a la entrada de los pines digitales son para evitar los rebotes y picos de señal que se producen al pulsar los botones. Es un problema intrínseco de los pulsadores y se conoce como debounce.
El circuito de la botonera consiste en una pista común con +5V que llega a todos los pulsadores. Dependiendo del pulsador que se accione metemos esos 5V al pin digital del Arduino que corresponda.
Con la botonera, un Arduino Nano y una pila de 9V, se puede hacer un sencillo mando inalámbrico.
Como veis el receptor también necesita de dos hilos de alimentación más el de datos.
Conectaremos seis leds a la salida del Arduino que se encenderán con cada uno de los pulsadores del mando.
El código lo he picado a partir del original que dedican los chicos de Robologs a los transmisores de radiofrecuencia en este tutorial
Para que funcione el sketch necesitamos la librería Virtual Wire.
El funcionamiento es el siguiente. Cada vez que pulsamos uno de los botones del mando a distancia, el Transmisor manda un mensaje. Este mensaje es recibido por el Receptor que lo interpreta y activa la salida correspondiente encendiendo un led.
/*
Proyecto 32 - 433MHz Wireless Remote Control
Sketch para el Transmisor.
Modificado por Angel M. https://sites.google.com/site/angmuz/
a partir del original de Nano www.robologs.net
*/
#include <VirtualWire.h>
void setup()
{
vw_setup(2000); // velocidad de transminión en bits por segundo
vw_set_tx_pin(13); // input data pin
pinMode(3, INPUT); // SW1
pinMode(4, INPUT); // SW2
pinMode(5, INPUT); // SW3
pinMode(6, INPUT); // SW4
pinMode(7, INPUT); // SW5
pinMode(8, INPUT); // SW6
}
void loop()
{
// SW1
if (digitalRead(3)==HIGH)
{
send("led1_on");
}
if (digitalRead(3)==LOW)
{
send("led1_off");
}
// SW2
if (digitalRead(4)==HIGH)
{
send("led2_on");
}
if (digitalRead(4)==LOW)
{
send("led2_off");
}
// SW3
if (digitalRead(5)==HIGH)
{
send("led3_on");
}
if (digitalRead(5)==LOW)
{
send("led3_off");
}
// SW4
if (digitalRead(6)==HIGH)
{
send("led4_on");
}
if (digitalRead(6)==LOW)
{
send("led4_off");
}
// SW5
if (digitalRead(7)==HIGH)
{
send("led5_on");
}
if (digitalRead(7)==LOW)
{
send("led5_off");
}
// SW6
if (digitalRead(8)==HIGH)
{
send("led6_on");
}
if (digitalRead(8)==LOW)
{
send("led6_off");
}
}
//Funcion para enviar el mensaje
void send (char *message)
{
vw_send((uint8_t *)message, strlen(message)); //Envia el mensaje
vw_wait_tx(); //Espera hasta que finalice la transminión
Serial.println(message);
}
/*
Proyecto 32 - 433MHz Wireless Remote Control
Sketch para el Receptor.
Modificado por Angel M. https://sites.google.com/site/angmuz/
a partir del original de Nano www.robologs.net
*/
#include <VirtualWire.h>
byte message[VW_MAX_MESSAGE_LEN];
byte messageLength = VW_MAX_MESSAGE_LEN;
void setup()
{
pinMode(8, OUTPUT); // DL1
pinMode(9, OUTPUT); // DL2
pinMode(10, OUTPUT); // DL3
pinMode(11, OUTPUT); // DL4
pinMode(12, OUTPUT); // DL5
pinMode(13, OUTPUT); // DL6
vw_setup(2000);
vw_set_rx_pin(2); // receiver digital pin
vw_rx_start();
}
void loop()
{
if (vw_get_message(message, &messageLength))
{
// LED 1
if(comparar("led1_on") == 0){
digitalWrite(8, HIGH);
}
if(comparar("led1_off") == 0)
{
digitalWrite(8,LOW);
}
// LED 2
if(comparar("led2_on") == 0){
digitalWrite(9, HIGH);
}
if(comparar("led2_off") == 0)
{
digitalWrite(9,LOW);
}
// LED 3
if(comparar("led3_on") == 0){
digitalWrite(10, HIGH);
}
if(comparar("led3_off") == 0)
{
digitalWrite(10,LOW);
}
// LED 4
if(comparar("led4_on") == 0){
digitalWrite(11, HIGH);
}
if(comparar("led4_off") == 0)
{
digitalWrite(11,LOW);
}
// LED 5
if(comparar("led5_on") == 0){
digitalWrite(12, HIGH);
}
if(comparar("led5_off") == 0)
{
digitalWrite(12,LOW);
}
// LED 6
if(comparar("led6_on") == 0){
digitalWrite(13, HIGH);
}
if(comparar("led6_off") == 0)
{
digitalWrite(13,LOW);
}
}
}
char comparar(char* cadena) {
//Esta funcion compara el string cadena con el mensaje recibido.
//Si son iguales, devuelve 1. Si no, devuelve 0.
for(int i = 0; i<messageLength; i++)
{
if(message[i] != cadena[i])
{
return 1;
}
}
return 0;
}
Como decía al principio, este conjunto emisor/receptor tiene unas prestaciones bastante modestas.
Para proyectos que necesiten de una mayor precisión y rapidez en las comunicaciones se puede utilizar el transceptor de 2.4GHz NRF24L01. En el Proyecto 32.2 puedes ver como conectar y programar este módulo.
Robologs: Arduino y RF con Virtualwire