16 KiB
Spécifications — Companion Cube Interactif
Version : 0.2.0
Date : 2026-02-08
Statut : Brouillon — en cours de validation
Sommaire
- Partie 1 — Spécifications Fonctionnelles
- Partie 2 — Spécifications Techniques (v1.0 — ESP32-S3)
- Partie 3 — Passerelle (Gateway/Dock)
- Partie 4 — Feuille de Route
Partie 1 — Spécifications Fonctionnelles
1. Vision Produit
Un cube interactif de ~12 cm inspiré du Weighted Companion Cube (Aperture Science), repositionné dans un contexte opérationnel (IT/DevOps, Défense, Coordination d'équipes).
Le cube est un terminal physique configurable : chaque face est un bouton lumineux dont le rôle, les animations et les actions sont définis depuis le serveur ops-devices. Il communique localement (ESP-NOW / BLE) avec une passerelle (dock) qui assure la connectivité réseau (WiFi / 4G) vers le serveur MQTT.
Contraintes de Design
- Esthétique : Coque grise mate, coins renforcés, centre de chaque face marqué d'un symbole configurable servant de bouton tactile. Le reste de la face est lumineux (LEDs RGB diffuses).
- Diffusion Lumineuse : Aucun "point chaud" visible. La lumière doit être diffuse, organique, et sembler émaner de la face.
- Étanchéité Visuelle : Aucun connecteur ni bouton visible de l'extérieur (charge par induction Qi, interaction par tactile et NFC).
- Taille : ~12 cm d'arête.
- Environnement : Bureau / QG intérieur (pas de contrainte IP spécifique pour la v1).
2. Architecture Globale (2 Tiers)
┌─────────────┐ ESP-NOW / BLE ┌──────────────────┐ WiFi / 4G ┌─────────────┐
│ CUBE(s) │ ◄─────────────────────► │ PASSERELLE │ ◄───────────────► │ SERVEUR │
│ ESP32-S3 │ Communication locale │ (Dock/Gateway) │ MQTT │ ops-devices │
│ Simple │ │ ESP32-S3 + WiFi │ │ Mosquitto │
└─────────────┘ │ Charge Qi TX │ └─────────────┘
└──────────────────┘
- Cube : Terminal autonome, pas de WiFi activé. Communication locale uniquement.
- Passerelle : Dock physique qui charge le cube (Qi) et fait le pont entre la communication locale et le réseau (WiFi/4G → MQTT).
- Serveur : ops-devices existant avec Mosquitto (MQTT), backend API, et interface web de configuration.
3. Disposition des Faces
| Face | Position | Rôle Matériel | Rôle Logiciel |
|---|---|---|---|
| 1 | Dessus | NFC (PN532) + Tactile + LEDs | Configurable (NFC + action) |
| 2 | Face avant | Tactile + LEDs | Configurable (action + statut) |
| 3 | Face droite | Tactile + LEDs | Configurable (action + statut) |
| 4 | Face arrière | Tactile + LEDs | Configurable (action + statut) |
| 5 | Face gauche | Tactile + LEDs | Configurable (action + statut) |
| 6 | Dessous | Récepteur Qi + LEDs (indicateur charge) | Statut batterie / charge |
Les rôles logiciels des faces 1 à 5 sont entièrement configurables depuis le serveur. L'utilisateur définit pour chaque face : l'action déclenchée, et l'animation associée à chaque état.
4. Système d'Actions Configurable
Chaque face (1-5) est un slot d'action configurable avec les propriétés suivantes :
4.1 Définition d'une Action
| Propriété | Description | Exemple |
|---|---|---|
label |
Nom affiché dans l'interface | "Redémarrer Nginx" |
icon |
Symbole sur la face physique (optionnel, gravé/imprimé) | 🔄 |
trigger |
Type d'interaction physique | tap, long_press, double_tap |
mqtt_topic |
Topic MQTT publié lors du déclenchement | ops/cube/{id}/action/face2 |
mqtt_payload |
Payload JSON envoyé | {"action": "restart", "target": "nginx"} |
confirm |
Nécessite une confirmation (double tap) | true / false |
4.2 États Visuels d'une Action
Chaque action possède des états visuels animés sur les LEDs de la face :
| État | Description | Animation par défaut |
|---|---|---|
idle |
En veille, aucune activité | Pulsation lente (couleur configurable) |
listening |
En écoute / surveillance active | Respiration douce (bleu) |
triggered |
Action déclenchée par l'utilisateur | Flash blanc → onde de couleur |
success |
Action exécutée avec succès | Vert fixe 3s → retour idle |
error |
Échec de l'action | Rouge clignotant 5s → retour idle |
alert |
Alerte reçue du serveur | Animation insistante (rouge pulsé) |
warning |
Avertissement reçu | Orange pulsé |
info |
Information reçue | Bleu flash unique |
4.3 Cas d'Usage Prioritaires
IT/DevOps — Monitoring & Actions Serveurs
- Face = un service (Nginx, Postgres, API, etc.)
- LED verte = service UP, rouge = DOWN
- Tap = voir le statut détaillé (clignotement code)
- Double Tap = redémarrer le service
- Alerte push = notification serveur DOWN
Défense — C2 (Command & Control)
- Face = un canal ou une zone d'opération
- LED = statut de la zone (vert = RAS, orange = vigilance, rouge = alerte)
- Tap = acquitter l'alerte
- Long Press = envoyer un signal prédéfini (point de ralliement, repli, etc.)
- NFC = identification opérateur / changement de profil
Coordination d'Équipes
- Face = une équipe ou un membre
- LED = disponibilité (vert = dispo, orange = occupé, rouge = indisponible)
- Tap = envoyer un "ping" à l'équipe
- Double Tap = demande de contact urgent
- Long Press = déclencher un timer partagé (briefing, pause)
5. Modes de Fonctionnement
A. Mode Veille (Idle)
- Pulsation lente ("respiration") sur les 6 faces, couleur selon l'état de chaque action configurée.
- Économie : Luminosité réduite à 10% après 5 minutes sans interaction.
- Deep Sleep : Après 30 minutes sans interaction ni message MQTT, le cube entre en deep sleep. Réveil par toucher ou message ESP-NOW.
B. Mode Interaction Tactile
- Tap : La face réagit par un flash blanc + exécute l'action
tapconfigurée. - Long Press (> 2s) : Exécute l'action
long_pressconfigurée. - Double Tap : Exécute l'action
double_tapconfigurée (avec confirmation si activée).
C. Mode NFC (Face du dessus uniquement)
- Tag d'identification : Change le profil utilisateur du cube (jeu d'actions différent).
- Tag d'action : Déclenche une action spécifique associée au tag.
- Smartphone : Le cube peut envoyer une URL (NDEF) ou recevoir des données de configuration.
- Cube-à-Cube : Approcher deux cubes = transfert du profil de configuration (WiFi, serveur, actions).
D. Mode Alerte (Push depuis le serveur)
- Le serveur envoie un message MQTT → la passerelle le relaie au cube en ESP-NOW/BLE.
- La face concernée passe en animation d'alerte.
- L'utilisateur acquitte en touchant la face → le cube envoie un ACK au serveur.
6. Gestion de l'Énergie et Alertes
- Autonomie cible : 12-24h en usage actif (LEDs à luminosité moyenne, communication ESP-NOW active).
- Charge Qi (sur la passerelle) : Quand posé sur le dock, les faces passent en orange pulsé → vert fixe à 100%.
- Charge USB-C : Accessible en ouvrant une face (maintenance uniquement).
- Alerte Batterie Faible : La face du dessous clignote en rouge sous 15%. Sous 5%, toutes les faces clignotent rouge.
- Sécurité Thermique : Si >45°C, le cube coupe les LEDs et émet un flash rouge toutes les 10s.
7. Configuration et Administration
Via l'interface web ops-devices
- Associer un cube (pairing BLE via la passerelle).
- Configurer les actions de chaque face (drag & drop).
- Créer des profils d'actions (IT, C2, Coordination) interchangeables via NFC.
- Voir l'état temps réel de chaque cube (batterie, température, dernière interaction).
- Mettre à jour le firmware (OTA via la passerelle).
Via la passerelle
- Appairage automatique des cubes à proximité.
- Relais transparent MQTT ↔ ESP-NOW.
- File d'attente des messages si le cube est en deep sleep.
- Logs locaux des interactions.
Partie 2 — Spécifications Techniques (v1.0 — ESP32-S3)
1. Architecture Matérielle du Cube
- MCU : ESP32-S3 (WiFi désactivé pour économie d'énergie, BLE + ESP-NOW actifs).
- Touch : 6 pads capacitifs natifs (pins TOUCH de l'ESP32-S3).
- NFC : 1x PN532 (face du dessus) — Communication I2C.
- LEDs : 6 lignes Data indépendantes (1 par face), LEDs WS2812B.
- Batterie : LiPo > 2000mAh (volume disponible dans un cube de 12cm).
- Charge : Qi 5V (face du dessous) + USB-C (maintenance).
- Jauge batterie : CW2015 (I2C).
- Thermique : NTC 10kΩ sur batterie, reliée à l'ESP32 et au TP4056.
- Charge controller : TP4056 avec protection.
2. Design des Faces ("Sandwich" à 2 étages)
Étage A : PCB "Bouchon" (Capteur)
- Face du dessus : PN532 (NFC) + pad capacitif central.
- Faces 2-5 : Pad capacitif central uniquement.
- Fixation : Plaque contre la membrane de 1.0mm, enfiché dans l'étage B via connecteurs 2.54mm.
Étage B : PCB "Anneau" (LEDs & Structure)
- LEDs : 12x WS2812B disposées en cercle, orientées vers l'extérieur.
- Connectivité : Reçoit le PCB Bouchon (femelle 2.54) et renvoie les signaux au PCB central (JST).
- Flux d'air : Large ouverture centrale (~30mm) pour la dissipation thermique.
3. Gestion de l'Énergie & Thermique
Alimentation & Charge
- Batterie : LiPo 3.7V — capacité cible 2000-3000mAh (le volume d'un cube de 12cm le permet).
- Charge Qi : Récepteur Qi 5V sur la face du dessous.
- Charge USB-C : Résistances 5.1kΩ, accès maintenance.
- Contrôleur : TP4056 avec protection (CHRG/STDBY).
Monitoring (I2C & Analogique)
- Jauge : CW2015 — suivi précis de la capacité via I2C.
- Thermique : NTC 10kΩ sur batterie, reliée à l'ESP32-S3 (ADC) et au TP4056 (coupure auto >45°C).
Estimation d'Autonomie
| Mode | Consommation estimée | Autonomie (2500mAh) |
|---|---|---|
| Deep Sleep | ~10µA | ~28 000h (3+ ans) |
| Veille (LEDs 10%) | ~50mA | ~50h |
| Actif (LEDs 50% + ESP-NOW) | ~150mA | ~16h |
| Actif max (LEDs 100% + BLE) | ~250mA | ~10h |
4. Mapping des Pins (ESP32-S3)
| Fonction | Pin GPIO | Détails |
|---|---|---|
| LEDs Face 1 (dessus) | GPIO 1 | Data WS2812B |
| LEDs Face 2 (avant) | GPIO 2 | Data WS2812B |
| LEDs Face 3 (droite) | GPIO 4 | Data WS2812B |
| LEDs Face 4 (arrière) | GPIO 5 | Data WS2812B |
| LEDs Face 5 (gauche) | GPIO 6 | Data WS2812B |
| LEDs Face 6 (dessous) | GPIO 7 | Data WS2812B (indicateur charge) |
| I2C SDA | GPIO 8 | Bus commun (PN532 + CW2015) |
| I2C SCL | GPIO 9 | Bus commun |
| Touch Face 1 | GPIO 10 | Capacitif natif ESP32-S3 |
| Touch Face 2 | GPIO 11 | Capacitif natif |
| Touch Face 3 | GPIO 12 | Capacitif natif |
| Touch Face 4 | GPIO 13 | Capacitif natif |
| Touch Face 5 | GPIO 14 | Capacitif natif |
| Touch Face 6 | GPIO 21 | Capacitif natif (optionnel) |
| TP4056 CHRG | GPIO 15 | État de charge |
| TP4056 STDBY | GPIO 16 | Charge terminée |
| NTC (Temp) | GPIO 17 (ADC) | Surveillance thermique |
| USB D- | GPIO 19 | Programmation & Debug natif |
| USB D+ | GPIO 20 | Programmation & Debug natif |
5. Structure Mécanique (OpenSCAD)
- Dimensions : Cube de ~12 cm d'arête.
- Chambre de Diffusion : "Ring Shroud" de 6mm entre les LEDs et la paroi extérieure.
- Membranes Tactiles : Épaisseur réduite à 1.0mm au centre de chaque face.
- Système de Clips : Ergots type baïonnette pour verrouiller le PCB Anneau.
- Circulation d'air : Effet cheminée par les centres évidés des faces.
- Matériau : Impression 3D (PLA/PETG) pour la petite série (5-10 unités).
- Finition : Peinture grise mate + vernis de protection.
6. Stack Logicielle (PlatformIO / Arduino Framework)
| Composant | Librairie / Technologie | Rôle |
|---|---|---|
| Animations LEDs | FastLED | Gestion des 6 sorties WS2812B |
| NFC | Adafruit PN532 | Lecture/écriture tags NFC (I2C) |
| Communication locale | ESP-NOW (natif) | Liaison cube ↔ passerelle |
| BLE | NimBLE-Arduino | Configuration initiale, pairing |
| OTA | Via passerelle (ESP-NOW) | Mise à jour firmware sans fil |
| Jauge batterie | CW2015 driver | Monitoring SOC (I2C) |
| Sécurité thermique | Custom | Priorité aux alertes NTC + SOC |
| Persistance config | Preferences (NVS) | Stockage local des actions/profils |
Structure MQTT (Topics)
ops/cube/{cube_id}/status → Statut général (batterie, temp, uptime)
ops/cube/{cube_id}/face/{n}/state → État visuel de la face n
ops/cube/{cube_id}/face/{n}/action → Action déclenchée par l'utilisateur
ops/cube/{cube_id}/config → Configuration des actions (serveur → cube)
ops/cube/{cube_id}/config/ack → Acquittement de configuration
ops/cube/{cube_id}/alert → Alertes push (serveur → cube)
ops/cube/{cube_id}/alert/ack → Acquittement d'alerte
ops/cube/{cube_id}/ota → Commande de mise à jour OTA
ops/cube/{cube_id}/ota/status → Statut de la mise à jour
Partie 3 — Passerelle (Gateway/Dock)
1. Rôle
La passerelle est le pont entre les cubes (communication locale) et le serveur (réseau IP). Elle sert également de station de charge Qi.
2. Matériel
- MCU : ESP32-S3 (WiFi activé) ou ESP32-C6 (WiFi + Thread).
- Communication locale : ESP-NOW (cube ↔ passerelle).
- Communication réseau : WiFi → MQTT vers le serveur ops-devices.
- Charge : Émetteur Qi 5V intégré dans le dock.
- Connectivité optionnelle : Module 4G (SIM7600) pour les déploiements sans WiFi.
- Alimentation : USB-C 5V (branchée en permanence).
3. Fonctionnalités Logicielles
- Relais MQTT ↔ ESP-NOW : Traduction transparente des messages.
- File d'attente : Stockage des messages si un cube est en deep sleep, livraison au réveil.
- Multi-cube : Gestion de 1 à N cubes simultanément.
- OTA Proxy : Télécharge le firmware depuis le serveur, le transmet au cube en ESP-NOW.
- Watchdog : Détection de perte de connexion (cube ou serveur) avec alertes.
- Logs : Historique local des interactions (SPIFFS/LittleFS).
Partie 4 — Feuille de Route
v1.0 — MVP (ESP32-S3)
- Cube fonctionnel avec 6 faces LED + tactile + 1 NFC.
- Passerelle ESP-NOW → WiFi → MQTT.
- Configuration des actions via l'interface web ops-devices.
- Charge Qi + USB-C.
- Firmware OTA via passerelle.
- Cible : 5-10 unités, budget 50-100€/cube (hors passerelle).
v1.1 — Améliorations
- Synthèse vocale (petit haut-parleur, annonce des actions/alertes).
- Synchronisation multi-cubes (actions coordonnées via ESP-NOW).
- Profils NFC (changement de jeu d'actions par tag).
v2.0 — Version Souveraine (STM32WB)
- Remplacement ESP32-S3 par STM32WB (STMicroelectronics, français).
- Communication Thread/Matter native.
- Touch via contrôleur externe (AT42QT1070).
- OTA via BLE (STM32 OTA DFU).
- Certification et durcissement pour usage Défense.
- Aucune technologie non-européenne dans la chaîne.
BOM Estimatif (v1.0 — par cube)
| Composant | Référence | Qté | Prix unitaire | Total |
|---|---|---|---|---|
| ESP32-S3-WROOM-1 | Espressif | 1 | ~4€ | 4€ |
| WS2812B (LEDs) | — | 72 (12/face) | ~0.05€ | 4€ |
| PN532 (NFC) | NXP | 1 | ~3€ | 3€ |
| TP4056 (Charge) | — | 1 | ~0.50€ | 1€ |
| CW2015 (Jauge) | CellWise | 1 | ~1€ | 1€ |
| NTC 10kΩ | — | 1 | ~0.10€ | 0€ |
| Batterie LiPo 2500mAh | — | 1 | ~8€ | 8€ |
| Récepteur Qi | — | 1 | ~3€ | 3€ |
| PCBs (6 anneaux + 6 bouchons + central) | JLCPCB | 13 | ~1€ | 13€ |
| Connecteurs JST + 2.54mm | — | lot | ~3€ | 3€ |
| Boîtier impression 3D | PLA/PETG | 1 | ~5€ | 5€ |
| USB-C + passifs | — | lot | ~2€ | 2€ |
| TOTAL | ~47€ |
Budget restant (~3-53€) disponible pour la finition, les imprévus, et l'outillage.