BIP2026 – Miroir Miroir

Quatre machines te jugent, quatre étiquettes en témoignent. Colle-les dans ton passeport : aucune douane ne l’acceptera. Mais toi, tu sauras enfin qui tu es (à peu près).

Il y a quelques mois, on m’a posé une question simple : « Tu saurais bricoler des trucs interactifs pour la BIP ? » J’ai dit oui. Évidemment…

Résultat : quatre installations pour Miroir Miroir, l’exposition de la Biennale de l’Image Possible 2026, à Liège, du 17 octobre au 13 décembre. Quatre bornes avec écran tactile, des caméras cachées un peu partout, une Kinect (2010) sortie du placard et quatre imprimantes d’étiquettes. Le tout est développé au Liège Hackerspace.

Le principe est le même partout : vous participez, la machine vous « regarde juge », et vous repartez avec une étiquette à coller dans votre passeport de visite. Un miroir, mais imprimé.

Note : cet article est le « making-of technique », brut de décoffrage. Les photos et les captures montrent le projet à nu, sans habillage scénographique. Une page dédiée arrivera bientôt sur /art : elle présentera les installations telles qu’elles sont montées dans l’exposition, avec leur mise en scène.

Le socle commun

Les quatre bornes ont le même squelette. Chacune fait tourner une app web statique dans Chromium en mode kiosk, sur un écran tactile Elo en 1024×768, avec une scène fixe mise à l’échelle. Pas de framework, pas de build : du HTML, du CSS et du JS, point.

  • Autorun : à l’ouverture de session, kiosk.sh lance Chromium en --kiosk, et une boucle le relance s’il plante. Parce que oui, il plantera.
  • Impression silencieuse : un petit service Python (print_server.py) reçoit l’étiquette, la passe en PDF et l’envoie à CUPS. Pas d’aperçu à l’écran, pas de boîte de dialogue.
  • Imprimante : une LW650XL PRO qui parle TSPL, avec son pilote CUPS. Les étiquettes font 59×102 mm.
  • Bandeau « petite pause technique » sur l’accueil, dès qu’une imprimante, une caméra ou la Kinect ne répond plus.
  • Une vue de réglage cachée donne accès au debug, au redémarrage et à l’extinction propres.

01. Le vrai test psychométrique

Le plus sage des quatre. Il tourne sur un Raspberry Pi 4 : huit questions et un résultat tiré parmi quatre, imprimé sur l’étiquette. Le contenu est rédigé dans un tableur Excel, et un script Python (build_content.py) le transforme en content.js. Les correcteurs n’ont jamais à toucher au code.

02. Des yeux derrière la tête

Le visiteur appuie sur « Prendre une photo ». Quatre caméras IP Tapo C110, cachées dans la pièce, déclenchent toutes en même temps.

Le piège : ces caméras n’ont pas d’URL de snapshot, seulement un flux RTSP. Et, un navigateur ne lit pas du RTSP, surtout derrière un mot de passe (bonjour CORS). La solution est un petit server.py qui sert l’app et relaie /snap/1…4 : à chaque appel, ffmpeg extrait une image du flux. Une caméra injoignable est simplement ignorée, et la borne affiche discrètement la panne.

Debug : Des yeux derrière la tête

03. Vide ton sac

Un vrai faux contrôle de sûreté d’aéroport. Le visiteur vide ses poches dans un bac et le glisse sous le scanner. L’écran affiche le contenu en « rayons X » et la borne imprime une étiquette AUTORISÉ.

La V1 utilisait un capteur GPIO et une Pi Camera sur un Raspberry Pi 4. La version finale tourne sur un mini PC avec une webcam USB fixée au-dessus du bac, et OpenCV qui :

  1. repère le bac grâce à sa bordure orange,
  2. attend que le bac entier soit visible et que plus rien ne bouge dedans pendant 1,5 s,
  3. recadre la photo sur l’intérieur du bac,
  4. garde une empreinte du contenu pour ne pas scanner deux fois le même bac.

Bonus : les néons faisaient défiler des bandes sombres sur l’image, donnant des faux positifs. Solution : passer la webcam en anti-scintillement 50 Hz.

04. Re-Kinect-Toi

Retour aux vieilles recettes : une Kinect de 2010, bricolée pour son alimentation.

Le visiteur se place sur une croix au sol, 3, 2, 1, puis il a 10 secondes pour bouger. Ses mains, ses pieds et sa tête tracent une signature à l’encre : trait épais quand le geste est lent, fin quand il est rapide.

Kinect v1 → USB → kinect_bridge.py → WebSocket → Page kiosk
  • Matériel : une Kinect Xbox 360 (bricolée avec un adaptateur secteur 12 V) sur un mini PC Core i5.
  • Pilote : libfreenect. Il faut blacklister gspca_kinect, le pilote webcam du noyau, qui lui pique le périphérique.
  • Squelette : MediaPipe Pose sur la caméra couleur. La profondeur sert à mesurer la distance et à isoler la personne du décor, qu’on « apprend » une fois la salle vide.
  • Repli : sans squelette, le pont devine la tête, les mains et les pieds à partir de la silhouette en profondeur. Ça marche même dans le noir.

Un dernier mot honnête

Vue simulée des étiquettes

Pour être franc, sur ce projet, j’étais seul, avec quatre bornes à livrer et des deadlines qui ne se négociaient pas. Alors, je me suis laissé emporter par la vibe… avec Claude comme binôme. Le pont Kinect, le relais RTSP, la détection du bac en OpenCV, le pilote d’imprimante TSPL… Seul, je n’aurais jamais bouclé tout ça dans les temps.

Et le plus surprenant, c’est que j’ai appris beaucoup de petites choses en route : libfreenect, MediaPipe, les caprices du 50 Hz, des finesses CUPS… Le code n’est pas parfait, mais il tourne bien, il est documenté, et je sais ce qu’il fait.

L’IA n’a pas fait le projet à ma place. Elle m’a permis de le faire tout court.


Tout le code est sur GitHub : iooner/bip2026-modules.

Merci à Manon, Louise et Marc des Chiroux pour leur patience et pour leur confiance, renouvelée et un brin kamikaze.

Autopsie de ma première PiCam extérieur

Autopsie de ma première PiCam extérieur. Afin de la protéger de la pluie, j’avais fait le choix d’utiliser un phare halogène extérieur premier prix du brico du coin. Et, y installer un Raspberry Pi modèle B rev1 (oui, c’est plutôt vieux, mais c’était plutôt solide).

Le projet a été fait le plus KISS possible (and dirty). Un morceau de plat d’aluminium comme support, des colliers de serrage, utilisation du presse-étoupe d’origine pour l’alimentation électrique et l’ajout d’un autre pour le câble réseau. Non, pas de POE.

La PiCam fixée à la vitre (très épaisse) avec de la colle à chaud, la vitre préalablement poncée et peinte en noir en conservant une partie intacte pour laisser la caméra, voir l’extérieur.

Niveau logiciel, j’ai utilisé motioneyeOS https://github.com/ccrisan/motioneyeos/wiki. De souvenir j’ai dû procéder à un seul changement de la SD en 4 ans de service.

J’ai abandonné cette solution pour une question de qualité d’image. Cette caméra avec pour rôle principal de prendre des photos du ciel de façon régulière. Elle est maintenant remplacée par une caméra IP extérieur 2K.

J’espère que cet article vous aura peut-être donné des idées sur comment installer votre projet en extérieur de façon simple et pas cher :).

Zigbee 2 MQTT – Frontend

Zigbee2MQTT propose maintenant une interface web simplifiant pas mal le débug, obtenir le détail de chaque point de votre réseau, visualiser une carte du mesh, l’appairage de vos appareils…


« Installer » Frontend

  1. Commencez par une mise à jour de votre Zigbee2MQTT,
  2. Ouvrez configuration.yaml en édition
nano /opt/zigbee2mqtt/data/configuration.yaml
  1. Ajouter la configuration de Frontend en fin de fichier de configuration
frontend:
  # Port de l'interface web (8080 par défaut)
  port: 8080
  # Sur quelle ip doit il écouter ? (0.0.0.0 par défaut toutes)
  host: 0.0.0.0
  # Optionnel, ajouter un mot de passe pour protéger votre interface web.
  auth_token: motdepasse
  1. Si vous avez suivi le guide d’installation officiel ou mon article, relancez Zigbee2MQTT avec la commande sudo systemctl restart zigbee2mqtt
  2. Voilà ! Rendez-vous sur votre interface web.


Sources