Auteur Sujet: Un décodeur DCC pour les signaux à deux ou trois feux sur Arduino NANO/UNO  (Lu 31779 fois)

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Bonsoir, et bien reprenons,

vous avez téléchargé dans votre Nano le programme decoder_traffic_light.ino sans modification donc configuré en TRICOLOR et avec 90 comme première adresse. Le MODE est LOW donc le common = HIGH, ce qui n'est peut-être pas le cas si le commun de vos signaux est le GND (0V et que les feux sont actifs en envoyant du 5V sur chacune des LED via une résistance de limitation)
Vous avez mis un pont sur votre circuit sur jump common LED du coté +5V (même remarque)

vous avez branché les deux fils du DCC sur input DCC du circuit
Vous avez branché une LED verte (avec une résistance de limitation) sur G1 (qui correspond à D3)
Vous activez l'adresse 90 sur votre ECOS et la LED verte G1 s'allume.
Vous avez branché une LED rouge (avec une résistance de limitation) sur R1 (qui correspond à D4)
Vous activez les adresses d'accessoires 39 à 151 sur votre ECOS et la LED rouge R1 ne s'allume pas. Ni connectée de O1 à O5

Cordialement

denizot

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
Bonjour,
Oui j'ai téléversé decoder_traffic_light.ino sans modification,( mais je veux le faire fonctionner en bicolores) le commun de mes LED est effectivement le GND.
le pont est également sur GND.
oui j'ai branché les 2 fils DCC sur input
oui j'ai branché une led verte avec résistance sur G1 et la led s'allume
oui j'ai activé l'adresse 90 et la led verte est toujours allumée
oui j'ai branché une led rouge sur R1 avec une résistance elle est éteinte
oui j'ai activé et essayé toutes les adresses de 39 à 151 de G1 à G4 et rien ne se passe.

J'ai donc dû louper un épisode, car il me semble qu'à une borne sur deux la led verte devrait s'allumer ou je me trompe?   
cordialement et à tête reposée

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
  d'ou ma question ce montage fonctionne-t-il vraiment ?   

Oui si on se donne la peine de lire l'article et de configurer le programme et le module conformément à ses besoins.

Non dans le cas contraire.

Donc, il faut que vous modifiez le programme :

/***************************************************************************************       
 *            CONFIGURATION SETTING
 *           
 ****************************************************************************************/
 
// #define CONSOLE                             // output console, delete this after checking the configuration
#define MODE   HIGH                        // LOW or HIGH
#define FIRST_ID_DCC   90                   // first DCC address, DCC_CODE
#define NB_TRAFFIC_LIGHT  BICOLOR           //  TRICOLOR or BICOLOR

N'oubliez pas le petit condensateur de 27pf (22pf-270pf) aux bornes de 2 et 3 du 6N137. (comme déjà expliqué sur le site éditorial)   
Cordialement

denizot

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
Bonjour, il y a un mieux,
la led rouge s'allume désormais sur les bornes A5 04 G4 R3 O2 mais pas sur G2 et R1, et toujours aucune inter-action à partir de ma central multmaus à partir de l'adresse 90, effectivement sur ce montage, puisque l'emplacement n'existe pas sur le circuit imprimé,  je n'ai pas ajouté le 27 pf  le problème provient-il de là ?
cordialement

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
je n'ai pas ajouté le 27 pf  le problème provient-il de là ?

Pour le savoir, ajoutez le ...

effectivement sur ce montage, puisque l'emplacement n'existe pas sur le circuit imprimé,

Quel emplacement ?

Postez nous votre programme modifié.
Cordialement

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3045
  • 100% Arduino et N
    • Voir le profil
Attention, la facture de msport pour ce support technique particulier va être bien salée  ;D >:(
Cordialement,
Dominique

denizot

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
je n'ai pas ajouté le 27 pf  le problème provient-il de là ?

Pour le savoir, ajoutez le ...

effectivement sur ce montage, puisque l'emplacement n'existe pas sur le circuit imprimé,


/*
 * Decoder for traffic light with three or two leds on ARDUINO NANO
 *
 * by default the red leds are switched on
 * pin 2 receives DCC interrupts
 *
 * TRAFFIC LIGHT WITH THREE leds (GREEN, RED, YELLOW)
 * 5 decoders of traffic lights with three leds on Arduino UNO
 * the leds are controlled by pins 3 to A3 by triplet
 * traffic light 1 : 3,4,5
 * traffic light 2 : 6,7,8
 * traffic light 3 : 9,10,11
 * traffic light 4 : 12,13,A0
 * traffic light 5 : A1,A2,A3
 * two addresses by traffic light
 * even addresses for green and red lights
 * odd addresses for yellow light
 *
 * TRAFFIC LIGHT WITH TWO leds (GREEN, RED)
 * 8 decoders of traffic lights with two leds on Arduino UNO
 * the leds are controlled by pins 3 to A4 by pair
 * traffic light 1 : 3,4
 * traffic light 2 : 5,6
 * traffic light 3 : 7,8
 * traffic light 4 : 9,10
 * traffic light 5 : 11,12
 * traffic light 6 : 13,A0
 * traffic light 7 : A1,A2
 * traffic light 8 : A3,A4
 * one address by traffic light
 *
 * CONFIGURATION
 * MODE : determined by the common of the led, LOW if common = HIGH, HIGH if common = LOW
 * FIRST_ID_DCC : DCC address of the first traffic light
 * NB_TRAFFIC_LIGHT : determined by the kind of traffic light, BICOLOR for two leds, TRICOLOR for three leds
 *
 */

/***************************************************************************************           
 *            CONFIGURATION SETTING
 *           
 ****************************************************************************************/
 
//#define CONSOLE                             // output console, delete this after checking the configuration
#define MODE   HIGH                         // LOW or HIGH
#define FIRST_ID_DCC   90                   // first DCC address, DCC_CODE
#define NB_TRAFFIC_LIGHT  BICOLOR           //  TRICOLOR or BICOLOR

/********************************************************************************** 
 *   DON'T CHANGE THE FOLLOWING
 *********************************************************************************/
 
/******************************************************************************
 *    INTERNAL PARAMETERS
 *   
 ********************************************************************************/
 
//  DCC

#include <DCC_Decoder.h>                 // Minabay library
#define kDCC_INTERRUPT    0             // pin 2 receives DCC interrupts
int previous_address = 0;               // avoids multiple DCC addresses
int previous_position = 2;              // avoids multiple DCC orders
volatile boolean update_light;          // set if an update should be processed after DCC control

// traffic light

#define BICOLOR  8                     // 8 traffic lights with two leds
#define TRICOLOR 5                     // 5 traffic lights with three leds
#define FIRST_PIN         3             // pin of the first traffic light
#define GREEN             0             // address DCC/0
#define RED               1             // address DCC/1
#define YELLOW            2             // address DCC+1/0

// traffic light definition

struct light {
  int address;                    // its DCC address
  int current_position;           // green / red / yellow
  int green;                      // pin of the green led
  int red;                        // pin of the red led
  int yellow;                     // pin of the yellow led
  boolean activation_request;     // request of activation
};
light traffic_light[NB_TRAFFIC_LIGHT];    // the set of traffic light

/********************************************************************
 * method called if a request is made by the DCC
 *
 *******************************************************************/
 
void activation_traffic_light() {
  for (int i = 0; i < NB_TRAFFIC_LIGHT; i++)                 // for all traffic lights
  {
    if (traffic_light.activation_request == true)  // if the traffic_light is waiting for activation
    {
      switch(traffic_light.current_position)            // we look the current position
      {
        case GREEN :{                                                     // if green led
                      digitalWrite(traffic_light.green,MODE);         // switch on green
                      digitalWrite(traffic_light.red,!MODE);          // switch off red
                      if ( NB_TRAFFIC_LIGHT == TRICOLOR){digitalWrite(traffic_light.yellow,!MODE);} // switch off yellow
                      #ifdef CONSOLE
                        Serial.print("activation -> traffic light");Serial.print(i);Serial.println(" : green led");
                      #endif
                      break;}
        case RED : {                                                  // if red led
                      digitalWrite(traffic_light.green,!MODE);      // switch off green
                      digitalWrite(traffic_light.red,MODE);         // switch on red
                      if ( NB_TRAFFIC_LIGHT == TRICOLOR){digitalWrite(traffic_light.yellow,!MODE);} // switch off yellow
                      #ifdef CONSOLE
                        Serial.print("activation -> traffic light");Serial.print(i);Serial.println(" : red led");
                      #endif
                     break;}
         case YELLOW : {                                                  // if yellow led
                      digitalWrite(traffic_light.green,!MODE);         // switch off green
                      digitalWrite(traffic_light.red,!MODE);           // switch off red
                      digitalWrite(traffic_light.yellow,MODE);         // switch on yellow
                      #ifdef CONSOLE
                        Serial.print("activation -> traffic light");Serial.print(i);Serial.println(" : yellow led");
                      #endif
                     break;}
         }
           }
       traffic_light.activation_request = false;            // the traffic light is updated
      }
  update_light = false;                                        // all updates are made
}

/*************************************************************************************
 *  DCC method
 * 
 ***********************************************************************************/

void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data)

 
  address -= 1; address *= 4; address += 1; address += (data & 0x06) >> 1;    // DCC address decoding
  int led = (data & 0x01) ? GREEN : RED;                                      // DCC/0 or DCC/1
  int traffic_light_index = address;                                          // index of a traffic light   
  int color = led;                                                            // the color of the led
  boolean activation = false;
  if ((address != previous_address) || ((led != previous_position) && (address == previous_address))){ // if we change the address or the led
        switch (NB_TRAFFIC_LIGHT) {
          case BICOLOR : {      // if the address is in our range for traffic light with two leds
                    if ((address >= FIRST_ID_DCC) && (address < FIRST_ID_DCC + NB_TRAFFIC_LIGHT)){
                      traffic_light_index = address - FIRST_ID_DCC;                                  // index of the traffic light
                      activation = true;}
                        break;}
          case TRICOLOR : {     // if the address is in our range for traffic light with three leds
                    if ((address >= FIRST_ID_DCC) && (address < FIRST_ID_DCC + (2*NB_TRAFFIC_LIGHT))){
                      if (address%2 != 0) {  traffic_light_index = address - 1; color = YELLOW;}         // if odd address => yellow led
                        traffic_light_index = (traffic_light_index - FIRST_ID_DCC)/2;                    // index of the traffic light
                        activation = true;}
                        break;}
        }
     traffic_light[traffic_light_index].activation_request =  activation;    // activation is requested
     traffic_light[traffic_light_index].current_position = color;            // state is requested (color of the led)
     update_light = activation;                                              // traffic light update is requested
    }
   previous_address = address; previous_position = led;                    // the current activation is saved
  }
/**********************************************************************************************
 *  setup
 *
 ******************************************************************************************/

void setup() {
  int pin_jump = 0;                                                     // a jump for traffic light pins
  int traffic_light_jump = 0;                                           // a jump for traffic light number
  for (int i=0; i<NB_TRAFFIC_LIGHT; i++){                               // for all the traffic lights
    traffic_light.activation_request = false;                        // no activation request
    traffic_light.green = pin_jump + FIRST_PIN;                      // pin number of the green led
    pinMode(traffic_light.green, OUTPUT);                            // green led in output(ID DCC/0)                                                                                                                                                                                                                                                                   
    digitalWrite(traffic_light.green, !MODE);                       // green led switch off
    traffic_light.red = 1+ pin_jump + FIRST_PIN;                    // pin number of the red led
    pinMode(traffic_light.red, OUTPUT);                             // red led in output  (ID DCC/1)
    digitalWrite(traffic_light.red, MODE);                          // red led switch on
    if (NB_TRAFFIC_LIGHT == TRICOLOR) {                                // if three leds
      traffic_light.address = traffic_light_jump + FIRST_ID_DCC + i;   // its DCC ID
      traffic_light.yellow = 2+ pin_jump + FIRST_PIN;               // pin number of the yellow led
      pinMode(traffic_light.yellow, OUTPUT);                        // yellow led in output  (ID DCC+1/0)
      digitalWrite(traffic_light.yellow, !MODE);                    // yellow led switch off
      traffic_light_jump++;                                             // the following traffic light
      pin_jump+=3;                                                     // the following pin for three leds
          }
    else {                                                             // if two leds
         traffic_light.address = FIRST_ID_DCC + i;                  // its DCC ID
        pin_jump+=2;                                                   // the following pin for two leds
        }
 
  }
 
  DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);   // instanciate the DCC
  DCC.SetupDecoder( 0x00, 0x00, kDCC_INTERRUPT );                                   // its IT
  update_light = false;                                                             // no update
 
  #ifdef CONSOLE
   Serial.begin(115200);
   for (int i=0; i<NB_TRAFFIC_LIGHT; i++){
    Serial.print("traffic light");Serial.println(i);
    Serial.print("\t green led on pin : ");Serial.print(traffic_light.green);Serial.print(" , DCC address : ");Serial.print(traffic_light.address);Serial.println("/0");
    Serial.print("\t red led on pin : ");Serial.print(traffic_light.red);Serial.print(" , DCC address : ");Serial.print(traffic_light.address);Serial.println("/1");
    if (NB_TRAFFIC_LIGHT == TRICOLOR) {
      Serial.print("\t yellow led on pin : ");Serial.print(traffic_light.yellow);Serial.print(" , DCC address : ");Serial.print(traffic_light.address+1);Serial.println("/0");
      }
   }
  #endif
}

/*************************************************************************
 * loop
 *
 ******************************************************************/
 
void loop() {
  DCC.loop();                                              // Is there a DCC command ?
  if (update_light) {activation_traffic_light();}          // if yes, activation of traffic lights
}

Quel emplacement ?

Postez nous votre programme modifié.

denizot

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
Attention, la facture de msport pour ce support technique particulier va être bien salée  ;D >:(

Oui je l'ai dejà remercié plus haut pour la patience dont il fait montre avec moi, mais je dois avouer que cela n'est pas si simple, d'ailleurs je me demande pourquoi vous n'avez pas plutôt fait deux programmes l'un pour les tricolors et l'autre pour les bi avec toutes les mises à jours qui vont bien.
j'en profite pour écrire que j'ai soudé le petit condo de 27pf et que le résultat est surprenant car maintenant je n'ai plus que la led verte qui s'allume mais à condition que les leds rouges soient conecté également .......!   

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Bonsoir,

je crains que votre maitrise des outils informatiques et de l'électronique ne soit pas suffisante pour arriver à bout, seul, de ce montage.
Faites vous aider par quelqu'un qui voit ce que vous faites. A distance, c'est impossible.
En attendant lisez les articles de formation du site éditorial.

L'ajout de ce petit condensateur n'a aucune raison de provoquer ce que vous nous indiquez.
C'est que votre montage n'est pas fiable et que probablement vous avez fait un pont de soudure ailleurs ...

Par ailleurs, vous n'auriez pas du mettre la copie du programme dans la citation, les crochets sont supprimés. ( ligne 172 )
Il faut le mettre en code balise : #Ou mieux le mettre en fichier joint.
« Modifié: juin 28, 2021, 09:49:10 pm par msport »
Cordialement

denizot

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
Bonjour, je comprends que la réflexion de Dominique vous ai agacé et que vous renonciez à m'aider .... Certes mes connaissances en électronique sont loin d'être au top, mais je manie le fer à souder depuis l'âge de 12 ans et j'en ai 60, j'estime avoir un peu d'expérience, mes soudures sont propres et lorsqu'il m'arrive d'en avoir une sèche je la corrige.
Pour mes connaissances en informatique et l'usage de l'Arduino, là non plus je ne prétends pas être au top, j'ai découvert ce produit il y a peu de temps mais j'ai réalisé un fonctionnement de pont tournant, le fonctionnement d'un rotary dumper, et le fonctionnement d'un passage à niveau double voies à l'aide de sensor GP2YoD805Z0f parfaitement fonctionnel et réaliste. J'ai voulu passer à l'étape supérieur en réalisant un montage électronique complet et en réalisant pour la première fois de ma vie le circuit imprimé artisanalement. Là je dois dire que la réussite n'y était pas,  j'ai  donc opté pour votre solution, le faire imprimer chez JLCPCB.
Vous avez essayé de m'aider et je vous en remercie encore.
Mais à votre place, et pour éviter de perdre le temps que vous avez perdu avec moi, et qui à priori ne servira pas aux autres internautes, vous devriez refaire tout ce post avec les circuits qui vont biens et les programmes tricolores et bicolores bien séparé avec quelques options comme pour le fonctionnement avec CDM rail par exemple,  et téléchargeable, le détail exacte des composants. Car actuellement tout cela est un peu brouillon et peu conviviale.
Je vais donc essayer de me débrouiller seul avec ce truc qui ne fonctionne pas. En espérant obtenir un résultat quitte à réécrire tout le code.  Car le temps passé et les sous investis en vale la peine.   
cordialement  >:( ::) :-[ :-\
               

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3045
  • 100% Arduino et N
    • Voir le profil
Je ne pense pas que "la réflexion de Dominique" ait pu agacer msport mais je comprends qu'elle ait pu vous agacer, et je tente de comprendre ce qui se passe pour éviter de voir cela à nouveau.

Je suis désolé que cette réalisation se termine, pour le moment, par un échec. "Echouer c'est toujours apprendre" si on trouve ses erreurs et qu'on ne les refait pas par la suite.

Mais je ne suis pas certain que le fait de refaire le circuit chez JLCPCB ne suffira pas car il y a, dans tous projets, une série d'étapes à franchir après avoir validé l'étape précédente :

Le schéma d'abord doit être finalisé : je n'ai vu nulle part dans votre fil le schéma définitif utilisé et les explications du pourquoi du comment vous êtes parti de quoi...

On voit bien que vous êtes parti de l'article de JP Claudé (https://www.locoduino.org/spip.php?article161) qui a été consulté environ 7500 fois et beaucoup de modélistes ont réalisé ce montage, moi-même y compris, avec succès, y compris avec comandes par Traincontroler.

Donc ça marche et il faudrait rechercher les différences à la fois dans le matériel et ensuite dans le logiciel.

Beaucoup de modélistes passent énormément de temps à lire les articles et les contributions du forum, et ensuite, ensuite seulement, réalisent, échouent, recommencent jusqu'à la réussite, puis, le plus souvent quand c'est fini et testé, partagent leur expérience au profit des autres modélistes.

Vous avez pu profiter de cette énorme masse de contributions pour préparer votre projet, mais je n'ai pas vu vos efforts pour adapter ces connaissances à votre projet. Au lieu de cela, au fur et à mesure, chaque problème s'est étalé sur le forum (et avec force détails !), au risque de provoquer la risée d'autres modélistes ...

Bien entendu je comprends que vos connaissences en électronique et programmation aient pu vous manquer, mais là encore, il faut avoir la patience de les acquérir, même si cela prend du temps et réaliser des montages intermédiaires n'est pas un crime : Quand vous aurez réalisé tout ce que j'ai réalisé pour mon compte personnel et surtout pour rendre service à la communauté Locoduino ainsi qu'à mon club ferroviaire, on en reparlera tous les deux tranquillement, entre quatre yeux si vous voulez  :D :D :D

Le nec plus ultra serait que vous décriviez cette réalisation dans un post ad hoc, celui que vous auriez souhaité trouver pour réaliser votre projet ;D

Citer
refaire tout ce post avec les circuits qui vont biens et les programmes tricolores et bicolores bien séparé avec quelques options comme pour le fonctionnement avec CDM rail par exemple,  et téléchargeable, le détail exacte des composants
(je vous laisse mettre le "s" à la bonne place  >:()
« Modifié: juin 29, 2021, 12:20:19 pm par Dominique »
Cordialement,
Dominique

denizot

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
Bonjour Dominique, je comprends que mes réflexions de néophyte agace et encombre inutilement le forum d’un sachant comme vous. Mais justement, jusqu’à présent ce que j’ai réalisé pour mon train électrique  (déjà cité) ou pour ma maison dans le domaine de la domotique, centralisation de l’ouverture et fermeture de mes volets roulant et l’automatisation de mon portail le tout à base d’Arduino, avec l’unique aide de tuto sur youtube. Je pensai qu’avec locoduino j’allais intégrer une communauté d’entre aide, et j’y ai vraiment cru avec la patience de msport, et votre réflexion, a vraiment tout gâché, j’ai l’impression que votre site est réservé à quelques sachant qui cherche à se faire mousser entre eux. A la limite invité un C.. de temps en temps le mardi soir à un diné.
Le schéma d'abord doit être finalisé : je n'ai vu nulle part dans votre fil le schéma définitif utilisé et les explications du pourquoi du comment vous êtes parti de quoi...
Le schema utilisé est celui que j’ai téléchargé sur votre site ou l’emplacement pour souder le 27PF n’existe pas et qui est conçu pour faire fonctionner 5 feux tricolores mais à priori pas 7 feux bicolores.
Sur les 7500 consultations, je serais curieux de savoir combien ont fait aboutir ce projet ? 
Beaucoup de modélistes passent énormément de temps à lire les articles et les contributions du forum, et ensuite, ensuite seulement, réalisent, échouent, recommencent jusqu'à la réussite, puis, le plus souvent quand c'est fini et testé, partagent leur expérience au profit des autres modélistes.
Oui  je sais ce que c’est, oui je félicite tous ceux qui ont vus leurs projets aboutir, et qui en font profiter la communauté, une fois encore bravo.   
Vous avez pu profiter de cette énorme masse de contributions pour préparer votre projet, mais je n'ai pas vu vos efforts pour adapter ces connaissances à votre projet. Au lieu de cela, au fur et à mesure, chaque problème s'est étalé sur le forum (et avec force détails !), au risque de provoquer la risée d'autres modélistes ...
Malheureusement en tant que modérateur, il me semble que vous avez un peu de mal à synthétisé cette énorme masse de contributions, voilà pourquoi plus votre site prends de l’ampleur, plus tout cela devient brouillon et illisible. Vous ne voulez pas suivre les deux ou trois conseils que je vous donne. Dommage car vous y gagneriez en lisibilité plutôt qu’en curiosité.   
Cordialement             

mario-bl

  • Newbie
  • *
  • Messages: 1
    • Voir le profil
Re : Un décodeur DCC pour les signaux à deux ou trois feux sur Arduino NANO/UNO
« Réponse #42 le: janvier 04, 2022, 10:42:18 pm »
Bonsoir,
J'ai réalisé décodeur dcc pour des signaux tricolore et le programme posté à la première page marche bien pour une exploitation avec cdm rail,
Si vous voulez tester les signaux lors de la configuration il est nécessaire de cocher : "Autoriser le pilotage des signaux" dans options => RUN
attention dans la programmation du signal il faut indiquer le type de décodeur : LDT LS DEC

Merci pour le partage de ce décodeur,

Bonne soirée (et bonne année)




msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Un décodeur DCC pour les signaux à deux ou trois feux sur Arduino NANO/UNO
« Réponse #43 le: janvier 04, 2022, 11:16:58 pm »
Merci pour le retour d'expérience !
Cordialement