Un Pong multijoueur où l'écran est un Minitel de 1982 et les manettes sont les téléphones des joueurs. Pas d'app à installer : on scanne le QR code, on touche l'écran, on joue.
Du vieux matériel, du temps-réel, et zéro installation côté joueur.
Un terminal Videotex des années 80, ressorti du placard. Le jeu s'affiche en 40×25 caractères verts, piloté par un ESP32 en liaison série.
Une web-app PWA tactile. On scanne le QR code affiché sur le Minitel, et le smartphone devient une raquette. Aucune application à installer.
Entre les manches, une question surprise. Le premier à répondre juste gagne une raquette agrandie pour l'échange suivant.
Points, séries de victoires et prestige : un classement général retrace les exploits de toute la soirée.
Tenir 20+ FPS sur un bus à 480 octets/seconde.
Un Minitel communique en Videotex à 4800 bauds — soit 480 octets par seconde. Effacer et redessiner l'écran entier à chaque frame plafonne à ~2 FPS. La solution : un renderer différentiel qui ne retransmet que les caractères qui changent (la balle, les raquettes, le score), laissant le reste de l'écran statique.
Stratégie A — full clear : 2,2 FPS → inacceptable Stratégie B — diff simple : 20 FPS → limite acceptable Stratégie C — diff optimisé: 22 FPS → production ✓
Le serveur est la seule source de vérité sur l'état du jeu : ESP32 et téléphones sont des clients stateless qui reçoivent des snapshots et affichent. Un joueur se déconnecte sans interrompre la partie ; l'ESP32 qui redémarre se resynchronise au message suivant.
Trois couches découplées, reliées par WebSocket et liaison série.
┌───────────────────────────────────────────┐
│ Serveur (cloud) │
│ Machine à états IDLE → WAITING → PLAYING │
│ Moteur physique 30 Hz · Quiz · Classement│
└───────────────┬───────────────┬─────────────┘
WebSocket │ │ WebSocket
┌───────────────▼──┐ ┌─────▼──────────────┐
│ ESP32 │ │ Smartphone (PWA) │
│ WiFi + renderer │ │ React · tactile │
│ différentiel │ └────────────────────┘
└────────┬──────────┘
Série 4800 bauds
┌────────▼──────────┐
│ Minitel 1982 │
│ Videotex 40×25 │
└────────────────────┘
| Composant | Rôle | Stack |
|---|---|---|
server/ | Serveur de jeu, broker WebSocket, SQLite | Bun, Hono, TS |
webapp/ | Manette tactile PWA | React 18, Vite, TS |
esp32/ | Firmware affichage Minitel | C++, Arduino |
simulator/ | Benchmark des stratégies de rendu | Node.js |
Du matériel à la partie, sans fer à souder.
Modèle 1, 1B ou 2 avec prise péri-informatique (DIN 5 broches à l'arrière).
La pièce qui rend le projet reproductible : elle s'enfiche sur la prise DIN et expose l'ESP32 en USB, sans câblage maison. Vendue prête à l'emploi par iodeo ↗.
Déploie le serveur (image Docker sur un VPS, ou en local) : c'est lui qui pilote le jeu. Un serveur par Minitel — l'état de la partie vit en mémoire dans une seule instance, alors deux Minitels branchés sur le même serveur partageraient le même lobby. Note son URL pour l'étape suivante.
Copier config.h.example, renseigner WiFi et l'URL de ton serveur, puis téléverser MinitelPong.ino depuis l'Arduino IDE.
Brancher le dongle, allumer le Minitel : le QR s'affiche. Les joueurs le scannent et la partie démarre à deux.
Tourner sans supervision pendant une AG, une soirée, un stand.
Watchdog WiFi (60 s) et reconnexion automatique avec retry.
Reconnexion WebSocket avec backoff exponentiel (1 s → 30 s), keepalive toutes les 20 s.
Timeout de déconnexion configurable, machine à états qui revient proprement en IDLE.
Déployable en une image Docker sur un VPS (Coolify), sans dépendance à un service tiers.