LOCODUINO

Parlons Arduino => Le logiciel DCC++ => Discussion démarrée par: Dominique38 le janvier 07, 2017, 11:55:44 am

Titre: DCC++ et pilotage d'aiguillage
Posté par: Dominique38 le janvier 07, 2017, 11:55:44 am
Bonjour à tous,
Je viens de passer à DCC (avant j’utilisais CmdrArduino comme beaucoup), j’utilise plutôt une liaison bluetooth en écrivant des programmes android avec app inventor du MIT, même si la solution ethernet m’intéresse, tout cela marche bien pour les locos mais pas pour les aiguilles !

Je souhaite commander mes aiguilles ROCO équipées du décodeur ROCO 61196 et je n’y arrive pas :
- j’ai fait de nombreux essais, mais rien ne bouge, et je ne comprends pas la notion de SUBADDRESS ?
- je mets l’aiguille en mode programmation (en la manoeuvrant manuellement 5 fois), elle entre bien dans ce mode, je définis avec < T ID ADDRESS SUBADDRESS >, puis j’essaye de manoeuvrer avec < T ID THROW > et rien ne se passe.
Merci pour votre aide.
Bien cordialement

Dominique38
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: bobyAndCo le janvier 07, 2017, 12:14:20 pm
Dominique,

Des précisions sur SUBADDRESS sont disponible dans le fichier SerialCommand.cpp ligne 70. Pour autant, il semble que tu as bien renseigné ce paramètre.


case 'a':       // <a ADDRESS SUBADDRESS ACTIVATE>
      /*
            turns an accessory (stationary) decoder on or off

            ADDRESS:  the primary address of the decoder (0-511)
            SUBADDRESS: the subaddress of the decoder (0-3)
            ACTIVATE: 1=on (set), 0=off (clear)

            Note that many decoders and controllers combine the ADDRESS and SUBADDRESS into a single number, N,
            from  1 through a max of 2044, where

            N = (ADDRESS - 1) * 4 + SUBADDRESS + 1, for all ADDRESS>0

            OR

            ADDRESS = INT((N - 1) / 4) + 1
            SUBADDRESS = (N - 1) % 4

Y a t'il des réponses avec d'autres messages < T > par exemple ? En principe, ce message doit permettre de voir si l'aiguillage est bien crée et si c'est juste un problème de fonctionnement.

Le message < s > renvoi aussi des informations plus globales dont les aiguillages.
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: Dominique38 le janvier 07, 2017, 12:27:39 pm
Rebonjour
- merci pour les précisions sur subadress, je comprends mieux maintenant ...
- j'ai bien eu des réponses avec <T> qui m'indiquaient que l'aiguillage était créé, mais je n'ai regardé tout en détails donc je vais ré-essayer en fin de journée et voir tout cela de manière plus précise.

Et je posterais les résultats de mes essais bien sûr, concluants ou non.

Je précise que j'utilise une carte UNO avec shield motor arduino également

A suivre donc...
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: Dominique38 le janvier 07, 2017, 09:35:10 pm
Bonsoir,
j'ai fais les manips suivantes :
- j'ai vérifié que mon aiguillage Roco et son décodeur Roco 61196 fonctionnaient bien, avec le booster Roco et la MultiMaus : c'est bien le cas, avec l'adresse 1  ;D
- j'ai pour commencer testé la commande DCC++ directe, sans "définir" l'aiguillage : <a 1 0 0> et <a 1 0 1> : aucun effet (à noter que ADRESS 1 et SUBADRESS 0 donnent bien l'adresse 1 avec la formule de SerialCommand.cpp indiqué par bobyAndCo) ;
- j'ai "défini" mon aiguillage avec <T 1 1 0>, sur l'ID 1 donc, retour OK de DCC++
- j'ai vérifié avec <T> que mon aiguille était définie : OK !
- j'ai testé la commande directe <T 1 1> et <T 1 0> et rien ne se passe.

Bref : échec pour l'instant  :'( :'( :'(

Mes pistes de travail, pour demain :
- aller prendre l'air ;
- faire un programme automate (avec processing) pour tester des valeurs ADRESS et SUBADRESS différentes...

une question :
- j'ai fait tout cela sur la ligne principale : est-ce que cela peut marcher sur la ligne programmation ???

Sur ce, bonne nuit.

Dominique38
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: Dominique38 le janvier 08, 2017, 10:30:45 am
Suite de l'histoire :
- j'ai fait mon automate et il n'a pas eu le temps de tester toutes les possibilités, l'aiguille avec le code 1 (programmé avec multimaus) c'est déclenchée avec ADRESS=0 et SUBADRESS=0, et j'ai regardé avec une aiguille avec le code 2 (multimaus toujours) qui s'est déclenchée avec ADRESS=0 et SUBADRESS=1.

avec uniquement ces 2 cas, la formule semble donc être : N = (ADDRESS) * 4 + SUBADDRESS + 1 mais il faudrait tester avec plus d'adresse décodeur bien sûr.

En tout cas cela marche et je vais donc continuer mes bricolages...
A bientôt

PS : donc cela marche bien en reprenant l'adresse du décodeur programmé avec la centrale ROCO, mais je n'ai pas vu comment "programmer" l'adresse d'un décodeur, comme le CV d'une locomotive : quelqu'un a une idée ?

dominique38
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: bobyAndCo le janvier 08, 2017, 10:36:29 am
Bonjour Dominique,

Heureux de savoir que cela fonctionne maintenant. Désolé mais je ne comprends pas la question :

Citer
PS : ... mais je n'ai pas vu comment "programmer" l'adresse d'un décodeur, comme le CV d'une locomotive : quelqu'un a une idée ?

Tu demandes comment modifier la CV d'un décodeur de locomotive qui contient son adresse ? CV 1 en l'occurrence. Est-ce bien cela ?
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: Dominique38 le janvier 08, 2017, 12:47:53 pm
Non, pour les locos cela va bien, je demandais comment modifier l'adresse du décodeur d'aiguillage : mon décodeur a l'adresse 1 que j'ai fixée avec mon booster ROCO et la Multimaus, et donc j'y accède par DCC++ avec ADRESS=0 et SUBADRESS=0, et je me demandais si c'était possible, avec DCC++, de modifier cette valeur "1" de mon décodeur d'aiguillage ?
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: bobyAndCo le janvier 08, 2017, 06:26:00 pm
Dominique,

Tout d'abord je suis quand même étonné que ton aiguille ait l'adresse 1 et que tu y accèdes par ADDRESS=0 et SUBADDRESS=0, Tu es sûr que ce n'est pas plutôt ID=0 et ADDRESS = 1 ? Je serai intéressé que tu me fasses une copie d'écran de l'IDE après avoir envoyé le message <T>.

Quand je regarde le code de Accessories.ccp, je ne vois pas la possibilité de modifier une adresse. Il faut donc créer un nouvel aiguillage et supprimer l'ancien. Ceci dit, il ne serait pas difficile de créer la fonction modify dans DCC++ Accessories.ccp. Ce serait une contribution à DCC++ et Locoduino ;-)

Est-ce que le code de cette page Accessories.ccp te parle même un peu ou pas du tout ?

Tu te souviens que je t'ai expliqué la partie de code à la ligne 143

void Turnout::parse(char *c){
  int n,s,m;
  Turnout *t;
 
  switch(sscanf(c,"%d %d %d",&n,&s,&m)){
   
    case 2:                     // argument is string with id number of turnout followed by zero (not thrown) or one (thrown)
      t=get(n);
      if(t!=NULL)
        t->activate(s);
      else
        INTERFACE.print("<X>");
      break;

    case 3:                     // argument is string with id number of turnout followed by an address and subAddress
      create(n,s,m,1);
    break;

    case 1:                     // argument is a string with id number only
      remove(n);
    break;
   
    case -1:                    // no arguments
      show(1);                  // verbose show
    break;
  }
}


switch(sscanf(c,"%d %d %d",&n,&s,&m)){ sert à compter le nombre de paramètres passés à la fonction. Donc en fait, ceux écrit dans le message. Un seul paramètre, case 1, on delete l'aiguille Exemple <T 3> va supprimer l'aiguille dont l'ID est 3 (pas l'ADDRESS). Cela renvoi le message <0> si le delete s'est bien passé, <X> autrement.

Regarde la fonction void Turnout::remove(int n){ ligne 95.

Une fonction modify serait assez similaire qui modifierait la valeur dans la case pointée par tt au lieu de faire free(tt). Le tour est joué ! tt->data.address = new adress, tt->data.subAddress = new subAddress. Attention toute fois à ne pas utiliser des valeurs déjà prises.

Donc au plus simple, create une nouvelle aiguille et delete de l'ancienne. Ou delete d'abord et create ensuite, je ne sais pas s'il autorise la création de deux aiguilles avec la même adresse.

Dans tous les cas, n'hésite pas à revenir vers moi.

Christophe
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: Dominique38 le janvier 09, 2017, 06:22:27 pm
Bonjour Christophe,

voici la copie d'écran demandée, sauf mauvaise manip de ma part :
(https://s6.postimg.org/arr3l3o8h/Capture_d_cran_2017_01_09.png)

C'est bien ADRESS = 0 et SUBADRESS = 0 ! (pour le premier aiguillage).

Pour la modification de l'adresse, c'est n'est pas l'ID ou ADRESS que je souhaite modifier mais l'adresse Roco de mon décodeur d'aiguille, et je vais regarder le code en détail... dans les prochains jours.

Bien amicalement

Dominique38
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: DDEFF le janvier 10, 2017, 08:15:41 am
Encore un Mac !... ;D
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: Dominique le janvier 10, 2017, 09:16:03 am
Il n'y a pas de mal à avoir un Mac. En général on s'en porte mieux.
Mais ce n'est pas le sujet, désolé  8)
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: bobyAndCo le janvier 10, 2017, 09:20:29 am
Citer
PS : ... mais je n'ai pas vu comment "programmer" l'adresse d'un décodeur, comme le CV d'une locomotive : quelqu'un a une idée ?

La modification de la CV d'un accessoire est elle différente ?

  case 'w':      // <w CAB CV VALUE>
      /*
            writes, without any verification, a Configuration Variable to the decoder of an engine on the main operations track

            CAB:  the short (1-127) or long (128-10293) address of the engine decoder
            CV: the number of the Configuration Variable memory location in the decoder to write to (1-1024)
            VALUE: the value to be written to the Configuration Variable memory location (0-255)

            returns: NONE

On retrouve dans PacketRegister.cpp les fonctions pour la modification des CV's void RegisterList::writeCVByte(char *s) volatile et void RegisterList::writeCVBit(char *s) volatile et je ne vois pas de raison pour laquelle celà ne fonctionnerait pas sur un accessoire (aiguille).
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: Dominique38 le janvier 10, 2017, 10:21:05 am
oui tu as tout à fait raison, j'essaye dès que possible... demain je pense.
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: JC60 le février 14, 2017, 04:54:01 pm
J’ai effectué différents test sur la programmation des aiguillages numériques avec ceux que j’avais sous la main.

Matériel utilisé :
Arduino UNO en configuration Main connecté au PC, avec LMD18200, MAX 471, une alimentation 15Volts continu et piloté par le moniteur Série.

-Sur 4 aiguillages Conrad connectés à un décodeur Littfinski  M-DEC pour 4 aiguillages, seul le premier peut être programmé et répond aux commandes, les autres également programmés ne répondes pas.

-Sur 2 aiguillages Cobalt avec décodeur intégré, cela fonctionne très bien, mais il faut les programmer individuellement (1 seul  alimenté par le DCC lors de la programmation), après la programmation, installation sur le réseau et ils répondent individuellement.

Procédure :
Aiguillage mis en programmation

Les commandes :
Programmation du n° 1 : <T 1 1 0> réponse avec  le test  (<T>) <H 1 1 0 0>

Mise en mémoire : <E 1 1 0> réponse du système <e 1 0 0>

Retirer le mode programmation de l’aiguillage.

Après il répond aux commandes comme : <T 1 1> pour un sens, l’aiguillage est dévié et le message suivant sur le moniteur <H1 1> et <T 1 0> pour l’autre sens et message <H1 0>

Pour le deuxième même procédure.

Je pense cela doit fonctionner avec  tout autres aiguillage possédant  un décodeur individuel.

Après arrêt du système e t remise en route on retrouve les aiguillages mémorisés avec la commande <T> Exemple <H1 1 0 0> <H2 2 0 1>

Pour supprimer la programmation et la mémorisation d’une aiguille sur l’arduino, <T 1> <T 2> etc, par contre l’aiguillage est toujours programmé.
Titre: Re : DCC++ et pilotage d'aiguillage
Posté par: bobyAndCo le février 14, 2017, 08:48:49 pm
Merci JC60 pour ce retour qui pourra en aider certains. Personnellement, je n'utilise le DCC que pour la traction (et un pont tournant car je n'ai pas d'autre moyen). Pour la détection et les aiguilles, ce sont des MEGA qui actionnent tout cela en direct.

Dans tous les cas, je vous invite à construire vos propres décodeurs. Ca sera probablement laborieux au début mais vous aurez la satisfaction de les avoir fait, à moindre coût c'est à peu près certain et vous en aurez beaucoup plus la maîtrise.

Voir l'un des articles de Jean-Pierre sur ce sujet spécifique avec un NANO : http://www.locoduino.org/spip.php?article142 (http://www.locoduino.org/spip.php?article142) et tous les autres qu'il a écrit sur les décodeurs d'accessoires en générale.

Continuez à alimenter ce fil en nous tenant informés de vos avancées.