Ca y est, j'ai enfin trouvé. Perturbé depuis des lustres par la norme DCC sur les accessoires, je me languissais de comprendre pourquoi les décodeurs sur Arduino comme celui de
mynabay refusaient de me donner un numéro d'accessoire correct, conforme à celui demandé à ma Mobile Station 2. Si j'active l'accessoire 317, c'est l'id 80 qui sort dans Dcc_monitor ! Si c'est l'accessoire 22 que j'active, c'est 6 qui sort ! Étrange...
Pour comprendre, j'ai fait du rétro engineering... J'ai essayé de faire coller la réalité des valeurs reçues à ce que je voulais obtenir. Cela ajouté à la recherche google-isée forcenée, et la lumière fût !
D'abord, voyons ce que dit la norme sur le site
NMRA. Un paquet de commande d'accessoire dans sa forme la plus simple se décrit comme suit:
11111111 0 10AAAAAA 0 1aaaCDDD 0 xxxxxxxx 1
Le code 11111111 donne le départ du paquet, ensuite les groupes de huit bits, les octets, sont séparés par des zéros, le 1 termine le paquet. Le dernier octet xxxxxxxx n'est que le xor (ou exclusif)) des deux précédents. Si le décodeur n'obtient pas le même résultat par son propre calcul que celui reçu, le paquet ne doit pas être utilisé. C'est un mode de contrôle. La partie intéressante pour nous est dans les deux octets du centre.
L'id du décodeur est donné par aaaAAAAAA où aaa est bien la partie des bits 4 à 6 du second octet (En binaire, la numérotation des bits part de 0 à partir de la droite...) , mais complémenté à deux. Ce qui signifie que chaque 1 est remplacé par un 0 et inversement. Pourquoi cette bizarrerie ? Parce qu'en DCC, un 0 est représenté sur les rails par un signal deux fois plus long qu'un 1, et que la plupart du temps ces trois bits sont inutilisés, donc à 0. Pour réduire la durée des paquets, mieux valait avoir des bits à 1 qu'à 0 ! Le bit C active ou non l'accessoire. Par exemple pour un accessoire impulsionnel comme un aiguillage, tant que le doigt de l'utilisateur reste sur le bouton, la commande envoie des paquets avec 1 dans C, lorsqu'il relâche, la commande envoie un unique paquet avec 0.
La partie DDD est celle qui m'a posé le plus de problème jusqu'à ce que je me souvienne de la définition d'un décodeur d'accessoire par le NMRA : c'est un dispositif capable de commander 4 couples de deux accessoires, soit huit sorties différentes pour une seule adresse DCC !
Donc, et contrairement à ce que je croyais avoir compris, un accessoire DCC n'est pas seulement adressé par un identifiant, mais bien par un identifiant de décodeur, suivi d'un numéro de sortie.
Prenons le seul cas que je suis en mesure de tester : ma Mobile Station 2 de Trix. Que se passe t-il lorsque je demande d'activer le coté 'rouge' de l'accessoire 317 ? Voici le binaire reçu :
10AAAAAA 1aaaCDDD
-------------------------
10010000 11101000 deux fois puis
10010000 11100000
aaa donne 110, soit inversé 001.
aaaAAAAAA donne donc 001 010000 , soit 80 en décimal. C'est l'identifiant du décodeur. C est à 1 pour l'activation envoyée deux fois, puis à 0. DDD donne 000. C'est le numéro d'accessoire sur le décodeur. Si je tape maintenant le vert sur la MS2, j'obtiens :
10AAAAAA 1aaaCDDD
-------------------------
10010000 11101001 plusieurs fois puis
10010000 11100001
on voit que c'est identique, sauf que le numéro d'accessoire DDD est devenu 001 . Si j'essaie sur l'accessoire MS2 318 rouge, j'obtiens 80 et 010 (2 en décimal). Pour le vert, 80 et 011 (trois en décimal), et ainsi de suite jusqu'à 320 vert qui donne 80 et 111, soit 7 en décimal. Si j'essaie sur le 315 Vert, j'aurais 79 et 7.
- Code:
-
Décodeur sorties
+---------+ +- 1 -- 317 / rouge 10 010000 1 110 C 000
| | +- 2 -- 317 / vert 10 010000 1 110 C 001
| | +- 3 -- 318 / rouge 10 010000 1 110 C 010
| 80 |----+- 4 -- 318 / vert 10 010000 1 110 C 011
| | +- 5 -- 319 / rouge 10 010000 1 110 C 100
| | +- 6 -- 319 / vert 10 010000 1 110 C 101
| | +- 7 -- 320 / rouge 10 010000 1 110 C 110
+---------+ +- 8 -- 320 / vert 10 010000 1 110 C 111
Ouf. Je n'ai plus qu'à appliquer ça à ma librairie d'accessoires, qui du coup devrait mieux prendre en compte ce que dit la MS2.
Pour les autres commandes du marché, je n'ai pas les moyens de tester. Si d'autres veulent le faire et dire ici quel est leur mode de fonctionnement, ce serait utile à tout le monde. Il 'suffit' de faire fonctionner DCC_decoder de mynabay et de noter les paquets de bits reçus lorsque l'on active ou pas un accessoire.