Dcc++

Re: Dcc++

Messagepar gily » 23 Novembre 2022, 15:54

bon ca avance, je pilote les aiguillages, les fonctions F, mon arduino digère bien mes commandes.

Mais je n'ai pas de vraie centrale DCC, juste un arduino mega seul.

Je ne comprends pas comment est gérée la rétro ; apparemment les détecteurs sont branchés sur les entrées de l'arduino et on reçoit un évenement
Q id ou q id. Mais comment est lié l'id du détecteur dans l'arduino avec son adresse (513 ...) dans cdm ? :? On doit envoyer à l'arduino la table entre pin d'entrée et ID...

Logiquement en début de run, cdm envoie bien la liste des aiguillages à l'arduino et leur positions et les mets en eprom, mais il ne lui envoie pas la liste des détecteurs.....

bizarre :|
gily
 
Messages: 1135
Inscrit le: 25 Juillet 2014, 14:32
Localisation: nord

Re: Dcc++

Messagepar MathieuA » 28 Novembre 2022, 08:07

Bonjour Gily,

gily a écrit:Mais je n'ai pas de vraie centrale DCC, juste un arduino mega seul.


A l'occasion je pourrais tester chez mon oncle avec sa centrale si besoin :)

gily a écrit:Je ne comprends pas comment est gérée la rétro ; apparemment les détecteurs sont branchés sur les entrées de l'arduino et on reçoit un évenement
Q id ou q id. Mais comment est lié l'id du détecteur dans l'arduino avec son adresse (513 ...) dans cdm ? On doit envoyer à l'arduino la table entre pin d'entrée et ID...


En fait la centrale Arduino ne gère absolument pas les id des détecteurs, elle fonctionne sur le principe du S88. Donc elle interroge à rythme régulier le réseau S88 et stock simplement toute la trame S88 dans une variable.
S'il y a changement entre deux retours d'états, alors elle renvoie la trame sous la forme demandée par le logiciel pilote. Pour elle le premier détecteur de la trame S88 aura donc l'id 1, le second l'id 2 et ainsi de suite.

Il existe trois types de retour:
- La forme binaire classique (dite brute en quelque sorte) ou chaque détecteur est représentée par un 0 ou 1 selon son état
- La forme hexadécimale où les détecteurs sont regroupés par groupes de quatre et l'état de ce groupe est représenté par un caractère hexadécimal (c'est ce qu'utilise la DLL dans CDM)
- Et enfin la forme Q, ou chaque adresse de détecteur est renvoyé avec soit la lettre majuscule Q qui signifié que le détecteur est actif (donc le canton occupé) soit avec la lettre minuscule q qui signifie qu'il est inactif (que le canton est libre donc). C'est notamment cette forme qu'utilise JMRI et ROCRAIL, qui est à mon sens la plus simple d'ailleurs. :)

Il faut néanmoins spécifier a l'Arduino combien de détecteurs sont en fonctionnement sur le réseau via la commande <Y Nb_S88_Modules DataFormat>, ou Nb_S88_Modules représente le nombre de modules sur lesquels 8 détecteurs sont branchés et DataFormat le format de retour que l'on souhaite obtenir.

Par exemple, pour 40 détecteurs nous avons 5 modules ou pour 160 détecteurs nous avons 20 modules.
Ensuite pour un format hexa la variable DataFormat vaudra 1, pour un format type binaire ça sera 0 et pour un format type JMRI ça sera 3.

Ce qui nous donne dans le cas de nos deux exemples ci-dessus pour CDM une commande <Y 5 1> (pour 40 détecteurs) ou <Y 20 1> (pour 160 détecteurs). :)

Mathieu :respect1:
MathieuA
 
Messages: 57
Inscrit le: 12 Janvier 2020, 16:34
Localisation: Orléans, Loiret

Re: Dcc++

Messagepar gily » 28 Novembre 2022, 08:44

bonjour

Bon j'ai bien noté toutes tes remarques. Quant à la commande <Y nombre_modules dataformat> je n'ai pas vu cela dans la specification du DCC++.

Je vais vérifier si CDM envoie cette commande..
gily
 
Messages: 1135
Inscrit le: 25 Juillet 2014, 14:32
Localisation: nord

Re: Dcc++

Messagepar MathieuA » 28 Novembre 2022, 11:26

(Re) Bonjour,

gily a écrit:Bon j'ai bien noté toutes tes remarques. Quant à la commande <Y nombre_modules dataformat> je n'ai pas vu cela dans la specification du DCC++.

Je vais vérifier si CDM envoie cette commande..


La norme DCC++ intègre uniquement les trames d'information descendantes, c'est-à-dire les commandes qui vont de la centrale vers les accessoires, il n'existe pas de spécification pour la rétrosignalisation dans la norme DCC++.
Mais la DLL intégré a CDM envoie bel et bien cette commande au lancement du mode RUN, elle a simplement été intégré en suivant le schéma de la norme DCC++.

Mathieu :respect1:
MathieuA
 
Messages: 57
Inscrit le: 12 Janvier 2020, 16:34
Localisation: Orléans, Loiret

Re: Dcc++

Messagepar gily » 29 Novembre 2022, 09:12

bonjour

j'ai aspiré les trames entre CDM et l'interface DCC++. Effectivement, CDM à l'ouverture du port, envoie les commandes suivantes:
<s> <-- identification
<1> <-- mise sous tension
<Y 8 1> <-- déclaration du nombre de modules de rétro et format hexa ascii...

J'ai intégré dans le fichier de config de signaux_complexes une liste de commandes que l'utilisateur souhaite envoyer à la centrale, et qu'il peut modifier à souhait.

A propos de la réception au format 1, j'ai trouvé ceci je suppose que c'est ton site:
F = 1 pour une réponse en hexadecimal 3 fois plus rapide (MSB first ou LSB first)
La réponse sera ‹y 0A0147405801CE..40

Je pense qu'il faut lire 16 bits par module (ex ici : 0A01=module 1, 4740=module 2 )
le bit 15 représente la dernière entrée du premier module
et le 0 la première entrée du premier module.

A bientot.
gily
 
Messages: 1135
Inscrit le: 25 Juillet 2014, 14:32
Localisation: nord

Re: Dcc++

Messagepar Lormedy » 27 Mars 2023, 19:07

Bonjour Gily,
A l'origine de l'intégration du S88 dans DCC++ se trouvaient Xavier et JPP pour CDM-Rail.
Il s'agit d'une lecture de type asynchrone : j'envoie une CLOCK et je lis une DATA, quand le MEGA n'a rien à faire.
On atteint un débit max de 10 trames par seconde si nécessaire mais la plupart du temps seul un changement d'état dans un canton initie un transfert de données.
J'ai repris le code pour l'étendre avec 3 options :
La commande que j'ai intégrée dans DCCppS88 et reprise par Mathieu est <Y n Format>. La réponse de la centrale dépendra du format choisi.
- n correspond au nombre de détecteurs lus et divisés par 8.
- Format = 0 donne une réponse avec une suite de bits '0'/'1' codés en ASCII (0x30/x031) représentant la liste lue séquentiellement sur les détecteurs, <y 0100010111101001> pour n = 2.
- Format = 1 donne une réponse avec une suite de quartets (groupe 4 bits mais renversés !) codés en ASCII représentant la liste lue séquentiellement sur les détecteurs mais groupé par 4 bits pour aller plus vite sur USB (compatible CDM-Rail), <y 2A79> (et non pas 45E9).
- Format = 2 donne une réponse avec <qm> ou <Qm> soit q=0 et Q=1 et m représente le numéro du détecteur qui vient de changer d'état, <q0>, <Q1>, <q2>, <q3>, <q4>, <q5>, <Q6>, ......, mais seulement ceux qui changent d'état sont transmis.

Dans DCCppS88 les pins relatives au S88 peuvent changer de place sur le MEGA, leur position n'est pas importante.
J'ai utilisé 2 entrées de DATA pour accélérer la lecture sur des grands réseaux en proposant deux prises S88-N, gauche et droite.
Les bits lus sur l'entrée gauche forment la première moitée de la réponse et les bits lus sur l'entrée droite forment la deuxième moitée de la réponse.
On peut n'utiliser que l'entrée gauche si on le souhaite en omettant la deuxième moitée de la réponse mais il faut que dans la commande n corresponde à 2 fois ce qu'il doit lire puisqu'on en jette la moitié.

Dans l'extension WiFi que j'ai ajouté au dessus du MEGA, j'utilise les Websockets pour avoir un canal de communication permanent avec le PC.
La vitesse d'exécution et de transfert est peu influencée par le Format. Qui gère plus de 99 cantons sur les 512 entrées possibles ?

Ferroviairement,
Philippe
Réseau DCC 2 voies H0
PC + TCO WiFi + WDD + DMC + Arduino Mega + L298+ Max 471 + D1-Mini WiFi
Détecteurs de train perso + S88-N perso + MAM perso + Décodeurs d'accesoires DCC perso
http://lormedy.free.fr
Lormedy
 
Messages: 11
Inscrit le: 09 Mai 2019, 05:31
Localisation: Grésivaudan

Re: Dcc++

Messagepar gily » 29 Mars 2023, 11:51

bon merci des infos, je vais digérer tout çà 8-)
gily
 
Messages: 1135
Inscrit le: 25 Juillet 2014, 14:32
Localisation: nord

Précédent

Retourner vers Le coin des bricoleurs (électronique)

Qui est en ligne ?

Utilisateurs parcourant actuellement ce forum : Aucun utilisateur inscrit et 2 invités