LOCODUINO

Un décodeur d’accessoires universel

Un décodeur d’accessoires universel (2)

.
Par : Thierry

DIFFICULTÉ :

Après une revue théorique des capacités de la bibliothèque, passons à des travaux pratiques.

La bibliothèque

Le plus simple pour l’installer est de la télécharger. et d’utiliser l’option ’Add library’ (cette option là n’est pas traduite dans mon IDE 1.0 !) du menu ’Croquis/Importer Bibliothèque’ . Voir l’article idoine pour installer une bibliothèque.

Comme toutes les bibliothèques Arduino, les fichiers sont livrés et installés directement utilisables. Mais comme la mise au point d’un programme peut être fastidieuse, il y a des moyens pour chercher à comprendre ce qui ne marche pas.

Dans le fichier UniversalAccessoryDecoder.h de la bibliothèque, vous pouvez déclarer le DEBUG_MODE en retirant le // au début de la ligne #define DEBUG_MODE. Lorsque vous êtes en debug (déverminage en français franchouillard), c’est à dire lorsque vous en êtes encore à la phase de mise au point de votre programme, la bibliothèque envoie des infos sur son fonctionnement sur la console série, alors prenez garde de l’ouvrir. Elle est configurée par la librairie à 115200 Bauds.. Elle vérifie également que ce que vous demandez d’actionner existe bien, qu’il est bien déclaré (mauvais numéro de port, de broche Arduino) et sortira des messages d’erreur si quelque chose ne va pas. Une fois le programme au point, remettez les deux slash // devant la ligne pour enlever tous les tests et tous les messages sur la console. Cela rendra le programme bien plus rapide et moins encombrant. En mode debug, vous pouvez en plus activer DEBUG_VERBOSE_MODE qui est encore plus bavard, je dirais verbeux, et qui vous abreuvera d’informations plus fines et plus précises. Toujours en mode Debug, nouveauté 4.0, la led liée à la pin 13 de l’Arduino clignotera si un signal DCC est bien présent. Utile pour vérifier que votre petit montage DCC en amont marche bien...


////////////////////////////////////////////////////////
// Add a '//' at the beginning of the line to be in 
// release mode.
#define DEBUG_MODE

///////////////////////////////////////////////////////
// Verbose mode lets you see all actions done by the 
// library, but with a real flood of text to console...
// Has no effect if DEBUG_MODE is not activated.
//#define DEBUG_VERBOSE_MODE


Exemple ’Full’

Dans la bibliothèque sont livrés plusieurs exemples. Prenons-en un pour voir comment ça marche. Full est l’un des plus complets. Voici son schéma :

PNG - 96.7 kio

On veut piloter ce qui est présent dans la colonne de droite : deux servos et trois leds de couleur. Pour les commander individuellement, on doit leur donner à chacun des codes DCC.
Le premier servo sera commandé par un seul code DCC 316/0. Ce qui signifie que chaque fois que ce code sera utilisé, le servo changera d’état et basculera de sa position mini à sa position maxi ou l’inverse. Le port servo 0 sera utilisé avec la pin 2 de l’Arduino.
Le second servo dispose lui de quatre positions, commandées par quatre codes DCC : 314/0 314/1 pour les mini/maxi, et 315/0 315/1 pour les positions intermédiaires 45 et 135°. Le port servo 1 sera utilisé avec la pin 3 de l’Arduino.
Les leds sont commandées individuellement par les codes DCC 1/0 1/1 et 2/0. Les deux premières leds sont configurées pour du fading. Chaque led utilise un port moteur/lumière avec les pins 9 10 et 11.

Des groupes sont également définis en bas du graphique. Un premier groupe de servos à gauche pour les déplacer en séquence, avec deux codes DCC 320/0 et 320/1, chacun correspondant à des positions de chaque servo. Le mouvement non simultané est donné par un argument du constructeur du groupe, à voir plus bas. Puis le second groupe de leds qui utilise deux codes DCC 319/0 et 319/1 pour changer l’état des trois leds simultanément, comme pour un feu de signalisation.

Enfin tout ça est pilotable par le DCC, mais aussi par des boutons représentés par les ronds blancs tout à gauche. Un bouton, quelque soit sa forme, ne fait qu’envoyer un code DCC à la bibliothèque, comme si ce code avait été reçu via le Commander DCC. L’exception, parce qu’il en faut une, c’est le potentiomètre qui en plus donne sa position courante.
Le premier rond blanc en haut est un bouton poussoir connecté à la pin 26 de l’Arduino. Lorsqu’un poussoir est pressé, il passe de son code DCC actuel au suivant. Ici deux sont définis : 320/0 et 320/1, qui correspondent au groupe de servos.
Le deuxième est un switch connecté aux pins 24 et 25. Lorsque la pin 24 est activée par le switch, le code DCC 319/0 est envoyé. La pin 25 appelle le code 319/1. Il change donc l’état du groupe de leds.
Le potentiomètre n’est relié à rien dans cet exemple. Il envoie un code DCC 321/0 qui n’est pas attaché à un accessoire ou un groupe. C’est volontaire. Si l’on voulait par exemple déplacer le servo 2 selon la position du potentiomètre, il suffirait de mettre 314/0 ou 1, ou même 315/0 ou 1. Pour un potentiomètre, le code DCC ne sert qu’a identifier l’accessoire à déplacer. Ensuite un ordre de mouvement est directement envoyé à l’accessoire en utilisant la position courante du potentiomètre. Dans Full, cette valeur serait contredite par les ordres DCC et/ou les boutons. Ce qui bouge de manière continue avec une position quelconque n’est pas compatible avec des ordres fixes. Voilà pourquoi ce potentiomètre ne pointe vers rien. Il est là pour l’exemple...

La suite, pour comprendre le détail de ’full.ino’, dans le prochain article.

20 Messages

  • Un décodeur d’accessoire universel (2) 20 janvier 2015 15:01, par Philippe

    Bonjour,

    Tout d’abord merci pour vos articles et votre bibliothèque. J’aurai une question à vous poser. Sur quelles PINs de l’Arduino doit on connecter le signal DCC venant de la centrale digitale.

    Cordialement
    Philippe

    Répondre

    • Un décodeur d’accessoire universel (2) 20 janvier 2015 17:45, par Thierry

      C’est effectivement une question pertinente à laquelle le troisième et dernier volet de la série répondra. Si vous voulez prendre de l’avance, le numéro de pin, dépend de ce que vous avez donné dans votre sketch avec un #define kDCC_INTERRUPT, et de votre version d’Arduino. Je vous conseille d’aller voir le site mynabay pour de plus amples informations... Ou d’attendre un peu la publication du troisième volet qui ne devrait pas trop tarder : il est déjà en cours de validation.

      Répondre

      • Un décodeur d’accessoire universel (2) 20 janvier 2015 18:20, par Jean-Luc

        En passant : il ne faut surtout pas connecter directement le signal DCC à l’Arduino. Il grillerait à coup sûr. Il faut utiliser un optocoupleur 1N637 6N137. Le schéma est ici : http://www.mynabay.com/dcc-monitor/...

        Répondre

        • Un décodeur d’accessoire universel (2) 13 avril 2015 00:54, par Rudy G.

          Bonjour,
          Je viens de tout préparer et pour faire un test j’ai appliqué le DCC_Monitor sur mon Uno, et la rien.
          Je suis à l’échelle G ce qui signifie que la tension est de 20V. La sonde DCC est elle prévue pour cette tension ?

          Par ailleurs j’ai eu une erreur de compilation avec le type prog_char. J’ai trouvé une explication liée au nouveau compilateur de l’IDE 1.7. Il est conseillé sur un forum de remplacer par le type char.
          Je n’ai plus d’erreur de compilation mais l’absence de trame dcc ne pourrait il pas venir de cette modification.

          Le programme tourne, mais même si je génère des trames DCC (aiguillage ou locomotive) je ne voie rien passer sur le monitor série.

          Qu’en pensez vous ?

          Répondre

          • Un décodeur d’accessoire universel (2) 13 avril 2015 11:42, par Thierry

            Bonjour

            Pour les qualités du 6N137, je laisse les spécialistes des datasheets répondre. Tout ce que je peux dire, c’est que c’est le modèle recommandé par Mynabay, et que lui fait du HO, donc entre 14 et 18v...
            Le prog_char a effectivement été supprimé en 1.5 et suivants. Il faut bien utiliser char.
            Enfin pour le moniteur série deux remarques. D’abord, vérifiez bien que vous l’avez passé en 115200 bauds. C’est la valeur utilisée par UAD pour les messages série. D’autre part, il n’y a rien sur ce moniteur si vous n’êtes pas en mode DEBUG. Pour ça, enlever les caractères ’//’ présents au début de UniversalAccessoryDecoder.h devant ’#define DEBUG_MODE’ .

            Répondre

            • Un décodeur d’accessoire universel (2) 13 avril 2015 12:30, par Rudy G

              Merci pour votre retour rapide !
              Je me suis peut être mal exprimé. Il y a bien un affichage sur le monitor série. Mais il m’affiche qu’il n’a lu aucune trame !
              Pour information j’utilise un Arduino Uno r3 et DCC_Decoder Library Version 4.

              Répondre

          • Un décodeur d’accessoire universel (2) 13 avril 2015 13:02, par Jean-Luc

            La contrainte sur le 6N137 est de ne pas dépasser 50mA. Ici on a 20V/1kΩ = 20mA, donc pas de soucis.

            Répondre

          • Un décodeur d’accessoire universel (2) 15 avril 2015 09:32, par Jean-Luc

            La dernière IDE est l’IDE 1.6.3

            Répondre

            • Un décodeur d’accessoire universel (2) 15 avril 2015 13:01, par Rudy G

              En fait le dernier IDE est le 1.7.1 disponible sur arduino.org. Comme je suis tout nouveau dans le monde Arduino j’ai acheté la dernière version de la carte UNO en r3 et le kit français officiel comprennant aussi une carte UNO R3. Et vous avez une notification pour télécharger l’IDE sur le site arduino.org (que j’ai pas lu en détail car j’avais déjà téléchargé la dernière version à partir du site arduino.cc et que le ".org" sur l’étiquette n’était pas franchement visible). Quand vous utilisez l’IDE du site de arduino.cc vous avez une notification vous indiquant que la carte utilisée n’est pas certifiée (port COM). Comme je débutais je voulais une carte certifiée (et pas une copie) et du coup j’ai cherché sur Internet s’il y avait une arnaque. Et comme l’étiquette collée sur la carte Arduino il est recomandé de télécharger l’IDE 1.7.x sur arduino.org.

              Je vais donc installer l’ancien IDE 1.6.3 sur un autre poste pour faire le test (car j’ai lu qu’une fois installé en 1.7 on pouvais pas revenir en version 1.6.x).

              Par ailleurs, dans mes recherches sur le datasheet du 6N137 j’ai observé que placer l’interface 7 à low, la réponse en 6 était toujours High (quelque soit l’état de la l’émetteur entre 2 et 3). Du coup j’ai trouvé aussi un schéma (plus complexe mais du même auteur) ou l’interface 7 était portée au 5V. Quand j’ai fait des tests avec un petit programme qui détecte le changement d’état dans la loop, j’ai bien vu une différence en utilisant une sources DC 20V en entrée du montage.

              Pour autant, le progamme compilé en IDE 1.7.0 n’est toujours pas opérationnel !

              Prochains essais ce soir (avec l’IDE 1.6.3) !

              Félicitation pour votre site et votre réactivité !!!

              A suivre ...

              Répondre

              • Un décodeur d’accessoire universel (2) 15 avril 2015 13:43, par Thierry

                L’histoire de 1.6.3 ou 1.7 est plus compliquée qu’elle n’y parait. C’est bien la version 1.6.3 qui est la version officielle téléchargeable sur le site arduino.cc, lui aussi officiel. Arduino.org est un fork créé par un ancien du groupe Arduino et qui compte se faire de l’argent avec une nouvelle version matérielle : l’Arduino Zero. La raison d’être de la version 1.7 est la possibilité de créer des programmes pour ce Zero, ce qui n’est pas possible avec la 1.6.3.
                Je pense que le mieux pour l’instant est de rester sagement sur le site officiel et OpenSource, arduino.cc et donc de rester avec la 1.6.3 et ses successeurs. Attendons de voir ce qu’il advient de arduino.org, au delà du plagiat évident du design du site, de la tentative de récupération du nom et du copyright et de leur nouvel Arduino... A moins bien sûr que ce ne soit effectivement le Zero que vous avez commandé !

                Répondre

                • Un décodeur d’accessoire universel (2) 15 avril 2015 14:40, par Jean-Luc

                  Pour préciser, cette nouvelle carte non officielle est la Zero Pro qui est vendue fort cher. Il existe une Zero tout court officielle mais qui n’est pas encore sortie.

                  Répondre

              • Un décodeur d’accessoire universel (2) 15 avril 2015 14:38, par Jean-Luc

                Le fait est que la carte Uno que vous avez n’est pas d’origine Arduino officiel (arduino.cc) mais un clone fait par arduino.org. Les deux cartes ont donc des vendor id (USB) différents d’où l’alerte émis par l’IDE Arduino officielle 1.6.3. Ça n’empêche en rien le fonctionnement ceci dit.

                Une bataille juridique est en cours.

                Répondre

                • Un décodeur d’accessoire universel (2) 16 avril 2015 22:55, par Rudy G.

                  Bonsoir,
                  Une fin heureuse ...

                  Après moult péripéties le décodeur fonctionne enfin.

                  Mon problème était lié aux 6N137. Il semble que les 5 CI commandés avec ma carte Arduino Uno.org doivent avoir des spécifications différentes (ou peut être un défaut de fabrication). Après des tests sur les différents IDE, des tests pour valider le fonctionnement de l’interruption lié à la pin 2, les résultats convergeaient vers un défaut du CI. J’ai monté une DEL en sortie du CI et en entrée un poussoir sur le 5V (sur la base d’un schéma sur un datasheet) et elle ne répondait pas quand le poussoir était pressé. J’ai trouvé ce soir un détaillant qui en disposait en stock de 6N137 (d’un autre constructeur). Et miracle cela fonctionne enfin (du premier coup).

                  Alors pour les débutants comme moi, je témoigne que l’arduino uno.org et l’IDE 1.7.0 fonctionne bien avec le module de lecture DCC décrit sur le site de mynabay avec une centrale Massoth en 20V.

                  Pour la petite histoire, j’en veux à Lextronic pour m’avoir vendu des Arduino.org pour des originaux mais aussi de m’avoir fourni les 5 x 6N137 défectueux qui m’ont fait perdre plusieurs soirées à me demander ce qui n’allait pas.

                  Merci encore pour vos remarques qui m’ont permis de comprendre un peu mieux le monde arduino. Je m’enthousiasme à nouveau pour les possibilités de l’arduino pour le modélisme ferroviaire.

                  Répondre

                  • Bravo. C’est un encouragement pour ceux qui galèrent avec ce composant. Pouvez vous donner l’adresse de ce datasheet afin de permettre à d’autres de reproduire ce schéma (comme moi par exemple qui a pas mal tâtonné au début avec mon pack de 6N137...) ?
                    C’est aussi un bon message sur la persévérance dont nous devons faire preuve pour résoudre ces petits problèmes rageants qui ne doivent pas nous détourner de notre but principal : faire tourner nos trains !

                    Répondre

                  • Un décodeur d’accessoire universel (2) 18 avril 2015 08:05, par Jean-Luc

                    Bonjour,

                    Quel est le fabricant des composants qui ne fonctionnent pas comme prévu ?
                    J’ai jeté un œil à la datasheet et à mon avis, s’agissant d’un optocoupleur actif, il faut mettre une capa de 100nF sur son alimentation. Ce n’est pas sur le schéma de Mynabay et c’est un tort.

                    Répondre

  • Un décodeur d’accessoire universel (2) 20 janvier 2015 19:35, par Philippe

    Merci pour vos réponses. Je vais donc attendre avec impatience ce troisième volet.

    Répondre

  • Un décodeur d’accessoire universel (2) 3 février 2015 23:05, par fandeloco

    Bonjour,

    Le site mynabay parle d’un optocoupleur 6N137 plutôt que 1N637 (les références en 1Nxxx sont pour les diodes)

    Cordialement

    Répondre

  • Un décodeur d’accessoires universel (2) 27 janvier 2016 07:45, par cardon samuel

    Bonjour,

    Je n’arrive pas à comprendre ce qu’est concrètement de "code DCC 316/0" ? Est ce que cela veut dire que sur ma centrale (multimaus) si je prend l’aiguillage à l’adresse 316 et que je clique sur le bouton droit l’arduino fera bouger le servo branché sur la pin 2 ? Et qu’ensuite si je clique sur le bouton dévié l’arduino fera bouger le servo de la pin 2 dans l’autre direction ?

    J’avais bien compris la version 3 de UAD (discutiion du le forum du N) mais il n’y avait pas cette notion de commander et de code DCC.

    Répondre

  • Un décodeur d’accessoires universel (2) 27 janvier 2016 09:18, par Thierry

    C’est presque ça. Dans mon exemple j’ai utilisé le code DCC comme une bascule. Cela signifie qu’à chaque appui sur le bouton de l’accessoire 316, il changera de sens. Le zéro désigne l’un des boutons du contrôleur. Selon le modèle, le code généré par les boutons est différent, mais je suppose que le bouton gauche est ’0’ et celui de droite ’1’... C’est le cas sur ma MS2, c’est à vérifier avec la Roco.
    Les Commanders sont là pour virtualiser la commande des accessoires et par exemple permet de remplacer facilement un bouton poussoir par une commande DCC ou inversement sans toucher à la déclaration ou au fonctionnement des accessoires eux-mêmes. Cela permettra aussi dans un futur plus ou moins proche d’utiliser un bus Can ou autre pour cette commande...

    Répondre

Réagissez à « Un décodeur d’accessoires universel (2) »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Bibliothèques »

Les derniers articles

Les articles les plus lus