Cómo trabajar con LoRaWAN y un controlador PLC

Utilizar un PLC Arduino para trabajar con la comunicación LoRaWAN
12 de febrero de 2024 por
Cómo trabajar con LoRaWAN y un controlador PLC
Boot & Work Corp. S.L., Queralt del Águila Munté

Contenido

Introducción

LoRaWAN es una especificación de red inalámbrica a largo plazo y de baja potencia, (LPWAN), basada en la modulación LoRa que puede lograr comunicaciones de hasta 20 Km. en condiciones favorables. Se trata de un MAC (Media Access Control) que se utiliza para conectar diferentes dispositivos LoRa y proporcionar autenticación a través de las conexiones siguiendo protocolos estándar. Si desea saber más sobre LoRa y LoRaWAN consulte los blogs de Enlaces Relacionados.

Al trabajar con LoRaWAN, se requiere una autenticación y una encriptación de los datos. Además, antes de que puedas comunicarte con los dispositivos, tendrás que añadir una aplicación y una puerta de enlace a una red y registrar los dispositivos en ella. Necesitarás una clave de sesión de la red y una clave de sesión de la aplicación para cifrar los datos. Hay dos métodos posibles que el dispositivo puede utilizar para obtener estas claves, activando la conexión con OTAA o ABP. A continuación te mostramos cómo trabajar con ambas configuraciones, así como sus ventajas y desventajas. Desde Industrial Shields, te proporcionamos algunos ejemplos con los que trabajar con los PLCs industriales para la automatización.

Requisitos

Links relacionados

OTAA y ABP

¿Qué es OTAA?

Over-The-Air Activation (OTAA) es un método de autenticación en el que la clave de sesión de red y la clave de sesión de aplicación se generan en cada nueva conexión. Cuando se conecta a través de una solicitud de unión, un dispositivo recibe un Appeui, un Deveui y la AppKey que se utilizará para generar la clave de sesión de red y la clave de sesión de aplicación. 

En el método OTAA las claves se generan en cada nueva conexión, lo que lo hace más seguro, ya que las claves también se borran cuando finaliza la conexión. Además, el dispositivo puede cambiarse fácilmente a una nueva red y las claves no pueden interceptarse tan fácilmente. Sin embargo, el dispositivo puede almacenar las claves y decidir cuándo es necesaria una solicitud de conexión.

¿Qué es ABP?

La activación por personalización (ABP) es un método de autenticación en el que la clave de sesión de red y la clave de sesión de aplicación se programan por defecto en el dispositivo. Como las claves están preprogramadas, no es necesario establecer una conexión de unión cada vez que se requiere una nueva conexión.

Tener las claves preprogramadas reduce el tiempo de conexión, ya que al conectarse al servidor es necesario realizar cualquier solicitud de unión. Sin embargo, el método no puede repetir las claves y debe asegurarse de que son únicas. No obstante, las claves pueden descubrirse fácilmente incluso antes de que se establezca la conexión. 

¿Cómo programarlo?

Para probar la LoRaWAN trabajaremos con The Things Network, así que usaremos una de sus puertas de enlace para realizar la conexión. Asegúrate de tener una cuenta y haber establecido la configuración previa de la aplicación y la pasarela. Por aplicaciones, nos referimos a lo que sea con lo que tus dispositivos se comunican en internet.

En este ejemplo básico, enviaremos al servidor por nuestra pasarela algunos datos cada 60 segundos. Nos servirá para introducir la comunicación LoRaWAN y ver cómo funcionan las conexiones.

En primer lugar, Arduino IDE debe haber sido descargado e instalado con nuestras placas Industrial Shields. A continuación, elija la placa M-Duino Family y el modelo con el que está trabajando. Nosotros usaremos una M-Duino LoRa 21+. Si no es así, configúrala antes de pasar al siguiente paso siguiendo nuestro tutorial.

Después de configurar todo lo anterior, abra el MCCI LoRaWAN LMIC y elija ttn-otaa o ttn-abp en función de la activación con la que desee trabajar.

Ambas configuraciones tienen un código similar pero con diferencias importantes. Asegúrate de saber con cuál vas a trabajar ya que se necesitan claves diferentes y sería imposible trabajar de otra forma. Las diferencias aparecerán en las primeras líneas del código donde se declaran las definiciones. Consulte las secciones del final saber qué parámetros deben modificarse para trabajar con OTAA o ABP.

How to work with LoRaWAN and a PLC controller

En las siguientes líneas se puede ver cómo establecer los datos que se enviarán y el intervalo de tiempo en segundos que el dispositivo enviará los paquetes. Por defecto, enviará la cadena "¡Hola, mundo!" cada minuto. 

Es importante configurar correctamente los pines del Arduino. En nuestro controlador lógico programable Arduino industrial, utilizaremos el pin 12 para el Chip Select y el pin 13 para el Reset *. La librería LoRa adoptada por Industrial Shields no utiliza los pines RXTX y DIO ya que las comprobaciones de recepción y transmisión se realizan internamente leyendo los registros de los pines y enviando los datos vía ModBus.  

(*IEn el caso de la Familia Ardbox LoRa, utilizaremos el pin 23 para el Chip Select y el pin 3 para el Reset. Cuidado con la configuración de interrupciones usando LoRa). 

Configure estos parámetros con las siguientes líneas:

static uint8_t mydata[] = "Hello, world!";
static osjob_t sendjob;
// Schedule TX every this many seconds (might become longer due to duty
// cycle limitations).
const unsigned TX_INTERVAL = 60;
// Pin mapping
const lmic_pinmap lmic_pins = {
.nss = 12,
.rxtx = LMIC_UNUSED_PIN,
.rst = 13,
.dio = {LMIC_UNUSED_PIN, LMIC_UNUSED_PIN, LMIC_UNUSED_PIN},
};
In both examples, the void function onEvent(ev_t ev) can be called for debugging if it is wished. However, in this example, we will not be using this function. For more detail check the library readme.

void do_send(osjob_t* j){
// Check if there is not a current TX/RX job running
if (LMIC.opmode & OP_TXRXPEND) {
Serial.println(F("OP_TXRXPEND, not sending"));
} else {
// Prepare upstream data transmission at the next possible time.
LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);
Serial.println(F("Packet queued"));
}
// Next TX is scheduled after TX_COMPLETE event.
}
En la función de configuración, inicializaremos el serial para poder imprimir mensajes en el Monitor Serial y todas las configuraciones para la comunicación LoRa. Por defecto, solo se usan tres canales base de la especificación LoRaWAN, que han sido configurados por The Things Network. Si solo trabajas con un dispositivo LoRa, la configuración por defecto no puede ser cambiada, sin embargo añadir más canales es recomendable ya que la red funcionará mejor. Para añadirlos añada las siguientes líneas (esto está configurado para los estándares de Europa, vea la especificación de la librería para otras regiones):

#if defined(CFG_eu868)
LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI); // g-band
LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK, DR_FSK), BAND_MILLI); // g2-band
#else
# error Region not supported
#endif

Finalmente, el os_runloop_once() debe ser llamado en la función loop() para comprobar y actualizar constantemente la comunicación LoRaWAN. Otras opciones de depuración como el parpadeo de los LEDs pueden ser implementadas para una opción de depuración más visual.

void loop() {
    unsigned long now;
    now = millis();
    if ((now & 512) != 0) digitalWrite(13, HIGH);
    else digitalWrite(13, LOW);
    os_runloop_once();
}


The Things Network

Ejemplos de OTTA

Si se trabaja con el ejemplo OTAA, las claves para AppEui, DevEui y AppKey deben ser pasadas. Esos parámetros son privados y deben ser obtenidos a través de la cuenta personal de The Things Network.
Recuerde que AppEui y DevEui deben pasarse en formato little-endian (primero el byte menos significativo) mientras que AppKey debe pasarse en formato big-endian. Póngalos en las siguientes líneas sustituyendo el texto FILLME:

static const u1_t PROGMEM APPEUI[8]={ FILLMEIN };
static const u1_t PROGMEM DEVEUI[8]={ FILLMEIN };
static const u1_t PROGMEM APPKEY[16] = { FILLMEIN };
Cómo trabajar con LoRaWAN y un controlador PLC

Ejemplos de ABP

Si trabaja con el ejemplo ABP, las claves para DevAddr, NetwKey y AppKey deben ser pasadas. Esos parámetros son privados y deben ser obtenidos a través de la cuenta personal de The Things Network. Recuerda que NetKey y AppKey deben ser pasadas en formato big-endian. Ponlas en las siguientes líneas reemplazando el texto FILLME:

static const PROGMEM u1_t NWKSKEY[16] = { FILLMEIN };
static const u1_t PROGMEM APPSKEY[16] = { FILLMEIN };
static const u4_t DEVADDR = FILLMEIN ;

Configuración del dispositivo

Para configurar esta aplicación, necesitas registrarte gratuitamente en The Things Network. Este registro permitirá la comunicación con tu dispositivo usando LoRaWAN. Antes que nada, es importante entender la aplicación. Sigue estos pasos:

  1. Crea una aplicación y elige un nombre para ella. Este paso es sencillo; puedes inventar el nombre que quieras.
  2. Registre un dispositivo haciendo clic en "+Registrar dispositivo final".
  3. Elija la opción manual: "Introducir manualmente las especificaciones del dispositivo final".
  4. Seleccione las siguientes opciones:
    • Plan de frecuencias: "Europa 863-870MHz (SF9 para RX2 - recomendado)"
    • Versión de LoRaWAN: Elige "LoRaWAN 1.0.1" o "LoRaWAN 1.0.2".
    • Versión de Parámetros Regionales: Para 1.0.1, no hay parámetros; para 1.0.2, elija "RP001 Parámetros Regionales 1.0.2".
  5. Introduzca una JoinEUI, que es la misma que la AppEUI. Póngase en contacto con el fabricante para obtener la JoinEUI. Si no está disponible, se acepta el uso de todos los ceros.
  6. Confirme la configuración y genere los parámetros DevEUI y AppKey.

Una vez completados estos pasos, su dispositivo estará completamente creado. Además, puede especificar la ubicación del dispositivo y dar formato a la carga útil.

Una forma recomendada de dar formato a la carga útil, especialmente cuando se utiliza la biblioteca LMIC o el ejemplo OTAA, es seleccionar el formateador JavaScript personalizado e insertar el siguiente código:


function decodeUplink(input) {
  if (input.bytes && input.bytes.length > 0) {
    const decodedChars = [];

    for (let i = 0; i < input.bytes.length; i++) {
      const charValue = String.fromCharCode(input.bytes[i]);
      decodedChars.push(charValue);
    }

    return {
      data: {
        decodedChars: decodedChars.join('')
      },
      warnings: [],
      errors: []
    };
  } else {
    return {
      data: {},
      warnings: ["No bytes in the input"],
      errors: []
    };
  }
}


Ahora puedes empezar a explorar y comunicarte con tu dispositivo físico usando LoRaWAN. Sin embargo, esta configuración funciona con un dispositivo M-duino y el código de ejemplo proporcionado por nuestra biblioteca LMIC. Si algo va mal puedes cambiar los parámetros y configuraciones o simplemente registrar un nuevo dispositivo.

Verificación

Para saber si la conexión ha ido bien, entra en The Things Network y comprueba si algún mensaje ha atravesado la pasarela y ha llegado al servidor. Asegúrate de que la trama está a 0 ya que si no, podría provocar un error.

Buscar en nuestro blog

Cómo trabajar con LoRaWAN y un controlador PLC
Boot & Work Corp. S.L., Queralt del Águila Munté 12 de febrero de 2024
Compartir

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


Industrial PLC comparison >>>