No description
  • JavaScript 89.1%
  • C++ 9.2%
  • Makefile 1.2%
  • HTML 0.3%
  • CSS 0.2%
Find a file
dioufissa 751e720a14 merge: ibrahim_lampe → main
Intègre tous les modules HMI et corrections :
- Sidebar gauche (navigation webapp)
- Convoyeur + Lampe en mode réel ESP32/Modbus TCP
- Distributeur Jus, Trieuse Caisses, Emballage Canettes (simulation)
- Physique convoyeurs : gap MIN_GAP, injection bloquée à l'entrée
- Emballage : bras robot, vision 6/12-pack, 3 canettes individuelles
- Unification cycle simulation à 10 ms (100 Hz)
- Correction double useEffect (simulation double vitesse)
- README complet avec temps de cycle et note temps réel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 13:33:59 +02:00
firmware feat: sidebar gauche, physique convoyeurs, correction bugs simulation 2026-04-21 13:17:16 +02:00
server feat: sidebar gauche, physique convoyeurs, correction bugs simulation 2026-04-21 13:17:16 +02:00
src chore: déplace Lampe en dernière position dans la sidebar 2026-04-21 13:33:33 +02:00
.gitignore feat: sidebar gauche, physique convoyeurs, correction bugs simulation 2026-04-21 13:17:16 +02:00
eslint.config.js Ajout du projet 2026-03-12 14:36:40 +01:00
index.html feat: connexion RPi↔ESP32 automatique via UDP + refactor complet 2026-04-10 14:16:26 +02:00
LICENSE Initial commit 2026-03-12 12:25:08 +01:00
Makefile feat: sidebar gauche, physique convoyeurs, correction bugs simulation 2026-04-21 13:17:16 +02:00
package-lock.json Ajout du page de simulation de lampe 2026-04-16 11:27:30 +02:00
package.json Ajout du page de simulation de lampe 2026-04-16 11:27:30 +02:00
postcss.config.js feat: connexion RPi↔ESP32 automatique via UDP + refactor complet 2026-04-10 14:16:26 +02:00
README.md perf: unification cycle simulation à 10 ms (100 Hz) 2026-04-21 13:25:19 +02:00
tailwind.config.js Ajout d'un main en C++ 2026-03-19 10:35:41 +01:00
vite.config.js feat: connexion RPi↔ESP32 automatique via UDP + refactor complet 2026-04-10 14:16:26 +02:00

MyHMI — IHM Industrie 4.0

Superviseur industriel multi-modules sur ESP32 / Modbus TCP.
Interface en sidebar gauche — navigation webapp classique.

Module Simulation Mode réel (ESP32)
Convoyeur canettes
Lampe
Distributeur jus
Trieuse caisses
Emballage canettes

Architecture

MODE SIMULATION
  Navigateur React ──── PLC local (cycle 10 ms, 100 Hz)

MODE RÉEL
  Navigateur ──Socket.IO──▶ Node.js (:3002) ──Modbus TCP──▶ ESP32 (:502)
                                  ▲
                             UDP :5001
                                  │
                        ESP32 annonce son IP au démarrage

Navigation

Sidebar fixe à gauche (icônes seules sur mobile, icônes + labels sur desktop).
Chaque module indique son mode : RÉEL+SIM ou SIM.


Temps de cycle

Couche Cycle Fréquence Temps réel ?
ESP32 firmware (loop) 100 ms 10 Hz Oui — bare metal, gigue < ms
Node.js poll Modbus 100 ms 10 Hz ⚠️ Soft — dépend de l'OS
React simulation (navigateur) 10 ms 100 Hz Non — setInterval best-effort

Note temps réel : un navigateur web tourne sur un OS non-temps-réel. setInterval(fn, 10) est une demande, pas une garantie — le scheduler OS peut retarder le tick de 2 à 20 ms selon la charge. Pour la simulation visuelle c'est largement suffisant. Pour du vrai contrôle industriel, seul l'ESP32 (bare metal) est temps réel dans ce projet.

Sur Raspberry Pi, en cas de lag visible, passer à 20 ms (SCAN_RATE_MS = 20) est un bon compromis.


Commandes

make dev      # Développement  — Vite :5173 + Node :3002
make build    # Production     — compile React → dist/
make start    # Production     — compile + démarre le serveur (:3002)
make flash    # ESP32          — compile firmware + flash + moniteur série
make monitor  # ESP32          — moniteur série seul (sans reflasher)
make clean    # Nettoyage      — dist/, cache Vite, artefacts firmware

Prérequis : Node.js ≥ 18, PlatformIO (pio dans le PATH)


Mode Simulation (sans matériel)

make dev

Ouvrir http://localhost:5173 — tous les modules fonctionnent sans ESP32.


Mode Réel (RPi + ESP32)

1. Flasher l'ESP32

Vérifier les identifiants Wi-Fi dans firmware/src/main.cpp :

const char* WIFI_SSID     = "Hotspot";
const char* WIFI_PASSWORD = "transformeresp32";

Puis flasher :

make flash

La LED GPIO 2 clignote = ESP32 connecté et Modbus prêt.

2. Hotspot RPi

nmcli con up Hotspot   # démarre le hotspot "Hotspot"

Pour créer le hotspot la première fois :

nmcli dev wifi hotspot ifname wlan0 ssid "Hotspot" password "transformeresp32"

3. Déployer sur la RPi

make start   # compile React + lance le serveur sur :3002

4. Ouvrir l'IHM

http://<IP_RPi>:3002

Sur la page Convoyeur ou Lampe, cliquer Mode Réel — la connexion s'établit automatiquement via UDP.


Connexion automatique

ESP32 boot → Wi-Fi → envoie "ESP32_IP:<ip>" UDP → RPi:5001
RPi reçoit → connectModbus(<ip>:502)
Modbus OK  → Socket.IO notifie l'IHM → "MODBUS TCP — <ip>"
Poll 100 ms → données temps réel

Si l'UDP est bloqué par le pare-feu : entrer l'IP manuellement dans l'IHM.


Module Emballage Canettes (simulation)

Cellule robotisée d'emballage automatique :

  • Convoyeur principal alimente des canettes en continu
  • Un système de vision détecte le type de pack (6 ou 12 canettes)
  • Quand 3 canettes atteignent la sortie, un bras robotique les saisit avec des ventouses
  • Le bras dépose les canettes dans le pack (rangées de 3) et revient chercher le lot suivant
  • Une fois le pack complet, il est évacué sur un convoyeur de sortie
  • Pendant le dépôt, 3 nouvelles canettes s'acheminent simultanément
Phase Description
scanning Vision système — détection 6-pack ou 12-pack
conveying Attente de 3 canettes en bout de convoyeur
pickup Bras descend, ventouses saisissent les 3 canettes
to_pack Bras se déplace vers la zone pack
placing Dépôt dans le pack + chargement 3 suivantes
to_home Retour position initiale
pack_exit Pack complet évacué sur convoyeur de sortie

Carte Modbus (Slave ID=1, port 502)

Registre Nom Description Valeurs
HR0 MOTOR État moteur 0=STOP / 1=RUN
HR1 SENSOR_IN Capteur entrée 0 / 1
HR2 SENSOR_OUT Capteur sortie 0 / 1
HR3 CAN_COUNT Canettes sur le tapis 010
HR4 TOTAL Total canettes traitées 065535
HR514 POS_CAN_x Positions canettes 09 0100 %
HR15 LAMP État lampe 0 / 1
C0 ADD_CAN Ajouter canette (pulse 300ms)
C1 RETRIEVE_CAN Récupérer canette (pulse 300ms)
C2 LAMP Commande lampe (état direct) 0 / 1

GPIO ESP32

Pin Rôle
2 LED statut Wi-Fi
4 Contacteur moteur
15 Lampe
34 Capteur entrée (option)
35 Capteur sortie (option)

PIN_USE_PHYSICAL_SENSORS = true dans firmware/src/main.cpp pour activer les capteurs physiques.


Physique simulation

Tous les convoyeurs appliquent une contrainte de gap minimum (MIN_GAP) entre éléments :

  • Traitement leader → suiveur à chaque cycle pour éviter l'empilement visuel
  • Injection bloquée si la zone d'entrée est déjà occupée
  • Sur la Trieuse : gap indépendant par piste (tapis principal / sortie haut / sortie droite)

Structure du projet

MyHMI/
├── firmware/                        # ESP32 — PlatformIO
│   ├── platformio.ini
│   └── src/main.cpp                 # Convoyeur + lampe, Modbus TCP, UDP
├── server/
│   └── index.js                     # Socket.IO ↔ Modbus TCP + UDP discovery
├── src/
│   ├── App.jsx                      # Sidebar gauche + routing
│   ├── convoyeur/ConvoyeurCanettes.jsx            # Réel + simulation
│   ├── lampe/Lampe.jsx                            # Réel + simulation
│   ├── distributeur_jus/DistributeurJus.jsx       # Simulation
│   ├── trieuse_caisse/TrieuseCaisse.jsx           # Simulation
│   └── emballage_canettes/EmballageCanettes.jsx   # Simulation
├── Makefile
└── package.json