Aprendiendo a programar radiofrecuencia con Arduino, ESP32...

Publicado el 29.10.2023 a las 21:04

Aprendiendo a programar radiofrecuencia con Arduino, ESP32...

  1. Introducción

    • ¿Por qué comunicar por radiofrecuencia?

    • Posibles casos de uso

  2. Materiales

    • Módulo transmisor

    • Módulo receptor y decodificador

  3. Procedimiento

    • Conexionado

    • Configurando el receptor

    • Aprendiendo qué hace cada pin del receptor

    • Programando la placa de desarrollo

  4. Usando un sensor de puerta

    • Sensor de puerta mágnético

    • Receptor 433 MHz universal

    • Conexión

    • Programando la placa de desarrollo

Logo de fjmduran

Aprendiendo a programar radiofrecuencia con Arduino, ESP32...

En mis proyectos de IoT, me han surgido varios escenarios donde la opción de cablear no es viable.


Por ejemplo, mi tío tiene una nave industrial donde la puerta de acceso es la típica puerta motorizada con una puerta de acceso peatonal integrada.


Una imagen vale más que mil palabras 👇

Puerta motorizada con puerta de acceso peatonal integrada

Hace un par de años me pidió una aplicación para abrir y cerrar la puerta con el móvil y además abrirla a distancia, es decir, abrirla sin tener que estar cerca.

Después también me pidió el poder añadir a más usuarios y que él pudiera controlar quién y cuando entra y demás características, para no aburrirte te dejo información de la aplicación 🚀


Bueno, a lo que iba... ahora quería que cuando la puerta se abriera le avisara con una notificación al móvil de que la puerta se había abierto.

Fácil, se le pone un final de carrera de los típicos magnéticos cableados y a correr, pero... ¿cómo lo haces con la puerta peatonal?


Con cable se puede hacer, imposible no es, pero tampoco es fácil.


Tienes que grapar el cable por la puerta, salvar la bisagra que pliega la puerta, después continuar hasta llegar a la bisagra que se une al bastidor y de ahí bajar hasta el motor que es donde está la micro.


Pues con un sensor de puerta que se comunique por rafiofrecuencia lo solucioné rápido, fácil y barato.

Sensor de puerta magnético a 433 MHz

Y es eso lo que te quiero contar en este artículo, cómo comunicar remotamente por radiofrecuencia a 433 MHz con tu placa de desarrollo.

Introducción

¿Por qué comunicar por radiofrecuencia?

La comunicación por radiofrecuencia:

  • Es segura
  • Es barata
  • Es universal, es decir, funciona en cualquier país
  • Ahorra cable y el taladrar para los soportes de los mismos cables

Posibles casos de uso de la radiofrecuencia

Además del ejemplo que te he puesto de la puerta basculante de la nave industrial, también se me han dado casos de:

  • Controlar enchufes a distancia para por ejemplo encender luces, aparatos de aire acondicionado...
  • Controlar electroválvulas de riego en macetas que están colgadas y tienen un difícil acceso
  • Hacer un marcador de pádel para mi club. Uno de los jugadores tiene un mando en su muñequera que se comunica por radiofrecuencia al marcador.

    🚀 Información de la aplicación

  • Te puedes crear una centralita de incendios sin necesidad de cablear los sensores de humo
  • Seguro que se te ocurren más aplicaciones
Enchufes por rafiofrecuencia

Materiales

Como ya te he dicho, voy a utilizar componentes que se comunican a 433 MHz


En toda comunicación siempre habrá un emisor y un receptor.

Módulo emisor o transmisor

Para escribir este ejemplo me voy a basar en un mando con 4 botones que ya viene liagado a un receptor.


Cada uno de los botones los puedes usar para lo que te parezca, yo voy a hacer un ejemplo en el que cada botón encenderá un led, pero como te imaginas puedes cambiar el encender un led por activar un relé y que ese relé haga algo, o activar un enchufe que se comunica a 433 MHz que son bastante baratos también.

Mando radiofrecuencia 433 MHz con 4 botones

Módulo receptor y decodificador

El receptor con el que te voy a explicar este ejemplo es con el RX480-E.

Receptor o decodificador radiofrecuencia 433 MHz

Este receptor ya decodifica por nosotros la señal del mando y nos la da directamente en entradas para nuestra placa de desarrollo.


Los decodificares universales como este son más versátiles porque te admiten comunicación con más sensores.

Procedimiento

Conexionado

Voy a realizar el ejemplo con una ESP32 de 30 pines.

Conexión entre una ESP32 y un RX480-E

Configurando el receptor

Una vez que hemos hecho la conexión como se indica en el diagrama del punto anterior, procedemos a alimentar nuestra placa.


El módulo RX480-E tiene tres modos de funcionamiento que podemos consumir:

  • Configuración de pulso

    Para activar este modo pulsa el botón de aprendizaje en el receptor una vez.

    Espera 3 segundos.

    Pulsa el botón A del control remoto.

    Espera 3 segundos.

    Listo

  • Configuración de palanca

    Para activar este modo pulsa el botón de aprendizaje en el receptor dos veces.

    Espera 3 segundos.

    Pulsa el botón A del control remoto.

    Espera 3 segundos.

    Listo

  • Configuración de enclavado

    Para activar este modo pulsa el botón de aprendizaje en el receptor tres veces.

    Espera 3 segundos.

    Pulsa el botón A del control remoto.

    Espera 3 segundos.

    Listo

Botón de aprendizaje del RX480-E

Para este ejemplo voy a utilizar el modo de pulso, que significa que el led asociado al botón que pulse estará encendido mientras el botón esté encendido.

Aprendiendo qué hace cada pin del receptor

Receptor o decodificador radiofrecuencia 433 MHz
  • GND: tierra o polo negativo
  • + V: alimentación a DC3.3 ~ 5V
  • D0: salida de datos; botón D del mando
  • D1: salida de datos; botón C del mando
  • D2: salida de datos; botón B del mando
  • D3: salida de datos; botón A del mando
  • VT: Salida (cuando cualquier pin, D0-D3, emite la señal de activación, VT sale sincrónicamente; VT se utiliza generalmente como indicador de salida).

Programando la placa de desarrollo

Te dejo el código en C++

#define greenLed 23
#define redLed 22
#define blueLed 21
#define yellowLed 19
#define VT 35
#define buttonD 32
#define buttonC 33
#define buttonB 25
#define buttonA 26

void setup()
{
  Serial.begin(115200);
  while (!Serial)    
  delay(200);
  pinMode(redLed, OUTPUT);
  pinMode(blueLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(VT, INPUT);
  pinMode(buttonA, INPUT);
  pinMode(buttonB, INPUT);
  pinMode(buttonC, INPUT);
  pinMode(buttonD, INPUT);

  Serial.println(" APLICACIÓN INICIADA");
}

void loop()
{
  bool vt = digitalRead(VT);
  if (vt)
  {
    bool aButton = digitalRead(buttonA);
    bool bButton = digitalRead(buttonB);
    bool cButton = digitalRead(buttonC);
    bool dButton = digitalRead(buttonD);
    if (aButton)
    {
      digitalWrite(greenLed, 1);      
      Serial.println("BOTÓN A");
    }
    else if (bButton)
    {
      digitalWrite(redLed, 1);      
      Serial.println("BOTÓN B");
    }
    else if (cButton)
    {
      digitalWrite(blueLed, 1);      
      Serial.println("BOTÓN C");
    }
    else if (dButton)
    {
      digitalWrite(yellowLed, 1);      
      Serial.println("BOTÓN D");
    }
  }
}
      

Usando un sensor de puerta

Sensor de puerta mágnético

Asegúrate que el sensor que compres sea de 433 MHz y que utilice el protocolo EV1527.

Sensor de puerta magnético a 433 MHz

Receptor 433 MHz universal

Este es el receptor que yo uso.

Esquema de pin de receptor 433 MHz

Conexión

Conectaremos el pin 3.3V en la ESP32 a VCC en su receptor de 433 MHz.


El pin GND al pin GND


El pin RX en el ESP32 al pin DATA en el receptor de 433 MHz


Observa que estoy utilizando un receptor de 433 MHz que funciona a 3,3 V, que es el mismo voltaje al que funciona la ESP32.


Seguimos escribiendo el código que nos muestre las señales de lectura desde el sensor de puerta al monitor serie.

Conexión ESP32 con receptor 433 MHz

Programando la placa de desarrollo

#include <RMT.h>

  // Set the RMT channel number
  #define RMT_CHANNEL 0
  
  void setup() {
    // Initialize the RMT peripheral
    RMT.begin();
  
    // Set the input pin
    pinMode(RMT.rxChannelToInput(RMT_CHANNEL), INPUT);
  
    // Set the carrier frequency (38 kHz)
    RMT.addCarrier(RMT_CHANNEL, 38000);
  
    // Set the decoder
    RMT.setDecoder(RMT_CHANNEL, RMT_MODE_RX, RMT_MEM_64);
  
    // Enable the RMT receiver
    RMT.enableRx(RMT_CHANNEL);
  }
  
  void loop() {
    // Wait for a signal to be received
    if (RMT.getRxState(RMT_CHANNEL) == RMT_RX_ACTIVE) {
      // Get the received signal
      rmt_item32_t* items = NULL;
      uint32_t numItems = 0;
      if (RMT.read(RMT_CHANNEL, &items, &numItems) == ESP_OK) {
      // Convert the signal to a byte array
      uint8_t data[numItems / 2];
      for (int i = 0; i < numItems / 2; i++) {
        uint8_t high = items[i * 2].duration1 > items[i * 2].duration0 ? 1 : 0;
        uint8_t low = items[i * 2 + 1].duration1 > items[i * 2 + 1].duration0 ? 1 : 0;
        data[i] = (high << 1) | low;
      }
  
      // Print the received data
      Serial.print("Received data: ");
      for (int i = 0; i < numItems / 2; i++) {
        Serial.print(data[i], HEX);
        Serial.print(" ");
      }
      Serial.println();
            }
  
            // Reset the receiver
            RMT.rxReset(RMT_CHANNEL);
          }
  }
      

Hasta luego 🖖