Diada de la Llibertat del Maquinari 2026

Bessons digitals lliures
per a maquinari lliure

Simuladors de codi obert per a la formació d'IoT
Jordi Binefa · github.com/jordibinefa · Xavier Pi · github.com/pixavier

Conceptes clau

PT — Physical Twin

Bessó físic. La placa real: circuits, sensors, actuadors. El que l'alumne té a les mans.

DT — Digital Twin

Bessó digital. Una rèplica virtual que es comporta com la placa física: rep i envia els mateixos missatges MQTT.

Boundary Object

Objecte de frontera. La interfície MQTT compartida que fa que PT i DT siguin intercanviables sense modificar el programa de control.

Un bessó digital lliure permet que qualsevol centre educatiu el pugui desplegar, modificar i millorar.

Tres bessons físics

Placa S4A PLB
S4A Programming Learning Board
Arduino Nano · ATmega328P
Placa IoT-02
Placa IoT-02
ESP32-S3 · SSD1306 · BME280 · LDR
IoT-Vertebrae
Sistema modular IoT-Vertebrae
ESP32-S3 · CAN/I²C · costelles

Primers bessons digitals de la IoT-02 — via MQTT

Qt/QML → WebAssembly · Qt6 · 2025–2026

Primer bessó digital. Interfície gràfica amb Qt6/QML compilada a WebAssembly. Connecta via MQTT WSS al broker.

binefa.com/iot-02/

Captura Qt/QML

Reescriptura JavaScript

Mateixa interfície portada a JavaScript pur. Base gràfica que ha evolucionat fins a l'iot02sim actual.

binefa.com/iot_02/

Captura JavaScript

S4A Simulator — arquitectura

Navegador (alumne)
CodeMirror 6Editor de codi
avr8jsSimulació CPU ATmega328P en JS
LEDs / BotonsDOM
Serial MonitorDOM
Servidor
arduino-cli (arduino:avr)POST /compile → retorna .hex

El servidor només compila. Tota la simulació s'executa al navegador.

S4A PLB
S4A Programming Learning Board

S4A Simulator — demo

s4a.binefa.cat

avr8js arduino-cli Docker

Captura S4A Simulator

Simulador IoT-02 — arquitectura

Navegador (alumne)
Editor / pujar .binZIP o fitxer merged.bin
Bessó digital interactiuCanvas OLED · LEDs · botons
Sliders BME280Temp · humitat
Slider LDRADC
Clients MQTT externs
Node-RED · Snap! · etc.iot02/{sessionId}/state|action
Backend (Node.js)
arduino-cliesp32:esp32@3.0.7 → firmware
QEMU (ESP32-S3)GPIO · I²C · ADC
OpenEth → slirp → xarxa
MqttBridgeWebSocket ↔ sessions QEMU
30 sessions simultànies
Placa IoT-02
Placa IoT-02

Board package i shim Ethernet

Board package iot02-qemu

Afegit a l'IDE d'Arduino via URL. Defineix la plataforma ESP32-QEMU i els flags de compilació adequats per generar un binari executable per QEMU en comptes de flash real.

iotv.binefa.cat — documentació instal·lació

Stub vs. shim

Un stub substitueix una interfície amb una implementació buida (per a proves). Un shim reimplementa la mateixa interfície amb un comportament diferent però real.

El nostre shim intercepta WiFiClient i redirigeix totes les crides a la pila TCP/IP d'OpenEth emulada per QEMU.

[SHIM] esp_wifi_init interceptat
[SHIM] _shim_init_openeth ENTER
[SHIM] netif+event OK, creant OpenEth MAC...
[SHIM] driver installed, starting eth...
[SHIM] Esperant Ethernet link up...
[SHIM] Xarxa OpenEth LLESTA IP 192.168.4.2
Connecting to WiFi network: iotcat...
WiFi connected
IP address: 192.168.4.15
MQTT connecting ...connected
Publishing topic: /223344556670/btI34

Serial Monitor d'iot02sim.binefa.cat — el firmware «creu» que usa WiFi; en realitat usa OpenEth emulat per QEMU.

Simulador IoT-02 — demo

iot02sim.binefa.cat

Execució automàtica via URL

#run:mac=…&sid=…&bin=https://…merged.bin

QEMU (calib fork) Node.js MQTT

Captura iot02sim.binefa.cat

IoT-Vertebrae — bessó digital Python

binefa.com/iotv/sAh/

Característiques

Editor Python integrat. Gestor de finestres. Bessó digital del sistema modular. Connexió MQTT directa al broker.

Sistema de finestres sAh

Interfície web tipus SCADA: panells configurables, visualització en temps real de les costelles.

Captura binefa.com/iotv/sAh

IoT-Vertebrae — bessó digital amb binari executable

iotvsim.binefa.cat

Firmware real sobre QEMU

El mateix binari compilat per a ESP32-S3 s'executa dins QEMU. Comportament idèntic al maquinari físic.

Fins a 30 sessions

Múltiples instàncies QEMU simultànies per instància de servidor. Usable a l'aula.

Captura iotvsim.binefa.cat

Boundary Object en acció (I)

dt.iotvertebrae.com/
prjs/i40/

El mateix programa Python o Snap! controla indistintament la placa física o el simulador. La interfície MQTT és l'objecte de frontera.

Virtual Commissioning

Validar el programa de control sobre el bessó digital abans de connectar-lo al maquinari real.

Boundary Object: sAh + Snap!

Boundary Object en acció (II)

xavierpi.com/bim/

El mateix programa Python o Snap! controla indistintament la placa física o el simulador. La interfície MQTT és l'objecte de frontera.

BIM

Building information modeling (BIM) is the holistic process of creating and managing information for a built asset. BIM integrates structured, multi-disciplinary data to produce a digital representation of an asset.

BIM + IoT-02 + Snap!

Resum

SimuladorMaquinariTecnologia clauURL
S4A SimulatorArduino Nano
ATmega328P
avr8js · arduino-clis4a.binefa.cat
IoT-02 SimulatorESP32QEMU · Node.js · MQTT · shim Eth.iot02sim.binefa.cat
IoT-Vertebrae (Python)Raspberry Pi + ESP32-S3 modularMQTT · Python · sAhbinefa.com/iotv/sAh
IoT-Vertebrae (binari)ESP32-S3 modularQEMU · arduino-cli · shim Eth.iotvsim.binefa.cat
BIM + IoT-02IoT-02Three.js · IFC · MQTTxavierpi.com/bim

Documentació Arduino / board package

iotv.binefa.cat

Codi a GitHub

github.com/jordibinefa