¿Cómo usar LoRa con el ESP32 para proyectos IoT usando Arduino IDE?

Libro Guía del Microcontrolador ESP32

En este tutorial exploraremos los principios básicos de LoRa y cómo se puede usar con el ESP32 para proyectos IoT usando Arduino IDE. Para que puedas empezar, también te mostraremos cómo crear un emisor y un receptor LoRa sencillos con el módulo transceptor RFM95.

¿Qué es LoRa?

LoRa es una tecnología de comunicación inalámbrica de datos que utiliza una técnica de modulación de radio que puede ser generada por los chips transceptores LoRa de Semtech.

Esta técnica de modulación permite comunicación de largo alcance con pequeñas cantidades de datos (lo que significa ancho de banda bajo), alta inmunidad a las interferencias y consumo de energía minimizado. Es decir, permite comunicación a larga distancia con requisitos de baja potencia. Esa combinación es precisamente lo que la hace única en el mundo del IoT.

Frecuencias de LoRa

LoRa utiliza frecuencias no licenciadas disponibles en todo el mundo. Estas son las frecuencias más utilizadas:

868 MHz para Europa, 915 MHz para Norteamérica y la banda de 433 MHz para Asia.

Como estas bandas no requieren licencia, cualquiera puede usarlas libremente sin pagar ni obtener un permiso. Comprueba las frecuencias utilizadas en tu país antes de configurar tus módulos.

Aplicaciones de LoRa

Las características de largo alcance y bajo consumo de LoRa la hacen perfecta para sensores alimentados por batería y aplicaciones de baja potencia en:

Internet de las Cosas (IoT), domótica (smart home), comunicación máquina a máquina (M2M) y mucho más.

LoRa es una buena elección para nodos sensores que funcionan con una pila de botón o energía solar, que transmiten pequeñas cantidades de datos.

Ten en cuenta que LoRa no es adecuado para proyectos que:

Requieren transmisión de alta velocidad de datos, necesitan transmisiones muy frecuentes o están en redes muy pobladas.

Topologías de LoRa

Puedes usar LoRa en comunicación punto a punto o construir una red LoRa (usando LoRaWAN, por ejemplo).

Comunicación punto a punto

En la comunicación punto a punto, dos dispositivos habilitados para LoRa se comunican entre sí usando señales de radiofrecuencia (RF). Esto es útil para intercambiar datos entre dos placas ESP32 equipadas con chips transceptores LoRa que están relativamente lejos una de otra o en entornos sin cobertura Wi-Fi.

A diferencia del Wi-Fi o Bluetooth, que solo soportan comunicación de corta distancia, dos dispositivos LoRa con una antena adecuada pueden intercambiar datos a larga distancia. Puedes configurar fácilmente tu ESP32 con un chip LoRa para transmitir y recibir datos de forma fiable a más de 200 metros de distancia (puedes obtener mejores resultados según tu entorno y la configuración de LoRa). Existen también otras soluciones LoRa que alcanzan fácilmente más de 30 km de rango.

LoRaWAN

También puedes construir una red LoRa usando LoRaWAN. El protocolo LoRaWAN es una especificación de red de área amplia de baja potencia (LPWAN) derivada de la tecnología LoRa y estandarizada por la LoRa Alliance. No exploraremos LoRaWAN en este tutorial, pero para más información puedes consultar los sitios web de LoRa Alliance y The Things Network.

¿Cómo puede ser útil LoRa en tus proyectos de domótica?

Veamos un ejemplo práctico. Imagina que quieres medir la humedad en tu campo. Aunque no está lejos de tu casa, probablemente no tiene cobertura Wi-Fi. Así que puedes construir un nodo sensor con un ESP32 y un sensor de humedad, que envía las lecturas de humedad una o dos veces al día a otro ESP32 usando LoRa.

El segundo ESP32 tiene acceso a Wi-Fi y puede ejecutar un servidor web que muestre las lecturas de humedad. Este es solo un ejemplo que ilustra cómo puedes usar la tecnología LoRa en tus proyectos con ESP32.

ESP32 con LoRa: primeros pasos

En esta sección te mostraremos cómo empezar con LoRa y tu ESP32 usando Arduino IDE. Como ejemplo, construiremos un emisor LoRa y un receptor LoRa sencillos.

El emisor LoRa enviará un mensaje “hello” seguido de un contador con fines de prueba. Este mensaje puede ser fácilmente reemplazado por datos útiles como lecturas de sensores o notificaciones.

Para seguir esta parte necesitas: dos placas ESP32 DOIT DEVKIT V1, dos módulos transceptores LoRa (RFM95), una placa de breakout para el RFM95 (opcional), cables jumper y una protoboard o stripboard.

Alternativa: en lugar de usar un ESP32 y un módulo transceptor LoRa separado, existen placas de desarrollo ESP32 con chip LoRa y OLED integrados, como la TTGO LoRa32 SX1276 OLED, que simplifican mucho el cableado. Si tienes una de esas placas, puedes seguir el tutorial específico de esa placa.

Preparar Arduino IDE

Existe un complemento para Arduino IDE que te permite programar el ESP32 usando Arduino IDE y su lenguaje de programación. Sigue el tutorial de instalación correspondiente a tu sistema operativo antes de continuar.

Instalar la librería LoRa

Hay varias librerías disponibles para enviar y recibir paquetes LoRa fácilmente con el ESP32. En este ejemplo usaremos la librería arduino-LoRa de Sandeep Mistry.

Abre tu Arduino IDE y ve a Programa > Incluir Librería > Gestionar Librerías y busca “LoRa”. Selecciona la librería LoRa e instálala.

Obtener los módulos transceptores LoRa

Para enviar y recibir mensajes LoRa con el ESP32 usaremos el módulo transceptor RFM95. Todos los módulos LoRa son transceptores, lo que significa que pueden enviar y recibir información. Necesitarás dos de ellos.

También puedes usar otros módulos compatibles como las placas basadas en Semtech SX1276/77/78/79, incluyendo RFM96W, RFM98W, etc. Alternativamente, existen placas ESP32 con LoRa y pantalla OLED integradas como la ESP32 Heltec WiFi Module o la TTGO LoRa32.

Antes de comprar tu módulo transceptor LoRa, asegúrate de comprobar la frecuencia correcta para tu ubicación. Por ejemplo, en Europa se puede usar una frecuencia entre 863 y 870 MHz o 433 MHz. Para este proyecto, usaremos un RFM95 que opera a 868 MHz.

Preparar el módulo transceptor RFM95

Si tienes una placa de desarrollo ESP32 con LoRa integrado, puedes saltarte este paso.

El RFM95 no es amigable para protoboard. Una fila común de pines header de 2,54 mm no encaja en los pines del transceptor. Los espacios entre las conexiones son más cortos de lo habitual.

Hay varias opciones que puedes usar para acceder a los pines del transceptor: soldar algunos cables directamente al transceptor, romper pines header y soldar cada uno por separado, o comprar una placa de breakout que haga los pines compatibles con protoboard.

En nuestro caso, hemos soldado un header al módulo. De esta forma puedes acceder a los pines del módulo con cables jumper normales, o incluso poner algunos pines header para conectarlos directamente a una stripboard o protoboard.

Antena: un elemento crítico

El chip transceptor RFM95 requiere una antena externa conectada al pin ANA. Puedes conectar una antena “real” o fabricar una tú mismo usando un cable conductor. Algunas placas de breakout vienen con un conector especial para añadir una antena adecuada.

La longitud del cable depende de la frecuencia:

868 MHz: 86,3 mm (3,4 pulgadas). 915 MHz: 81,9 mm (3,22 pulgadas). 433 MHz: 173,1 mm (6,8 pulgadas).

Para nuestro módulo necesitamos usar un cable de 86,3 mm soldado directamente al pin ANA del transceptor. Ten en cuenta que usar una antena adecuada extenderá el rango de comunicación.

Importante: DEBES conectar una antena al módulo. Sin antena, el módulo puede dañarse o no funcionar correctamente.

Cablear el módulo transceptor RFM95

El RFM95 LoRa se comunica con el ESP32 usando el protocolo SPI. Así que usaremos los pines SPI por defecto del ESP32. Cablea ambas placas ESP32 a los módulos transceptores correspondientes.

Las conexiones entre el RFM95 y el ESP32 son las siguientes:

ANA: Antena. GND: GND. DIO3: no conectar. DIO4: no conectar. 3.3V: 3.3V. DIO0: GPIO 2. DIO1: no conectar. DIO2: no conectar. GND: no conectar. DIO5: no conectar. RESET: GPIO 14. NSS: GPIO 5. SCK: GPIO 18. MOSI: GPIO 23. MISO: GPIO 19. GND: no conectar.

Nota: el módulo RFM95 tiene 3 pines GND. No importa cuál uses, pero necesitas conectar al menos uno.

Por razones prácticas, hemos montado este circuito en una stripboard. Es más fácil de manejar y los cables no se desconectan. Puedes usar una protoboard si lo prefieres.

El sketch del emisor LoRa

Abre tu Arduino IDE y copia el siguiente código. Este sketch está basado en un ejemplo de la librería LoRa. Transmite mensajes cada 10 segundos usando LoRa. Envía un “hello” seguido de un número que se incrementa en cada mensaje.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Modificado de los ejemplos de la librería Arduino LoRa
  Más recursos: https://RandomNerdTutorials.com/esp32-lora-rfm95-transceiver-arduino-ide/
*/

#include <SPI.h>
#include <LoRa.h>

// Define los pines usados por el módulo transceptor
#define ss 5
#define rst 14
#define dio0 2

int counter = 0;

void setup() {
  // Inicializa el Monitor Serie
  Serial.begin(115200);
  while (!Serial);
  Serial.println("LoRa Sender");

  // Configura el módulo transceptor LoRa
  LoRa.setPins(ss, rst, dio0);

  // Reemplaza el argumento de LoRa.begin(---E-) con la frecuencia de tu ubicación
  // 433E6 para Asia
  // 868E6 para Europa
  // 915E6 para Norteamérica
  while (!LoRa.begin(868E6)) {
    Serial.println(".");
    delay(500);
  }
  // Cambia la palabra de sincronización (0xF3) para que coincida con el receptor
  // La palabra de sincronización asegura que no recibes mensajes LoRa de otros transceptores
  // rangos de 0-0xFF
  LoRa.setSyncWord(0xF3);
  Serial.println("LoRa Initializing OK!");
}

void loop() {
  Serial.print("Sending packet: ");
  Serial.println(counter);

  // Envía el paquete LoRa al receptor
  LoRa.beginPacket();
  LoRa.print("hello ");
  LoRa.print(counter);
  LoRa.endPacket();

  counter++;

  delay(10000);
}

Cómo funciona el código del emisor

Empieza incluyendo las librerías necesarias:

#include <SPI.h>
#include <LoRa.h>

Después, define los pines usados por tu módulo LoRa. Si has seguido el esquema anterior, puedes usar la definición de pines usada en el código. Si estás usando una placa ESP32 con LoRa integrado, comprueba los pines usados por el módulo LoRa en tu placa y haz la asignación correcta:

#define ss 5
#define rst 14
#define dio0 2

Se inicializa la variable counter que empieza en 0:

int counter = 0;

En el setup(), se inicializa una comunicación serie y se configuran los pines del módulo LoRa:

LoRa.setPins(ss, rst, dio0);

Y se inicializa el módulo transceptor con una frecuencia específica:

while (!LoRa.begin(868E6)) {
  Serial.println(".");
  delay(500);
}

Puede que necesites cambiar la frecuencia para que coincida con la usada en tu ubicación. Elige una de estas opciones: 433E6, 868E6 o 915E6.

Los módulos transceptores LoRa escuchan paquetes dentro de su rango. No importa de dónde vengan. Para asegurarte de que solo recibes paquetes de tu emisor, puedes establecer una palabra de sincronización (sync word) que va de 0 a 0xFF:

LoRa.setSyncWord(0xF3);

Tanto el receptor como el emisor necesitan usar la misma palabra de sincronización. De esta forma, el receptor ignora cualquier paquete LoRa que no contenga esa palabra.

Después, en el loop() se envían los paquetes LoRa. Se inicializa un paquete con el método beginPacket():

LoRa.beginPacket();

Se escriben datos en el paquete usando el método print(). Como puedes ver en las siguientes dos líneas, estamos enviando un mensaje “hello” seguido del contador:

LoRa.print("hello ");
LoRa.print(counter);

Después, se cierra el paquete con el método endPacket():

LoRa.endPacket();

El contador se incrementa en uno en cada bucle, que ocurre cada 10 segundos:

counter++;
delay(10000);

Probar el sketch del emisor

Sube el código a tu placa ESP32. Asegúrate de tener la placa y el puerto COM correctos seleccionados. Después, abre el Monitor Serie y pulsa el botón de habilitación del ESP32. Deberías ver un mensaje de éxito. El contador debería incrementarse cada 10 segundos.

El sketch del receptor LoRa

Ahora, coge otro ESP32 y sube el siguiente sketch (el receptor LoRa). Este sketch escucha paquetes LoRa con la palabra de sincronización que hayas definido e imprime el contenido de los paquetes en el Monitor Serie, así como el RSSI. El RSSI mide la intensidad relativa de la señal recibida.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Modificado de los ejemplos de la librería Arduino LoRa
  Más recursos: https://RandomNerdTutorials.com/esp32-lora-rfm95-transceiver-arduino-ide/
*/

#include <SPI.h>
#include <LoRa.h>

// Define los pines usados por el módulo transceptor
#define ss 5
#define rst 14
#define dio0 2

void setup() {
  // Inicializa el Monitor Serie
  Serial.begin(115200);
  while (!Serial);
  Serial.println("LoRa Receiver");

  // Configura el módulo transceptor LoRa
  LoRa.setPins(ss, rst, dio0);

  // Reemplaza el argumento de LoRa.begin(---E-) con la frecuencia de tu ubicación
  // 433E6 para Asia
  // 868E6 para Europa
  // 915E6 para Norteamérica
  while (!LoRa.begin(868E6)) {
    Serial.println(".");
    delay(500);
  }
  // Cambia la palabra de sincronización (0xF3) para que coincida con el receptor
  // La palabra de sincronización asegura que no recibes mensajes LoRa de otros transceptores
  // rangos de 0-0xFF
  LoRa.setSyncWord(0xF3);
  Serial.println("LoRa Initializing OK!");
}

void loop() {
  // Intenta parsear el paquete
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    // Recibido un paquete
    Serial.print("Received packet '");

    // Lee el paquete
    while (LoRa.available()) {
      String LoRaData = LoRa.readString();
      Serial.print(LoRaData);
    }

    // Imprime el RSSI del paquete
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
  }
}

Cómo funciona el código del receptor

Este sketch es muy similar al anterior. Solo el loop() es diferente. Puede que necesites cambiar la frecuencia y la palabra de sincronización para que coincidan con las usadas en el sketch del emisor.

En el loop(), el código comprueba si se ha recibido un nuevo paquete usando el método parsePacket():

int packetSize = LoRa.parsePacket();

Si hay un nuevo paquete, leeremos su contenido mientras esté disponible. Para leer los datos entrantes se usa el método readString():

while (LoRa.available()) {
  String LoRaData = LoRa.readString();
  Serial.print(LoRaData);
}

Los datos entrantes se guardan en la variable LoRaData y se imprimen en el Monitor Serie.

Finalmente, las siguientes dos líneas de código imprimen el RSSI del paquete recibido en dB:

Serial.print("' with RSSI ");
Serial.println(LoRa.packetRssi());

Probar el sketch del receptor LoRa

Sube este código a tu ESP32. En este punto deberías tener dos placas ESP32 con diferentes sketches: el emisor y el receptor.

Abre el Monitor Serie del receptor LoRa y pulsa el botón de habilitación del emisor LoRa. Deberías empezar a recibir los paquetes LoRa en el receptor.

¡Enhorabuena! Has construido un emisor y un receptor LoRa usando el ESP32.

Llevándolo más lejos

Ahora deberías probar el rango de comunicación entre el emisor y el receptor en tu zona. El rango de comunicación varía mucho dependiendo de tu entorno (si vives en una zona rural o urbana con muchos edificios altos).

Para probar el rango de comunicación, puedes añadir una pantalla OLED al receptor LoRa y salir a caminar para ver hasta dónde llega la comunicación. En este ejemplo solo enviamos un mensaje “hello”, pero la idea es reemplazar ese texto con información útil: lecturas de sensores, alertas, comandos de control, etc.

Conclusión: lo que has aprendido

En resumen, en este tutorial te hemos mostrado los conceptos básicos de la tecnología LoRa:

LoRa es una técnica de modulación de radio. LoRa permite comunicación a larga distancia de pequeñas cantidades de datos y requiere baja potencia. Puedes usar LoRa en comunicación punto a punto o en red. LoRa puede ser especialmente útil si quieres monitorizar sensores que no están cubiertos por tu red Wi-Fi y que están a varios metros de distancia.

También te hemos mostrado cómo construir un emisor y un receptor LoRa sencillos. Estos son solo ejemplos simples para empezar con LoRa.

LoRa es la tecnología complementaria perfecta para el ESP32 en proyectos IoT de campo. Mientras que el Wi-Fi te da velocidad y conexión a internet, LoRa te da alcance y eficiencia energética. Combinando ambas, puedes construir sistemas completos de monitorización remota que funcionen durante meses con una batería.

Vistas: 0

Descubre más desde CIBERED

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Scroll al inicio