Sie sind auf Seite 1von 11

16/7/2017 Comunicacin inalmbrica en Arduino con mdulos RF 433MHz

LUIS LLAMAS
INGENIERA, INFORMTICA Y DISEO

TUTORIALES ARDUINO

COMUNICACIN INALMBRICA EN
ARDUINO CON MDULOS RF
433MHZ
6 DICIEMBRE, 2016 SHARE ON:

QU ES UN MDULO RF 433MHZ?

https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/ 1/11
16/7/2017 Comunicacin inalmbrica en Arduino con mdulos RF 433MHz

Los mdulos de radio frecuencia RF 433MHz son transmisores/receptores inalmbricos que podemos
emplear como forma de comunicacin entre procesadores como Arduino.

Este tipo de mdulos emisor FS1000A) y el receptor (XY-MK-5V) se han hecho populares como medio
de comunicacin, principalmente, por su bajo coste.

La frecuencia de operacin es de 433MHz, aunque tambin existen mdulos similares a 315MHz.


Ambas frecuencias pertenecen a bandas libres, por lo que su uso es gratuito.

El alcance depende del voltaje con el que alimentemos el mdulo y la antena que usemos. A 5V y con
la antena del mdulo, el alcance difcilmente exceder de los 2 metros. Alimentando a 12V y con una
antena de cobre de 16.5cm el rango en exteriores puede alcanzar 300 metros.

La longitud de la antena ptima depende de la frecuencia del mdulo. Antenas habituales para RF
433MHz son un cable de cobre de 16.5cm y la helicoidal 4.5mm de dimetro y 22mm 0 34mm de
longitud.

La comunicacin es simplex (canal nico y unidireccional) y tienen baja velocidad de transmisin


(tpicamente 2400bps). Se realiza, bsicamente, por modulacin ASK (amplitude shift keying). No disponen
de ltro ni ID por hardware, por lo que si queremos una comunicacin robusta tendremos que
implementarlo por software

Este tipo de comunicacin RF 433MHz es muy frecuente en proyectos caseros de electrnica y


robtica, debido a su bajo precio y medio-largo alcance en condiciones adecuadas, aunque tenemos que
tener en cuenta que la robustez y calidad de la comunicacin puede ser limitada.

Ejemplos de uso son recepcin remota de sensores como temperatura presin, aplicaciones de
domtica y edi cios inteligentes, activacin remota de dispositivos como iluminacin, alarmas, o control y
monitorizacin de robots y vehculos.

PRECIO
Cmo hemos comentado, estos mdulos son muy baratos. Podemos comprar el par de emisor
(FS1000A) y receptor (XY-MK-5V) RF 433MHz por 0.80, buscando en vendedores internacionales de eBay
o AliExpress.

https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/ 2/11
16/7/2017 Comunicacin inalmbrica en Arduino con mdulos RF 433MHz

Tambin podemos encontrar ambos mdulos con una antena helicoidal para soldar por 1.70. Si
queris usar estos mdulos en aplicaciones reales donde necesitis un alcance superior a 2-3 metros,
puede resultar interesante adquirirlo con antena.

En cualquier caso, siempre podemos o bien comprar la antena de forma independiente, o hacer una
con un cable desnudo de cobre la longitud adecuada (16.5 cm para RF 433MHz)

ESQUEMA DE MONTAJE
La conexin es realmente sencilla. En primer lugar, alimentamos los mdulos conectando Vcc y Gnd,
respectivamente a 5V y Gnd en Arduino.

Como veremos en al ver el cdigo, vamos a emplear la librera Virtual Wire, que funciona con
cualquier pin digital. Por tanto, simplemente conectamos los pines de DATA a una salida digital
cualquiera.

Por tanto, la conexin del emisor FS1000A sera la siguiente,

Y la del receptor XY-MK-5V la que se ve a continuacin.

https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/ 3/11
16/7/2017 Comunicacin inalmbrica en Arduino con mdulos RF 433MHz

Finalmente, la conexin en ambos casos de los Arduino que controlan cada uno de los mdulos
emisor/receptor es la misma,

Opcionalmente, podis alimentar el mdulo a tensin superior para aumentar el alcance. Si estis
alimentando Arduino a travs de su regulador de voltaje (por ejemplo, desde una batera de litio de 7.4V),
podis emplear esta fuente antes del regulador para alimentar el mdulo.

Si usis varias fuentes de alimentacin, recordar poner GND en comn.

EJEMPLOS DE CDIGO
https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/ 4/11
16/7/2017 Comunicacin inalmbrica en Arduino con mdulos RF 433MHz

EJEMPLOS DE CDIGO
Para realizar la comunicacin usaremos la librera Virtual Wire desarrollada por Mike McCauley,
disponible en este enlace.

Por qu usar una librera en vez de emplear directamente el UART? Para mejorar la robustez de la
comunicacin. Las transmisiones ASK requieren una serie de impulsos de entrenamiento para
sincronizar el receptor y el transmisor. Tambin necesitan de un buen balance entre 1s y 0s para
mantener el balance DC del mensaje. La UART no realizan estas funciones.

Con la librera Virtual Wire cada transmisin consta de un cdigo de entrenamiento, el mensaje, la
longitud del mensaje, y el checksum. Los mensajes son enviados con codi cacin 4-a-6 bit para mejorar el
balance DC.

Por supuesto, estas mejoras contienen su coste, que en este caso es el espacio que ocupa la librera,
la alta carga que supone al procesador, y el uso intensivo que hace de interrupciones. Por otro lado, no se
dispone de acuse de seal de recibo (ACK) por lo que no sabemos si los mensajes han llegado
correctamente.

La librera proporciona ejemplos de cdigo, que resulta aconsejable revisar. Los siguientes ejemplos
son modi caciones a partir de los disponibles en la librera

ENCENDER UN LED A DISTANCIA


En el primer ejemplo, basado en el que vimos al ver el puerto serie, enciende de forma remota el LED
integrado de un Arduino desde otro conectado a un ordenador. El Arduino emisor recibe un byte desde
puerto serie y lo reenva al Arduino receptor. Si se transmite a el receptor enciende el LED, y si transmite
b lo apaga.

CDIGO EMISOR

https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/ 5/11
16/7/2017 Comunicacin inalmbrica en Arduino con mdulos RF 433MHz

1 #include <VirtualWire.h>
2
3 const int dataPin = 9;
4
5 void setup()
6 {
7 Serial.begin(9600);
8 vw_setup(2000);
9 vw_set_tx_pin(dataPin);
10 }
11
12 void loop()
13 {
14 while (Serial.available() > 0)
15 {
16 char data[1];
17 data[0] = Serial.read();
18 vw_send((uint8_t*)data,sizeof(data));
19 vw_wait_tx();
20 }
21 delay(200);
22 }

CDIGO RECEPTOR
1 #include <VirtualWire.h>
2
3 const int dataPin = 9;
4 const int ledPin = 13;
5
6 void setup()
7 {
8 vw_setup(2000);
9 vw_set_rx_pin(dataPin);
10 vw_rx_start();
11
12 pinMode(ledPin, OUTPUT);
13 digitalWrite(ledPin, false);
14 }
15
16 void loop()
17 {
18 uint8_t data;
19 uint8_t dataLength=1;
20
21 if (vw_get_message(&data,&dataLength))
22 {
23 if((char)data=='a')
24 {
25 digitalWrite(ledPin, true);
26 }
27 else if((char)data=='b')
28 {
29 digitalWrite(ledPin, false);
30 }
31 }
32 }

ENVIAR UN STRING

https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/ 6/11
16/7/2017 Comunicacin inalmbrica en Arduino con mdulos RF 433MHz

El siguiente ejemplo muestra el envo de una cadena de texto desde un Arduino emisor a un Arduino
receptor, que al recibir el texto lo muestra por puerto serie.

CDIGO EMISOR
1 #include <VirtualWire.h>
2
3 const int dataPin = 9;
4 const int ledPin = 13;
5
6 void setup()
7 {
8 vw_setup(2000);
9 vw_set_tx_pin(dataPin);
10 }
11
12 void loop()
13 {
14 const char *msg = "Hola mundo";
15
16 digitalWrite(ledPin, true);
17 vw_send((uint8_t *)msg, strlen(msg));
18 vw_wait_tx();
19 digitalWrite(ledPin, false);
20 delay(200);
21 }

CDIGO RECEPTOR
1 #include <VirtualWire.h>
2
3 const int dataPin = 9;
4 const int ledPin = 13;
5
6 void setup()
7 {
8 Serial.begin(9600);
9 vw_setup(2000);
10 vw_set_rx_pin(dataPin);
11 vw_rx_start();
12 }
13
14 void loop()
15 {
16 uint8_t buf[VW_MAX_MESSAGE_LEN];
17 uint8_t buflen = VW_MAX_MESSAGE_LEN;
18
19 if (vw_get_message(buf, &buflen))
20 {
21 digitalWrite(ledPin, true);
22 Serial.print("Mensaje: ");
23 for (int i = 0; i < buflen; i++)
24 {
25 Serial.print((char)buf[i]);
26 }
27 Serial.println("");
28 digitalWrite(ledPin, false);
29 }
30 }

ENVIAR UNA VARIABLE INTEGER Y FLOAT


https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/ 7/11
16/7/2017 Comunicacin inalmbrica en Arduino con mdulos RF 433MHz

ENVIAR UNA VARIABLE INTEGER Y FLOAT


El siguiente ejemplo muestra el envo de variables integer y oat desde un Arduino emisor a otro
receptor, que muestra los datos por puerto serie. El Arduino emisor enva dos datos cualquiera, en el
ejemplo millis()/1000 como integer y 3.14 como oat, para lo cual tiene que convertirlos en un array de
char. Adems, aade un identi cador i o f para distinguir el tipo de variable enviado.

Por su parte, el receptor recibe los datos, y en funcin del identi cador convierte los datos recibidos a
integer o oat, y muestra el resultado por el puerto serie.

CDIGO EMISOR
1 #include <VirtualWire.h>
2
3 const int dataPin = 9;
4
5 void setup()
6 {
7 vw_setup(2000);
8 vw_set_tx_pin(dataPin);
9 }
10
11 void loop()
12 {
13 String str;
14 char buf[VW_MAX_MESSAGE_LEN];
15
16 // Ejemplo de envo int
17 int dataInt = millis() / 1000;
18 str = "i" + String(dataInt); /// Convertir a string
19 str.toCharArray(buf,sizeof(buf)); // Convertir a char array
20 vw_send((uint8_t *)buf, strlen(buf)); // Enviar array
21 vw_wait_tx(); // Esperar envio
22
23 // Ejemplo de envo float
24 float dataFloat = 3.14;
25 str = "f" + String(dataFloat); // Convertir a string
26 str.toCharArray(buf,sizeof(buf)); // Convertir a char array
27 vw_send((uint8_t *)buf, strlen(buf)); // Enviar array
28 vw_wait_tx(); // Esperar envio
29
30 delay(200);
31 }

CDIGO RECEPTOR

https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/ 8/11
16/7/2017 Comunicacin inalmbrica en Arduino con mdulos RF 433MHz

1 #include <VirtualWire.h>
2
3 const int dataPin = 9;
4
5 void setup()
6 {
7 Serial.begin(9600);
8 vw_setup(2000);
9 vw_set_rx_pin(dataPin);
10 vw_rx_start();
11 }
12
13 void loop()
14 {
15 uint8_t buf[VW_MAX_MESSAGE_LEN];
16 uint8_t buflen = VW_MAX_MESSAGE_LEN;
17
18 // Recibir dato
19 if (vw_get_message((uint8_t *)buf,&buflen))
20 {
21 String dataString;
22 if((char)buf[0]=='i')
23 {
24 for (int i = 1; i < buflen; i++)
25 {
26 dataString.concat((char)buf[i]);
27 }
28 int dataInt = dataString.toInt(); // Convertir a int
29 Serial.print("Int: ");
30 Serial.println(dataInt);
31 }
32 else if((char)buf[0]=='f')
33 {
34 for (int i = 1; i < buflen; i++)
35 {
36 dataString.concat((char)buf[i]);
37 }
38 float dataFloat = dataString.toFloat(); // Convertir a float
39 Serial.print("Float: ");
40 Serial.println(dataFloat);
41 }
42 }
43 }

Si te ha gustado esta entrada y quieres leer ms sobre Arduino puedes consultar la seccin
TUTORIALES DE ARDUINO

TAGS:
ARDUINO ARDUINO INTERMEDIO COMUNICACIN WIRELESS

PREVIOUS POST NEXT POST

ARDUINO Y MANDO A DISTANCIA DE 4 COMUNICACIN INALMBRICA A


CANALES 315MHZ IC2262 2.4GHZ CON ARDUINO Y NRF24L01

https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/ 9/11
16/7/2017 Comunicacin inalmbrica en Arduino con mdulos RF 433MHz

RELATED POSTS
ARRAY SEPARADO POR COMAS POR PUERTO SERIE EN ARDUINO

ENVIAR Y RECIBIR NMEROS POR PUERTO SERIE EN ARDUINO

ENVIAR Y RECIBIR TEXTOS POR PUERTO SERIE EN ARDUINO

https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/ 10/11
16/7/2017 Comunicacin inalmbrica en Arduino con mdulos RF 433MHz

0 Comentarios Luis Llamas


1 Acceder

Ordenar por los ms nuevos


Recomendar 1 Compartir

S el primero en comentar...

INICIAR SESIN CON

O REGISTRARSE CON DISQUS ?

Nombre

S el primero en comentar.

Search

SIGUENOS EN

TWITTER G+ LINKEDIN RSS

SIGUE LEYENDO EN

TUTORIALES ARDUINO

ARRAY SEPARADO POR COMAS POR PUERTO SERIE EN ARDUINO

ENVIAR Y RECIBIR NMEROS POR PUERTO SERIE EN ARDUINO

https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/ 11/11

Das könnte Ihnen auch gefallen