LOCODUINO

Parlons Arduino => Bibliothèques => Discussion démarrée par: Benoit92 le octobre 01, 2017, 04:43:38 pm

Titre: Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 01, 2017, 04:43:38 pm
Bonjour,
Quelqu'un a-t-il déjà utilisé cette bibliothèque ?
Qu'en pensez-vous ?
C'est pour réaliser un décodeur de locomotive (échelle 1/32).
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 21, 2017, 10:42:21 pm
Bonjour,
Je me suis monté un petit bancs avec un arduino Uno R3, une Mobile Station 2 Märklin (MS2) + le petit circuit d’isolement du signal DCC (optocoupleur 6N136).
J'ai commencé à programmer un peu.
J’arrive à
 - allumer les feux avant et arrière en fonction du sens de marche F00 (sur la pin 13)
- allumer l'éclairage cabine F01 (sur la pin 13)
Par contre, j'ai un problème avec la montée/descente des pantographes avec un servo car le programme passe son temps à incrémenter ou décrémenter la position du servo (en partie à cause du delay(15); ).
J'aimerai que cette montée ou descente n'intervienne qu'au moment de l'appui sur le bouton de la MS2.

#include <Servo.h>
...............................................
        Servo PANTOGRAPHE;
        int pos = 0;
...............................................
     PANTOGRAPHE.attach(13);

     if( (FuncState && FN_BIT_01) == 1) // Condition MS2-F01 = 1
{
          for (pos = 0; pos <= 255; pos += 1) { // goes from 0 degrees to 255 degrees in steps of 1 degree
          PANTOGRAPHE.write(pos);              // tell servo to go to position in variable 'pos'
          delay(15);                       // waits 15ms for the servo to reach the position
          Serial.print("MONTEE PANTOGRAPHE:");   
}
}
    else // Condition MS2-F01 = 0
 { 
          for (pos = 255; pos >= 0; pos -= 1) { // goes from 255 degrees to 0 degrees
          PANTOGRAPHE.write(pos);              // tell servo to go to position in variable 'pos'
          delay(15);                       // waits 15ms for the servo to reach the position
          Serial.print("DESCENTE PANTOGRAPHE:");
}
}
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: bobyAndCo le octobre 22, 2017, 09:54:02 am
Bonjour,

Tout d'abord, pense à utiliser la balise code quand tu mets des programmes sur le forum, c'est plus clair et lisible.

J'aimerai que cette montée ou descente n'intervienne qu'au moment de l'appui sur le bouton de la MS2.

Je ne comprends pas bien ton code, il n'y a pas de setUp et pas de loop. Même si tu ne devais rien avoir à l'intérieur de ces balises, elles doivent être écrites dans le code.

Ensuite, je ne vois pas non plus de déclaration et encore moins d'initialisation pour FuncState et FN_BIT_01 ???

Bref, il vaudrait mieux que tu envoies "tout" le code, éventuellement en fichier joint.

Quoiqu'il en soit, il semble assez évident que c'est la variable FuncState qui devrait permettre que le programme ne fonctionne pas en continue. Il faut donc que cette condition soit vérifiée seule tout d'abord et non pas if( (FuncState && FN_BIT_01) == 1). Dans ce cas, le else est toujours exécuté quand  FuncState est à false. N'ayant pas tout le code, il n'est pas évident de comprendre tout ton programme, mais une rédaction comme ci-dessous devrait permettre que ça fonctionne mieux. A la fin du programme, tu vois que j'ai ajouté FuncState == false qui remet la variable FuncState à false jusqu'à ce qu'une nouvelle commande la remette à true et permette la montée ou la descente du pantographe.

Mais on peut aussi se demander si FuncState sert à quelque chose dans ton programme !

Bien amicalement.

Christophe



bool FuncState = false;

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  if (FuncState) { // L'action a été lancée, FuncState est à true
    if (FN_BIT_01) == 1) {// Condition MS2-F01 = 1
      for (pos = 0; pos <= 255; pos += 1) { // goes from 0 degrees to 255 degrees in steps of 1 degree
        PANTOGRAPHE.write(pos);              // tell servo to go to position in variable 'pos'
        delay(15);                       // waits 15ms for the servo to reach the position
        Serial.print("MONTEE PANTOGRAPHE:");
      } // End for
    }// End if
    else { // Condition MS2-F01 = 0
      for (pos = 255; pos >= 0; pos -= 1) { // goes from 255 degrees to 0 degrees
        PANTOGRAPHE.write(pos);              // tell servo to go to position in variable 'pos'
        delay(15);                       // waits 15ms for the servo to reach the position
        Serial.print("DESCENTE PANTOGRAPHE:");
      } // End for
    }// End else

    FuncState == false; // On met FuncState à false pour éviter de tourner sans fin

  }
}



Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: bobyAndCo le octobre 23, 2017, 08:59:26 am
En relisant mon message, je me suis aperçu qu'il y avait d'autres erreurs :

Je doute que tes servos fonctionnent dans des plage de 0 à 255 ! Tout au plus, un servo a un angle d'action de 180°.

Petit conseil, la fonction writeMicroseconds() offre un nombre de pas plus important (de 700 à 2300 bien souvent) ce qui permet des mouvements plus fluides et des positions d'arrivée plus précises.

Plutôt qu'un long discours  :

https://www.youtube.com/watch?v=f5klLiTm1Rs

Enfin, dans les boucles for je te suggère d'utiliser les incrémentations pos++ ou décrémentations pos-- plus conventionnelles et surtout plus compactes.

Bien amicalement,

Christophe
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 23, 2017, 09:04:31 pm
En fait, j'ai fait cela et c'est tombé en marche (le panto monte quand j’appuie sur le bouton F01 de la MS2  et descend quand je réappuie sur le bouton). L'essai est réalisé sur la pin 13 (pour l'instant) avec également vérification sur le moniteur série (j'ai enlevé les print()) :

   Signal = (FuncState & FN_BIT_01);    // Détection front montant
         
      if(Signal != SignalPrec)    // Détection front montant/descendant
       {
          PANTOGRAPHE.attach(13);

          if( (Signal)== 1)  // Condition MS2-F01 = 1
          {
              for (pos =0; pos <= 255; pos++){  // goes from 0 degrees to 180 degrees in steps of 1 degree
              PANTOGRAPHE.write(pos);              // tell servo to go to position in variable 'pos'
              Serial.print("MONTEE PANTOGRAPHE:");
              Serial.println(pos);
              delay(15);                       // waits 15ms for the servo to reach the position
              }
          }
            else // Condition MS2-F01 == 1
     
           if( (Signal)!= 1)  // Condition MS2-F01 = 1         
          {
              for (pos =255; pos >= 0; pos--){  // goes from 180 degrees to 0 degrees
              PANTOGRAPHE.write(pos);              // tell servo to go to position in variable 'pos'
              Serial.print("DESCENTE PANTOGRAPHE:");
              Serial.println(pos);
              delay(15);                       // waits 15ms for the servo to reach the position
             }
          }
       }
    SignalPrec = Signal; // Détection front montant/descendant

Si le servo est à 255, c'est parce qu'en fait j'envoie le signal sur la LED 13. Comme cela, je la vois mieux (c'est du à l'age).
Ce  chiffre sera bien évidemment à modifier en fonction du montage mécanique du pantographe.

Question : "Tout d'abord, pense à utiliser la balise code quand tu mets des programmes sur le forum, c'est plus clair et lisible" ?????
Cékoissa ?
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Dominique le octobre 24, 2017, 02:19:42 pm
Juste au dessus de la zone de saisie de ton texte, il y a plein de petites icônes.

En appuyant sur le bouton contenant un #, cela insére 2 balises code entre lesquelles tu peux coller ton code.
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Dominique le octobre 24, 2017, 02:28:26 pm
Il y a même une documentation de Simple Machines, pour tout savoir comment poster une contribution ici :

https://wiki.simplemachines.org/smf/Posting (https://wiki.simplemachines.org/smf/Posting)

Et je dirai aussi qu'il ne faut pas hésiter à se servir abondamment du lien "modifier" en haut à droite du post publié pour parfaire son œuvre (si, si, elle le mérite !!).

Amicalement
Dominique
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: bobyAndCo le octobre 24, 2017, 06:15:06 pm
Merci Dominique pour ces précisions.

Benoit,

Il faut que tu nous adresses l'intégralité de ton code sinon, c'est presque impossible de le comprendre et encore moins de le tester. En bas à gauche de la fenêtre de rédaction de message, tu as un lien "Fichiers joints et autres options..." puis plus bas quand tu cliques sur le lien choisissez un fichier. Tu sélectionnes alors ton fichier .ino.

Bien amicalement.

Christophe
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 24, 2017, 08:10:03 pm
Pour l'instant, le programme est à l'état "ébauche".
Curieusement, mes lignes de programme correspondant au différentes fonctions se retrouve juste derrière la lecture des données Dcc obtenu dans l'exemple de la bibliothèque NmraDcc :NmraDccMultifunctionDecoder_1
#define NOTIFY_DCC_SPEED
#ifdef  NOTIFY_DCC_SPEED
void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Speed, DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps )
{
  Serial.print("notifyDccSpeed: Addr: ");
  Serial.print(Addr,DEC);
  Serial.print( (AddrType == DCC_ADDR_SHORT) ? "-S" : "-L" );
  Serial.print(" Speed: ");
  Serial.print(Speed,DEC);
  Serial.print(" Steps: ");
  Serial.print(SpeedSteps,DEC);
  Serial.print(" Dir: ");
  Serial.println( (Dir == DCC_DIR_FWD) ? "Forward" : "Reverse" );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//Programme nécessitant d'exploiter les data : Dir, Speed, Speedsteps
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


Par contre, je ne suis ni dans la partie void setup(), ni dans la partie void loop() ??????????
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Dominique le octobre 24, 2017, 08:17:05 pm
Ca ne ressemble pas à un programme, mais seulement à une fonction qui affiche sur le moniteur les paramètres qu'on lui donne en entrée  :o ::) ??

Ca correspond aux lignes 41 à 55 de l'exemple NMRADccMultiFunctionDecoder_1.

Je ne vois vraiment pas où tu veux en venir !?!
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 24, 2017, 08:58:22 pm
Oui, cela permet de sortie le données sur le moniteur
Il reste les lignes au début :
#define NOTIFY_DCC_SPEED
#ifdef  NOTIFY_DCC_SPEED
void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Speed, DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps )
qui permettent de lire les données Addr,AddrType, Speed, Dir et SpeedSteeps

Le programme que j'ai pris comme base de travail (NMRADccMultiFunctionDecoder_1) lit ces données dans la partie "déclaration des données" et non pas dans la partie setup ou loop.
J'ai essayé d'utiliser ces données en mettant mes petits programmes dans la partie setup, mais les données  Addr,AddrType, Speed, Dir et SpeedSteeps ne sont pas connues à cet endroit (problèmes de portées ?)
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: bobyAndCo le octobre 24, 2017, 09:11:13 pm
Alors moi je fais du modélisme ferroviaire, pas du planeur !!! Là j'avoue ne plus rien comprendre du tout. Sans avoir examiné plus que cela la source que tu cites :

Le programme que j'ai pris comme base de travail (NMRADccMultiFunctionDecoder_1) lit ces données dans la partie "déclaration des données" et non pas dans la partie setup ou loop.

et que je trouve sur le GitHub ici : https://github.com/mrrwa/NmraDcc/blob/master/examples/NmraDccMultiFunctionDecoder_1/NmraDccMultiFunctionDecoder_1.ino

je vois un superbe void setup() ligne 163 et encore un void loop() ligne 184. Et qui plus est, le fichier possède une extension .ino bien rassurante dans notre petit univers Arduino.
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 24, 2017, 09:45:50 pm
En fait, ma méthode, c'est de réaliser une fonction par exemple : allumage de la diode 13 en fonction du sens de marche de la MS2.
Quand ça marche (ou que ça tombe en marche!), je mets ces instructions en commentaire (car pour l'instant, je valide en utilisant uniquement sur la diode 13 et le moniteur série d'où la bordée de print.
La fonction gestion de la vitesse est en cours.
A noter que je débute depuis 15 jours sur la programmation tout cours.
Donc, j'essaie de me faufiler humblement dans l'exemple NMRADccMultiFunctionDecoder_1.

#include <NmraDcc.h>
#include <Servo.h>
#include <PWMFreq.h>

#define This_Decoder_Address 3

struct CVPair
{
  uint16_t  CV;
  uint8_t   Value;
};

CVPair FactoryDefaultCVs [] =
{
// The CV Below defines the Short DCC Address
  {CV_MULTIFUNCTION_PRIMARY_ADDRESS, This_Decoder_Address},

  // These two CVs define the Long DCC Address
  {CV_MULTIFUNCTION_EXTENDED_ADDRESS_MSB, 0},
  {CV_MULTIFUNCTION_EXTENDED_ADDRESS_LSB, This_Decoder_Address},

// ONLY uncomment 1 CV_29_CONFIG line below as approprate
//  {CV_29_CONFIG,                                      0}, // Short Address 14 Speed Steps
  {CV_29_CONFIG,                       CV29_F0_LOCATION}, // Short Address 28/128 Speed Steps

//  {CV_29_CONFIG, CV29_EXT_ADDRESSING | CV29_F0_LOCATION}, // Long  Address 28/128 Speed Steps 
};

//xxxxxxxxxxxxxxxxxxxxxxxxxxxx
//  Début Essai Sens des feux
//xxxxxxxxxxxxxxxxxxxxxxxxxxxx
//    const int FEUX = 13;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Fin Essai Sens des feux
//xxxxxxxxxxxxxxxxxxxxxxxxxxx



//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Début Essai Eclairage cabine F0
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//     const int ECLAIRAGE_CABINE = 13;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Fin Essai Eclairage cabine
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx



//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
//   Début Essai Servo pantographe
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
        Servo PANTOGRAPHE;
        int pos;
        unsigned int Signal; // permet de gérer le front montant-descendant de la commande de levée-descente des pantographes
        unsigned int SignalPrec; // permet de gérer le front montant-descendant de la commande de levée-descente des pantographes
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
//   Fin Essai Servo pantographe
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 


NmraDcc  Dcc ;

uint8_t FactoryDefaultCVIndex = 0;

// Uncomment this line below to force resetting the CVs back to Factory Defaults
// FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs)/sizeof(CVPair);

void notifyCVResetFactoryDefault()
{
  // Make FactoryDefaultCVIndex non-zero and equal to num CV's to be reset
  // to flag to the loop() function that a reset to Factory Defaults needs to be done
  FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs)/sizeof(CVPair);
};

// Uncomment the #define below to print all Speed Packets
#define NOTIFY_DCC_SPEED
#ifdef  NOTIFY_DCC_SPEED
void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Speed, DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps )
{
  Serial.print("notifyDccSpeed: Addr: ");
  Serial.print(Addr,DEC);
  Serial.print( (AddrType == DCC_ADDR_SHORT) ? "-S" : "-L" );
  Serial.print(" Speed: ");
  Serial.print(Speed,DEC);
  Serial.print(" Steps: ");
  Serial.print(SpeedSteps,DEC);
  Serial.print(" Dir: ");
  Serial.println( (Dir == DCC_DIR_FWD) ? "Forward" : "Reverse" );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Début Essai Sens des feux
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//     pinMode( FEUX, OUTPUT );
//       if( Dir == 1)
//          digitalWrite( FEUX, HIGH );
//      else
//          digitalWrite( FEUX, LOW );
//xxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Fin Essai Sens des feux
//xxxxxxxxxxxxxxxxxxxxxxxxxxx


//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   
//   Début Essai Gestion vitesse (en cours)
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   
//setPWMFrequency(PINS_3_11, PWM_125); // 4k, 1k, 500, 250, 125, 30
//int pin1Moteur1=12; //cmd 1 du moteur 1
//int pin2Moteur1=8; // cmd 2 du moteur 1
//int pinPWMoteur1=3;// PMM du moteur 1
//int pin1Moteur2=2;//  cmd 1 du moteur 2
//int pin2Moteur2=4;//  cmd 2 du moteur 2
//int pinPWMoteur2=11;//  PWM du moteur 2
//
//pinMode( pin1Moteur1, OUTPUT );
//pinMode( pin2Moteur1, OUTPUT );
//pinMode( pinPWMoteur1, OUTPUT );
//pinMode( pin1Moteur2, OUTPUT );
//pinMode( pin2Moteur2, OUTPUT );
//pinMode( pinPWMoteur2, OUTPUT );
//
//int SpeedPrec
//       
//       if( (Speed)== 0)  //     Arret urgence
//          {
//            analogWrite(pinPWMoteur1,LOW);//Mettre moteur à 0
//            analogWrite(pinPWMoteur2,LOW);
//            digitalWrite(pin1Moteur1,LOW);
//            digitalWrite(pin2Moteur1,LOW);
//            digitalWrite(pin1Moteur2,LOW);
//            digitalWrite(pin2Moteur2,LOW);           
//          }
//        else
//      if(Speed != SpeedPrec)    // Détection changement vitesse (à partir du potentiomêtre MS2)
// {
//           if( (Dir)== 1)  // sens de marche avant
//          {
//            digitalWrite(pin1Moteur1,HIGH);
//            digitalWrite(pin2Moteur1,LOW);
//            digitalWrite(pin1Moteur2,HIGH);
//            digitalWrite(pin2Moteur2,LOW);
//            analogWrite(pinPWMoteur1,Speed);
//            analogWrite(pinPWMoteur2,Speed);
//           
//            for (pos =SpeedPrec; pos <= Speed; pos++)
//          }
//            else
//            if( (Dir)== 0)  // sens de marche arrière
//          {
//
//              digitalWrite(pin1Moteur1,LOW);
//              digitalWrite(pin2Moteur1,HIGH);
//              digitalWrite(pin1Moteur2,LOW);
//              digitalWrite(pin2Moteur2,HIGH);
//              analogWrite(pinPWMoteur1,Speed);
//              analogWrite(pinPWMoteur2,Speed);         
// }
//         SpeedPrec = Speed; // Détection changement vitesse

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Fin Essai Gestion vitesse (en cours)
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


};
#endif

// Uncomment the #define below to print all Function Packets
#define NOTIFY_DCC_FUNC
#ifdef  NOTIFY_DCC_FUNC
void notifyDccFunc(uint16_t Addr, DCC_ADDR_TYPE AddrType, FN_GROUP FuncGrp, uint8_t FuncState)
{
  Serial.print("notifyDccFunc: Addr: ");
  Serial.print(Addr,DEC);
  Serial.print( (AddrType == DCC_ADDR_SHORT) ? 'S' : 'L' );
  Serial.print("  Function Group: ");
  Serial.print(FuncGrp,DEC);

  switch( FuncGrp )
   {
#ifdef NMRA_DCC_ENABLE_14_SPEED_STEP_MODE   
     case FN_0:
       Serial.print(" FN0: ");
       Serial.println((FuncState & FN_BIT_00) ? "1  " : "0  ");
       break;
#endif
 
     case FN_0_4:
       if(Dcc.getCV(CV_29_CONFIG) & CV29_F0_LOCATION) // Only process Function 0 in this packet if we're not in Speed Step 14 Mode
       {
         Serial.print(" FN 0: ");
         Serial.print((FuncState & FN_BIT_00) ? "1  ": "0  ");
         
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   
//   Début Essai Eclairage cabine F0
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   
//         Serial.print("FuncState:");
//         Serial.print(FuncState);
//         Serial.print("FN_BIT_00:");
//         Serial.print(FN_BIT_00);
//         
//     pinMode( ECLAIRAGE_CABINE, OUTPUT );
//       if( (FuncState && FN_BIT_00) == 1)
//          digitalWrite( ECLAIRAGE_CABINE, HIGH );
//      else
//          digitalWrite( ECLAIRAGE_CABINE, LOW );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Fin Essai Eclairage cabine F0
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 
       }
       
       Serial.print(" FN 1-4: ");
       Serial.print((FuncState & FN_BIT_01) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_02) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_03) ? "1  ": "0  ");
       Serial.println((FuncState & FN_BIT_04) ? "1  ": "0  ");
       
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   
//  Debut Essai Pantographe F01
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   

         Serial.println("FuncState:");
         Serial.println(FuncState);
         Serial.println("FN_BIT_01:");
         Serial.println(FN_BIT_01);

        Signal = (FuncState & FN_BIT_01);    // Détection front montant
          Serial.println("Signal:");
          Serial.println(Signal);
         
      if(Signal != SignalPrec)    // Détection front montant-descendant
       {
          PANTOGRAPHE.attach(13);
              Serial.println("FuncState1:");
              Serial.println(FuncState & FN_BIT_01);

          if( (Signal)== 1)  // Condition MS2-F01 = 1
          {
              for (pos =0; pos <= 255; pos++){  // goes from 0 degrees to 180 degrees in steps of 1 degree
              PANTOGRAPHE.write(pos);              // tell servo to go to position in variable 'pos'
              Serial.print("MONTEE PANTOGRAPHE:");
              Serial.println(pos);
              delay(15);                       // waits 15ms for the servo to reach the position
              }
          }
            else // Condition MS2-F01 == 1
     
           if( (Signal)!= 1)  // Condition MS2-F01 = 1         
          {
              Serial.print("FuncState0:");
              Serial.println(FuncState);
             
              for (pos =255; pos >= 0; pos--){  // goes from 180 degrees to 0 degrees
              PANTOGRAPHE.write(pos);              // tell servo to go to position in variable 'pos'
              Serial.print("DESCENTE PANTOGRAPHE:");
              Serial.println(pos);
              delay(15);                       // waits 15ms for the servo to reach the position
             }
          }
       }
         SignalPrec = Signal; // Détection front montant
 //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//  Fin Essai Pantographe F01
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   

       break;

     case FN_5_8:
       Serial.print(" FN 5-8: ");
       Serial.print((FuncState & FN_BIT_05) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_06) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_07) ? "1  ": "0  ");
       Serial.println((FuncState & FN_BIT_08) ? "1  ": "0  ");
       break;
   
     case FN_9_12:
       Serial.print(" FN 9-12: ");
       Serial.print((FuncState & FN_BIT_09) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_10) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_11) ? "1  ": "0  ");
       Serial.println((FuncState & FN_BIT_12) ? "1  ": "0  ");
       break;

     case FN_13_20:
       Serial.print(" FN 13-20: ");
       Serial.print((FuncState & FN_BIT_13) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_14) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_15) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_16) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_17) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_18) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_19) ? "1  ": "0  ");
       Serial.println((FuncState & FN_BIT_20) ? "1  ": "0  ");
       break;
 
     case FN_21_28:
       Serial.print(" FN 21-28: ");
       Serial.print((FuncState & FN_BIT_21) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_22) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_23) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_24) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_25) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_26) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_27) ? "1  ": "0  ");
       Serial.println((FuncState & FN_BIT_28) ? "1  ": "0  ");
       break; 
 
   }
}
#endif

// Uncomment the #define below to print all DCC Packets
#define NOTIFY_DCC_MSG
#ifdef  NOTIFY_DCC_MSG
void notifyDccMsg( DCC_MSG * Msg)
{
  Serial.print("notifyDccMsg: ");
  for(uint8_t i = 0; i < Msg->Size; i++)
  {
    Serial.print(Msg->Data[i], HEX);
    Serial.write(' ');
  }
  Serial.println();
}
#endif

// This function is called by the NmraDcc library when a DCC ACK needs to be sent
// Calling this function should cause an increased 60ma current drain on the power supply for 6ms to ACK a CV Read

const int DccAckPin = 15 ;

void notifyCVAck(void)
{
  Serial.println("notifyCVAck") ;
 
  digitalWrite( DccAckPin, HIGH );
  delay( 8 ); 
  digitalWrite( DccAckPin, LOW );
}


void setup()
{
  Serial.begin(115200);
  Serial.println("NMRA Dcc Multifunction Decoder Demo 1");


   
 
  // Configure the DCC CV Programing ACK pin for an output
  pinMode( DccAckPin, OUTPUT );
  digitalWrite( DccAckPin, LOW );
 
    // Setup which External Interrupt, the Pin it's associated with that we're using and enable the Pull-Up
  Dcc.pin(0, 2, 0);
 
  // Call the main DCC Init function to enable the DCC Receiver
  //Dcc.init( MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0 );

  Dcc.init( MAN_ID_DIY, 10, FLAGS_MY_ADDRESS_ONLY, 0 );

  // Uncomment to force CV Reset to Factory Defaults
  notifyCVResetFactoryDefault();
}



void loop()
{
  // You MUST call the NmraDcc.process() method frequently from the Arduino loop() function for correct library operation
  Dcc.process();
 
  if( FactoryDefaultCVIndex && Dcc.isSetCVReady())
  {
    FactoryDefaultCVIndex--; // Decrement first as initially it is the size of the array
    Dcc.setCV( FactoryDefaultCVs[FactoryDefaultCVIndex].CV, FactoryDefaultCVs[FactoryDefaultCVIndex].Value);
  }
 
}
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Dominique le octobre 24, 2017, 10:52:19 pm
J'ai appris une nouvelle expression : tomber en marche .

D'habitude ça tombe en panne  ::)

Attention de ne pas tomber en marchant !

Merci pour cet instant de rigolade  ;D

Bon j'admire l'effort de se lancer dans la programmation sur un cas aussi compliqué et surtout sans passer par les phase d'apprentissage, par exemple en lisant et réalisant les projets débutants de Locoduino.
Mais vous êtes libre de tenter cette chance et d'explorer ce sujet pour lequel vous êtes pionnier sur Locoduino.
Bon courage.
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: bobyAndCo le octobre 24, 2017, 11:26:05 pm
Bon avec l'ensemble du code ça va mieux. Ceci dit, pour quelqu'un qui n'a que 15 jours de programmation, ce que tu as fait est vraiment bien !

Alors, quelques remarques, tout ne sera sans doute pas réglé du premier coup mais bon.

Lignes 53 à 55 tu as déclaré tes variables :
int pos;
unsigned int Signal; // permet de gérer le front montant-descendant de la commande de levée-descente des pantographes
unsigned int SignalPrec; // permet de gérer le front montant-descendant de la commande de levée-descente des pantographes

Mettre int pos ici n'est pas une erreur mais je te conseille de faire la déclaration et l'initialisation directement dans la boucle. Donc ligne 238 et 252

for (int pos = 0; pos <= 255; pos++)

for (int pos = 255; pos >= 0; pos--)

Placée ligne 53, pos est déclarée comme une variable globale donc occupera toujours un espace mémoire. Déclarée et initialisée dans la boucle, sa durée de vie est l'excécution de la fonction.

Il faudra alors effacer la ligne 53. Je vois par ailleurs que tu as adopté le système d'incrémenation et de décrémentation que je t'ai suggéré !

Lignes 54 et 55, tu as déclaré les variables Signal et SignalPrec. Ensuite, ces variables n'ont jamais été initialisées explicitement avant d'être utilisées dans le code surtout en ce qui concerne SignalPrec dont tu te sers pourtant dans un test if (Signal != SignalPrec) ligne 230. Ces variables ayant été déclarées dans le "TAS", on peut espérer qu'elle ont été initialisées en même temps. Mais faut-il prendre le risque alors que pour toute sécurité il suffit d'écrire ligne 54 et 55 ? :
unsigned int Signal = 0; // permet de gérer le front montant-descendant de la commande de levée-descente des pantographes
unsigned int SignalPrec = 0; // permet de gérer le front montant-descendant de la commande de levée-descente des pantographes

Pour moi, ligne 260,
SignalPrec = Signal; // Détection front montantn'est pas à sa place et devrait être placée avant l'accolade entre la ligne 258 et 259

Ligne 247, if ( (Signal) != 1) // Condition MS2-F01 = 1 ne sert à rien puisque le else  ligne 245 fait déjà le même "travail". Et au passage, il ne sert à rien de mettre (Signal) entre parenthèses : if ( (Signal) != 1)

Enfin, ce sera la dernière modification pour cette première série, il est pour moi impossible (voir dangeureux pour le moteur du servo) que pos puisse varier de 0 à 255 sur un servo !!!
for (int pos = 0; pos <= 255; pos++)Je t'invite à mettre des valeurs "plus raisonnables" comme par exemple 60 à 120 et de modifier ces valeurs "à tatons" en fonction des résultats que tu obtiens.
for (int pos = 60; pos <= 120; pos++)et bien sur :
for (int pos = 120; pos >= 60; pos--)

Essaye déjà cela et tiens nous au courant.

Et Dominique a raison, tu aurais pu commencer par moins difficile mais j'avoue que c'est un très bon début.  :)

Bien amicalement.

Christophe
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 25, 2017, 12:02:00 am
Merci  à tous pour ces conseils.
Je vais prendre une aspirine.
1) Par contre, comment repérer-vous les numéros de lignes ?
Ok, vu, j'ai modifié les préférences !
2) les instructions que j'ai écrites sont-elles bien placées par rapport à l'ensemble du programme (avant le set-up) ?

"Tomber en marche" est souvent utilisé au moins dans l'industrie (j'ai 30 ans d'expérience) pour expliquer qu'un système fonctionne alors qu'il devrait théoriquement foiré.

"Tomber en panne" c'est quand un système ne marche pas alors que théoriquement, il devrait marcher.

Quelque part, ça permet de rester modeste!

Cela fait partie des lois de Murphy.
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: bobyAndCo le octobre 25, 2017, 12:18:57 am
1) Par contre, comment repérer-vous les numéros de lignes ?

Tu prends l'ensemble du code que tu copies dans l'IDE de l'Arduino. Il y a des numéros à gauche de l'IDE

2) les instructions que j'ai écrites sont-elles bien placées par rapport à l'ensemble du programme (avant le set-up) ?

Si ça tombe en marche, probablement que oui. Maintenant, difficile de dire cela comme ça, je n'ai pas moyen de tester le code qui est quand même complexe et en lien avec une bibliothèque qui ne l'est pas moins. Le compilateur est un bon allié, si erreurs il te dis et bien souvent où. Quand il ne bronche plus, il ne faut pas être plus royaliste que le roi, c'est que ça doit aller !
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Jean-Luc le octobre 25, 2017, 08:40:40 am
Bonjour,

Note qu’avec toutes ces boucles et tous ces delay, ton code de manœuvre du pantographe est bloquant. Tu ne pourras pas l’intégrer en l’état avec le reste.

Regarde les articles

http://www.locoduino.org/spip.php?article6
http://www.locoduino.org/spip.php?article116

Et il faut que j’écrive un article sur SlowMotionServo, hein bobyAndCo :) ?
Titre: Re : Re : Bibliothèque Nmra.Dcc.h
Posté par: bobyAndCo le octobre 25, 2017, 09:42:34 am
Oui d'autant qu'il y a quelques perles dans SlowMotionServo. Le pantographe (à l'échelle O si j'ai bien suivi) dont  le mouvement se ferait avec une accélération au départ, une décélération à l'arrivée avec, cerise sur le gâteau,  un léger rebond à l'arrivée. Oui je crois qu'il est urgent que tu nous "clavarde" un article sur le sujet.

Maintenant, il faut commencer par rendre le code de Benoit opérationnel (même avec des delay()) car il y a une erreur de logique.

Par contre, j'ai un problème avec la montée/descente des pantographes avec un servo car le programme passe son temps à incrémenter ou décrémenter la position du servo

Je pense que c'est le changement de valeur de : SignalPrec = Signal; // Détection front montant qui ne devait pas être à la bonne place dans le code. Après, il pourra poursuivre "aux p'tits oignons" en utilisant SlowMotionServo

Benoit, désolé d'avoir insisté sur la plage de fonctionnement des servo 0 à 255. J'avais zappé sur le fait que tu utilisais des LED's pour tes tests.

Bien amicalement.

Christophe
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 25, 2017, 09:59:27 am
Il est clair que quand je monte ou descend le pantographe (sur la led 13!), l'arduino ne fait que cela (vu sur le moniteur), mais c'est pas grave car, dans la réalité, la locomotive ne fait rien pendant la montée et la descente du pantographe.
Pour l'instant, j'essaye de valider "en gros, le programme.
En parallèle, j'ai l'usinage de ma 2D2 (à l'échelle 1 :: 1/32) à réaliser (minitour + Minifraiseuse + Imprimante 3D).
C'est pas forcément évident car je dois usiner une plaque d'inox de 8 mm d'épaisseur pour faire les 16 roues.
Après, on peut toujours affiner avec un slowmotion, le rebondissement du pantographe sur la caténaire et même le petit "TSSSITTTTTTTTT" lors du contact pantographe/caténaire.
Pour la gestion de la vitesse je pourrais ensuite affiner en:
  - intégrant les taux d'accélération et décélération linéaires puis non linéaires
  - mesurant la valeur moyenne du signal Dcc pour engager un freinage ou une accélération progressive (système de canton avec 3 ou 4 diodes en série)
Pour le dételage, je pense installer directement l'attelage sur un servo.
pour l'instant, les fonctions suivantes fonctionnent :
  - Allumage cabine
  - Allumage des feux en fonction du sens de marche
  - Montée/Descente des pantographes (certes en linéaire), mais pour le résultat final, il faut que je réfléchisse sur le montage et la cinématique du servo.

Je m'attaque en suite à la gestion de la vitesse en essayant de ne pas bloquer l'arduino. C'est pour cela que je détecte si la consigne vitesse à changer avant de modifier les PWM des 2 moteurs.
J'y vais progressivement ! ! !
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: bobyAndCo le octobre 25, 2017, 01:10:39 pm
Benoit,

Est-ce que tu mettrais en copie l'ensemble du code sur le forum maintenant que la fonction panthographe fonctionne ?

Merci
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 25, 2017, 07:23:17 pm
J'ai mis tout ce que j'avais fait.
Il reste en particulierà terminer la gestion vitesse (pilotage pont en H).
A priori, je partirai sur la base de 2 moteurs de 12 V monté en série.
Ci-joint la partie pantographe :
Attention, j'ai mis 255 comme butée car je travaille sur la LED 13 (pour la voir).
A adapter sur ta locomotive pour éviter que le pantographe ne touche le plafond !

        Signal = (FuncState & FN_BIT_01);    // Détection front montant
          Serial.println("Signal:");
          Serial.println(Signal);
         
      if(Signal != SignalPrec)    // Détection front montant-descendant
       {
          PANTOGRAPHE.attach(13);
              Serial.println("FuncState1:");
              Serial.println(FuncState & FN_BIT_01);

          if( (Signal)== 1)  // Condition MS2-F01 = 1
          {
              for (pos =0; pos <= 255; pos++){  // goes from 0 degrees to 180 degrees in steps of 1 degree
              PANTOGRAPHE.write(pos);              // tell servo to go to position in variable 'pos'
              Serial.print("MONTEE PANTOGRAPHE:");
              Serial.println(pos);
              delay(15);                       // waits 15ms for the servo to reach the position
              }
          }
            else // Condition MS2-F01 == 1
     
           if( (Signal)!= 1)  // Condition MS2-F01 = 1         
          {
              Serial.print("FuncState0:");
              Serial.println(FuncState);
             
              for (pos =255; pos >= 0; pos--){  // goes from 180 degrees to 0 degrees
              PANTOGRAPHE.write(pos);              // tell servo to go to position in variable 'pos'
              Serial.print("DESCENTE PANTOGRAPHE:");
              Serial.println(pos);
              delay(15);                       // waits 15ms for the servo to reach the position
             }
          }
       }
         SignalPrec = Signal; // Détection front montant
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 25, 2017, 10:41:19 pm
J'ai changé Servo PANTOGRAPHE; par :
Servo obj_panthographe;

 obj_panthographe.detach(13) -----------> et j'ai le message suivant : no matching function for call to 'Servo::detach(int)'
 
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Dominique le octobre 25, 2017, 10:52:41 pm
Il manque donc quelque chose dans le code qu'il serait plus pratique de voir en totalité pour répondre.

Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 25, 2017, 11:57:49 pm
Voila .
#include <NmraDcc.h>
#include <Servo.h>
#include <PWMFreq.h>

#define This_Decoder_Address 3

struct CVPair
{
  uint16_t  CV;
  uint8_t   Value;
};

CVPair FactoryDefaultCVs [] =
{
// The CV Below defines the Short DCC Address
  {CV_MULTIFUNCTION_PRIMARY_ADDRESS, This_Decoder_Address},

  // These two CVs define the Long DCC Address
  {CV_MULTIFUNCTION_EXTENDED_ADDRESS_MSB, 0},
  {CV_MULTIFUNCTION_EXTENDED_ADDRESS_LSB, This_Decoder_Address},

// ONLY uncomment 1 CV_29_CONFIG line below as approprate
//  {CV_29_CONFIG,                                      0}, // Short Address 14 Speed Steps
  {CV_29_CONFIG,                       CV29_F0_LOCATION}, // Short Address 28/128 Speed Steps

//  {CV_29_CONFIG, CV29_EXT_ADDRESSING | CV29_F0_LOCATION}, // Long  Address 28/128 Speed Steps 
};

//xxxxxxxxxxxxxxxxxxxxxxxxxxxx
//  Début Essai Sens des feux
//xxxxxxxxxxxxxxxxxxxxxxxxxxxx
//    const int FEUX = 13;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Fin Essai Sens des feux
//xxxxxxxxxxxxxxxxxxxxxxxxxxx



//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Début Essai Eclairage cabine F0
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//     const int ECLAIRAGE_CABINE = 13;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Fin Essai Eclairage cabine
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx



//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
//   Début Essai Servo pantographe
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
        Servo obj_panthographe;
        unsigned int signal = 0; // permet de gérer le front montant-descendant de la commande de levée-descente des pantographes
        unsigned int signalPrec = 0; // permet de gérer le front montant-descendant de la commande de levée-descente des pantographes

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
//   Fin Essai Servo pantographe
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 


NmraDcc  Dcc ;

uint8_t FactoryDefaultCVIndex = 0;

// Uncomment this line below to force resetting the CVs back to Factory Defaults
// FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs)/sizeof(CVPair);

void notifyCVResetFactoryDefault()
{
  // Make FactoryDefaultCVIndex non-zero and equal to num CV's to be reset
  // to flag to the loop() function that a reset to Factory Defaults needs to be done
  FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs)/sizeof(CVPair);
};

// Uncomment the #define below to print all Speed Packets
#define NOTIFY_DCC_SPEED
#ifdef  NOTIFY_DCC_SPEED
void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Speed, DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps )
{
  Serial.print("notifyDccSpeed: Addr: ");
  Serial.print(Addr,DEC);
  Serial.print( (AddrType == DCC_ADDR_SHORT) ? "-S" : "-L" );
  Serial.print(" Speed: ");
  Serial.print(Speed,DEC);
  Serial.print(" Steps: ");
  Serial.print(SpeedSteps,DEC);
  Serial.print(" Dir: ");
  Serial.println( (Dir == DCC_DIR_FWD) ? "Forward" : "Reverse" );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Début Essai Sens des feux
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//     pinMode( FEUX, OUTPUT );
//       if( Dir == 1)
//          digitalWrite( FEUX, HIGH );
//      else
//          digitalWrite( FEUX, LOW );
//xxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Fin Essai Sens des feux
//xxxxxxxxxxxxxxxxxxxxxxxxxxx


//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   
//   Début Essai Gestion vitesse (en cours)
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   
//setPWMFrequency(PINS_3_11, PWM_125); // 4k, 1k, 500, 250, 125, 30
//int pin1Moteur1=12; //cmd 1 du moteur 1
//int pin2Moteur1=8; // cmd 2 du moteur 1
//int pinPWMoteur1=3;// PMM du moteur 1
//int pin1Moteur2=2;//  cmd 1 du moteur 2
//int pin2Moteur2=4;//  cmd 2 du moteur 2
//int pinPWMoteur2=11;//  PWM du moteur 2
//
//pinMode( pin1Moteur1, OUTPUT );
//pinMode( pin2Moteur1, OUTPUT );
//pinMode( pinPWMoteur1, OUTPUT );
//pinMode( pin1Moteur2, OUTPUT );
//pinMode( pin2Moteur2, OUTPUT );
//pinMode( pinPWMoteur2, OUTPUT );
//
//int SpeedPrec
//       
//       if( (Speed)== 0)  //     Arret urgence
//          {
//            analogWrite(pinPWMoteur1,LOW);//Mettre moteur à 0
//            analogWrite(pinPWMoteur2,LOW);
//            digitalWrite(pin1Moteur1,LOW);
//            digitalWrite(pin2Moteur1,LOW);
//            digitalWrite(pin1Moteur2,LOW);
//            digitalWrite(pin2Moteur2,LOW);           
//          }
//        else
//      if(Speed != SpeedPrec)    // Détection changement vitesse (à partir du potentiomêtre MS2)
// {
//           if( (Dir)== 1)  // sens de marche avant
//          {
//            digitalWrite(pin1Moteur1,HIGH);
//            digitalWrite(pin2Moteur1,LOW);
//            digitalWrite(pin1Moteur2,HIGH);
//            digitalWrite(pin2Moteur2,LOW);
//            analogWrite(pinPWMoteur1,Speed);
//            analogWrite(pinPWMoteur2,Speed);
//           
//            for (pos =SpeedPrec; pos <= Speed; pos++)
//          }
//            else
//            if( (Dir)== 0)  // sens de marche arrière
//          {
//
//              digitalWrite(pin1Moteur1,LOW);
//              digitalWrite(pin2Moteur1,HIGH);
//              digitalWrite(pin1Moteur2,LOW);
//              digitalWrite(pin2Moteur2,HIGH);
//              analogWrite(pinPWMoteur1,Speed);
//              analogWrite(pinPWMoteur2,Speed);         
// }
//         SpeedPrec = Speed; // Détection changement vitesse

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Fin Essai Gestion vitesse (en cours)
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


};
#endif

// Uncomment the #define below to print all Function Packets
#define NOTIFY_DCC_FUNC
#ifdef  NOTIFY_DCC_FUNC
void notifyDccFunc(uint16_t Addr, DCC_ADDR_TYPE AddrType, FN_GROUP FuncGrp, uint8_t FuncState)
{
  Serial.print("notifyDccFunc: Addr: ");
  Serial.print(Addr,DEC);
  Serial.print( (AddrType == DCC_ADDR_SHORT) ? 'S' : 'L' );
  Serial.print("  Function Group: ");
  Serial.print(FuncGrp,DEC);

  switch( FuncGrp )
   {
#ifdef NMRA_DCC_ENABLE_14_SPEED_STEP_MODE   
     case FN_0:
       Serial.print(" FN0: ");
       Serial.println((FuncState & FN_BIT_00) ? "1  " : "0  ");
       break;
#endif
 
     case FN_0_4:
       if(Dcc.getCV(CV_29_CONFIG) & CV29_F0_LOCATION) // Only process Function 0 in this packet if we're not in Speed Step 14 Mode
       {
         Serial.print(" FN 0: ");
         Serial.print((FuncState & FN_BIT_00) ? "1  ": "0  ");
         
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   
//   Début Essai Eclairage cabine F0
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   
//         Serial.print("FuncState:");
//         Serial.print(FuncState);
//         Serial.print("FN_BIT_00:");
//         Serial.print(FN_BIT_00);
//         
//     pinMode( ECLAIRAGE_CABINE, OUTPUT );
//       if( (FuncState && FN_BIT_00) == 1)
//          digitalWrite( ECLAIRAGE_CABINE, HIGH );
//      else
//          digitalWrite( ECLAIRAGE_CABINE, LOW );
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//   Fin Essai Eclairage cabine F0
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 
       }
       
       Serial.print(" FN 1-4: ");
       Serial.print((FuncState & FN_BIT_01) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_02) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_03) ? "1  ": "0  ");
       Serial.println((FuncState & FN_BIT_04) ? "1  ": "0  ");
       
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   
//  Debut Essai Pantographe F01
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   

         Serial.println("FuncState:");
         Serial.println(FuncState);
         Serial.println("FN_BIT_01:");
         Serial.println(FN_BIT_01);
        int pos;

        signal = (FuncState & FN_BIT_01);    // Détection front montant
          Serial.println("signal:");
          Serial.println(signal);
         
      if(signal != signalPrec)    // Détection front montant-descendant
       {
        obj_panthographe.attach(13);
              Serial.println("FuncState1:");
              Serial.println(FuncState & FN_BIT_01);

          if( (signal)== 1)  // Condition MS2-F01 = 1
          {
              for (pos =0; pos <= 255; pos++){  // goes from 0 degrees to 180 degrees in steps of 1 degree
              obj_panthographe.write(pos);              // tell servo to go to position in variable 'pos'
              Serial.print("MONTEE PANTOGRAPHE:");
              Serial.println(pos);
              delay(15);                       // waits 15ms for the servo to reach the position
              }
          }
            else // Condition MS2-F01 == 1
              Serial.print("FuncState0:");
              Serial.println(FuncState);
             
              for (pos =255; pos >= 0; pos--){  // goes from 180 degrees to 0 degrees
              obj_panthographe.write(pos);              // tell servo to go to position in variable 'pos'
              Serial.print("DESCENTE PANTOGRAPHE:");
              Serial.println(pos);
              delay(15);                       // waits 15ms for the servo to reach the position
             }
//          }
       obj_panthographe.detach(13);
       }
         signalPrec = signal; // Détection front montant
 //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//  Fin Essai Pantographe F01
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   

       break;

     case FN_5_8:
       Serial.print(" FN 5-8: ");
       Serial.print((FuncState & FN_BIT_05) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_06) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_07) ? "1  ": "0  ");
       Serial.println((FuncState & FN_BIT_08) ? "1  ": "0  ");
       break;
   
     case FN_9_12:
       Serial.print(" FN 9-12: ");
       Serial.print((FuncState & FN_BIT_09) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_10) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_11) ? "1  ": "0  ");
       Serial.println((FuncState & FN_BIT_12) ? "1  ": "0  ");
       break;

     case FN_13_20:
       Serial.print(" FN 13-20: ");
       Serial.print((FuncState & FN_BIT_13) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_14) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_15) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_16) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_17) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_18) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_19) ? "1  ": "0  ");
       Serial.println((FuncState & FN_BIT_20) ? "1  ": "0  ");
       break;
 
     case FN_21_28:
       Serial.print(" FN 21-28: ");
       Serial.print((FuncState & FN_BIT_21) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_22) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_23) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_24) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_25) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_26) ? "1  ": "0  ");
       Serial.print((FuncState & FN_BIT_27) ? "1  ": "0  ");
       Serial.println((FuncState & FN_BIT_28) ? "1  ": "0  ");
       break; 
 
   }
}
#endif

// Uncomment the #define below to print all DCC Packets
#define NOTIFY_DCC_MSG
#ifdef  NOTIFY_DCC_MSG
void notifyDccMsg( DCC_MSG * Msg)
{
  Serial.print("notifyDccMsg: ");
  for(uint8_t i = 0; i < Msg->Size; i++)
  {
    Serial.print(Msg->Data[i], HEX);
    Serial.write(' ');
  }
  Serial.println();
}
#endif

// This function is called by the NmraDcc library when a DCC ACK needs to be sent
// Calling this function should cause an increased 60ma current drain on the power supply for 6ms to ACK a CV Read

const int DccAckPin = 15 ;

void notifyCVAck(void)
{
  Serial.println("notifyCVAck") ;
 
  digitalWrite( DccAckPin, HIGH );
  delay( 8 ); 
  digitalWrite( DccAckPin, LOW );
}


void setup()
{
  Serial.begin(115200);
  Serial.println("NMRA Dcc Multifunction Decoder Demo 1");


   
 
  // Configure the DCC CV Programing ACK pin for an output
  pinMode( DccAckPin, OUTPUT );
  digitalWrite( DccAckPin, LOW );
 
    // Setup which External Interrupt, the Pin it's associated with that we're using and enable the Pull-Up
  Dcc.pin(0, 2, 0);
 
  // Call the main DCC Init function to enable the DCC Receiver
  //Dcc.init( MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0 );

  Dcc.init( MAN_ID_DIY, 10, FLAGS_MY_ADDRESS_ONLY, 0 );

  // Uncomment to force CV Reset to Factory Defaults
  notifyCVResetFactoryDefault();
}



void loop()
{
  // You MUST call the NmraDcc.process() method frequently from the Arduino loop() function for correct library operation
  Dcc.process();
 
  if( FactoryDefaultCVIndex && Dcc.isSetCVReady())
  {
    FactoryDefaultCVIndex--; // Decrement first as initially it is the size of the array
    Dcc.setCV( FactoryDefaultCVs[FactoryDefaultCVIndex].CV, FactoryDefaultCVs[FactoryDefaultCVIndex].Value);
  }
 
}
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 26, 2017, 12:13:31 am
Je crois qu'il ne faut pas de spécifier le numéro de pin (13)
Soit :
   obj_pantographe.detach();   

Là, le compilo ne me jette pas
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: bobyAndCo le octobre 26, 2017, 01:27:12 am
Je crois qu'il ne faut pas de spécifier le numéro de pin (13)
Soit :
   obj_pantographe.detach();   

Là, le compilo ne me jette pas

En effet, obj_pantographe est une instance unique de la classe Servo. Il pourrait y avoir d'autres instances en même temps mais elles ne pourraient pas porter le même nom. Puisque tu y as attaché la broche 13, il sait que c'est cette broche 13 qu'il doit détacher sans qu'on ait besoin de le spécifier.

Tu as un truc étonnant dans ton code, il n'y a pas "{" après ton else ligne 246. Il faut aussi que tu décommentes l'accolade fermante ligne 256 qui est l'accolade de fermeture du else.

Idéalement, il faut aussi que tu descendes obj_panthographe.detach(); sous l'accolade qui suit. Ce n'est pas faux ainsi mais cela viendrait alors en "pendant", sur le même niveau que obj_panthographe.attach(13); plus élégant !


else // Condition MS2-F01 == 1
          Serial.print("FuncState0:");
        Serial.println(FuncState);

        for (pos = 255; pos >= 0; pos--) { // goes from 180 degrees to 0 degrees
          obj_panthographe.write(pos);              // tell servo to go to position in variable 'pos'
          Serial.print("DESCENTE PANTOGRAPHE:");
          Serial.println(pos);
          delay(15);                       // waits 15ms for the servo to reach the position
        }
        //          }
        obj_panthographe.detach();

Bien amicalement.

Christophe
Titre: Re : Re : Bibliothèque Nmra.Dcc.h
Posté par: Jean-Luc le octobre 26, 2017, 08:20:52 am
Je crois qu'il ne faut pas de spécifier le numéro de pin (13)
Soit :
   obj_pantographe.detach();   

Là, le compilo ne me jette pas

C’est même complètement sûr. https://www.arduino.cc/en/Reference/ServoDetach
Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Benoit92 le octobre 26, 2017, 10:42:33 pm
Bon, maintenant, je vais cesser de travailler uniquement sur la fameuse pin 13.
C'est l'heure de faire la lettre au Père Noël :

 - Digital : Eclairage  Cabine (et tableau de bord) ---> Digital pin 2

 - Digital : Eclairage  Feux en marche AV (4diodes  : 2 blanches + 2 rouges) - ce sont des diodes à 3 pattes blanche/rouge ---> Digital pin 4

 - Digital pin 7 : Eclairage variable Feux  en marche AR (4diodes : 2 rouges+ 2 blanches) --> Digital pin 7

 - PWM : Servo Attelage arrière ( à l'avant je mettrais un attelage à vis) ----> Digital Pin 9 (PWM)

 - PWM : Servo pantographe AV----> Digital Pin 5 (PWM)

 - PWM : Servo pantographe AR----> Digital Pin 6 (PWM)

 - PWM : Moteurs (2 moteurs 12V en série) ---> Digital Pin 3 (PWM)

 - Tx/ Rx : Module de son Serialmp3player Digital Pin 0 (Rx) et Digital Pin 1 (Tx)

+ le prescaler TIMER 2 du PWM Moteurs sera modifié suivant la techno des moteurs. A noter que la modification du prescaler modifie en fait 2¨PWM (pin 3 et 11).

+ gestion des taux d'accélération et de décélération par :
1)    une interruption interne "Timer 1" ??) pour éviter que l'Arduino ne  perde du temps à incrémenter ou décrémenter la vitesse ?????
2)   avec avec la fonction milli () ??????



Titre: Re : Bibliothèque Nmra.Dcc.h
Posté par: Dominique le octobre 27, 2017, 10:41:15 am
Faisant du N j'avoue que je n'aurais jamais entrepris la construction d'un décodeur de loco. Mais dans une grosse machine, ça se conçoit quand on voit ça :

(http://forum.locoduino.org/index.php?action=dlattach;topic=385.0;attach=1103;image)
c'est sur http://www.lucadentella.it/en/2017/09/25/dcc-shield-per-arduino/ (http://www.lucadentella.it/en/2017/09/25/dcc-shield-per-arduino/)