Piloter un train miniature en Common Lisp



Tags : #commonlisp #networking

Créé le 23 avril 2026.

Le modélisme ferroviaire et Common Lisp — deux sujets qui se croisent rarement…

Réseau ferroviaire miniature

La Roco Z21 est une centrale de commande numérique pour le modélisme ferroviaire. Elle se branche sur le réseau local, écoute sur le port UDP 21105, et parle un protocole binaire. Locomotives, aiguillages et alimentation des voies se pilotent en lui envoyant les bons octets.

Le matériel Z21 — routeur Wi-Fi, centrale de commande, télécommande, alimentation

Le protocole est documenté, et n’importe quel langage doté d’un socket UDP peut piloter le réseau. Common Lisp a paru tout indiqué — envoyer une expression depuis le REPL et observer le train réagir est exactement le type de boucle interactive pour lequel ce langage est pratique.

cl-z21 en est le résultat : un modeste projet personnel de 2018 couvrant un sous-ensemble cohérent du protocole — informations système, alimentation des voies, aiguillages, commande des locomotives et de leurs fonctions, lecture de CV en mode service, et écoute des messages diffusés.

Une session type ressemble à :

(z21-set-track-power-on :verbose t)
(z21-set-loco-drive 3 64 :direction 1 :verbose t)   ; loco 3, marche avant, vitesse 64/127
(z21-set-loco-function 3 0 #x01 :verbose t)         ; allumer le phare
(z21-switch-turnout 0 :verbose t)

Chaque forme encode ses arguments en un paquet UDP, l’envoie, attend la réponse, et affiche le résultat décodé.

Côté interne, un petit registre de structures coder — une par commande — sait transformer des arguments en octets. Le décodage est symétrique : les structures decoder identifient les paquets entrants par leur préfixe et en extraient les données. La fonction z21-interact fait le lien entre les deux.

Seule dépendance d’exécution : usocket, installé via Quicklisp. Testé avec SBCL sous Windows.