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

Benoit92

  • Full Member
  • ***
  • Messages: 200
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #15 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.
« Modifié: octobre 25, 2017, 12:08:17 am par Benoit92 »

bobyAndCo

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

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1713
    • Voir le profil
Re : Bibliothèque Nmra.Dcc.h
« Réponse #17 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 :) ?
Cordialement

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1073
  • HO avec DCC++
    • Voir le profil
Re : Re : Bibliothèque Nmra.Dcc.h
« Réponse #18 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
« Modifié: octobre 25, 2017, 01:07:55 pm par bobyAndCo »

Benoit92

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

bobyAndCo

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

Benoit92

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

Benoit92

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

Dominique

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

Cordialement,
Dominique

Benoit92

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

Benoit92

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

bobyAndCo

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

Jean-Luc

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

Benoit92

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




Dominique

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


c'est sur http://www.lucadentella.it/en/2017/09/25/dcc-shield-per-arduino/
Cordialement,
Dominique