Skip to main content

Primeros pasos con LoRaWAN usando Wio-E5 y Arduino en PlatformIO

Si quieres aprender sobre Long Range y sus características como la arquitectura de red y aplicaciones, puedes consultar este artículo LoRapedia, que introduce Long Range y Long Range en detalle, explica qué es Long Range, cómo funciona, y sus pros y contras.

LoRaWAN Framework
Marco de red LoRaWAN

Introducción

Esta guía detalla el uso del módulo LoRa Wio-E5 con XIAO ESP32S3 en PlatformIO, aplicable a cualquier placa compatible con Arduino.

Aprendizajes clave:

  1. Programación de librerías Arduino para Wio-E5: Utilizando librerías Arduino para programación eficiente del Wio-E5, más allá del control básico de comandos AT.
  2. Integración de red LoRaWAN: Pasos para conectar el Wio-E5 a una red LoRaWAN.
  3. Implementación de enlace ascendente y descendente: Gestión de transmisión de datos hacia y desde la red.

Esta aplicación modifica la configuración de hardware estándar, incorporando un OLED para visualización directa de datos y CircleLED para indicación de enlace descendente, junto con reporte de datos del sensor DHT11, simplificando el proceso de aprendizaje con implementaciones prácticas.

Prerrequisitos

Hardware

  • XIAO ESP32S3: Una placa versátil que es compatible con Arduino, ideal para varios proyectos IoT. Puedes sustituirla con cualquier placa compatible con Arduino según sea necesario.
  • Grove - DHT11: Para recolección de datos ambientales, esencial en muchas aplicaciones IoT.
  • Grove - LED Circular: Usado para control de luz. Este es un ejemplo de un dispositivo controlable; siéntete libre de reemplazarlo con un componente de tu elección.
  • Grove - Pantalla OLED: Mejora tu proyecto con capacidades de visualización de datos. Este componente es opcional pero recomendado para una interfaz de usuario más interactiva.
  • Grove - Módulo LoRa Wio-E5: Proporciona comunicación inalámbrica de largo alcance y bajo consumo, convirtiéndolo en una excelente opción para aplicaciones LoRaWAN.
  • Gateway Multi-Plataforma SenseCAP M2: Un componente crítico para habilitar la comunicación entre tu módulo Wio-E5 y la red LoRaWAN.

Software

PlatofmrIO

PlatformIO Logo

Para este proyecto, aprovecharemos PlatformIO, que ofrece numerosas ventajas:

  • Gestión eficiente de librerías: PlatformIO facilita la gestión fácil y efectiva de librerías, asegurando que tu proyecto esté siempre alineado con los últimos avances.
  • Integración con VSCode: Esta integración mejora significativamente la experiencia de desarrollo, con resaltado de código e IntelliSense, para un proceso de codificación más fluido y eficiente.
  • Adición y configuración simple de librerías: Con PlatformIO, agregar y configurar librerías es un proceso directo, permitiendo personalización rápida para ajustarse a las necesidades específicas de tu proyecto.
info

Si eres nuevo en PlatformIO o buscas profundizar tu comprensión, puedes comenzar con estos recursos:

Servidor de red LoRaWAN (ChirpStack)

Esta sección proporciona orientación sobre cómo conectarse a un servidor de red LoRaWAN local, usando la plataforma ChirpStack como nuestro ejemplo principal. Nos enfocaremos específicamente en usar el Gateway Interior Multi-Plataforma LoRaWAN SenseCAP M2 (EU868) para este propósito.

info

Si no estás familiarizado con los siguientes pasos en ChirpStack, como:

  • Crear un perfil de dispositivo
  • Agregar una aplicación
  • Registrar un dispositivo bajo una aplicación

Puedes aprender más de estos recursos:

Lo haremos juntos en la siguiente sección.

tip

Para aquellos que prefieren plataformas alternativas como AWS IoT o TTN, consulta las siguientes guías:

Trabajo preparatorio

Ahora, comencemos. Haremos las siguientes cosas.

Red LoRaWAN

Para asegurar una comunicación exitosa con la red LoRaWAN a través de tu módulo Wio-E5, hay un par de aspectos clave que necesitas verificar:

  1. Cobertura LoRaWAN:

    • Asegúrate de que tu dispositivo esté dentro del área de cobertura de una red LoRaWAN. Por ejemplo, en mi caso, el dispositivo está cubierto por un gateway M2 que opera en la banda de frecuencia EU868. Esto es crucial ya que el dispositivo necesita comunicarse con un gateway LoRaWAN cercano que soporte la misma banda de frecuencia.
  2. Enlace del Gateway al LNS:

    • También es esencial confirmar que uno de estos gateways esté vinculado al Servidor de Red LoRaWAN (LNS) que pretendes usar. Esta vinculación es vital porque el gateway no solo actúa como un puente entre tu dispositivo Wio-E5 y el servidor de red, sino que también dicta la ruta que tomarán los datos de tu dispositivo para llegar al servidor.

Obtener Parámetros de Unión

Asumiendo que ya has configurado el servidor de red ChirpStack en la sección anterior, el siguiente paso es reunir los parámetros de unión de red necesarios. Estos parámetros son vitales para asegurar que tu dispositivo pueda unirse exitosamente y acceder a la red.

Para un tutorial paso a paso más detallado, por favor consulta la sección Registrar el Dispositivo en el Servidor de Red LoRaWAN.

Agregar Perfil de Dispositivo

El módulo Wio-E5 está configurado por defecto para usar el Parámetro Regional V102B. Esta información está de acuerdo con la sección 4.28.13 VER de la Especificación de Comandos AT Wio-E5.

Consecuentemente, seleccionaremos LoRaWAN 1.0.2 como la versión MAC y RP002-1.0.2 para la revisión del Parámetro Regional.

Si necesitas usar Clase C para tu dispositivo, puedes activarla haciendo clic en el siguiente botón:

Agregar Aplicación

Agregar Dispositivo

Debes llenar el Device EUI (EUI64) de tu información Device EUI (EUI64), esta sección lo está usando.

Si lo has cambiado, navega a esta sección para obtener el DevAddr, DevEui, AppEui.

Alternativamente, si prefieres usar un nuevo DevEUi, puedes regenerarlo y luego enviarlo.

Y obtener el AppKey:

Información del Dispositivo

Hasta este punto, hemos obtenido las siguientes credenciales necesarias para la operación de unión con la red LoRaWAN:

  • DevEUI: 2cf7f1205100a785
  • AppKey: 19aee7bedec56509a9c66a44b7956b6f

Estas credenciales son esenciales para el registro seguro y la comunicación de tu dispositivo con la red LoRaWAN.

¿Por Qué No Necesitamos AppEUI?

En el contexto de LoRaWAN, DevEUI y AppKey juegan roles críticos en la identificación del dispositivo y la comunicación segura. El AppEUI, también conocido como JoinEUI en LoRaWAN 1.1 y versiones posteriores, se usa típicamente durante el proceso de unión del dispositivo para identificar la instancia del servidor de aplicación al cual el dispositivo debería conectarse. Sin embargo, en algunas configuraciones de red o con ciertas implementaciones de servidor de red, como The Things Network (TTN), el AppEUI puede no ser esencial o ya está predefinido. Este enfoque simplifica el proceso de configuración del dispositivo reduciendo el número de parámetros que necesitan ser configurados. Por lo tanto, basado en las especificidades de tu servidor de red y su configuración, el uso explícito de un AppEUI podría no ser necesario para el proceso de unión.

Práctica

Iniciando un Nuevo Proyecto de PlatformIO

Para comenzar, crearás un proyecto de PlatformIO. Sigue estos pasos:

  1. Abrir PlatformIO: Comienza abriendo el IDE de PlatformIO en tu computadora.

  2. Crear un Nuevo Proyecto: Ve al menú principal y selecciona New Project.

Aquí hay una imagen de ejemplo que muestra la creación de un nuevo proyecto en PlatformIO:

Para este proyecto, elige XIAO ESP32S3 como la placa de desarrollo.

Ejemplo de creación de proyecto para XIAO ESP32S3:

Agregar Librerías Necesarias:

Después de crear tu proyecto, necesitas incluir varias librerías que son esenciales para tu proyecto. Puedes agregar estas librerías a tu archivo platformio.ini para permitir que PlatformIO las descargue automáticamente:

[env:seeed_xiao_esp32s3]
platform = espressif32
board = seeed_xiao_esp32s3
framework = arduino
lib_deps =
olikraus/U8g2@^2.35.9
plerup/EspSoftwareSerial@^8.2.0
https://github.com/dok-net/ghostl # Issue Fix: https://github.com/plerup/espsoftwareserial/issues/305#issuecomment-1880188894
seeed-studio/Grove Temperature And Humidity Sensor@^2.0.2
seeed-studio/Grove LED Bar@^1.0.0
https://github.com/andresoliva/LoRa-E5

Una vez que el Administrador de Bibliotecas de PlatformIO haya terminado de procesar tus solicitudes, podrás ver todas las bibliotecas que se han añadido a tu proyecto. Estas bibliotecas se almacenan en el directorio .pio/libdeps/seeed_xiao_esp32s3, específico para tu placa seleccionada, que en este caso es el Seeed XIAO ESP32S3.

Aquí tienes una imagen que muestra cómo se verá tu entorno de PlatformIO después de que las bibliotecas hayan sido añadidas exitosamente:

En este directorio, encontrarás carpetas para cada biblioteca que especificaste en tu archivo platformio.ini. Estas carpetas contienen los archivos necesarios para cada biblioteca, como código fuente, ejemplos y metadatos adicionales.

Esta organización facilita la gestión y actualización de tus bibliotecas. PlatformIO maneja automáticamente la compatibilidad y resolución de dependencias, asegurando que tu proceso de desarrollo sea fluido y eficiente. También puedes actualizar o eliminar bibliotecas fácilmente usando el Administrador de Bibliotecas de PlatformIO, manteniendo tu entorno de desarrollo actualizado con las últimas versiones de las bibliotecas.

Unirse a la Red LoRaWAN (Pruebas)

En esta sección, utilizaremos andresoliva/LoRa-E5 para controlar el Wio-E5 para unirse a la red LoRaWAN, en lugar de usar comandos AT manualmente.

#include <Arduino.h>
#include <LoRa-E5.h> //main LoRa

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#if defined(ARDUINO_ARCH_AVR)
#define serialLog Serial

#elif defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_SAM)
#define serialLog SerialUSB
#else
#define serialLog Serial
#endif

const int RXPin = D7, TXPin = D6; // Replace with your Wio-E5 RX,TX pin number

/************************LORA SET UP*******************************************************************/
#define LoRa_APPKEY "19aee7bedec56509a9c66a44b7956b6f" /*Custom key for this App*/
#define LoRa_FREQ_standard EU868 /*International frequency band. see*/
#define LoRa_DR DR4 /*DR5=5.2kbps //data rate. see at https://www.thethingsnetwork.org/docs/lorawan/regional-parameters/ */
#define LoRa_DEVICE_CLASS CLASS_C /*CLASS_A for power restriction/low power nodes. Class C for other device applications */
#define LoRa_PORT_BYTES 8 /*node Port for binary values to send, allowing the app to know it is recieving bytes*/
#define LoRa_PORT_STRING 7 /*Node Port for string messages to send, allowing the app to know it is recieving characters/text */
#define LoRa_POWER 14 /*Node Tx (Transmition) power*/
#define LoRa_CHANNEL 0 /*Node selected Tx channel. Default is 0, we use 2 to show only to show how to set up*/
#define LoRa_ADR_FLAG false /*ADR(Adaptative Dara Rate) status flag (True or False). Use False if your Node is moving*/
/*Time to wait for transmiting a packet again*/
#define Tx_delay_s 9.5 /*delay between transmitions expressed in seconds*/
/*Packet information*/
#define PAYLOAD_FIRST_TX 10 /*bytes to send into first packet*/
#define Tx_and_ACK_RX_timeout 6000 /*6000 for SF12,4000 for SF11,3000 for SF11, 2000 for SF9/8/, 1500 for SF7. All examples consering 50 bytes payload and BW125*/
/*Buffers used to send*/
unsigned char buffer_binary[128] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
char buffer_char[50] = "I am sending this message to a LoRa Gateway."; /**/
/*******************************************************************/
/*Set up the LoRa module with the desired configuration */
void LoRa_setup(void) {
lora.setDeviceMode(LWOTAA); /*LWOTAA or LWABP. We use LWOTAA in this example*/
lora.setDataRate((_data_rate_t)LoRa_DR, (_physical_type_t)LoRa_FREQ_standard);
lora.setKey(NULL, NULL, LoRa_APPKEY); /*Only App key is seeted when using OOTA*/
lora.setClassType((_class_type_t)LoRa_DEVICE_CLASS); /*set device class*/
lora.setPort(LoRa_PORT_BYTES); /*set the default port for transmiting data*/
lora.setPower(LoRa_POWER); /*sets the Tx power*/
lora.setChannel(LoRa_CHANNEL); /*selects the channel*/
lora.setAdaptiveDataRate(LoRa_ADR_FLAG); /*Enables adaptative data rate*/
}

void setup() {
serialLog.begin(9600);
while (!serialLog)
; // Wait until Serial is ready
lora.init(TXPin, RXPin);
/*set up device. You must set up all your parameters BEFORE Joining.
If you make any change (outside channel or port setup), you should join again the network for proper working*/
LoRa_setup();
/*Enters in a while Loop until the join process is completed*/
serialLog.println("Waiting to join the network...");
while (lora.setOTAAJoin(JOIN, 10000) == 0)
; // will attempt to join network until the ends of time. https://www.thethingsnetwork.org/docs/lorawan/message-types/
/*POWER DOWN the LoRa module until next Tx (Transmition) cicle*/
lora.setDeviceLowPower();
serialLog.println("Joining network successful!");
}

void loop() {

/*Wake Up the LoRa module*/
lora.setDeviceWakeUp(); /*if the module is not in sleep state, this command does nothing*/

/*-----------sending a string message*/
lora.setPort(LoRa_PORT_STRING); /*set port configured in reception Gateway for expecting Strings*/
lora.transferPacketWithConfirmed(buffer_char, Tx_and_ACK_RX_timeout);
/*--------sending bytes message*/
lora.setPort(LoRa_PORT_BYTES); /*set port configured in reception Gateway for expecting bytes*/
lora.transferPacketWithConfirmed(buffer_binary, PAYLOAD_FIRST_TX, Tx_and_ACK_RX_timeout);

/*POWER DOWN the LoRa module until next Tx Transmition (Tx) cicle*/
lora.setDeviceLowPower();
delay((unsigned int)(Tx_delay_s*1000));/*Convert the value in seconds to miliseconds*/
}

Construyamos y flasheémoslo a la placa.

Ahora podemos ver que aparece el mensaje, y podemos ver que hay dos mensajes ahí:

es fácil entender los datos 00010203040506070809, que provienen del array buffer_binary.

también aparecen datos: SSBhbSBzZW5kaW5nIHRoaXMgbWVzc2FnZSB0byBhIExvUmEgR2F0ZXdheS4=, ¿qué significa eso? ya que el paquete está codificado en base64. podemos utilizar el decodificador base64 para ver la cadena.

Sí, proviene del array buffer_char: I am sending this message to a LoRa Gateway.

Solución de problemas

P1: Problema con la librería Grove_LED_Bar

Si estás experimentando problemas con la librería Grove_LED_Bar, añade las siguientes definiciones de macro al inicio del archivo Grove_LED_Bar.cpp:

#include "Grove_LED_Bar.h"
// Add these macros to resolve conflicts
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))

Este código define las macros max y min, que pueden ayudar a solucionar errores de compilación relacionados con estas funciones en la biblioteca.

Recursos

Biblioteca LoRaE5

Hay varias bibliotecas disponibles para el módulo Wio E5:

Soporte Técnico y Discusión de Productos

¡Gracias por elegir nuestros productos! Estamos aquí para brindarle diferentes tipos de soporte para asegurar que su experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para satisfacer diferentes preferencias y necesidades.

Loading Comments...