Professional Documents
Culture Documents
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.
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.
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.
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.
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
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 }
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
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
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
S el primero en comentar...
Nombre
S el primero en comentar.
Search
SIGUENOS EN
SIGUE LEYENDO EN
TUTORIALES ARDUINO
https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/ 11/11