16/7/2017
Comunicación inalámbrica en Arduino con módulos RF 433MHz
LUIS LLAMAS INGENIERÍA, INFORMÁTICA Y DISEÑO
TUT T UT O RI AL ES A RD UI N O
COMUNICACIÓN INALÁMBRICA EN ARDUINO CON MÓDULOS RF 433MHZ — 6 DICIEMBRE, 2016
SHARE ON:
¿QUÉ ES UN MÓDULO RF 433MHZ? https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/
1/11
16/7/2017
Comunicación inalámbrica en Arduino con módulos RF 433MHz
Los módulos de radio frecuencia RF 433MHz son transmisores/receptores inalámbricos que podemos emplear como forma de comunicación entre procesadores como Arduino. Este tipo de módulos emisor FS1000A) y el receptor (XY-MK-5V) se han hecho populares como medio de comunicación, principalmente, por su bajo coste. La frecuencia de operación es de 433MHz, aunque también existen módulos 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 módulo y la antena que usemos. A 5V y con la antena del módulo, el alcance difícilmente 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 módulo. Antenas habituales para RF 433MHz son un cable de cobre de 16.5cm y la helicoidal 4.5mm de diámetro y 22mm 0 34mm de longitud.
La comunicación es simplex (canal único y unidireccional) y tienen baja velocidad de transmisión (típicamente 2400bps). Se realiza, básicamente, por modulación ASK (amplitude shift keying). No disponen de ltro ni ID por hardware, por lo que si queremos una comunicación robusta tendremos que implementarlo por software Este tipo de comunicación RF 433MHz es muy frecuente en proyectos caseros de electrónica y robótica, 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 comunicación puede ser limitada. Ejemplos de uso son recepción remota de sensores como temperatura presión, aplicaciones de domótica y edicios inteligentes, activación remota de dispositivos como iluminación, alarmas, o control y monitorización de robots y vehículos.
PRECIO Cómo hemos comentado, estos módulos 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
Comunicación inalámbrica en Arduino con módulos RF 433MHz
También podemos encontrar ambos módulos con una antena helicoidal para soldar por 1.70€. Si queréis usar estos módulos en aplicaciones reales donde necesitéis 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 conexión es realmente sencilla. En primer lugar, alimentamos los módulos conectando Vcc y Gnd, respectivamente a 5V y Gnd en Arduino. Como veremos en al ver el código, vamos a emplear la librería Virtual Wire, que funciona con cualquier pin digital. Por tanto, simplemente conectamos los pines de DATA a una salida digital cualquiera. Por tanto, la conexión del emisor FS1000A sería la siguiente,
Y la del receptor XY-MK-5V la que se ve a continuación.
https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/
3/11
16/7/2017
Comunicación inalámbrica en Arduino con módulos RF 433MHz
Finalmente, la conexión en ambos casos de los Arduino que controlan cada uno de los módulos emisor/receptor es la misma,
Opcionalmente, podéis alimentar el módulo a tensión superior para aumentar el alcance. Si estáis alimentando Arduino a través de su regulador de voltaje (por ejemplo, desde una batería de litio de 7.4V), podéis emplear esta fuente antes del regulador para alimentar el módulo.
Si usáis varias fuentes de alimentación, recordar poner GND en común.
https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/
4/11
16/7/2017
Comunicación inalámbrica en Arduino con módulos RF 433MHz
EJEMPLOS DE C DIGO Para realizar la comunicación usaremos la librería Virtual Wire desarrollada por Mike McCauley, disponible en este enlace. ¿Por qué usar una librería en vez de emplear directamente el UART? Para mejorar la robustez de la comunicación. Las transmisiones ASK requieren una serie de impulsos de “entrenamiento” para sincronizar el receptor y el transmisor. También necesitan de un buen balance entre 1s y 0s para mantener el balance DC del mensaje. La UART no realizan estas funciones. Con la librería Virtual Wire cada transmisión consta de un código de entrenamiento, el mensaje, la longitud del mensaje, y el checksum. Los mensajes son enviados con codicación 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 librería, la alta carga que supone al procesador, y el uso intensivo que hace de interrupciones. Por otro lado, no se dispone de acuse de señal de recibo (ACK) por lo que no sabemos si los mensajes han llegado correctamente. La librería proporciona ejemplos de código, que resulta aconsejable revisar. Los siguientes ejemplos son modicaciones a partir de los disponibles en la librería
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 reenvía al Arduino receptor. Si se transmite ‘a’ el receptor enciende el LED, y si transmite ‘b’ lo apaga.
CÓDIGO EMISOR
https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/
5/11
16/7/2017
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Comunicación inalámbrica en Arduino con módulos RF 433MHz
#include const int dataPin = 9; void setup() { Serial.begin(9600); vw_setup(2000); vw_set_tx_pin(dataPin); } void loop() { while (Serial.available() > 0) { char data[1]; data[0] = Serial.read(); vw_send((uint8_t*)data,sizeof(data)); vw_wait_tx(); } delay(200); }
CÓDIGO RECEPTOR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#include const int dataPin = 9; const int ledPin = 13; void setup() { vw_setup(2000); vw_set_rx_pin(dataPin); vw_rx_start(); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, false); } void loop() { uint8_t data; uint8_t dataLength=1; if (vw_get_message(&data,&dataLength)) { if((char)data=='a') { digitalWrite(ledPin, true); } else if((char)data=='b') { digitalWrite(ledPin, false); } } }
ENVIAR UN STRING https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/
6/11
16/7/2017
Comunicación inalámbrica en Arduino con módulos RF 433MHz
El siguiente ejemplo muestra el envío de una cadena de texto desde un Arduino emisor a un Arduino receptor, que al recibir el texto lo muestra por puerto serie.
CÓDIGO EMISOR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#include const int dataPin = 9; const int ledPin = 13; void setup() { vw_setup(2000); vw_set_tx_pin(dataPin); } void loop() { const char *msg = "Hola mundo"; digitalWrite(ledPin, true); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); digitalWrite(ledPin, false); delay(200); }
CÓDIGO RECEPTOR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
#include const int dataPin = 9; const int ledPin = 13; void setup() { Serial.begin(9600); vw_setup(2000); vw_set_rx_pin(dataPin); vw_rx_start(); } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)) { digitalWrite(ledPin, true); Serial.print("Mensaje: "); for (int i = 0; i < buflen; i++) { Serial.print((char)buf[i]); } Serial.println(""); digitalWrite(ledPin, false); } }
https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/
7/11
16/7/2017
Comunicación inalámbrica en Arduino con módulos RF 433MHz
ENVIAR UNA VARIABLE INTEGER Y FLOAT El siguiente ejemplo muestra el envío de variables integer y oat desde un Arduino emisor a otro receptor, que muestra los datos por puerto serie. El Arduino emisor envía 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. Además, añade un identicador ‘i’ o ‘f’ para distinguir el tipo de variable enviado. Por su parte, el receptor recibe los datos, y en función del identicador convierte los datos recibidos a integer o oat, y muestra el resultado por el puerto serie.
CÓDIGO EMISOR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#include const int dataPin = 9; void setup() { vw_setup(2000); vw_set_tx_pin(dataPin); } void loop() { String str; char buf[VW_MAX_MESSAGE_LEN]; // Ejemplo de envío int int dataInt = millis() / 1000; str = "i" + String(dataInt); /// Convertir a string str.toCharArray(buf,sizeof(buf)); // Convertir a char array vw_send((uint8_t *)buf, strlen(buf)); // Enviar array vw_wait_tx(); // Esperar envio // Ejemplo de envío float float dataFloat = 3.14; str = "f" + String(dataFloat); // Convertir a string str.toCharArray(buf,sizeof(buf)); // Convertir a char array vw_send((uint8_t *)buf, strlen(buf)); // Enviar array vw_wait_tx(); // Esperar envio delay(200); }
CÓDIGO RECEPTOR
https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/
8/11
16/7/2017
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
Comunicación inalámbrica en Arduino con módulos RF 433MHz
#include const int dataPin = 9; void setup() { Serial.begin(9600); vw_setup(2000); vw_set_rx_pin(dataPin); vw_rx_start(); } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; // Recibir dato if (vw_get_message((uint8_t *)buf,&buflen)) { String dataString; if((char)buf[0]=='i') { for (int i = 1; i < buflen; i++) { dataString.concat((char)buf[i]); } int dataInt = dataString.toInt(); // Convertir a int Serial.print("Int: "); Serial.println(dataInt); } else if((char)buf[0]=='f') { for (int i = 1; i < buflen; i++) { dataString.concat((char)buf[i]); } float dataFloat = dataString.toFloat(); // Convertir a float Serial.print("Float: "); Serial.println(dataFloat); } } }
Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección TUTORIALES DE ARDUINO
TAGS: A R D UI N O
A R D UI N O I N T E RM E D IO
C O M U NI C A C IÓ N
W I R E LE S S
PREVIOUS POST
ARDUINO Y MANDO A DISTANCIA DE 4 CANALES 315MHZ IC2262
https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/
NEXT POST
COMUNICACIÓN INALÁMBRICA A 2.4GHZ CON ARDUINO Y NRF24L01
9/11
16/7/2017
Comunicación inalámbrica en Arduino con módulos RF 433MHz
RELATED POSTS ARRAY SEPARADO POR COMAS POR PUERTO SERIE EN ARDUINO
ENVIAR Y RECIBIR NÚMEROS 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
Comunicación inalámbrica en Arduino con módulos RF 433MHz
0 Comentarios Recomendar 1
1 Acceder
Luis Llamas
Ordenar por los más nuevos
⤤ Compartir
Sé el primero en comentar... INICIAR SESIÓN CON
O REGISTRARSE CON DISQUS ? Nombre
Search
SIGUENOS EN
TWITTER
G+
LINKEDIN
RSS
SIGUE LEYENDO EN
TUTORIALES ARDUINO ARRAY SEPARADO POR COMAS POR PUERTO SERIE EN ARDUINO
https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/
11/11