Curs: Internet of Things amb IA aplicada a la Indústria 4.0
Col·legi d'Enginyers de Catalunya
Un tècnic amb 20 anys a peu de màquina no mira un sol valor per decidir si una instal·lació va bé. Combina temperatura, vibració, soroll i humitat de forma intuïtiva: ha après a reconèixer patrons que no es poden expressar com un simple if temperatura > 35°C → alarma.
TinyML és exactament això: emmagatzemar l'experiència del tècnic dins el microcontrolador. La decisió es pren a peu de màquina, en menys d'un mil·lisegon, sense connexió al núvol i sense dependre de cap servidor.
En termes tècnics: un model de xarxa neuronal de 3.1 KB s'executa directament a un ESP32 de 3€, classificant l'estat ambiental a partir de tres sensors en ~300 µs.
La placa IoT-02 (ESP32) llegeix tres sensors simultàniament i classifica l'entorn en quatre estats:
| Estat | Temperatura | Humitat | Lluminositat | Actuació |
|---|---|---|---|---|
| 🟢 NORMAL | 18–28 °C | 30–65 % | moderada | LED verd |
| 🔴 CALOR | 30–45 °C | 65–100 % | qualsevol | LED vermell + relé |
| 🟣 FOSCOR | qualsevol | qualsevol | molt baixa | LED groc |
| 🌕 MOLT LLUMINÓS | qualsevol | qualsevol | molt alta | LED blanc |
La decisió no es basa en cap regla if/else. El model ha après les fronteres entre estats a partir de dades, i les aplica en temps real combinant les tres variables alhora.
Dades d'entrenament (Python / Google Colab)
↓
Model Keras (entrenament)
↓
Conversió a TFLite Micro (3.1 KB)
↓
Exportació a fitxer .h (array de bytes C)
↓
Compilació Arduino IDE → firmware .bin
↓
Desplegament a l'ESP32 (o simulador IoT-02)
Cada pas té una eina concreta. El més important és el primer: si les dades no representen la realitat del hardware, tot el que ve després serà incorrecte.
Durant el desenvolupament d'aquesta demostració, el model va ser entrenat dues vegades.
Model v1: entrenat amb dades sintètiques on l'estat NORMAL tenia una lluminositat LDR de 0.30–0.90 (normalitzat sobre 4095). Accuracy en test: 99.7 %. Desplegat al simulador: classificava l'estat normal com a FOSCOR.
Per què? El simulador, quan ningú toca els controls, retorna LDR = 500. Normalitzat: 500/4095 = 0.12. La zona FOSCOR del model v1 anava de 0.00 a 0.15. El model tenia raó: havia après exactament el que li havíem ensenyat. El problema era que les dades d'entrenament no representaven el hardware real.
El tècnic havia après en una altra fàbrica. Les màquines eren iguals, però les condicions de treball eren diferents. El primer mes fallava en els diagnòstics.
Model v2: zones redefinides a partir dels valors reals mesurats al simulador. Accuracy: 99.2 %. Resultat: tots els estats es classifiquen correctament.
Accuracy alta ≠ model útil.
Un model és tan bo com les dades amb les que ha après. Si entrenes amb dades de laboratori, obtens un model de laboratori.
Això és el covariate shift: la distribució de les dades en producció difereix de la distribució d'entrenament. És el problema número u del ML en entorns industrials reals.
| Núvol | TinyML (Edge) | |
|---|---|---|
| Latència | 50–500 ms (xarxa) | < 1 ms |
| Connectivitat | Necessària | No necessària |
| Privacitat | Dades surten de la instal·lació | Dades no surten del dispositiu |
| Cost recurrent | SaaS / API / servidor | Zero |
| Mida del model | Sense límit | Kilobytes |
| Cas d'ús ideal | Models complexos, dades massives | Decisions simples i ràpides a peu de màquina |
TinyML no substitueix el núvol: el complementa. Un detector d'anomalies al microcontrolador pot filtrar el 99 % dels events i enviar al núvol només el que requereix anàlisi profunda.
Aquesta secció és per a qui vulgui entendre el funcionament intern del model.
No és necessària per aplicar TinyML a un projecte real.
Total: 188 paràmetres. Per comparar: GPT-4 té ~1.8 bilions de paràmetres. El nostre model és adequat per al problema perquè les quatre zones són raonablement separables en un espai tridimensional.
Cada connexió entre dues neurones té un pes (un nombre que el model ajusta durant l'entrenament). A més, cada neurona de les capes denses té un biaix addicional. La suma de tots és el nombre de paràmetres del model:
| Capa | Pesos | Biaixos | Total capa |
|---|---|---|---|
| Dense(12, ReLU) | 3 × 12 = 36 | 12 | 48 |
| Dense(8, ReLU) | 12 × 8 = 96 | 8 | 104 |
| Dense(4, Softmax) | 8 × 4 = 32 | 4 | 36 |
| ∑ paràmetres | 188 |
La funció ReLU (Rectified Linear Unit) és la porta de cada neurona oculta: si el valor que rep és negatiu, retorna 0; si és positiu, el deixa passar sense modificar. Formalment: f(x) = max(0, x).
Aquesta simplesa té una conseqüència important: permet que la xarxa aprengui fronteres no lineals entre les zones (NORMAL, CALOR, FOSCOR, MOLT_LLUMINÓS) sense un cost computacional elevat. Sense ReLU —o una funció d'activació equivalent— la combinació de capes denses seria equivalent a una sola capa lineal, incapaç de separar zones que no siguin hiperplans.
La capa Softmax garanteix que les quatre probabilitats de sortida sumin sempre 1.0. Si la temperatura és 40 °C i la humitat és 90 %, la sortida podria ser:
NORMAL: 0.0 %
CALOR: 100.0 %
FOSCOR: 0.0 %
MOLT_LLUM: 0.0 %
Softmax no és una decisió binària: en situacions ambigües (per exemple, temperatura moderada i humitat alta), les probabilitats es repartiran entre dos estats, i el sistema pot optar per activar una alerta suau en lloc d'una decisió categòrica.
Les xarxes neuronals aprenen millor quan totes les entrades estan en el mateix rang. Les tres variables es normalitzen a [0, 1]:
temp_norm = temperatura_celsius / 50.0
hum_norm = humitat_percent / 100.0
ldr_norm = ldr_adc_raw / 4095.0
Aquesta normalització ha de ser idèntica entre l'entrenament (Python) i l'execució (Arduino). Si canvien, el model farà prediccions incorrectes sense donar cap error.
El model Keras es converteix a format FlatBuffer (TFLite), un format binari optimitzat per a dispositius amb recursos limitats. Després es representa com un array de bytes C que s'incrusta directament al firmware:
alignas(8) const unsigned char g_model[] = {
0x1c, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33,
// ... 3168 bytes en total
};
En executar el firmware, TFLite Micro llegeix aquest array de la memòria flash i fa la inferència directament, sense sistema operatiu ni intèrpret.
Document elaborat per al curs IoT amb IA — Col·legi d'Enginyers de Catalunya