Guía completa: Cómo elegir un controlador industrial
El ESP32 es un microcontrolador de 32 bits de Espressif con Wi-Fi de 2,4 GHz (802.11 b/g/n, hasta 150 Mbps) y Bluetooth v4.2 (Classic BR/EDR y Bluetooth LE) en el mismo chip, 520 KB de SRAM y hasta 240 MHz. En un ESP32 PLC de Industrial Shields la radio va integrada, así que el mismo controlador que lee las entradas puede enviar datos por Wi-Fi o intercambiar valores con un móvil por BLE, sin ningún módulo externo. Las dos radios se programan en el IDE de Arduino con las librerías WiFi y BLE del core ESP32.
Esta guía da las cifras del datasheet que importan en un proyecto con PLC, muestra cómo encaja la radio en el ESP32 PLC e incluye dos ejemplos de Arduino: un escaneo Wi-Fi y una escritura BLE desde un móvil. La última sección explica el método antiguo: una placa ESP32 conectada a un M-Duino o a un Ardbox por una línea serie.
Características Wi-Fi y Bluetooth del ESP32
Estas cifras salen del ESP32 Series Datasheet (versión 5.3):
| Característica | Chip ESP32 |
|---|---|
| CPU | Xtensa LX6, de uno o dos núcleos, 32 bits, hasta 240 MHz |
| Memoria | 448 KB de ROM, 520 KB de SRAM, 16 KB de SRAM en el RTC |
| Wi-Fi | 802.11 b/g/n, solo 2,4 GHz, hasta 150 Mbps con 802.11n |
| Modos Wi-Fi | Estación, SoftAP (punto de acceso) y promiscuo, a la vez |
| Bluetooth | v4.2 BR/EDR (Classic) y Bluetooth LE |
| Radio Bluetooth | Potencia de transmisión de +9 dBm, sensibilidad Bluetooth LE de -94 dBm |
| Periféricos | 34 GPIO, ADC de 12 bits con hasta 18 canales, dos DAC de 8 bits, 10 sensores táctiles, 4 SPI, 2 I2S, 2 I2C, 3 UART, TWAI (CAN 2.0), LED PWM con hasta 16 canales |
| Seguridad | Arranque seguro, cifrado de la flash, OTP de 1024 bits (hasta 768 bits para el usuario), AES, SHA-2 y RSA por hardware y un generador de números aleatorios |
En un proyecto industrial importan dos límites. La radio solo funciona en la banda de 2,4 GHz, así que no puede conectarse a una red de 5 GHz. Y el Wi-Fi y el Bluetooth comparten la misma radio y la misma antena: cuando los dos están activos, el chip reparte el tiempo de aire entre ellos (coexistencia) y cada uno tiene menos caudal.
El ESP32 dentro de un PLC industrial
La familia ESP32 PLC de Industrial Shields pone el ESP32 en un controlador para carril DIN con entradas y salidas industriales. La radio no necesita ningún hardware adicional. Según las fichas de producto del ESP32 PLC 14 y del 21:
| Elemento | ESP32 PLC |
|---|---|
| Procesador | ESP32 de doble núcleo, hasta 240 MHz, 16 MB de flash, 520 KB de SRAM |
| Inalámbrico | Wi-Fi de 2,4 GHz y Bluetooth LE, integrados |
| Por cable | Ethernet 10/100 Mbit, RS-485 e I2C; el ESP32 PLC 21 añade RS-232 y SPI |
| Modelos | ESP32 PLC 14, 19R, 21, 38AR, 38R, 42, 57R y 58 |
| Opciones | Las versiones FLEX del ESP32 PLC 14 y del 21 admiten una placa: LoRa, 4G LTE-M/NB-IoT o CAN. El 14 FLEX también ofrece una placa RTC |
| Alimentación y montaje | De 12 a 24 Vdc, carril DIN, IP20, dentro de un armario |
| Programación | IDE de Arduino con el paquete de placas ESP32 de Industrial Shields |
Usos habituales de la radio en una máquina o una planta: enviar valores a un broker MQTT o a una base de datos por Wi-Fi cuando no hay cable de red, dar a un técnico una pantalla en el móvil por BLE para leer valores y cambiar ajustes, o dejar Ethernet para la red de planta y usar el Wi-Fi como enlace de servicio.
El M-Duino y el Ardbox usan un Arduino Mega y un Arduino Leonardo, que no tienen radio. En esos PLC una placa ESP32 externa puede añadir Wi-Fi o Bluetooth, como se ve al final de esta guía.
Cómo programar la radio del ESP32 en el IDE de Arduino
- Instala las placas de Industrial Shields en el IDE de Arduino y elige la familia ESP32 PLC y tu modelo.
- Incluye la librería que necesites:
WiFi.hpara el Wi-Fi,BLEDevice.hpara Bluetooth LE oBluetoothSerial.hpara un enlace serie por Bluetooth Classic. - Abre el monitor serie a 115200 baudios para leer la salida de los ejemplos de abajo.
El paquete ESP32 de Industrial Shields (versión 2.7.1) se basa en la versión 2 del core ESP32 para Arduino. En esa versión, getValue() de una característica BLE devuelve un std::string. En la versión 3 del core devuelve un String de Arduino.
Ejemplo 1: escanear las redes Wi-Fi
Antes de instalar un PLC en un armario, comprueba qué redes ve y con qué intensidad. Este sketch lista las redes cada 5 segundos con su RSSI (intensidad de la señal recibida, en dBm) y su canal:
// Wi-Fi scan on an Industrial Shields ESP32 PLC
// Lists the 2.4 GHz networks the PLC can see, with signal strength and channel
#include <WiFi.h>
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA); // station mode: the PLC joins networks, it does not create one
WiFi.disconnect(); // make sure it is not connected to an access point
delay(100);
Serial.println("Scan ready");
}
void loop() {
unsigned long start = millis();
int n = WiFi.scanNetworks(); // blocking scan, about 2 to 3 s
Serial.print("Scan time (ms): ");
Serial.println(millis() - start);
if (n <= 0) {
Serial.println("No networks found");
} else {
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; i++) {
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" RSSI ");
Serial.print(WiFi.RSSI(i)); // dBm, closer to 0 is stronger
Serial.print(" dBm channel ");
Serial.print(WiFi.channel(i));
Serial.println(WiFi.encryptionType(i) == WIFI_AUTH_OPEN ? " open" : " encrypted");
}
}
WiFi.scanDelete(); // free the memory of the results
Serial.println();
delay(5000);
}
El RSSI es negativo, y cuanto más cerca de 0, más fuerte es la señal. Un armario metálico debilita la señal, así que haz el escaneo con la puerta del armario cerrada.
Ejemplo 2: recibir datos de un móvil por BLE
Bluetooth LE organiza los datos en servicios y características, cada uno identificado por un UUID de 128 bits. Este sketch crea un servicio con una característica. Cuando un móvil escribe en ella, el PLC muestra el texto en el monitor serie:
// BLE write on an Industrial Shields ESP32 PLC
// A phone writes text to a characteristic and the PLC prints it on the serial monitor
// Based on the BLE_write example of the ESP32 Arduino core (Neil Kolban, Evandro Copercini)
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
// Generate your own UUIDs (for example with uuidgen on Linux)
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5b9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
class WriteCallbacks : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue(); // String in ESP32 core 3.x
if (value.length() > 0) {
Serial.print("Received: ");
Serial.println(value.c_str());
}
}
};
void setup() {
Serial.begin(115200);
Serial.println("1. Install a BLE scanner app on your phone");
Serial.println("2. Scan and connect to ESP32-PLC");
Serial.println("3. Write text to the custom characteristic");
BLEDevice::init("ESP32-PLC");
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE);
pCharacteristic->setCallbacks(new WriteCallbacks());
pCharacteristic->setValue("Hello from the PLC");
pService->start();
BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();
}
void loop() {
delay(2000);
}
Para probarlo:
- Instala en el móvil una app de escáner BLE, como nRF Connect.
- Busca dispositivos y conéctate a ESP32-PLC.
- Abre el servicio personalizado, escribe un texto en la característica y envíalo.
- El monitor serie muestra
Received:seguido de tu texto.
En un proyecto real, asocia cada comando a una acción del programa y comprueba su valor antes de actuar. Deja las paradas de emergencia y las demás funciones de seguridad en circuitos cableados, no en un enlace inalámbrico.
Los dos sketches compilan sin avisos en el código del sketch con el paquete ESP32 2.7.1 de Industrial Shields para el ESP32 PLC 21 (solo prueba de compilador del sketch, no una compilación completa con el IDE de Arduino). No los hemos ejecutado en un PLC para este artículo.
Wi-Fi o BLE en un M-Duino o un Ardbox con un ESP32 externo
Un M-Duino o un Ardbox puede recibir datos inalámbricos de una placa de desarrollo ESP32 por una línea serie TTL. La placa ESP32 ejecuta su propio programa, por ejemplo el escaneo Wi-Fi de arriba con Serial2 en lugar de Serial, y el PLC lee lo que recibe.
M-Duino (Arduino Mega)
Conecta el TX2 de la placa ESP32 al RX1 del PLC y el RX2 al TX1, con un GND común. El ESP32 envía por Serial2 y el PLC recibe por Serial1:
// M-Duino: print on the USB serial port what the ESP32 board sends to Serial1
void setup() {
Serial.begin(19200); // USB, serial monitor
Serial1.begin(19200); // TTL serial from the ESP32 board
}
void loop() {
if (Serial1.available()) {
Serial.print((char)Serial1.read());
}
}
Ardbox (Arduino Leonardo)
Los pines 0 y 1 del Ardbox los usa el puerto RS-232, así que este ejemplo usa un puerto serie por software en los pines MISO (RX) y MOSI (TX):
// Ardbox: software serial on MISO (RX) and MOSI (TX), so pins 0 and 1 stay free for RS-232
#include <SoftwareSerial.h>
SoftwareSerial espSerial(MISO, MOSI); // RX, TX
void setup() {
Serial.begin(19200); // USB, serial monitor
espSerial.begin(19200); // TTL serial from the ESP32 board
}
void loop() {
if (espSerial.available()) {
Serial.print((char)espSerial.read());
}
}

Comprueba los niveles lógicos. Los GPIO del ESP32 trabajan a 3,3 V y no toleran 5 V, mientras que los pines serie del M-Duino y del Ardbox trabajan a 5 V. Pon un adaptador de niveles entre el TX del PLC y el RX del ESP32. Los dos programas compilan y enlazan con el paquete AVR 1.2.1 de Industrial Shields para el M-Duino 21+ y el Ardbox Relay; no se han probado en hardware para este artículo.
Este montaje sirve para pruebas. En una máquina, un controlador con la radio dentro, como el ESP32 PLC, evita placas sueltas y cableado extra en el armario.
Preguntas frecuentes sobre el Wi-Fi y el Bluetooth del ESP32
¿El ESP32 admite Wi-Fi de 5 GHz?
No. La radio del ESP32 solo funciona en la banda de 2,4 GHz, con 802.11 b/g/n. Comprueba que el punto de acceso ofrece una red de 2,4 GHz.
¿Puede el ESP32 usar Wi-Fi y Bluetooth a la vez?
Sí. Los dos comparten una radio y una antena, y el chip reparte el tiempo de aire entre ellos. Funciona, pero cada enlace es más lento que cuando trabaja solo.
¿Qué diferencia hay entre Bluetooth Classic y BLE en el ESP32?
Bluetooth Classic (BR/EDR) da un enlace serie continuo, con la librería BluetoothSerial. Bluetooth LE usa servicios y características, consume menos y funciona con las apps de los móviles actuales. Las fichas de producto del ESP32 PLC indican Bluetooth LE.
¿Qué PLC de Industrial Shields llevan Wi-Fi y Bluetooth integrados?
La familia ESP32 PLC, del ESP32 PLC 14 al ESP32 PLC 58. El M-Duino y el Ardbox no tienen radio propia.
¿Puedo controlar las salidas del PLC desde un móvil?
Sí, por BLE. La PLC Solution Library tiene un ejemplo de un ESP32 PLC controlado desde una app móvil. Deja las funciones de seguridad cableadas.
Llévalo a la práctica
El inalámbrico del ESP32 PLC en la práctica: un sistema de puertas por Wi-Fi, control desde un móvil por BLE y una rutina de reconexión para el Wi-Fi de fábrica.
Caso de éxito
Las puertas de la reserva, en Wi-Fi. Un ESP32 PLC abre la barrera.
Cinco puertas de entrada pasan de un viejo sistema cableado RS485 a Wi-Fi, con tickets de código de barras.
Lee el caso de éxito
PLC Solution Library
Controlar un PLC ESP32 industrial desde una app móvil por BLE
El Bluetooth Low Energy del ESP32 convierte el PLC en la HMI: un móvil maneja las válvulas y lee presión y temperatura en vivo.
Ver el ejemplo
PLC Solution Library
Reconexión Wi-Fi que nunca detiene el monitor de máquina
El ESP32 PLC reintenta la conexión como máximo cada 10 segundos sin bloquear nunca el bucle.
Ver el ejemplo