Préambule

Tout est parti d’un truc tout bête : j’ai récupéré un vieux PC tactile qui traînait. Vous savez, ce genre de matériel qu’on n’ose pas jeter parce que « ça peut toujours servir », mais qui prend la poussière sur une étagère depuis des mois.
Bon, OK, là, il ne prenait pas la poussière, il m’a été donné par un ami qui a dû le changer car les utilisateurs avaient explosé le bouton power.
En fait, le bouton est carrément défoncé et ils ont même arraché un bout de la carte mère dans l’histoire 😮
Diantre (spéciale dédicace à Marie-Charlotte), les bourrins !!!
Bon,
Bref,
L’idée de départ était simpliste :
Est-ce qu’on peut faire tourner « un petit jeu tactile » dessus, histoire de lui redonner une utilité ?
Rien de plus.
(oui, j’avais pensé à un photobooth tactile avec un APN Reflex qu’on m’a donné, mais j’aimais l’idée d’un truc nouveau ; d’autant que j’étais dans un contexte particulier)
Mise en contexte
Il faut noter que l’idée de base (et ses évolutions) ont germé alors que j’étais hors de mon domicile, juste avec un PC portable de récup (celui qui sert de station nomade) et un téléphone portable.
Il faut aussi dire que j’étais désœuvré puisque j’avais fini mon bouquin et que je ne trouvais pas la suite (petite ville avec justes 2 librairies minuscules).
Vif du sujet
On est donc avec un gars (moi) et un ennui (Non, Florian, je ne suis pas hyperactif ; je n’aime pas rester sans rien faire ; nuance) qui ont dû apprendre à faire face au temps.
Du coup, j’ai mené ce projet en 2 temps :
Idée(s) ; Réflexion ; Premiers tests hors de chez moi.
Puis mise en pratique ensuite.
Sauf que voilà, comme d’habitude chez moi, le « petit truc simple » a fini par devenir un « petit truc simple, mais un peu moins simpliste/minimaliste pour aboutir à un truc avec six jeux, un menu façon borne d’arcade, une IA qui joue au Puissance 4, et une installation Debian from scratch sans le moindre bureau graphique ».
Bref, du Alban classique 😀
Le cahier des charges (qui a un peu gonflé en cours de route)
Comme toujours, ce qui commence petit finit par s’étoffer.
Voici le départ :
Faire un jeu tactile pour recycler un vieux PC tactile basique.
Voici où j’en suis arrivé :
- Le PC doit démarrer, se connecter tout seul, et afficher directement l’écran de la borne en plein écran — pas de bureau, pas de barre des tâches, pas de souris qui traîne.
- Le tactile doit fonctionner nativement, sans calibration à rallonge.
- Un écran d’accueil façon « choisis ton jeu », avec plusieurs tuiles.
- Plusieurs jeux, pas un seul : de quoi occuper un peu tout le monde selon l’humeur (réflexe, réflexion, mémoire…).
- Le tout doit tenir sur une Debian la plus légère possible — pas question d’installer tout un environnement de bureau pour au final ne montrer qu’un navigateur en plein écran. D’autant que le proc est limité et la RAM restreinte.
- L’écran ne doit jamais afficher un vilain écran noir de veille sauvage (le classique bug qui fait peur un dimanche après-midi), mais il ne faut pas non plus le laisser cramer bêtement le rétroéclairage en continu.
- Et, cerise sur le gâteau : autant que ce soit joli, cohérent visuellement, et pas juste « des boutons HTML basiques ».
In fine, six jeux ont fini par sortir du chapeau : Lucioles (un jeu de réflexe où on attrape des lucioles avant qu’elles ne s’envolent ; pure création de Claude… J’avais juste demandé un jeu tactile simple ; il a inventé des lucioles bioluminescentes dans une forêt nocturne, allez comprendre ; aussi tarée que moi cette IA), Morpion (duo ou contre l’ordinateur), Memory, Serpent, 2048, et Puissance 4 (duo ou contre une IA).
01 – Le choix de l’OS : Debian minimaliste, sans bureau
Pas de blabla ici : juste une Debian, en installation netinst, sans rien cocher côté environnement de bureau. Juste le strict nécessaire (« utilitaires standards du système ») + un serveur SSH pour pouvoir intervenir à distance sans avoir à rebrancher clavier et souris à chaque fois.
Le principe : pas de GNOME, pas de Xfce, rien. Juste un serveur X minimal (Xorg) qui, à la connexion, lance directement Chromium en mode kiosk. Pas de bureau à cacher puisqu’il n’existe tout simplement pas.
sudo apt install --no-install-recommends \
xserver-xorg xserver-xorg-input-libinput xinit chromium
Ensuite, il faut un utilisateur dédié (kiosk) qui se connecte tout seul au démarrage, sans passer par un écran de login. Ça se joue en surchargeant le service getty du premier terminal virtuel :
sudo mkdir -p /etc/systemd/system/getty@tty1.service.d
sudo tee /etc/systemd/system/getty@tty1.service.d/override.conf <<'EOF'
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin kiosk --noclear %I $TERM
EOF
sudo systemctl daemon-reload
Une fois connecté automatiquement, encore faut-il que X démarre tout seul. C’est le rôle du .bash_profile de l’utilisateur kiosk, qui lance startx, mais seulement si on est bien sur ce fameux tty1 (histoire de ne pas déclencher X si jamais on se connecte en SSH avec ce même compte) :
cat > /home/kiosk/.bash_profile <<'EOF'
if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then
exec startx
fi
EOF
Et enfin, le .xinitrc, qui désactive toute mise en veille et ouvre Chromium en plein écran directement sur la page d’accueil :
cat > /home/kiosk/.xinitrc <<'EOF'
xset s off
xset s noblank
xset -dpms
xset dpms 0 0 0
exec chromium --kiosk --incognito --noerrdialogs --disable-infobars \
--no-first-run --disable-translate \
file:///home/kiosk/borne/accueil.html
EOF
Résultat : on branche, ça « boote », ça arrive direct sur l’écran d’accueil de la borne. Aucune intervention humaine nécessaire, exactement comme pour n’importe quelle vraie borne d’arcade qui se respecte.
02 – Le tactile : la bonne nouvelle et la mauvaise
La bonne nouvelle d’abord : sur la grande majorité des écrans tactiles USB depuis les années 2010 (norme HID multitouch), le pilote est déjà dans le noyau Linux. Rien à installer, ça fonctionne « out of the box » avec juste xserver-xorg-input-libinput en dépendance de Xorg.
La mauvaise nouvelle, découverte un peu plus tard : sur un écran tactile de type caisse enregistreuse (mon modèle a un boîtier qui ressemble furieusement à ceux qu’on voit derrière une caisse de supérette), il y a souvent une minuterie de veille intégrée à l’écran lui-même, dans son menu OSD, complètement indépendante du PC. Peu importe à quel point on peaufine xset côté logiciel, si cette minuterie hardware est active, l’écran coupe quand même.
Moralité : si votre écran passe en noir malgré des réglages logiciels apparemment corrects, regardez les boutons physiques du boîtier avant de chercher plus loin.
Pour moi, comme je ne dispose pas de boutons physiques, cette piste reste à creuser.
03 – L’architecture des jeux : un dossier, un thème commun
Plutôt que six fichiers HTML totalement indépendants et incohérents visuellement, j’ai opté pour une base commune :
borne/
├── accueil.html → écran de menu avec les 6 tuiles
├── style.css → thème visuel partagé
├── common.js → script partagé (ciel étoilé, veille douce...)
├── lucioles.html
├── morpion.html
├── memory.html
├── serpent.html
├── 2048.html
├── puissance4.html
└── images/ → icônes emoji locales (voir crédits)
Thème visuel : un fond façon nuit étoilée, une police arrondie et sympathique pour les titres, une couleur d’accent différente par jeu (or pour Lucioles, cyan pour le Morpion, violet pour le Memory, vert pour le Serpent, orange pour 2048, rouge pour Puissance 4). Histoire que chaque tuile de l’accueil se reconnaisse d’un coup d’œil.
04 – Le Puissance 4 qui joue (presque) tout seul
Pour Puissance 4 comme pour le Morpion, l’idée d’un mode Solo contre l’ordinateur s’est imposée assez vite — utile quand il n’y a qu’une seule personne devant la borne.
Le Morpion, sur une grille 3×3, se prête très bien à un algorithme minimax classique : l’ordinateur explore la totalité des coups possibles et ne perd jamais.
Pour Puissance 4, la grille (7×6) est trop grande pour tout explorer à fond, donc minimax avec élagage alpha-bêta et une profondeur limitée (4 coups d’anticipation) — assez costaud pour donner du fil à retordre, mais pas insurmontable, et surtout assez léger en calcul pour ne pas ramer sur un PC qui a quelques années.
05 – Les bugs d’affichage (overlay caché et icônes absentes)
Voici deux bugs amusants rencontrés en cours de route.
J’avais tout testé sur mon PC en local et sur mon vieux smartphone de récup (iPhone 11 Pro) via un de mes hébergements web (puisque tout est en html).
J’avais donc déjà corrigé pas mal de trucs.
Mais j’ai eu confirmation d’un des bugs sur le PC tactile :
Le premier :
Sur le 2048, l’écran de fin de partie (« Perdu ! » ou « Bravo ! ») se retrouvait caché derrière les tuiles du jeu.
Pas un souci avec mon tel.
La cause ?
Cet écran de fin était présent dans le code avant les tuiles, et les tuiles étaient ajoutées dynamiquement après lui à chaque coup.
Dans une page web, à défaut d’indication contraire, ce qui arrive en dernier dans le code s’affiche par-dessus le reste.
C’est con, hein ?!? 😀
Oui, c’est le genre d’erreur classique.
Correction :
Un écran de fin totalement séparé, empilé au-dessus de tout le reste par construction, comme sur les 5 autres jeux.
Le second :
Plus perfide ! Sur l’écran d’accueil et dans le Memory, toutes les icônes s’affichaient en petits rectangles vides (des « tofu », comme on les appelle dans le jargon).
Rien à voir avec un bug de code cette fois : une Debian minimaliste n’a tout simplement aucune police d’émojis installée (logique, elle n’a même pas de bureau). Plutôt que d’aller installer une police d’émojis sur le système, j’ai préféré rapatrier les icônes en local, sous forme d’images SVG (Twemoji), rangées dans un dossier images/. Zéro dépendance système, ça fonctionne à l’identique sur n’importe quelle Debian, même hors-ligne.
C’est vraiment le même principe qu’une bête page web où les images sont servies par un dossier spécifique.
06 – La veille douce (parce qu’un écran, ça s’use, mais ça se rassure aussi)
Un écran tactile professionnel n’a — sauf exception — rien à craindre à rester allumé en continu (à la différence d’une dalle OLED, une dalle LCD classique ne « marque » pas).
Reste que ménager un peu le rétroéclairage n’est jamais une mauvaise idée sur une borne destinée à tourner des heures durant sans surveillance.
La solution retenue : pas de vraie extinction, mais une veille douce logicielle. Après quelques minutes sans le moindre toucher, l’écran s’assombrit avec un message « Touchez l’écran » qui pulse doucement. Le premier toucher réveille instantanément (sans déclencher l’action du dessous — il faut toucher une deuxième fois pour vraiment agir). Codé en une trentaine de lignes de JavaScript dans le fichier partagé common.js, donc actif sur les six jeux d’un coup.
Conclusion
Comme souvent avec ce genre de projet, le plus long n’a pas été d’écrire le code en lui-même, mais tout ce qui gravite autour : établir un cahier des charges + faire les tests en grandeur réelle + écrire l’article.
J’ai vraiment procédé comme pour ce qui est de la méthode agile : par itérations avec livraisons étape par étape.
Un vieux PC tactile récupéré, un cahier des charges qui n’a cessé de grossir, et au final une petite borne d’arcade maison qui démarre toute seule et qu’on peut poser n’importe où.
Rien de révolutionnaire, mais c’est bien tout l’intérêt de ce genre de bidouille : partir de pas grand-chose, et se retrouver avec un objet fini et fonctionnel.
Juste pour le fun ?
Oui, juste pour le fun !
Note importante
Petite particularité de ce projet-là par rapport à mes bidouilles habituelles : je l’ai mené en grande partie en dialoguant avec Claude (l’IA d’Anthropic), plutôt qu’en codant tout seul dans mon coin comme d’ordinaire.
Je le précise volontiers ici, par pure transparence.
Oui, le fond de la démarche (cahier des charges, tests, décisions, corrections/adaptations à la main ; lignes directrices) reste le mien, mais la quasi totalité du code HTML/CSS/JS et du script d’installation a été écrite avec cette assistance.
C’est une manière différente de bidouiller, mais c’est de la bidouille quand même.
Je précise que je ne suis pas pour les IA, mais je ne suis pas contre.
Je suis plutôt contre leur usage « sans discernement » et « juste pour le fun ».
Pour le reste, je vois les IA comme des outils : ça ne doit pas faire le job, mais ça peut grandement aider.
Un peu comme des outils style perceuse/visseuse ou une calculatrice scientifique.
Et attention, les IA font des erreurs et inventent des trucs (il y a un article sympa dans un récent Sciences et Vie Junior là-dessus d’ailleurs).
Bon, bref, je m’égare et je parle tout seul (sauf si on admet que je ne suis pas seul dans ma tête, mais, là, je ne suis pas sûr que nous soyons, lui et moi, en accord sur ce concept).
Crédits
- Icônes : Twemoji, par Twitter, Inc, sous licence CC-BY 4.0.
- Polices : Fredoka et Nunito, via Google Fonts, licence SIL Open Font License.
- 2048 : concept original du jeu par Gabriele Cirulli, sous licence MIT — la version présentée ici est une réécriture, mais l’idée lui revient entièrement.
- Assistance à la conception et au code : Claude, d’Anthropic — pour l’essentiel du HTML/CSS/JS des jeux, du script d’installation Debian, et des multiples allers-retours de débogage.
N’hésitez pas à laisser un commentaire si vous tentez l’aventure sur votre propre vieux PC tactile.