Arduino y Modulo RF 433 MHz

Por Luis del Valle Hernández, post original aqui.

Tutorial radiofrecuencia con RF 433 MHz y Arduino

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.

Indice de contenidos

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:

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 433.xx 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 433.xx 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

¡ LECTURA OBLIGADA, MUY IMPORTANTE !

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

 \textrm{Longitud de onda}=\frac{\textrm{velocidad de transmision (v)}}{\textrm{frecuencia de transmision (f)}}

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

 \textrm{Longitud de onda}=\frac{299.792.458 m/s}{433.000.000 Hz}=0,6924 metros = 69,24 cm

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

 \textrm{Longitud antena}=\frac{69,24 cm}{4}=17,31 cm

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:

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.

// Incluir librerías
// RadioHead ASK
// SPI
#include <RH_ASK.h>
#include <SPI.h> 
 
// Crear un objeto de la clase ASK
RH_ASK askTx;
 
void setup()
{
    // Inicializar objeto
    askTx.init();
}
 
void loop()
{
    // Mensaje a enviar
    // Longitud: 10
    // No superar los 27 caracteres
    const char *msg = "Hola mundo";
    // Envió información
    askTx.send((uint8_t *)msg, strlen(msg));
    // Esperar a que sea enviado el paquete
    askTx.waitPacketSent();
    // Esperamos 1 segundo antes de volver a enviar
    delay(1000);
}

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.

// Incluir librerías
// RadioHead ASK
// SPI
#include <RH_ASK.h>
#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.

// Crear un objeto de la clase ASK
RH_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.

void setup()
{
    // Inicializar objeto
    askTx.init();
}

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.
    // Mensaje a enviar

    // Longitud: 10
    // No superar los 27 caracteres
    const char *msg = "Hola mundo";

Para transmitir el mensaje hay que llamar a la función send(…) de la clase RH_ASK.

rf_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.

    // Esperar a que sea enviado el paquete
    askTx.waitPacketSent();
    // Esperamos 1 segundo antes de volver a enviar
    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.

// Incluir librerías
// RadioHead ASK
// SPI
#include <RH_ASK.h>
#include <SPI.h> 

// Indicar tamaño del mensaje que se va a recibir
const byte tamMsg = 10;

// Crear un objeto de la clase ASK
RH_ASK askRx;
 
void setup()
{
    // Iniciar monitor serie
    Serial.begin(9600);
    // Inicializar objeto ASK
    askRx.init();
}
 
void loop()
{
    // Tamaño esperado del mensaje
    uint8_t msg[tamMsg];
    uint8_t msgLen = sizeof(msg);
    // Comprobar si el mensaje recibido tiene el tamaño adecuado
    if (askRx.recv(msg, &msgLen))
    {
      // Mostrar mensaje por el monitor serie
      Serial.print("Mensaje recibido: ");
      Serial.println((char*)msg);         
    }
}

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.

// Incluir librerías
// RadioHead ASK
// SPI
#include <RH_ASK.h>
#include <SPI.h> 

// Indicar tamaño del mensaje que se va a recibir
const byte tamMsg = 10;

// Crear un objeto de la clase ASK
RH_ASK askRx;

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.

    // Iniciar monitor serie
    Serial.begin(9600);
    // Inicializar objeto ASK
    askRx.init();

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.

    // Set buffer to size of expected message
    uint8_t msg[10];
    uint8_t msgLen = sizeof(msg);

A continuación hay que activar el receptor llamando a la función recv(…) de la clase RH_ASK.

askRx.recv(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.

    // Comprobar si el mensaje recibido tiene el tamaño adecuado
    if (askRx.recv(msg, &msgLen))
    {
      // Mostrar mensaje por el monitor serie
      Serial.print("Mensaje recibido: ");
      Serial.println((char*)msg);         
    }

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.

Deja un comentario