Ir al contenido

Cómo utilizar 4G con un ESP32 PLC

SIM, ajustes del Arduino IDE y dos sketches, HTTP y MQTT, para la placa u-blox LTE-M y NB-IoT
5 de septiembre de 2024 por
Cómo utilizar 4G con un ESP32 PLC
Boot & Work Corp. S.L, Joan Bello

Para usar 4G en un ESP32 PLC necesitas la placa de comunicación 4G (M1)-NB1 IoT LTE (u-blox SARA-R412M), una SIM con tarifa de datos LTE-M o NB-IoT y una antena. En el Arduino IDE, selecciona tu modelo de ESP32 PLC y pon Tools > Extension module 1 en LTE para LTE-M o en NB para NB-IoT. La librería NB del paquete de placas de Industrial Shields registra el módem en la red, y su NBClient funciona con ArduinoHttpClient para HTTP y con PubSubClient para MQTT.

Esta guía explica cómo insertar la tarjeta SIM, qué opciones elegir en los menús y dos sketches: una petición HTTP y un cliente MQTT que publica y se suscribe. Se ha comprobado la sintaxis de los dos, pero no se han compilado ni probado en un PLC, así que compílalos y pruébalos en tu propio ESP32 PLC antes de usarlos. Al final hay una tabla para encontrar la causa cuando el PLC no se conecta.

  1. Paso 1Placa y SIMPlaca 4G en la ranura 1, SIM LTE-M o NB-IoT, antena
  2. Paso 2Arduino IDEModelo, versión v3 y Extension module
  3. Paso 3Conectarbegin() con PIN y APN, después attachGPRS()
  4. Paso 4Enviar datosHTTP o MQTT sobre NBClient

Por qué usar 4G en un ESP32 PLC

El ESP32 PLC ya tiene Wi-Fi, Bluetooth y Ethernet. Necesitan una red local. Una placa 4G permite al PLC enviar datos desde lugares sin ella: estaciones de bombeo, pozos, vehículos, vagones de tren o máquinas en casa de un cliente donde no puedes usar la red de la planta. LTE-M y NB-IoT son las tecnologías 4G pensadas para este tipo de equipos: poco volumen de datos, bajo consumo y buena cobertura.

Un enlace móvil pierde la cobertura de vez en cuando. Tenlo en cuenta desde el principio: guarda los datos en el PLC mientras el enlace está caído y envíalos cuando vuelva.

Hardware necesario

  • Un ESP32 PLC con la placa de comunicación 4G (M1)-NB1 IoT LTE (u-blox). En la página del producto, elígela como placa de comunicación 1. La placa lleva un módulo u-blox SARA-R412M.
  • Una tarjeta SIM con tarifa de datos para LTE-M (LTE Cat M1) o NB-IoT. Pregunta a tu operador cuál ofrece en tu zona y qué APN usar.
  • Una antena LTE conectada a la placa 4G.
  • Un ordenador con el Arduino IDE y el paquete de placas de Industrial Shields. Consulta Cómo instalar las placas de Industrial Shields en el Arduino IDE.

¿Qué placa 4G? La librería NB del paquete de placas funciona con los módulos u-blox SARA-R412M y SARA-R422M8S: lee el modelo del módem y se detiene con un error si es otro. Esta guía es para la placa 4G (M1)-NB1 IoT LTE (u-blox). Si tu PLC lleva una placa Quectel o LTE Cat 4, pregunta a nuestro equipo técnico qué librería usar. El ESP32 PLC 14 se puede pedir con el 4G integrado: consulta Enviar mensajes por SMS o Telegram con un ESP32 PLC 14.

Insertar la tarjeta SIM en el ESP32 PLC

Desconecta la alimentación antes de abrir la tapa.

  1. Quita la tapa del puerto Ethernet. Mete un dedo en el puerto Ethernet y empuja hacia arriba para levantar la tapa, o levántala con cuidado por un lado con un destornillador plano.
  2. Inserta la tarjeta SIM. La ranura de la SIM está encima del botón de reset. Inserta la tarjeta con los contactos hacia arriba.
  3. Vuelve a poner la tapa. Presiónala hasta que encaje con un clic.
Frontal de un ESP32 PLC V3 con la tapa del puerto Ethernet puesta y un destornillador plano para levantarla
El frontal del ESP32 PLC con la tapa del puerto Ethernet puesta.
ESP32 PLC sin la tapa del puerto Ethernet, con el interior donde la ranura de la SIM está encima del botón de reset
Sin la tapa, la ranura de la SIM queda encima del botón de reset.

Configurar el Arduino IDE para la placa 4G

La placa 4G es opcional, así que tienes que indicar al IDE dónde está. Estas opciones están en el menú Tools:

MenúValorNota
BoardIndustrial Shields ESP32 Boards > ESP32 PLC FamilySe instala con el paquete de placas
ModelTu modelo, por ejemplo ESP32 PLC 21 IO+Define el mapa de E/S del PLC
Versionv3Las opciones NB y LTE solo existen para v3. v1 es la versión antigua
Extension module 1LTE para LTE-M, o NB para NB-IoTUsa Extension module 2 si la placa está en la ranura 2

La opción que eliges en Extension module decide la tecnología de radio. Con LTE, la librería pone el módem en LTE Cat M1 (AT+URAT=7). Con NB, en NB-IoT (AT+URAT=8). Si la SIM solo funciona en LTE-M y eliges NB, el PLC nunca se registra. La opción GPRS es para la placa GPRS de 2G, no para la placa 4G.

Si no hay ningún módulo seleccionado, el sketch no compila y muestra: No NB expansion module has been defined. Please select one in Tools -> Extension module.

La librería NB viene con el paquete de placas. Sus ejemplos están en File > Examples > NB: NBWebClient, NBSSLWebClient, SendSMS, ReceiveSMS y, dentro de Tools, TestModem, TestGPRS y NBScanNetworks. Para los sketches de abajo, instala también dos librerías desde Sketch > Include Library > Manage Libraries:

  • ArduinoHttpClient, para HTTP.
  • PubSubClient, para MQTT.

Ejemplo 1: enviar una petición HTTP por 4G

El sketch se registra en la red móvil, abre la conexión de datos y envía una petición GET a httpbin.org, un servicio público de pruebas que responde con la petición que recibe. Rellena el PIN y el APN de tu SIM. Deja el PIN vacío si la SIM no tiene PIN.

#include <NB.h>
#include <ArduinoHttpClient.h>

// Uncomment once if the modem does not answer: it finds the baud rate and sets it to 38400
// #define MAKE_AUTOBAUD

const char PINNUMBER[] = "";  // SIM PIN, empty if the SIM has no PIN
const char APN[]       = "";  // APN of your operator
const char USERNAME[]  = "";  // only if the operator asks for it
const char PASSWORD[]  = "";

NBClient nbClient;
GPRS gprs;
NB nbAccess;  // NB nbAccess(true); prints every AT command on the serial monitor

const char server[] = "httpbin.org";
const int port = 80;
HttpClient http(nbClient, server, port);

void setup() {
  Serial.begin(115200);
  Serial.println("Starting the 4G web client");

#ifdef MAKE_AUTOBAUD
  if (!nbAccess.autobaud()) {
    Serial.println("Autobaud failed, check the Extension module setting");
    while (true);
  }
  nbAccess.shutdown();
#endif

  // Register on the LTE-M or NB-IoT network and open the data connection
  while (nbAccess.begin(PINNUMBER, APN, USERNAME, PASSWORD) != NB_READY ||
         gprs.attachGPRS() != GPRS_READY) {
    Serial.println("Not connected, retrying");
    delay(1000);
  }
  Serial.println("Connected to the mobile network");

  int err = http.get("/get");
  if (err != 0) {
    Serial.print("Request failed, error ");
    Serial.println(err);
    return;
  }
  int status = http.responseStatusCode();
  String body = http.responseBody();
  Serial.print("HTTP status: ");
  Serial.println(status);
  Serial.println(body);
  http.stop();
}

void loop() {
}

Cómo funciona:

  • nbAccess.begin(PIN, APN, USERNAME, PASSWORD) arranca el módem, aplica la configuración y espera a que se registre en la red. Devuelve NB_READY.
  • gprs.attachGPRS() abre la conexión de datos y devuelve GPRS_READY. El nombre viene de la librería Arduino MKR NB en la que se basa: la conexión usa LTE-M o NB-IoT, no 2G.
  • NBClient es un Client estándar de Arduino, así que HttpClient lo usa igual que un cliente Ethernet o Wi-Fi.
  • http.get() devuelve 0 cuando la petición se ha enviado. responseStatusCode() da el código HTTP (200 si todo va bien) y responseBody() la respuesta.

Abre el monitor serie a 115200 baudios. El registro tarda como mínimo 24 segundos, porque la librería reinicia el módem y su radio, y puede tardar unos minutos la primera vez, mientras el módem busca la red.

Ejemplo 2: publicar y suscribirse con MQTT por 4G

MQTT envía mensajes pequeños a través de un broker. Gasta pocos datos, así que encaja con LTE-M y NB-IoT. Este sketch se conecta a un broker público de pruebas, publica un mensaje, se suscribe al mismo topic e imprime cada mensaje que recibe.

#include <NB.h>
#include <PubSubClient.h>

const char PINNUMBER[] = "";  // SIM PIN, empty if the SIM has no PIN
const char APN[]       = "";  // APN of your operator
const char USERNAME[]  = "";
const char PASSWORD[]  = "";

NBClient nbClient;
GPRS gprs;
NB nbAccess;
PubSubClient mqtt(nbClient);

const char* MQTT_SERVER = "broker.hivemq.com";  // public test broker: no login, no TLS
const int   MQTT_PORT   = 1883;
const char* TOPIC       = "test/esp32plc-4g";
const char* CLIENT_ID   = "esp32plc-4g-0001";   // must be unique on the broker

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message on ");
  Serial.print(topic);
  Serial.print(": ");
  for (unsigned int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void connectNetwork() {
  while (nbAccess.begin(PINNUMBER, APN, USERNAME, PASSWORD) != NB_READY ||
         gprs.attachGPRS() != GPRS_READY) {
    Serial.println("Not connected, retrying");
    delay(1000);
  }
  Serial.println("Connected to the mobile network");
}

void connectMqtt() {
  Serial.print("Connecting to the MQTT broker... ");
  if (mqtt.connect(CLIENT_ID)) {
    Serial.println("connected");
    mqtt.publish(TOPIC, "Hello from the ESP32 PLC over 4G");
    mqtt.subscribe(TOPIC);
  } else {
    Serial.print("failed, state ");
    Serial.println(mqtt.state());
    delay(5000);
  }
}

void setup() {
  Serial.begin(115200);
  connectNetwork();
  mqtt.setServer(MQTT_SERVER, MQTT_PORT);
  mqtt.setCallback(callback);
}

void loop() {
  if (!mqtt.connected()) {
    if (!nbAccess.isAccessAlive()) {
      connectNetwork();  // registration lost: attach again
    }
    connectMqtt();
  }
  mqtt.loop();
}

Cómo funciona:

  • connectNetwork() se registra en la red y abre la conexión de datos, como en el ejemplo 1.
  • connectMqtt() hace un intento de conexión. Si falla, imprime el código de error y espera 5 segundos.
  • En loop(), si MQTT está desconectado, isAccessAlive() comprueba el registro con AT+CEREG?. Si el PLC ha perdido la red, vuelve a conectarse antes de reconectar con el broker.
  • mqtt.loop() mantiene viva la conexión y llama a callback() por cada mensaje que llega.

El client ID tiene que ser único en el broker: si dos equipos usan el mismo, el broker desconecta el primero. broker.hivemq.com es un broker público de pruebas sin usuario ni cifrado, así que cualquiera puede leer el topic. En una instalación real, usa tu propio broker con usuario, contraseña y TLS. Consulta MQTT sobre TLS con el ESP32 PLC y fundamentos de seguridad en MQTT.

El delay(5000) y los bucles de reintento bloquean el programa. Para una prueba no importa. En un PLC que también controla salidas, reconecta sin bloquear, como en la reconexión sin bloqueo en un ESP32 PLC.

LTE-M o NB-IoT: cuál elegir

LTE-M (LTE Cat M1)NB-IoT
Opción de Extension moduleLTENB
Velocidad de datosCientos de kbit/sDecenas de kbit/s
Equipos en movimientoSí, cambia de celda sin cortar la conexiónMejor para equipos fijos
Encaja conMQTT y HTTP con mensajes frecuentes, descargas de firmware, vehículosMensajes pequeños unas pocas veces por hora, instalaciones fijas, cobertura en interiores profundos

Las dos dependen del operador: comprueba que tu SIM y tu zona tienen la que eliges. La librería también aplica el perfil de operador Standard Europe del módem y las bandas LTE 3, 8 y 20, que son las habituales para LTE-M y NB-IoT en Europa. Si tu operador usa otras bandas, consulta a nuestro equipo técnico antes de instalar.

Diagnóstico de la conexión 4G

Qué vesCausa probableQué hacer
Error de compilación: No NB expansion module has been definedExtension module está en NonePon Tools > Extension module 1 (o 2) en LTE o NB
El módem no responde, begin() devuelve un error enseguidaEl módem usa otra velocidad en baudiosDescomenta #define MAKE_AUTOBAUD y carga el sketch una vez. La librería prueba varias velocidades y deja el módem a 38400. Después vuelve a comentarlo
"Not connected, retrying" sin finTecnología equivocada (NB o LTE), APN o PIN incorrectos, sin antena, sin cobertura o la SIM no tiene LTE-M ni NB-IoTRevisa la opción del menú, el APN y la antena. Ejecuta los ejemplos NBScanNetworks y TestGPRS
Necesitas ver qué dice el módemCrea el objeto como NB nbAccess(true);: cada comando AT y su respuesta salen por el monitor serie
MQTT state -2Ha fallado la conexión TCP con el brokerRevisa el nombre del servidor, el puerto y la conexión de datos
MQTT state -4 o -3Tiempo agotado o conexión perdida, a menudo por poca coberturaRevisa la antena y la señal, y guarda los datos en el PLC hasta que se reconecte
MQTT state 2, 4 o 5El broker rechaza el client ID, el usuario y la contraseña, o el accesoUsa un client ID único y las credenciales del broker

De un sketch de prueba a la telemetría remota

Una instalación de campo añade tres cosas a estos ejemplos: un búfer para los datos mientras no hay cobertura, marcas de tiempo y un servidor que recibe los mensajes de muchos PLC. El caso ferroviario de abajo envía datos de energía por 4G LTE-M y los guarda a bordo cuando el tren no tiene cobertura. El caso del pozo de petróleo muestra el mismo patrón desde una instalación remota, con un ESP32 PLC 21 FLEX y una placa 4G. Para recoger los mensajes de muchos PLC, consulta el concentrador MQTT en Node-RED para flotas de ESP32 PLC.

Llévalo a la práctica

Un enlace 4G se cae y vuelve. Mira cómo gestiona la cobertura un proyecto real, un simulador donde cortas el enlace y el código que conserva los datos.

Preguntas frecuentes sobre 4G en el ESP32 PLC

¿Qué tarjeta SIM necesito para la placa 4G del ESP32 PLC?

Una SIM con tarifa de datos para LTE-M o NB-IoT, de un operador que lo ofrezca en tu zona. Muchas SIM IoT incluyen las dos. Una SIM solo de 2G no funciona con esta placa, porque la librería pone el módem en LTE-M o NB-IoT.

¿Por qué el código usa una clase llamada GPRS en una placa 4G?

La librería NB se basa en la librería Arduino MKR NB, que mantiene el nombre GPRS para la conexión de datos. attachGPRS() abre la conexión de datos por LTE-M o NB-IoT.

¿Puedo usar HTTPS o MQTT con TLS por 4G?

Sí. La librería NB incluye NBSSLClient, con el ejemplo NBSSLWebClient. Para MQTT con TLS en el ESP32 PLC, consulta esta guía.

¿La placa 4G puede enviar SMS?

Sí. La librería incluye los ejemplos SendSMS y ReceiveSMS, en File > Examples > NB.

¿Qué pasa con los datos cuando el PLC pierde la cobertura?

Los ejemplos de arriba no los guardan. En un proyecto real, escribe primero cada mensaje en la tarjeta SD o en memoria y envíalo cuando vuelva el enlace. Consulta el datalogging MQTT offline-first con búfer en SD.

Buscar en nuestro blog

Cómo utilizar 4G con un ESP32 PLC
Boot & Work Corp. S.L, Joan Bello 5 de septiembre de 2024
Compartir esta publicación
Etiquetas

¿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.

Comparativa de PLCs