Bonjour à tous,
La limitation d'une rétro-signalisation à 128 capteurs convient pour les petits réseaux mais une limite portée à 512 capteurs sera perenne pour l'avenir.
Actuellement la routine S88.cpp que j'avais ajoutée dans le code Arduino DCCpp_S88 et une reprise de la routine de Xavier avec son accord.
Je l'ai étendu pour la rendre compatible avec plusieurs logiciels de gestion de trains.
Elle permet de lire séquentiellement jusqu'à 512 capteurs d'un seul trait avec une fréquence maxi de 10 fois par seconde environ.
Ceci lui permet une réactivité dans les 100 millisecondes qui suivent le changement d'état d'un capteur, plus les latences générées par le mode de transport de l'information jusqu'au PC.
Marklin recommandait de ne pas chainer plus de 32 modules S88 (sous 12V) à cause des pertes électriques dans les connexions, les modules gérant 8 ou 16 capteurs, ce qui conduit à un bus de 512 capteurs au maximum.
Pour des raisons pratiques évidentes, j'ai scindé électriquement le bus S88-N en 2 bras de 256 capteurs (sous 5V) qui sont concaténés en soft dans l'Arduino avant d'être transmis vers le PC.
Le contenu de la trame S88 transmise par l'Arduino dépend de la requête faite par le logiciel du PC.
Le dialoque se fait en ASCII et les commandes sont les suivantes :
<Y> envoie la dernière trame S88 lue vers le PC
<Y 0> arrête la transmission vers le PC
<Y N F> N étant un Nombre total pair, représentant les groupes de 8 capteurs connectés sur le bus. N = 2, 4, 6, 8, ..., 64.
F représente le Format d'encodage émit vers le PC :
Réponse <y data>
F = 0 envoie l'état de chaque capteur '0'/'1' encodé en ASCII dans un byte.
Exemple <y 00011010101... ...> data maxi = 512 bytes.
F = 1 envoie l'état de chaque capteur '0'/'1' groupé en nibble ASCII dans un byte.
Chaque nibble représente donc 4 capteurs de 0x00 à 0x0F encodés en ASCII de '0' à 'F'.
L'ordre des capteurs pour CDM-Rail est inversé : capteur4 capteur3 capteur2 capteur1(lsb). (option DCCpp_S88)
Sinon l'ordre naturel des capteurs est : capteur1 capteur2 capteur3 capteur4(lsb)
Exemple <y F01805B40... ...> data maxi = 128 bytes.
F = 2 envoie l'état de chaque capteur '0'/'1' groupé par 8 dans un byte Hexadécimal. 8 capteurs = un byte.
L'ordre naturel des capteurs est : capteur1 capteur2 capteur3 capteur4 capteur5 capteur6 capteur7 capteur8(lsb)
Exemple <y F01805B40... ...> data maxi = 64 bytes.
F = 3 envoie l'état de chaque capteur ID '0'/'1' encodé en ASCII "q ID"/"Q ID" dans un Byte. '0' => 'q' et '1' => 'Q'.
Ce format est utilisé par JMRI, RocRail, etc...
Exemple <Q0> ou <q1> ou <Q84> ou <q511> Maxi 512 transmissions à l'initialisation,
ensuite une seule transmission à chaque changement d'état d'un capteur.
<Y N> est équivalent à <Y N 0>
<o N*8 F> est renvoyé vers le PC indiquant la bonne réception de la commande.
<X Bad Argument value> sera renvoyé vers le PC en cas d'erreur dans la commande.
Notes : Après initialisation, à chaque changement d'état d'un capteur, une trame est transmise automatiquement vers le PC.
Les capteurs absents sur le bus S88-N sont représentés par des '0' avant encodage.
La lecture du bus progresse du capteur1 jusqu'au capteur512 et la transmission vers le PC suit la même ascendance mais encodée.
J'espère que ces éclaircissement feront avancer le modélisme auquel je contribue alors que le logiciel du forum a détruit ma mise en page...
Philippe