Auteur Sujet: Bibliothèque Nmra.Dcc.h  (Lu 23280 fois)

Benoit92

  • Full Member
  • ***
  • Messages: 200
    • Voir le profil
Bibliothèque Nmra.Dcc.h
« 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).
« Modifié: octobre 01, 2017, 06:54:35 pm par Benoit92 »

Benoit92

  • Full Member
  • ***
  • Messages: 200
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #1 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:");
}
}
« Modifié: octobre 21, 2017, 10:45:13 pm par Benoit92 »

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 904
  • HO avec DCC++
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #2 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

  }
}



« Modifié: octobre 23, 2017, 08:44:33 am par bobyAndCo »

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 904
  • HO avec DCC++
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #3 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  :



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
« Modifié: octobre 23, 2017, 09:08:01 am par bobyAndCo »

Benoit92

  • Full Member
  • ***
  • Messages: 200
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #4 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 ?
« Modifié: octobre 24, 2017, 10:04:46 am par Benoit92 »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #5 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.
Cordialement,
Dominique

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #6 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

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
Cordialement,
Dominique

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 904
  • HO avec DCC++
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #7 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

Benoit92

  • Full Member
  • ***
  • Messages: 200
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #8 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() ??????????

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #9 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 !?!
« Modifié: octobre 24, 2017, 08:21:42 pm par Dominique »
Cordialement,
Dominique

Benoit92

  • Full Member
  • ***
  • Messages: 200
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #10 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 ?)

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 904
  • HO avec DCC++
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #11 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.
« Modifié: octobre 24, 2017, 09:14:16 pm par bobyAndCo »

Benoit92

  • Full Member
  • ***
  • Messages: 200
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #12 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);
  }
 
}

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #13 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.
« Modifié: octobre 24, 2017, 11:14:32 pm par Dominique »
Cordialement,
Dominique

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 904
  • HO avec DCC++
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #14 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