Usted está aquí: Inicio / Blog / Arduino / RF 433 MHz con Arduino y
fs1000a XY-MK-5V
RF 433 MHz con Arduino y fs1000a XY-MK-5V
Luis del Valle Hernández
Si tu proyecto necesita conectarse de forma inalámbrica, quizás te
interese saber cómo se ha puede hacer utilizando RF 433 MHz con
Arduino.
Imagínate que quieres controlar una persiana, un toldo e incluso una
lámpara o bombilla. Si llevas tiempo en el mundo de Arduino y
el ESP8266 conocerás la comunicación WiFi.
En ciertos proyectos es interesante. Sin embargo, cuando lo único que
necesitas es controlar un dispositivo sin clouds, ni routers, ni Cristo
que fundó, RF 433 MHz puede ser una muy buena solución.
Es una conexión entre dos dispositivos que se quieren, se respetan y
hablan. Sin el incordio de terceros. Una pareja feliz que no necesita de
más.
En este tutorial sentaremos las bases de esta relación de amor
utilizando la comunicación RF 433 MHz con Arduino. Del transmisor
fs1000A y del receptor XY-MK-5V.
Ponte cómodo que empezamos.
Indice de contenidos
1 Módulo transmisor fs1000A y receptor XY-MK-5V para RF 433 MHz
con Arduino
2 Precauciones banda de radio ISM
3 Pines y conexión módulo RF 433 MHz con Arduino
4 Qué antena utilizar con los módulos RF 433 MHz con Arduino
5 Envío de datos entre dos Arduinos con RF 433 MHz
Módulo transmisor fs1000A y
receptor XY-MK-5V para RF 433 MHz
con Arduino
Lo primero que debemos hacer cuando nos enfrentamos a una
tecnología como esta es tener una perspectiva general de cómo
funciona la comunicación RF 433 MHz con Arduino.
En toda comunicación existe un emisor y un receptor y en la
comunicación RF 433 MHz no iba a ser menos.
Algo importante, este tipo de módulos no es bidireccional, para poder
comunicar en las dos direcciones en cada lado tiene que haber un
módulo transmisor y receptor.
Por un lado tendremos un Arduino conectado al emisor fs1000A que
enviará información a través de la banda 433 MHz. Se puede enviar
cualquier cosa, piensa por ejemplo en un sensor de
temperatura DS18B20 o el DHT11 o un termómetro infrarrojo.
En el otro extremo tendremos un módulo receptor XY-MK-5V que
recibirá la información y la enviará al monitor serie. Aquí podríamos
tener conectado cualquier cosa, un relé para subir o bajar una
persiana, una lámpara o una pantalla para mostrar datos de
temperatura.
Las configuraciones son múltiples.
Estos módulos los puedes adquirir a un precio muy bajo en:
Amazon
Aliexpress
Módulo transmisor fs1000A RF 433 MHz
El módulo transmisor es muy simple. Lo vas a encontrar con el
nombre técnico fs1000A aunque esto no es muy importante.
Está compuesto por un oscilador que está sintonizado para funcionar
a [Link] MHz. También tiene un transistor de conmutación y algunos
componentes pasivos.
Es importante tener en cuenta que deben coincidir los resonadores del
transmisor y receptor, es decir, deben trabajar a la misma frecuencia
ya que de otro modo será difícil que se entienda. Asegúrate de esto
antes de comprarlo.
Tampoco voy a entrar en detalles técnicos por dos razones: vamos a
hacerlo fácil y la electrónica no es mi fuerte.
Su funcionamiento es igual de simple, cuando se aplica una señal
HIGH al pin de entrada de datos, el resonador produce una onda
portadora de RF (radiofrecuencia) a [Link] MHz.
Cuando se aplica un estado LOW a dicha entrada de datos, el
resonador se detiene.
Esta técnica de modulación es muy conocida y se conoce como
modulación por desplazamiento de amplitud. Luego la veremos más
en detalle.
Módulo receptor XY-MK-5V RF 433 MHz
Por otro lado está el módulo receptor que recibe la señal que envía el
emisor.
Aunque el módulo receptor RF 433 MHZ para Arduino parece más
complejo que el emisor, en realidad es tan simple como el módulo
transmisor.
Consiste en un circuito sintonizador por RF y un par de
amplificaciones OP que se utilizan para amplificar la onda recibida del
transmisor.
Luego se conecta con un lazo de seguimiento de fase o PLL (del
inglés Phase Lock Loop) para que la señal de salida sea más inmune
al ruido.
Y así es cómo funciona a grandes rasgos la comunicación RF 433
MHz con Arduino.
Una vez tenemos claro el hardware es importante conocer cómo son
capaces de comunicar estos módulos RF 433 MHz con Arduino. Qué
técnica de modulación utilizan.
Modulación por desplazamiento de amplitud o
ASK
Los módulos RF 433 MHz con Arduino utilizan la modulación por
desplazamiento de amplitud o ASK (del inglés Amplitude Shift Keying).
Aunque existen otros métodos para enviar datos digitales por radio
como:
FSK o modulación por desplazamiento de frecuencia.
PSK o modulación por desplazamiento de fase.
Simplemente para que lo tengas en cuenta.
No voy a entrar muy en detalle de cómo funciona la modulación ASK
(te dejo un vídeo al final de esta sección por si quieres profundizar
más sobre este tema) pero sí que veremos cómo funciona a grandes
rasgos.
En la modulación ASK la amplitud o el nivel de la onda portadora
(señal de 433 MHz) varía según la señal de datos que queramos
enviar.
Es muy parecido a cómo funciona la modulación de amplitud o
amplitud modulada. Vamos, la típica radio AM (del inglés Amplitude
Modulation).
La forma más básica de modulación ASK es cuando se trabaja con
datos binarios: unos y ceros. En esta situación la ASK se
denomina modulación digital de amplitud o también OOK (del
inglés On-Off Keying).
Cuando se quiere enviar un uno, la portadora utiliza toda su potencia.
Cuando se quiere enviar un cero, la portadora tiene potencia cero.
Una de las mayores ventajas de la modulación por desplazamiento de
amplitud o ASK es que es muy sencilla y, por lo tanto, el circuito
eléctrico es muy simple y económico.
Esto es también gracias a que ASK necesita menos ancho de banda
que FSK por ejemplo.
Y una de las mayores desventajas es que ASK es susceptible a
interferencias de otros dispositivos radio y al ruido. Para evitar esto se
recomienda que la transferencia sea una velocidad lenta y así evitar
cualquier tipo de interferencia.
Precauciones banda de radio ISM
Dentro del espectro radioeléctrico existe una banda de radio
reservadas internacionalmente para el uso con fines industriales,
científico y médicos. De ahí su nombre ISM (del inglés Industrial,
Science and Medical).
En estas bandas operan procesos de calentamiento por
radiofrecuencia como los hornos microondas, redes de sensores o
redes WLAN inalámbricas.
Aunque son frecuencias que se pueden utilizar sin licencia, están
sujetas a regulaciones que difieren dependiendo de la zona del mundo
donde vivas.
Es muy importante que conozcas la legislación y la normativa al
respecto ya que puede causar muchos problemas si no sigues las
indicaciones.
Cada país tiene un organismo regulador responsable de las
comunicaciones por radio.
En españa, por ejemplo, es la Comisión Nacional de los Mercados y
la Competencia, en México es el Instituto Federal de
Comunicaciones y en Argentina el Ente Nacional de
Telecomunicaciones.
En este enlace puedes consultar la lista de organismos para tu país.
En la gran mayoría de países estos módulos son legales siempre que
cumplas las siguientes condiciones:
Que se operen a baja potencia.
No se puede transmitir de forma contínua.
No se puede transmitir voz o sonidos.
Y vuelvo a repetir, consulta la legislación local de tu país.
Pines y conexión módulo RF 433 MHz
con Arduino
Como ya hemos visto en el tutorial vamos a necesitar dos módulos. El
módulo transmisor fs1000A y el módulo receptor XY-MK-5V.
Vamos a echar un vistazo a las características técnicas y a los pines
de los dos módulos RF 433 MHz con Arduino. Empecemos por el
transmisor fs1000A.
Pineado módulo transmisor fs1000A
Donde:
DATOS: pin donde se envían los datos para ser enviados
por RF 433 MHz. Este pin es el que se conecta a Arduino.
VCC: es el pin de alimentación. El módulo fs1000a admite
una tensión entre 3,5V y 12V. Ten en cuenta que la
potencia RF es proporcional a la tensión de alimentación,
cuanto mayor es la tensión, mayor alcance.
GND: pin de tierra.
ANTENA: en este pin puedes conectar una antena. De
momento no hay nada conectado luego veremos qué es lo
que tenemos que conectar aquí.
Pineado módulo receptor XY-MK-5V
Donde:
DATOS: pin donde se envían los datos recibidos por RF
433 MHz. Este pin es el que se conecta a Arduino.
VCC: es el pin de alimentación y en el caso del receptor
debe ser de 5V.
GND: pin de tierra.
ANTENA: en este pin puedes conectar una antena. De
momento no hay nada conectado luego veremos qué es lo
que tenemos que conectar aquí.
Qué antena utilizar con los módulos
RF 433 MHz con Arduino
A ver, en principio no hace falta utilizar ninguna antena. Para hacer
unas pruebas sencillas y transmitir datos no es necesario que ni el
módulo de transmisión fs1000a o el XY-MK-5V tenga una antena
acoplada.
Sin embargo, la diferencia entre tener o no tener una antena
conectada afecta en gran medida al alcance de estos módulos. Sin
una antena adecuada el alcance se reduce, con suerte, a poco más de
un metro.
Elegir una antena adecuada puede ser la diferencia entre transmitir a
menos de un metro a poder transmitir a más de 50 metros en un
espacio abierto.
Y, ¿qué antena tengo que poner?
Realmente no hace falta que la antena sea especial, con un simple
trozo de cable con un único hilo puede ser una excelente elección
tanto para el transmisor fs1000a como para el receptor XY-MK-5V.
Lo importante aquí no es el diámetro de la antena, que apenas tiene
importancia, lo importante es su longitud ya que la más eficaz es
aquella que tiene el mismo tamaño que la longitud de onda para la
frecuencia que se quiere utilizar.
No tiene porque ser del mismo tamaño que la longitud de onda, con
que sea una fracción par de la longitud es más que suficiente. Esto
quiere decir que con que sea la mitad o un cuarto valdría.
Entonces, necesitamos un trozo de cable que mida la mitad o un
cuarto de la longitud de onda pero, ¿cómo calcular la longitud de
onda?
La longitud de onda de una señal periódica se calcula como
La frecuencia es la de la señal portadora en nuestro caso RF 433
MHz. Y la velocidad es la de la luz 299.792.458 m/s.
Por lo tanto, la longitud de onda de una señal a 433 MHz es
También puedes calcular la longitud de onda de una señal utilizando
esta calculadora para calcular la longitud de onda.
Por lo tanto, una posible antena sería de de 69, 24 cm que, como
podrás entender, se hace un poco larga para colocarla en cualquier
sitio. Una posibilidad es utilizar un cuarto de onda lo que equivale a
una antena de
Una antena de 17,31 cm ya es algo más asequible aunque sigue
siendo bastante larga.
Para trabajar de forma cómoda se suele enrollar la antena para que
sea más compacta. Y aunque una antena bien estirada y recta es
siempre la mejor solución, una antena enrollada no afecta demasiado
a su alcance.
Envío de datos entre dos Arduinos
con RF 433 MHz
Ya tenemos la información necesaria para empezar a programar y a
probar el módulo RF 433 MHz con Arduino. En este primer ejemplo
práctico enviaremos varios datos utilizando la modulación ASK.
El material que vas a necesitar es el siguiente:
2 x Arduino UNO, Arduino MEGA, Arduino Nano o
compatible
1 x módulo transmisor fs1000A
1 x módulo receptor XY-MK-5V
Cables
Protoboard
Este material suele venir el los kit de Arduino. Antes de comprar
nada comprueba si lo tienes en algún cajón olvidado.
Y una vez está claro el material que vamos a utilizar vamos a ver
cómo conectarlo a nuestro Arduino.
Conexión módulo transmisor fs1000A RF 433
MHz con Arduino
La conexión del módulo transistor fs1000A con Arduino es muy
sencilla. En el siguiente esquema puedes ver cómo hacerlo.
El pin de alimentación VCC a 5V y el pin GND a GND de Arduino. El
pin de datos se conecta con el pin 8 por ejemplo aunque puedes
utilizar el que más rabia te dé.
Conexión módulo receptor XY-MK-5V RF 433
MHz con Arduino
La conexión del módulo receptor XY-MK-5V es igual de sencilla. En el
siguiente esquema puedes ver cómo se hace.
El pin VCC tiene que ir conectado al pin 5V, el GND a GND de Arduino
y el pin de datos, cualquiera de los dos, al pin 9 por ejemplo.
Y con esto es suficiente. Ahora vamos a ver cómo programar este
proyecto para poder enviar datos entre los dos Arduinos.
Librería RadioHead para la comunicación RF
433 MHz con Arduino
Una de las librerías más populares para hacer proyectos inalámbricos
con Arduino es la librería RadioHead. Sí, se llama igual que la mítica
banda británica de rock alternativo y que tan buenas canciones nos ha
dado.
Sin embargo, para nuestro proyecto resulta más útil la librería
RadioHead que el grupo de música.
Esta librería no solo se centra en la modulación ASK y en los módulos
fs1000A y XY-MK-5V, también abarca una amplia gama de
modulaciones, módulos, funcionalidades y tecnologías. Puedes
encontrar toda la información en la página web oficial.
Lo primero, como siempre, es instalar la librería de Arduino. Esta
librería no la vas a encontrar en el gestor de librerías así que tendrás
que descargar el .zip de la web oficial e instalarlo a través de este
archivo.
Entra en la web oficial y justo arriba encontrarás el enlace al
archivo .zip
Descárgalo y abre el IDE de Arduino. En esta ocasión voy a utilizar
el Arduino IDE 2.0.
Ves a la opción Sketch>Include Library>Add .ZIP Library… y esto
abrirá una ventana donde debes seleccionar el archivo .zip que te
acabas de descargar de la web de RadioHead.
La librería RadioHead nos facilita la tarea de programar los módulos
RF 433 MHz con Arduino. Para mantener la integridad de los datos
que se quieren enviar la librería utiliza código de redundancia cíclica
o CRC (del inglés Cyclic Redundancy Check).
Este tipo de códigos permiten detectar errores en el envío de datos en
redes de comunicación.
En la web oficial de la librería RadioHead tienes más información de
cómo se compone la trama de bits que se envían ya que esto se sale
fuera de este tutorial práctico.
Vamos a empezar con la programación del módulo de transmisión
fs1000a RF 433 MHz con Arduino.
Programación módulo fs1000a RF 433 MHz
con Arduino
Una vez conectado el módulo fs1000a a tu Arduino, carga el siguiente
código.
1 // Incluir librerías
2 // RadioHead ASK
3 // SPI
4 #include <RH_ASK.h>
5 #include <SPI.h>
7 // Crear un objeto de la clase ASK
8 RH_ASK askTx;
1 void setup()
0
{
1
1 // Inicializar objeto
1 [Link]();
2
}
1
3
void loop()
1
4{
1 // Mensaje a enviar
5
// Longitud: 10
1
6 // No superar los 27 caracteres
1 const char *msg = "Hola mundo";
7
// Envió información
1
8 [Link]((uint8_t *)msg, strlen(msg));
1 // Esperar a que sea enviado el paquete
9
[Link]();
2
0 // Esperamos 1 segundo antes de volver a enviar
2 delay(1000);
1
}
2
2
2
3
2
4
2
5
2
6
2
7
2
8
Se trata de un código muy simple y muy corto pero suficiente para
enviar la información de un Arduino a otro utilizando RF 433 MHz.
Lo primero es importar las librerías RadioHead ASK y SPI. Esta última
también hay que importarla por que internamente RadioHead la utiliza.
1// Incluir librerías
2// RadioHead ASK
3// SPI
4#include <RH_ASK.h>
5#include <SPI.h>
Luego creamos una instancia de la clase RH_ASK que nos servirá
para enviar la información de un extremo a otro.
1// Crear un objeto de la clase ASK
2RH_ASK askTx;
En la función setup() lo único que hacemos es iniciar el objeto
llamando a la función init() de la clase RH_ASK que no necesita
ningún parámetro.
1void setup()
2{
3 // Inicializar objeto
4 [Link]();
5}
En la función loop() es donde enviamos el mensaje. Lo primero es
declarar una cadena de caracteres que almacenará el mensaje. En
este caso voy a enviar el texto Hola mundo. Sí, lo sé, muy original no
soy :)
Puedes enviar cualquier cosa como la temperatura y humedad de un
sensor DHT11 o la temperatura de un sensor infrarrojo. Da lo mismo lo
que sea pero tienes que tener en cuenta dos cosas.
1. No excedas de 27 caracteres para tener un mejor
rendimiento.
2. En el receptor es muy importante saber cuántos caracteres
has enviado así que los tendrás que contar. En este caso el
texto tiene una longitud de 10 caracteres.
1 // Mensaje a enviar
2
3
// Longitud: 10
4
// No superar los 27 caracteres
5
const char *msg = "Hola mundo";
Para transmitir el mensaje hay que llamar a la función send(…) de la
clase RH_ASK.
1rf_driver.send((uint8_t *)msg, strlen(msg));
Esta función admite dos parámetros:
(uint8_t *)msg: array de datos a enviar.
strlen(msg): longitud de los datos que se quiere enviar.
Una vez enviado el mensaje hay que esperar hasta que se envíe por
completo y eso se hace llamando a la función waitPacketSent() que
espera el tiempo necesario hasta que esto ocurra.
Por último hacemos un delay() de 1 segundo para que en el receptor
de tiempo a procesar la información.
1 // Esperar a que sea enviado el paquete
2 [Link]();
3 // Esperamos 1 segundo antes de volver a enviar
4 delay(1000);
Puedes cargar el código al transmisor pero hará falta cargar también
el código en el receptor.
Programación módulo XY-MK-5V RF 433 MHz
con Arduino
Ya tenemos la mitad del proyecto, ahora nos queda la otra mitad,
programar el módulo receptor XY-MK-5V RF 433 MHz con Arduino.
Este sería el código completo.
1 // Incluir librerías
2 // RadioHead ASK
3 // SPI
4 #include <RH_ASK.h>
5 #include <SPI.h>
7 // Indicar tamaño del mensaje que se va a recibir
8 const byte tamMsg = 10;
1 // Crear un objeto de la clase ASK
0
RH_ASK askRx;
1
1
1 void setup()
2
{
1
// Iniciar monitor serie
3
[Link](9600);
1
4 // Inicializar objeto ASK
1 [Link]();
5
}
1
6
1 void loop()
7
{
1
// Tamaño esperado del mensaje
8
1 uint8_t msg[tamMsg];
9
uint8_t msgLen = sizeof(msg);
2
0 // Comprobar si el mensaje recibido tiene el tamaño adecuado
2 if ([Link](msg, &msgLen))
1
{
2
// Mostrar mensaje por el monitor serie
2
[Link]("Mensaje recibido: ");
2
3 [Link]((char*)msg);
2 }
4
}
2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2
3
3
3
4
Comenzamos importando las librerías y declarando una constante que
almacena la longitud del mensaje que se va a recibir. También hay
que crear un objeto de la clase RH_ASK.
1 // Incluir librerías
2 // RadioHead ASK
3 // SPI
4 #include <RH_ASK.h>
5 #include <SPI.h>
7 // Indicar tamaño del mensaje que se va a recibir
8 const byte tamMsg = 10;
1 // Crear un objeto de la clase ASK
0
RH_ASK askRx;
1
1
Si la longitud del mensaje que has enviado es diferente, debes
cambiar la constante tamMsg que de lo contrario no funcionará el
código.
En la función setup() se inicia el monitor serie y la clase RH_ASK con
la función init() que no admite ningún parámetro.
1 // Iniciar monitor serie
2 [Link](9600);
3 // Inicializar objeto ASK
4 [Link]();
En la función loop() se lee el mensaje que se recibe del transmisor.
Para almacenar el mensaje hay que crear un array de caracteres con
la misma longitud que el mensaje enviado.
Luego se obtiene el tamaño en bytes utilizando la función sizeof y se
almacena en la variable msgLen.
1 // Set buffer to size of expected message
2 uint8_t msg[10];
3 uint8_t msgLen = sizeof(msg);
A continuación hay que activar el receptor llamando a la
función recv(…) de la clase RH_ASK.
[Link](msg, &msgLen)
Esta función admite dos parámetros
msg: es el array donde se almacenará el mensaje recibido.
msgLen: es la longitud esperada del mensaje.
En el caso de que se haya recibido un mensaje y este sea correcto,
esta función devuelve true. En caso contrario devuelve false.
Si todo está correcto entrará dentro del if de Arduino y mostrará el
mensaje por el monitor serie.
1 // Comprobar si el mensaje recibido tiene el tamaño adecuado
2 if ([Link](msg, &msgLen))
3 {
4 // Mostrar mensaje por el monitor serie
5 [Link]("Mensaje recibido: ");
6 [Link]((char*)msg);
7 }
Y con esto ya tenemos todo preparado en el transmisor fs1000a y en
el receptor XY-MK-5V para iniciar la comunicación RF 433 MHz con
Arduino.
Solo nos queda una cosa, probar como comunican los dos
dispositivos.
Carga los dos códigos y mira el monitor serie, verás algo
parecido a esto.
Ten en cuenta que si los módulos no tienen una antena acoplada
tendrás que poner uno al lado de otro para hacer la transmisión.
Y con esto damos por finalizado este tutorial. Cualquier duda o
sugerencia en los comentarios.
Gracias por la atención.
Integrar Alexa en Home Assistant
En este nuevo tutorial vamos a ver cómo integrar Alexa en Home
Assistant y esto tiene un doble sentido y ahora verás porqué lo digo.
Creo que todos …[+ info...]
Las dudas más habituales sobre Home Assistant
Vamos con un nuevo vídeo donde voy a responder desde la
ignorancia total, seña de identidad de este canal, un puñado de
preguntas sobre Home Assistant …[+ info...]
Zigbee y Home Assistant
En este nuevo tutorial voy a hablar de Zigbee y Home Assistant, el
estándar de comunicación inalámbrica abierto que puede hacer que tu
sistema …[+ info...]
COPYRIGHT © 2023 · PROGRAMAR FÁCIL · AVISO LEGAL
Utilizamos cookies propios y de terceros para mejorar nuestros servicios
y experiencia de usuario. Si continua navegando, consideramos que
acepta su