Piloter un ESP32 en écrivant sur une feuille : OCR + IA + IoT ESP32

Objectif : contrôler un ESP32 en écrivant une commande manuscrite sur papier. Une page web capture l’image via la caméra, un backend (OpenCV + EasyOCR) extrait du texte puis un LLM (OpenRouter) génère une commande JSON stricte envoyée à l’ESP32. Le microcontrôleur exécute l’action (LEDs) et affiche un retour sur écran TFT (cercles, compteurs, message).
Aziz Malloul — Ingénieur Systèmes Embarqués & Machine Learning | IA embarquée | IoT

Démo : “papier → caméra → OCR → LLM → JSON → ESP32 (LEDs + TFT)”.

1. Vue d’ensemble du système

Le projet se compose de trois blocs : front web (capture caméra), backend FastAPI (prétraitement + OCR + LLM), et ESP32 (serveur HTTP + exécution JSON + affichage TFT).

  1. L’utilisateur écrit une commande sur papier.
  2. Le navigateur capture l’image via la caméra (JPEG base64).
  3. Le backend OCR extrait un texte puis le LLM génère une commande JSON stricte.
  4. L’ESP32 reçoit ce JSON et exécute l’action + feedback TFT (cercles, compteurs, message).
Extensible : ajout facile d’actionneurs (relais, servo, buzzer), nouvelles actions JSON, amélioration OCR sans changer l’ESP32.

2. Matériel et câblage

2.1 Matériel

2.2 LEDs (GPIO)

LEDGPIOMontage
Rouge25GPIO → résistance → anode ; cathode → GND
Verte26GPIO → résistance → anode ; cathode → GND
Bleue27GPIO → résistance → anode ; cathode → GND

Important : GND commun entre ESP32, TFT et LEDs.

2.3 TFT SPI (ILI9341)

SignalGPIO (exemple)Remarque
MOSI23SPI data
SCLK18SPI clock
MISO19Optionnel selon module
CS15Chip select
DC2Data/Command
RST4Reset
BL32 ou 3.3VBacklight

2.4 Configuration TFT_eSPI

#define ILI9341_DRIVER

#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_MISO 19      // optionnel
#define TFT_CS   15
#define TFT_DC   2
#define TFT_RST  4

#define SPI_FREQUENCY 27000000   // 27 MHz

3. ESP32 : serveur HTTP, JSON et affichage TFT

3.1 Rôle

3.2 Format JSON attendu

{
  "actions": [
    {
      "type": "set_led" | "display_text",
      "colors": ["red","green","blue"] | [],
      "state": "on" | "off" | "blink" | null,
      "duration_s": number | null,
      "delay_ms": number | null,
      "blink_period_ms": number | null,
      "message": string | null
    }
  ]
}
Règle : si colors est absent ou vide → l’action s’applique aux 3 LEDs.

3.3 Non-bloquant (millis)

Pas de delay() : timers d’extinction + clignotement gérés via millis(), et rafraîchissement TFT périodique (~200 ms). L’ESP32 reste réactif et peut recevoir une nouvelle commande pendant une action longue.

4. Backend FastAPI : OCR + interprétation LLM

4.1 Endpoints

RouteMéthodeRôle
/GETTest : {"status":"ok"}
/api/commandPOSTReçoit image_base64 → OCR → LLM → JSON → envoi ESP32

4.2 Prétraitement OpenCV (scan-like)

4.3 OCR (EasyOCR) + nettoyage

4.4 Interprétation LLM via OpenRouter (JSON strict)

Le LLM transforme un texte OCR bruité en JSON strict : couleurs, état (on/off/blink), durée, message TFT, et séparation en plusieurs actions (et/puis/ensuite).

Exemple :
"clignote toutes les leds pendant 20 et affiche bonjour"

→ actions[0] = set_led (blink, duration_s=20, blink_period_ms=500)
→ actions[1] = display_text ("bonjour")

5. Front Web : capture caméra et visualisation

6. Résultats, limites et améliorations

6.1 Résultats

6.2 Limites

Conclusion

Ce projet illustre une interaction naturelle “papier → IA → action” reliant vision, NLP et IoT. Grâce à une architecture modulaire (front / backend / ESP32), il est facile d’étendre les actions matérielles et d’améliorer la robustesse de l’OCR.