VictorJAM.zapto.org
Arduino 

2023-12-26

Comunicación inalámbrica RF433 en Arduino

Los módulos de radio frecuencia RF 433MHz son transmisores/receptores inalámbricos que podemos emplear para comunicar microcontroladores como Arduino.

 

Módulos FS1000A y XY-MK-5V.

Podemos encontrar distintos tipos de módulos transmisores/receptores, pero a nivel de hobby nos encontraremos con los módulos FS1000A (emisor) y XY-MK-5V (receptor) que se han hecho muy populares debido a su bajo coste.

Operan en la frecuencia de 433MHz, aunque también hay módulos similares que operan a 315MHz. Ambas frecuencias son libres de uso.

El alcance de estos módulos depende del voltaje de alimentación y de la antena del módulo. Con la antena propia del módulo se alcanzará una distancia corta de unos pocos centímetros. Si lo alimentamos a 12V y con una antena de 16.5cm el rango puede alcanzar los 300 metros.

 

El emisor FS1000A

El circuito es muy fácil: consiste en un oscilador de frecuencia a 433MHz y un transistor que hará que oscile cuando recibe un valor HIGH.

A esta forma de actuar se le conoce como OOK (On-Off Keying).

 

El receptor XY-MK-5V

El receptor es un poco más complejo. Se compone de un circuito sintonizador de RF, un par de amplificadores para aumentar la señal y un lazo de seguimiento de fase (PLL) para filtrar los ruidos a la salida.

 

Modulación por desplazamiento de amplitud (ASK)

Estos módulos de RF utilizan la modulación por desplazamiento de amplitud ASK (Amplitude Shift Keying).

Existes muchos método de transmitir información por radio frecuencia, entre los más usados podemos destacar FSK o modulación por desplazamiento de frecuencia y PSK o modulación por desplazamiento de fase.

En ASK dependiendo del valor de la señal digital (cero o uno), variamos la amplitud de la señal. Generalmente, en los dispositivos baratos se suele usar una amplitud del 100% de la alimentación para un valor alto y amplitud de cero voltios para un valor bajo, a este sistema se llama OOK (On-Off Keying).

Usando con Arduino.

Para usar estos módulos conviene usar la librería VirtualWire. Aunque en teoría se puede usar el UART de Arduino, tendremos muchos fallos de comunicación con lo que conviene hacer unas operaciones previas de "aprendizaje" y tener una buena corrección de errores. Esta librería se encarga de ello.

Esta librería hace uso del TIMER1 por lo que las funciones PWM del core de Arduino se verán afectadas y no funcionaran!.

Emisor

He aquí como realizar la conexión:

Y este es el código del emisor.

#include <VirtualWire.h>

const char *msg = "hola mundo";

void setup() {
  pinMode(13, OUTPUT);
  vw_setup(2000);
  vw_set_tx_pin(2);
};

void loop() {
  digitalWrite(13, HIGH);
  vw_send((uint8_t*)msg, strlen(msg));
  vw_wait_tx();
  digitalWrite(13, LOW);
  delay(1000);
}

Primero iniciamos la velocidad con vw_setup y establecemos el pin que realizará la transmisión con vw_set_tx_pin

En el loop, enviamos la información con vw_send y esperamos a que la información ha sido enviada con vw_wait.

Receptor

He aquí como realizar la conexión:


#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);
    vw_setup(2000);
    vw_set_rx_pin(2);
    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(13, true);
      Serial.print("Mensaje: ");
      for (int i = 0; i < buflen; i++) {
         Serial.print((char)buf[i]);
      }
      Serial.println("");
      digitalWrite(23, false);
    }
}

De igual manera que en el emisor, en el setup debemos configurar la velocidad y el pin de datos con las funciones vw_setup y vw_set_rx_pin. Por último aquí tenemos que activar la interrupción para poder recibir datos usando la función vw_rx_start.

En el loop podremos comprobar y leer la información con la función vw_get_message.

En la sección de referencias está disponible la librería en su versión 1.27 que incluye el PDF con la documentación de la misma.

 

Referencias

Comunicación inalámbrica en Arduino con módulos RF 433MHz

Copiar un mando inalámbrico 315/433Mhz con Arduino

RF 433 MHz con Arduino y fs1000a XY-MK-5V

Esquema FS1000A

VirtualWire 1.27