Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Benoit92

Pages: 1 ... 10 11 [12] 13 14
166
Bibliothèques / Re : Bibliothèque Nmra.Dcc.h
« 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);
  }
 
}

167
Bibliothèques / Re : Bibliothèque Nmra.Dcc.h
« 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 ?)

168
Bibliothèques / Re : Bibliothèque Nmra.Dcc.h
« 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() ??????????

169
Débuter / Re : Fréquence de récurrence PWM
« le: octobre 24, 2017, 07:48:26 pm »
Les locomotives Mârklin Echelle 1 utilisent les mêmes "Central station" que les locomotives HO.
Ces centrales sont multiprotocoles : MM1, MM2, mfx, Dcc.
Par contre, le décodeur est musclé en terme de puissance.
Pour le Dcc, la tension peut varier de + 21 volt à -21 Volt.
Comme la valeur moyenne du signal Dcc = 0, je pense que la tension moyenne maximale correspondant au signal  Dcc redressé (pont de diode) doit être de 21 Volt (pour pwm 100% duty cycle).
Par contre, je ne sais pas si je peux utiliser un moteur 12V en ne dépassant pas 50% de duty cycle.

170
Vos projets / Re : 2D2 Echelle 1/32
« le: octobre 24, 2017, 01:37:49 pm »
Ok, merci msport.

171
Débuter / Re : Fréquence de récurrence PWM
« le: octobre 24, 2017, 01:35:59 pm »
Merci,
Au fait, pour les moteurs, il faut prendre des 12V ou des 24V ?

172
Débuter / Re : Fréquence de récurrence PWM
« le: octobre 24, 2017, 10:13:06 am »
Merci Jean-Luc,
Je vais analyser ce document.
Je pense que seules, les entrés ENA1 et ENA2 du L298N doivent être avoir la bonne fréquence de commande du moteur.
Les signaux IN1, UN2, IN3 et IN4 sont fixes sauf en cas de changement de sens de rotation du moteur ?

173
Débuter / Fréquence de récurrence PWM
« le: octobre 24, 2017, 12:27:48 am »
Bonjour,
Suivant le type de moteur utilisé, la fréquence de pilotage est différente.
Cette fréquence varie en fonction en particulier des épaisseurs de tôle, de la technologie du moteur . . .
Pour cela, j'ai besoin de faire varier la fréquence de récurrence du PWM en fonction du type de moteur.
Et éventuellement pour optimiser cette fréquence(éviter les bruits moteur trop important)
Je m'aperçois que cela n'est pas possible dans le cadre de l'instruction AnalogWrite.
Il parait que d'origine, l'Arduino Uno donne une fréquence de récurrence de 890 Hz : c'est beaucoup trop pour un moteur surtout par exemple pour un moteur Märklin avec inducteur bobiné (ou moteur universelle ou moteur à CC Série) qui doit être limité au environ de 50-60 Hz.
Cette capacité à gérer les fréquences de récurrence est gérée par le protocole DCC (CV 9 Période PWM 0...255 (0))

Quelle serait la méthode pour pouvoir changer cette fréquence de récurrence sur les PWM Arduino?

174
Bibliothèques / Re : Bibliothèque Nmra.Dcc.h
« 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 ?

175
Bibliothèques / Re : Bibliothèque Nmra.Dcc.h
« 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:");
}
}

176
Bus DCC / Re : Märklin Mobile Station 2
« le: octobre 12, 2017, 11:40:10 pm »
Merci Dominique et Thierry,
La fonction "Ack" permet au décodeur de la locomotive de renvoyer un signal (pulse) calibré de 60mA pendant 6ms.
Cette impulsion est récupéré par le centrale de contrôle sur la voie de programmation.
Mais, bon si cela n'est pas nécessaire sur la Märklin Mobile 2, je ne vais pas me fatiguer la-dessus.

Traduction depuis l'allemand :
OpenDecoder V2 a la possibilité de renvoyer un signal à la centrale. Il peut s'agir d'une impulsion d'acquittement conforme DCC, d'une impulsion sur une ligne de retour séparée ou d'un arrêt d'urgence, signalé par une ligne distincte.

https://www.opendcc.de/elektronik/HW2/opendecoder2_hw_sch.html


177
Bus DCC / Re : Märklin Mobile Station 2
« le: octobre 12, 2017, 10:36:11 am »
Il parait que certaines centrales, lors de la programmation CV du décodeur, ont besoin d'un acknolegment (Ack) pour envoyer les data des CV.

178
Bus DCC / Märklin Mobile Station 2
« le: octobre 12, 2017, 12:01:56 am »
J'ai réussi à récupérer une Mobile Station 2 d'occasion.
Je me demande s'il faut installer la fonction "Ack" sur le décodeur pour pouvoir programmer les CV à partir de la Mobile Station 2.

179
Vos projets / Re : 2D2 Echelle 1/32
« le: octobre 11, 2017, 11:26:24 pm »
Après consultation d'un certains nombres de sites, je pense partir sur la base du hardware et software "Wolfgang Kuffer’s DCC Decoder".
Je me pose la question de la génération du son. Je pense que ce serait risqué d'intégrer des fichiers son dans le logiciel arduino. Je pense utiliser une carte son (Serial MP3 Player) avec une liaison I2C avec l'arduino.

Par contre, je cherche des fichiers Wave ou MP3 correspondant à la locomotive 2D2 (ou une locomotive électrique de 1930 suisse ou allemande). J'aimerais trouver des fichiers bruits unitaires : avertisseur, compresseur, frein, moteurs électriques, . . . )

Nota : je cherche un équivalent américain en 2NXXXX du transistor BC860 (référence européenne)
Merci

180
Bibliothèques / 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).

Pages: 1 ... 10 11 [12] 13 14