LOCODUINO

Un décodeur d’accessoires universel (3)

. Par : Thierry

Résumé des épisodes précédents... Universal Accessory Decoder, UAD pour les amis, est une bibliothèque destinée à piloter des accessoires via des circuits de puissances commandés par un Arduino. Les ordres peuvent être reçus par des codes DCC en écoutant les rails, ou par des boutons à actionner manuellement, comme un TCO (Tableau de contrôle (…)

Retourner à l'article

Vous répondez à :

Un décodeur d’accessoires universel (3) 17 février 2016 21:52, par Gabor

Dear Thierry,

does the address calculation always work for you ? Because I found out, that - at least in case of using Multimaus -, basic accessory addressing and DCC_Decode::GetAddress, the address calculated by this function is not OK. In case of address 5 on Maus (in reality : 1), it’s okay, but for address 6,7,8 (reality : 2, 3, 4) this does not work. The real calculated address was 3, 5, 7, 13 and so on...

But after having a look at the address calculation in the other function DCC_Decoder::State_Execute I adapted the code and changed the calculation to Wolfgang Kufer’s (opendcc.de).
The original code lines were :
address = gPacket[1] & 0x70 ;
address = (address<<2) + (gPacket[0] & 0x3F) ;

The new code lines are (only the second one is changed) :
address = gPacket[1] & 0x70 ;
address = (address<<1) | (gPacket[0] & 0x3F) ;

I tested some addresses and now I get the following "real" addresses :
Multimaus / variable "address" (should be "Multimaus" minus 4)
5 / 1
6 / 2
7 / 3
20 / 16
So for me, it look OK :) And I’m interested, if this also works for e.g. Trix or other controllers (if you have some free time to test it :) )

Thanks,
Gabor

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.)

31 Messages

  • Un décodeur d’accessoire universel (3) 18 février 2015 18:58, par LIKIKI

    Bravo pour ce superbe travail.

    Les possibilités sont ENORME.

    Encore bravo.

    Répondre

  • Un décodeur d’accessoire universel (3) 19 février 2015 08:50, par Thierry

    Merci ! D’autres projets tout aussi utiles sont sur le feu !

    Répondre

  • Un décodeur d’accessoire universel (3) 19 février 2015 10:41, par jerome savary

    Bra...vo !!!

    quel site, mais quel site....!

    chapeau bas pour toutes ces infos, le temps passé, l’envie de partager.

    bra...vo !
    jerome

    Répondre

  • Bonjour,

    Merci pour votre travail !!!!

    J’ai une question. Comment utiliser votre code pour alumer/éteindre un LED avec une centrale DCC. Par exemple, avec l’adresse 01 sur la centrale DCC, en appuyant sur la touche F0 ou F1 ou d’autre, le LED s’allume ou s’éteint.

    Merci et bravo !
    Stephan

    Répondre

  • Un décodeur d’accessoire universel (3) 16 octobre 2015 10:54, par Thierry

    Je dirais quelque chose comme ça (compilé mais pas testé !)

    /*************************************************************
    project: <DCC Accessory Decoder>
    author: <Thierry PARIS>
    description: <Test for UAD library, with one light, controled by Dcc.>
    *************************************************************/
    
    #include "UniversalAccessoryDecoder.h"
    
    /* kDCC_INTERRUPT values :
    Board         int.0   int.1   int.2   int.3   int.4   int.5
    Uno, Ethernet   2      3
    Mega2560        2      3      21      20      19      18
    Leonardo        3      2      0       1       7
    */
    #define kDCC_INTERRUPT          5
    
    // Accessories
    
    Accessories accessories;
    DccCommander dccCommander;
    
    // Drivers
    	
    DriverArduino *arduino;
    
    //////////////////////////////////
    //
    // Setup
    //
    void setup()
    {
    	UAD_StartSetup();
    
        // Setup of the Dcc commander.
    	dccCommander.Setup(0x00, 0x00, kDCC_INTERRUPT);
    	dccCommander.SetStatusLedPin(13);
    
    	// Drivers setups
    
        // one light is connected to the arduino.
    	arduino = new DriverArduino(1, 0); // 1 motor/led, 0 servos
    	arduino->Setup();
    	arduino->SetupPortMotor(0, 13); // first port (0), pin 13
    	
    	// Accessories setups
    
        // Assign Dcc code for each accessory.
    	accessories.Setup(1);
    	accessories.Add(new AccessoryLight(1, 0)); // dcc 1/0
    
       // Attach each accessory to its driver/port.
    	LIGHT(accessories, 0)->Setup(arduino, 0); // use port 0 of arduino driver
    
    	UAD_EndSetup();
    }
    
    void loop()
    {
        // Dcc is run first, and if necessary, lets the accessories work.
    	if (dccCommander.Loop())
    	{
    		accessories.Loop();
    	}
    }

    Répondre

  • This is an interesting project !
    I was experimenting with SerialCommander in V4.1 on Arduino Nano.
    In the Loop function the following test :

    if ((int)character < 32 || (int)character > 60)

    is too restrictive. The ’_’ doesn’t pass the test.
    I have found that ’ ’ is allowable in CheckSyntax().
    Thank you.

    Répondre

  • Un décodeur d’accessoires universel (3) 8 novembre 2015 10:41, par Thierry

    Thanks for your comment. SerialCommander is a base or a sample for what you could do with a serial link, but I never tried to use it, so it is probably not functional... Fell free to adapt it to your needs and to share the result with us !

    Répondre

  • Un décodeur d’accessoires universel (3) 29 décembre 2015 17:32, par dudule

    bonjour
    très bonne démo bravo.
    petite remarque pour ce qui est de la commande simultanée de plusieurs appareils : peut on utiliser des optocoupleurs pour relayer les charges en utilisant une alim externe ?

    Répondre

  • Un décodeur d’accessoires universel (3) 14 février 2016 15:56, par Gabor

    Hi !
    I’d just like to ask you, if this UAD also works with the Roco Multimaus (and its commander nr. 10764) ? Because I set up an Uno (with kDCC_Interrupt = 2), where I have attached the optocoupler’s pin 6 to uno’s digital pin 2. But somehow, even the example program "SimpleLED" does not work.
    Is there anything different, that I shall keep in mind while using the Multimaus ?
    Thanks,
    Gabor

    Répondre

  • Un décodeur d’accessoires universel (3) 14 février 2016 17:08, par Thierry

    Hello. Thanks for using UAD. I have heard of a difference in the value of the Dcc code just on the Multimaus, shifted of 4 from the Arduino : if you program a Dcc code of 27 in the Arduino, you have to use the code 31 on your Multimaus ! I dont know why, and i dont have a Multimaus to test and try to solve the problem... With a Trix MS2 and an Ecos, 27 stay 27 !

    Répondre

    • Un décodeur d’accessoires universel (3) 14 février 2016 20:23, par Gabor

      Hello Thierry,

      Thanks for your help. I heard about a difference of 4, while using a Multimaus as controller, but I was not really sure about that.
      I had also a problem with the interrupt : I used the pin’s number for kDCC_INTERRUPT (pin 2), but not the interrupt’s number (like int. 0).
      With kDCC_INTERRUPT = 0 and choosing the address 5 on Multimaus (when the arduino is programmed for address 1) everything works.

      Thanks a lot,
      Gabor (from Hungary)

      Répondre

      • Un décodeur d’accessoires universel (3) 17 février 2016 21:52, par Gabor

        Dear Thierry,

        does the address calculation always work for you ? Because I found out, that - at least in case of using Multimaus -, basic accessory addressing and DCC_Decode::GetAddress, the address calculated by this function is not OK. In case of address 5 on Maus (in reality : 1), it’s okay, but for address 6,7,8 (reality : 2, 3, 4) this does not work. The real calculated address was 3, 5, 7, 13 and so on...

        But after having a look at the address calculation in the other function DCC_Decoder::State_Execute I adapted the code and changed the calculation to Wolfgang Kufer’s (opendcc.de).
        The original code lines were :
        address = gPacket[1] & 0x70 ;
        address = (address<<2) + (gPacket[0] & 0x3F) ;

        The new code lines are (only the second one is changed) :
        address = gPacket[1] & 0x70 ;
        address = (address<<1) | (gPacket[0] & 0x3F) ;

        I tested some addresses and now I get the following "real" addresses :
        Multimaus / variable "address" (should be "Multimaus" minus 4)
        5 / 1
        6 / 2
        7 / 3
        20 / 16
        So for me, it look OK :) And I’m interested, if this also works for e.g. Trix or other controllers (if you have some free time to test it :) )

        Thanks,
        Gabor

        Répondre

        • Un décodeur d’accessoires universel (3) 18 février 2016 09:18, par Thierry

          Good news ! I will check it soon with my MS2. But could you give the exact URL source of the good formula ? I have tried to decrypt opendcc.de, but german is like chinese for me, and even google translator does not want to translate the pages !

          Répondre

  • Un décodeur d’accessoires universel (3) 18 février 2016 20:34, par Gabor

    Hello ! :) It’s like French to me...beautiful language, but I cannot speak or understand it :)

    Well, you can find under "Dekoder" (decoder) a "Download" link on the left side. Thas directs you here : http://opendcc.de/elektronik/opende...

    I only tried to construct an Opendekoder 1 (=Hardware 1), so I took the firmware for "Signaldekoder V0.14" (signalling decoder) from Opendekoder1.
    It’s a ZIP file, where you find a SignalDekoder.c source file. There is a function "analyse_message", which decodes the address, too. (And in the source file, all comments are in English).

    Best regards,
    Gabor

    P.S. : On opendcc.de in the right upper corner, there is a button for English language. But I don’t know, if everything was translated into English - therefore take maybe the german link :)

    Répondre

  • Un décodeur d’accessoires universel (3) 16 juin 2016 15:10, par Boubou

    Bonjour,
    C’est génial, votre programme fonctionne parfaitement chez moi, mais j’ai une question :
    Je désire ajouter des détecteurs de présence avec une détection de frequence sur des entrées du Méga non utiliser. Je fais l’ajout dans la boucle avant le "if (dccCommander.Loop())", mais cà me bloque tous le reste.
    Dois-je créer une fonction pour pas être bloqué ?
    Merci d’avance

    Répondre

    • Un décodeur d’accessoires universel (3) 16 juin 2016 15:36, par Thierry

      Bonjour, et merci pour votre enthousiasme. Ce n’est pas tant de faire une fonction qui est important, mais ce que vous y mettez... Ce code ne doit pas être bloquant, par d’appel à delay() par exemple, pas de boucle infinie, ni même de boucle trop longue qui aurait pour effet de désynchroniser tout le reste. Le mieux serait de poster votre source sur la partie forum, ce qui permettrait à toute la communauté de suivre des échanges qui peuvent être instructifs, et me permettrait de voir de quoi il retourne !

      Répondre

      • Un décodeur d’accessoires universel (3) 16 juin 2016 15:46, par Boubou

        OK, je comprends, voici ce que je veux ajouter :


        void loop()
        {
        for (int a=38; a<46 ; a++ ) {
          int duration = pulseIn(a,HIGH);
          int b=a+8;
            if (duration >450 && duration <1500){
            digitalWrite (b, HIGH); 
          }else {digitalWrite (b, LOW);}
          }
         // Dcc is run first, and if necessary, lets the    accessories work.
          if (dccCommander.Loop())
          
          {
              accessories.Loop();
          }
        }

        Répondre

        • De ce que je comprends, pulseIn peut prendre un temps indéterminé, qui peut au pire osciller entre 450 et 1500 millisecondes pour une seule broche, et vous bouclez sur neuf broches de 38 à 46 ! C’est beaucoup trop long et ne permet pas au reste de fonctionner correctement... La première modification pourrait être de ne faire qu’une seule broche à chaque loop(). Mais même dans ce cas, la plus grande des durées possibles est tout de même d’une seconde et demie ! Un traitement par interruption pourrait faire l’affaire, mais il y a trop de broches concernées... La seule solution viable serait de faire faire ce travail à un autre Arduino, et de les faire discuter via I2C, CAN ou liaison série. Il faut réfléchir davantage...

          Répondre

          • Un décodeur d’accessoires universel (3) 17 juin 2016 09:45, par Jean-Luc

            La solution consiste à ne pas utiliser pulseIn qui est une fonction bloquante.

            Tel que c’est écrit, la boucle bloque longtemps le programme et les messages DCC sont perdus.

            Je dirais même plus que ça risque de bloquer éternellement. Il suffit qu’une seule des entrées ne délivre jamais de pulse.

            Réponse plus complète sur le forum : http://forum.locoduino.org/index.ph...

            Répondre

            • Un décodeur d’accessoires universel (3) 17 juin 2016 10:11, par Boubou

              Hello,

              Merci pour les infos, c’est cool.
              je vais séparer ma détection sur un autre arduino.
              J’ai aussi déplacer la discussion sur le forum comme préconiser.

              Sujet : Ajout fonction à mon programme décodeur d’accessoires universel

              Répondre

  • Un décodeur d’accessoires universel (3) 12 août 2018 13:39, par pierre

    Bonjour,

    J’ai très envie d’utiliser ce décodeur universel, j’utilise déjà la rétrosignalisation décrite dans ce site.

    Mais j’ai 35 aiguillages que je désire commander avec des servos.

    Je n’arrive pas à comprendre combien de servo peut piloter ce décodeur ?

    Cordialement

    Répondre

  • Bonjour, et merci de votre intérêt pour ma librairie.

    Le nombre d’accessoires n’est pas limité par la bibliothèque. Il l’est matériellement par le nombre de broches sur l’Arduino, et par la mémoire disponible pour déclarer les accessoires.
    D’autre part, il est important de ne PAS utiliser cette bibliothèque ! Elle a été remplacée depuis par Commanders pour les entrées (https://www.locoduino.org/spip.php?...) et Accessories pour les sorties (https://www.locoduino.org/spip.php?...) qui reprennent chacun une partie d’UniversalAccessoriesDecoder. Commanders assurera le décodage DCC ou des boutons, tandis qu’Accessories fera bouger les servos.
    Les exemples d’Accessories utilise tous ou presque Commanders, c’est un bon point de départ.

    Bon courage.

    Répondre

    • Un décodeur d’accessoires universel (3) 12 août 2018 18:26, par pierre

      Bonjour,

      Et merci de votre réponse.

      J’ai bien compris en ce qui concerne la bibliothèque, mais alors sur un Arduino Mega 2560, combien de servos pourrais-je connecter en fonction du nombre de broches disponibles.

      Cordialement

      Répondre

      • Le Mega dispose d’une cinquantaine de broches disponibles. La librairie de pilotage de servo livrée avec l’IDE Arduino qui est utilisée en interne par UAD et Accessories permet de piloter 48 servos avec un Mega... Il y a quand même une limite supplémentaire dont je n’ai pas parlé dans ma première réponse, c’est le courant que peut délivrer un Arduino ou un Mega. Pour simplifier, un Mega peut piloter simultanément 4 ou 5 servos, mais guère plus (http://arduino-info.wikispaces.com/...). 48 peuvent être raccordés si 4 ou 5 maximum sont activés en même temps... Si plus sont nécessaires, alors il faut alimenter les servos avec une source de courant extérieure et ne se servir que de la broche de pilotage de l’Arduino, pas de son alimentation.
        Si 35 servos doivent être pilotés, je placerai un Nano pour quatre servos aux endroits stratégiques, chacun recevant ses ordres sur un bus DCC ou autre et traitant ses propres servos. Nul besoin de les raccorder entre eux...

        Répondre

  • Un décodeur d’accessoires universel (3) 6 février 2020 19:14, par Jean François Lesage

    Bonjour,

    j’admire tout le travail qui a été fait ici
    j’ai réalisé le montage proposé avec inter leds et servos tout fonctionne bien
    quand je branche l’arduino sur mon circuit piloté par DCC++ je n’arrive pas à commander ni les servos ni les leds, la led 13 clignote bien , si j’envoie à dcc++ la commande a 19 1 0 le décodeur d’aiguillage jouef correspondant réagit. les commandes a 320 0 0 et autres restent sans effet. Quelle erreur puis-je faire. Merci de votre aide

    Répondre

  • Un décodeur d’accessoires universel (3) 7 février 2020 16:29, par thierry

    Bonjour

    Merci de vous intéresser à UAD, mais cette bibliothèque n’est plus maintenue depuis depuis plusieurs années. Je ne peux que vous conseiller de regarder les bibliothèques Commanders et Accessories qui en sont les héritières. Le fonctionnement est plus simple, les fonctionnalités étendues et elles sont maintenues par mes soins. Convertir votre projet pour elles ne devrait pas être très compliqué...

    Répondre

  • Un décodeur d’accessoires universel (3) 1er janvier 2021 22:24, par BRUNO

    Bonjour , merci pour cet article très complet , j’ai mis en application cette bibliothèque pour une commande de relais avec un attiny13 , le fonctionnement est parfait.
    Il y a quelques semaines j’ai acheté des puces attiny 804 (commande de Servo moteur), sur ces nouvelles puces il n’y a pas de INTO, je ne parvient pas à trouver la formule pour désigner la pin d’interruption, mes compétences sont dépassées !!
    donc est il possible d’utiliser ces nouveaux attiny avec cette bibliothèque et si oui comment faire , merci de votre aide , cordialement Bruno

    Voir en ligne : DCC et megaTinyCore

    Répondre

  • Un décodeur d’accessoires universel (3) 2 janvier 2021 14:15, par Thierry

    Bonjour. D’après le datasheet récupéré sur le site microchip qui développe et diffuse la famille des Atmel AVR dont l’ATTiny804 est l’un des membres (https://ww1.microchip.com/downloads...) , le chapitre 16.3.3 page 140 précise que toutes les broches peuvent piloter des interruptions. Après il faut trouver des exemples, mais ça doit se trouver...
    Je me permet de rappeler que cette bibliothèque n’est plus maintenue et qu’elle a été remplacée par deux bibliothèques : Commanders pour la partie prise de commande, par des boutons, des potars ou un décodeur DCC, et Accessories qui pilote des moteurs et des leds lorsqu’on lui demande gentiment. Bien entendu, ces deux bibs fonctionnent encore mieux ensemble... Accessories a par exemple beaucoup évolué en gérant les multiplicateurs de port (74HC595, MCP23017, PCA9505 ou SX1509...). Commanders dispose maintenant d’un automate qui lui permet de gérer des petits automatismes.

    Répondre

    • Un décodeur d’accessoires universel (3) 2 janvier 2021 14:54, par BRUNO

      Bonjour, oui j’avais parcouru la data, même si cette bibliothèque n’est plus d’actualité, j’ai plusieurs petits programmes que je fais tourner avec des attiny ou un nano et je voudrai pouvoir les transposer vers les nouveaux attiny
      mon problème c’est que je n’arrive pas à assigner une patte pour l’interruption, avec le nano je prenais INT0, mais je coince pour remplacer cette fonction avec l’attiny, Bruno

      Répondre

Rubrique Bibliothèques

Les derniers articles

Les articles les plus lus