Ir al contenido

Arduino CLI con un Arduino PLC: compilar y cargar en Windows y Linux

Instala Arduino CLI, añade las placas de Industrial Shields y programa un M-Duino o Ardbox desde el terminal
27 de octubre de 2026 por
Arduino CLI con un Arduino PLC: compilar y cargar en Windows y Linux

Arduino CLI es la herramienta oficial de línea de comandos de Arduino. Con ella programas un Arduino PLC (M-Duino o Ardbox) sin abrir el IDE: añades la URL de placas de Industrial Shields, instalas la plataforma industrialshields:avr y ejecutas arduino-cli compile y arduino-cli upload con el FQBN de tu modelo. Los comandos son los mismos en Windows y en Linux; solo cambian la instalación y el nombre del puerto serie.

Esta guía cubre el flujo completo en los dos sistemas: instalación, paquete de placas, FQBN de cada modelo, compilación, carga por USB y monitor serie. Al final tienes el método con avrdude, que usa las herramientas que el Arduino IDE 2 ya instaló.

¿Cuándo es mejor la línea de comandos que el Arduino IDE?

El IDE es la forma más fácil de escribir y probar un sketch. La línea de comandos es mejor cuando la misma compilación se tiene que repetir sin clics: un script que programa un lote de PLC al final de la línea, un servidor de compilación, un PC remoto al que entras por SSH o un asistente de IA que compila y carga por ti.

HerramientaQué haceÚsala cuando
Arduino IDE 2Editor, compilador, cargador y monitor serie en una ventanaEscribes y depuras el programa
Arduino CLIInstala cores y librerías, compila y carga desde un terminalRepites compilaciones, usas scripts o trabajas sin escritorio
avrdudeSolo escribe en el PLC un archivo .hex ya compiladoHas recibido un .hex y solo tienes que cargarlo

El IDE 2 usa Arduino CLI por dentro, con la misma carpeta de datos por defecto. Un core que instalas desde uno está disponible en el otro.

Qué necesitas

  • Un Arduino PLC de las familias M-Duino o Ardbox, alimentado como indica su datasheet, y su cable USB.
  • Un PC con Windows 10 u 11, o con una distribución Linux (Ubuntu, Debian o similar). Arduino CLI también tiene versiones para Linux ARM, así que sirve una Raspberry Pi.
  • Conexión a internet la primera vez, para descargar Arduino CLI, las placas de Industrial Shields y el compilador.
  • La URL del paquete de placas de Industrial Shields:
    https://apps.industrialshields.com/main/arduino/boards/package_industrialshields_index.json

¿Cómo se instala Arduino CLI en Windows?

  1. Abre la página oficial de instalación de Arduino CLI y descarga el instalador MSI o el archivo ZIP de Windows de 64 bits.
  2. Con el MSI, ejecuta el instalador. Con el ZIP, extrae arduino-cli.exe en una carpeta, por ejemplo C:\arduino-cli, y añade esa carpeta a la variable de entorno Path (busca "variables de entorno" en el menú Inicio y luego Variables de entorno > Path > Editar > Nuevo).
  3. Abre una ventana nueva de Símbolo del sistema o PowerShell y comprueba la instalación:
arduino-cli version

Si Windows responde que no reconoce el comando, la carpeta todavía no está en Path. Cierra el terminal y abre uno nuevo después de editar Path; no hace falta reiniciar el PC.

¿Cómo se instala Arduino CLI en Linux?

El script oficial de instalación descarga la última versión en la carpeta de BINDIR. La carpeta tiene que existir antes de ejecutarlo:

mkdir -p ~/.local/bin
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR=~/.local/bin sh
arduino-cli version

Si la shell no encuentra arduino-cli, añade la carpeta al PATH y abre un terminal nuevo:

echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc

Para usar el puerto serie USB sin sudo, añade tu usuario al grupo dialout (Debian, Ubuntu y Raspberry Pi OS) y cierra y vuelve a abrir la sesión:

sudo usermod -aG dialout $USER

¿Cómo se añaden las placas de Industrial Shields a Arduino CLI?

Estos comandos son iguales en el terminal de Windows y en la shell de Linux. El primero crea el archivo de configuración; si ya existe, sáltalo.

arduino-cli config init
arduino-cli config add board_manager.additional_urls https://apps.industrialshields.com/main/arduino/boards/package_industrialshields_index.json
arduino-cli core update-index
arduino-cli core search industrialshields
arduino-cli core install industrialshields:avr

core install descarga el core AVR de Industrial Shields, el compilador avr-gcc y avrdude. Ejecuta arduino-cli core list para ver la versión instalada, y más adelante arduino-cli core upgrade para actualizarla.

PlataformaFamilias de PLC
industrialshields:avrM-Duino, Ardbox y Spartan (ATmega2560 y ATmega32u4)
industrialshields:esp32ESP32 PLC y las otras familias basadas en ESP32

¿Qué FQBN usa cada modelo de M-Duino y Ardbox?

El FQBN (Fully Qualified Board Name) indica a Arduino CLI el paquete, la plataforma, la familia y el modelo: industrialshields:avr:<familia>:cpu=<modelo>. Es la misma elección que haces en el IDE en Herramientas > Placa y Herramientas > Model, y selecciona los nombres de pin (Q0_0, I0_0, R1...) de tu PLC.

PLCFQBN
M-Duino 21+industrialshields:avr:mduino:cpu=mduino21plus
M-Duino 42+industrialshields:avr:mduino:cpu=mduino42plus
M-Duino 57R+industrialshields:avr:mduino:cpu=mduino57rplus
M-Duino 58+industrialshields:avr:mduino:cpu=mduino58plus
Ardbox Analog HF+ con RS-485industrialshields:avr:ardbox:cpu=ardboxanaloghfplus485
Ardbox Relay HF+ con RS-485industrialshields:avr:ardbox:cpu=ardboxrelayhfplus485

Para ver todas las familias y las opciones de modelo de la tuya:

arduino-cli board listall industrialshields
arduino-cli board details -b industrialshields:avr:mduino

Las versiones WiFi/BT, GPRS, LoRa y DALI tienen su propia familia (por ejemplo mduinowifi o ardboxlora), cada una con su propia lista de modelos: consúltala con board details.

Crear y compilar un sketch

Crea la carpeta del sketch y sustituye el contenido del archivo .ino por este ejemplo. Cambia la salida digital Q0.0 cada segundo y escribe el estado en el puerto serie USB:

arduino-cli sketch new BlinkQ00
// Cambia la salida digital Q0.0 cada segundo y escribe su estado en el puerto serie USB.
void setup() {
  Serial.begin(115200);
  pinMode(Q0_0, OUTPUT);
}

void loop() {
  static bool on = false;
  on = !on;
  digitalWrite(Q0_0, on ? HIGH : LOW);
  Serial.println(on ? "Q0.0 ON" : "Q0.0 OFF");
  delay(1000);
}

Compílalo para tu modelo, por ejemplo un M-Duino 42+:

arduino-cli compile --fqbn industrialshields:avr:mduino:cpu=mduino42plus BlinkQ00

La salida termina con la flash y la RAM que usa el programa. En nuestra compilación con el core AVR 1.2.1 de Industrial Shields, este sketch usó 2.850 bytes de los 253.952 disponibles en el M-Duino 42+, y 4.318 bytes de los 28.672 disponibles en el Ardbox Analog HF+.

En un Ardbox Relay las salidas son relés, así que el pin es R1 en lugar de Q0_0. Si compilas el ejemplo tal cual para ese modelo, el compilador se detiene con "Q0_0 was not declared in this scope". Ese error es el FQBN haciendo su trabajo: cada modelo solo conoce sus propios nombres de pin.

Cargar el sketch por USB

Conecta el PLC y busca su puerto serie:

arduino-cli board list

En Windows el puerto es COM más un número (también lo ves en Administrador de dispositivos > Puertos (COM y LPT)). En Linux suele ser /dev/ttyACM0 o /dev/ttyUSB0. La lista puede mostrar la placa con el nombre del Arduino que lleva dentro el PLC (Mega 2560 o Leonardo); carga igualmente con el FQBN de Industrial Shields.

# Windows
arduino-cli upload -p COM5 --fqbn industrialshields:avr:mduino:cpu=mduino42plus BlinkQ00

# Linux
arduino-cli upload -p /dev/ttyACM0 --fqbn industrialshields:avr:mduino:cpu=mduino42plus BlinkQ00

También puedes compilar y cargar en un solo paso con arduino-cli compile --upload -p <puerto> --fqbn <fqbn> BlinkQ00.

Ardbox: su ATmega32u4 tiene USB nativo. Para arrancar el bootloader, Arduino CLI abre primero el puerto a 1200 baudios, y después el PLC puede volver durante unos segundos con otro número de puerto. Arduino CLI espera a ese puerto nuevo y carga allí. Si la carga falla, cierra cualquier monitor serie que tenga el puerto abierto y vuelve a probar.

Comprobar el programa con el monitor serie

arduino-cli monitor -p COM5 -c baudrate=115200

En Linux, usa -p /dev/ttyACM0. Tienes que ver "Q0.0 ON" y "Q0.0 OFF" cada segundo, y el LED de Q0.0 del PLC cambiar a la vez. Pulsa Ctrl+C para salir.

Alternativa: cargar un archivo .hex con avrdude

Si ya tienes el archivo compilado, avrdude lo escribe en el PLC sin compilar. Arduino CLI guarda el .hex junto al sketch con la opción --export-binaries (-e), en BlinkQ00/build/industrialshields.avr.mduino/. En el Arduino IDE 2 el mismo archivo sale de Sketch > Exportar binario compilado.

No hace falta instalar avrdude: el core de Industrial Shields lo instala, para el IDE 2 y para Arduino CLI, en esta carpeta (el número de versión depende del core):

Sistemaavrdude y su archivo de configuración
Windows%LOCALAPPDATA%\Arduino15\packages\industrialshields\tools\avrdude\6.3.0-arduino17\bin\avrdude.exe
...\6.3.0-arduino17\etc\avrdude.conf
Linux~/.arduino15/packages/industrialshields/tools/avrdude/6.3.0-arduino17/bin/avrdude
.../6.3.0-arduino17/etc/avrdude.conf

M-Duino (ATmega2560, protocolo wiring, 115200 baudios), en Linux:

AVRDUDE=~/.arduino15/packages/industrialshields/tools/avrdude/6.3.0-arduino17
$AVRDUDE/bin/avrdude -C $AVRDUDE/etc/avrdude.conf -p atmega2560 -c wiring -P /dev/ttyACM0 -b 115200 -D -U flash:w:BlinkQ00.ino.hex:i

Ardbox (ATmega32u4, protocolo avr109, 57600 baudios): primero abre el puerto a 1200 baudios para arrancar el bootloader y luego ejecuta avrdude en el puerto que aparece. El puerto puede cambiar, así que vuelve a comprobarlo. En Linux:

stty -F /dev/ttyACM0 1200
arduino-cli board list
$AVRDUDE/bin/avrdude -C $AVRDUDE/etc/avrdude.conf -p atmega32u4 -c avr109 -P /dev/ttyACM0 -b 57600 -D -U flash:w:BlinkQ00.ino.hex:i

En Windows, mode COM5 BAUD=1200 abre el puerto a 1200 baudios de la misma forma.

OpciónSignificado
-CArchivo de configuración de avrdude. Sin él, avrdude puede no conocer el protocolo
-pMicrocontrolador: atmega2560 en M-Duino, atmega32u4 en Ardbox
-cProtocolo de carga del bootloader: wiring en M-Duino, avr109 en Ardbox
-PPuerto serie (COM5, /dev/ttyACM0...)
-bVelocidad: 115200 en M-Duino, 57600 en Ardbox
-DNo hace el borrado completo del chip antes de escribir, igual que el Arduino IDE
-U flash:w:file.hex:iEscribe el archivo en la memoria flash, en formato Intel HEX

La versión de Windows de cada paso, con capturas de Path y del Administrador de dispositivos, está en subir un sketch a un PLC Arduino desde la línea de comandos de Windows, y la de Linux en subir un sketch a un M-Duino o Ardbox desde la shell de Linux.

Cómo hemos comprobado esta guía. El 27 de octubre de 2026 descargamos el índice de placas de Industrial Shields desde la URL de arriba y el core AVR 1.2.1 que contiene (suma SHA-256 correcta), y compilamos el ejemplo con ese core y el avr-gcc 7.3.0 de Ubuntu 24.04 (el core instala su propia compilación 7.3.0), para M-Duino 21+, 42+, 57R+ y 58+ y para Ardbox Analog HF+ (Ardbox Relay HF+ con R1). Los FQBN, protocolos, velocidades y rutas salen de los archivos boards.txt y platform.txt de ese core. Los comandos de arduino-cli siguen la documentación oficial de Arduino CLI y no se ejecutaron en ese entorno, y los pasos de carga no se probaron en un PLC para esta guía.

De hacer parpadear una salida a controlar una máquina. En el simulador de variador por Modbus, un M-Duino lee y escribe un variador de frecuencia por Modbus RTU y controla su velocidad. En el caso de estudio de climatización, un M-Duino 58 controla una unidad de tratamiento de aire para un fabricante.

Abrir el simulador de variador ModbusLeer el caso de climatización

Preguntas frecuentes sobre Arduino CLI y los Arduino PLC

¿Necesito el Arduino IDE para usar Arduino CLI?

No. Arduino CLI instala por sí mismo el core, el compilador y avrdude. Si además tienes el IDE 2, los dos usan los mismos cores instalados.

¿Por qué la carga falla con "Permission denied" en Linux?

Tu usuario no puede abrir el puerto serie. Añádelo al grupo dialout con sudo usermod -aG dialout $USER y cierra y vuelve a abrir la sesión.

¿Por qué el compilador no reconoce Q0_0 o I0_0?

El FQBN no es de Industrial Shields (por ejemplo arduino:avr:mega) o el modelo no es el correcto. Usa industrialshields:avr:mduino:cpu=... o industrialshields:avr:ardbox:cpu=... con tu modelo exacto.

¿Puedo programar un M-Duino desde una Raspberry Pi?

Sí. Arduino CLI tiene versiones para Linux ARM, y el índice de Industrial Shields incluye el compilador y avrdude para Linux ARM de 32 y 64 bits. Los pasos son los mismos que en un PC con Linux.

¿Puedo cargar por Ethernet en lugar de USB?

Sí, con un archivo binario y un reset remoto. El proceso se explica en cargar un sketch en un PLC por Ethernet, paso 2: archivo binario.

Buscar en nuestro blog

Arduino CLI con un Arduino PLC: compilar y cargar en Windows y Linux
27 de octubre de 2026
Compartir esta publicación

¿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