Auteur Sujet: DCC++ Exploitation des commandes de programmation  (Lu 3606 fois)

msport

  • Hero Member
  • *****
  • Messages: 655
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Re : DCC++ Exploitation des commandes de programmation
« Réponse #15 le: août 25, 2018, 10:55:18 am »

- Est-ce qu'un court-circuit a coupé le DCC ?
- Est-ce qu'on est hors tension ?
- Est-ce qu'on est sous tension ?


le moniteur renvoie sur la liaison série au changement d'état, entre autres :
<p0> mise hors tension
<p1> mise sous tension
<p2> CC sur voie principale
<p3> CC sur voie de programmation

à vérifier dans l'onglet DCCpp_Uno

CurrentMonitor mainMonitor(CURRENT_MONITOR_PIN_MAIN,"<p2>"); // create monitor for current on Main Track
CurrentMonitor progMonitor(CURRENT_MONITOR_PIN_PROG,"<p3>"); // create monitor for current on Program Track
Cordialement

Tony04

  • Full Member
  • ***
  • Messages: 213
    • Voir le profil
Re : DCC++ Exploitation des commandes de programmation
« Réponse #16 le: août 25, 2018, 11:20:14 am »
Bonjour Dominique et Michel (et à tous),

je pense que ta solution, Dominique, va être la bonne et je t'en remercie. J'ai bien compris pourquoi le forum tourne un peu au ralenti ces dernières semaines et c'est bien normal vue ce que vous allez présenter à Orléans, il n'y a pas de soucis de ce coté.

Quand à toi Michel, merci aussi pour ta contribution mais ces codes envoyés sur la liaison série m'étaient déjà connus mais ne sont pas exploitables dans le loop, ou plutôt je ne sais pas faire.

Bonne journée à tous

Antoine

Souris verte

  • Newbie
  • *
  • Messages: 26
  • HO, DCC, Arduino...
    • Voir le profil
Re : DCC++ Exploitation des commandes de programmation
« Réponse #17 le: août 25, 2018, 02:12:14 pm »
On n’est pas très loin de ce j’ai écrit  :o

Tony04

  • Full Member
  • ***
  • Messages: 213
    • Voir le profil
Re : DCC++ Exploitation des commandes de programmation
« Réponse #18 le: août 25, 2018, 03:09:06 pm »
En effet Yannick, tu y étais même tout à fait.

Je viens de rajouter la routine de mesure du courant dans mon loop et cela fonctionne parfaitement à un détail prêt: La routine de la librairie DCCpp est toujours active et j'aimerais dépasser les valeurs qui gèrent cette routine.
J'ai essayer de ne pas charger "CurrentMonitor.h" dans "DCCpp.h" mais comme prévu je me retrouve avec pleins de messages d'erreurs à la compilation.

Pour me dépanner j'ai passé la valeur MAX de la routine à 1300 à la ligne 38 de "CurrentMonitor.h" mais je ne voudrais pas trop toucher à cette bibliothèque si possible.

Dans ton programme va et vient, Dominique, as-tu inhiber cette routine de la librairie ? Et si oui, comment ?

A plus tard donc
« Modifié: août 25, 2018, 03:20:25 pm par Tony04 »

Souris verte

  • Newbie
  • *
  • Messages: 26
  • HO, DCC, Arduino...
    • Voir le profil
Re : DCC++ Exploitation des commandes de programmation
« Réponse #19 le: août 25, 2018, 04:40:40 pm »
bonjour,

La routine n'est pas utilisée dans le programme.

Dans le CurrentMonitor, la valeur 300 correspond à la valeur par défaut si tu ne le précises pas.
il  faut l'initialier avec la valeur que tu souhaites:
begin (int pin, const char *msg, float inSampleMax = 300)
Dans ton cas, le loop fait appel à la fonction stop_DCC.
L'avantage de passer par 2 fonctions et pouvoir faire autre chose . pas seulement arrêter ou démarrer DCC.

en modifiant les 2 fonctions:
void start_DCC(PIN_DCC) {            // Démarre DCC en fonction de la PIN passée en paramètre (Main ou Prog)
  digitalWrite(PIN_DCC,HIGH);
  digitalWrite(LEDROUGE, HIGH);             // eteint led rouge ou autre
}

void stop_DCC(PIN_DCC) {                     // Stop DCC en fonction de la PIN passée en paramètre (Main ou Prog)
  digitalWrite(PIN_DCC,LOW);
  digitalWrite(LEDROUGE, LOW);              // allume led rouge ou autre
  delay(1000);
}

void loop() {

  ///////////////// Declenchement DCCpp  ///////////////////////////////////

  DCCpp::loop();
 
  //// Affichage courant, détection de court-circuit et de faux contact ////
 
  // affichage courant = la valeur maxi pendant 500 ms pour la voie Prog
  if ((millis() - gCurrentSampleTimeMain) > 500) {
    gCurrentSampleTimeMain = millis();
    #ifdef DEBUG
    Serial.println(gCurrentMain*5);Serial.print(' '); // en mA réels
    #endif
    gCurrent = 0;
  }
  int iCurrentMain = analogRead(Max471_Main);
  if (iCurrentMain > gCurrentMain) {
    gCurrentMain = iCurrentMain;
    if (gCurrentMain > CurrentMaxMain) { // 400 * 5 = 2000 mA
      stop_DCC(LMD_PWM_Main);
    }
  }
  if ((iCurrentMain == 0) && (mAutomate.auto_etat > 2)) { // perte de consommation
    if ((millis() - gCurrentNulTimeMAin) > NULCURRENT_TIME) {
      mAutomate.auto_etat=INIT;           // RAZ automate
      mAutomate.LRclignote=true;          // led rouge clignote
      mTrain.cran_vitesse = 0;            // vitesse = 0
      mTrain.lumiere=false;
      delay(2000);
      stop_DCC(LMD_PWM_Main);                         // arrêt DCC
      #ifdef DEBUG
      Serial.println("Faucon_Main");       // panne de courant
      #endif
    }   
  } else {
     gCurrentNulTimeMain = millis();           // relance tempo
  }

  // affichage courant = la valeur maxi pendant 500 ms pour la voie Prog
  if ((millis() - gCurrentSampleTimeProg) > 500) {
    gCurrentSampleTimeProg = millis();
    #ifdef DEBUG
    Serial.println(gCurrentProg*5);Serial.print(' '); // en mA réels
    #endif
    gCurrent = 0;
  }
  int iCurrentProg = analogRead(Max471_Prog);
  if (iCurrentProg > gCurrentProg) {
    gCurrentProg = iCurrentProg;
    if (gCurrentProg > CurrentMaxProg) { // 400 * 5 = 2000 mA
      stop_DCC(LMD_PWM_Prog);
    }
  }
  if ((iCurrentProg == 0) && (mAutomate.auto_etat > 2)) { // perte de consommation
    if ((millis() - gCurrentNulTimeProg) > NULCURRENT_TIME) {
      mAutomate.auto_etat=INIT;           // RAZ automate
      mAutomate.LRclignote=true;          // led rouge clignote
      mTrain.cran_vitesse = 0;            // vitesse = 0
      mTrain.lumiere=false;
      delay(2000);
      stop_DCC(LMD_PWM_Prog);                         // arrêt DCC
     #ifdef DEBUG
      Serial.println("Faucon_Prog");       // panne de courant
      #endif
    }   
  } else {
    gCurrentNulTimeProg = millis();           // relance tempo
  }
 
} //loop



A toi de voir les morceaux qui te conviennent.
Bonne recherche
Yannick
« Modifié: août 25, 2018, 04:48:28 pm par Souris verte »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1709
  • 100% Arduino et N
    • Voir le profil
Re : DCC++ Exploitation des commandes de programmation
« Réponse #20 le: août 25, 2018, 04:53:26 pm »
En fait c'est tout simple :

Je n'utilise pas la mesure de courant de DCCpp donc je n'utilise pas "CurrentMonitor" et j'utilise ma propre routine de détection.
L'entrée A0 du détecteur de courant est alimentée seulement par mon max471 et lue par ma routine :
int iCurrent = analogRead(A0);
  if (iCurrent > gCurrent) {
    gCurrent = iCurrent;
    if (gCurrent > CurrentMax) { // 400 * 5 = 2000 mA
    stop_DCC();
    }
  }

Donc il n'y a aucun risque de conflit entre DCCpp et ma mesure.

Tout est dans le programme du va et vient (article 232)

Tony04

  • Full Member
  • ***
  • Messages: 213
    • Voir le profil
Re : Re : DCC++ Exploitation des commandes de programmation
« Réponse #21 le: août 25, 2018, 06:02:42 pm »
Je n'utilise pas la mesure de courant de DCCpp donc je n'utilise pas "CurrentMonitor" et j'utilise ma propre routine de détection.

Désolé Dominique pour mon incompréhension  :( , je ne vois pas dans ton programme par quel action tu supprimes la mesure de courant de la librairie DCCpp, elle aussi mesure sur A0. Ou est-ce comme écrit Yannick en augmentant la valeur lors du begin ?


Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1709
  • 100% Arduino et N
    • Voir le profil
Re : DCC++ Exploitation des commandes de programmation
« Réponse #22 le: août 25, 2018, 08:16:51 pm »
Il va falloir que je me plonge dans le code de DCCpp mais pas avant quelques jours ou demander à Thierry que je vois dans 8 jours  :D

Avant DCCpp (donc DCC++) je n’utilisais pas le current monitor. Avec DCCpp il y a sûrement un moyen d’en faire autant mais je n’ai rien avec moi pour le moment pour te répondre.

Alors un peu de patience.

Dominique

Souris verte

  • Newbie
  • *
  • Messages: 26
  • HO, DCC, Arduino...
    • Voir le profil
Re : DCC++ Exploitation des commandes de programmation
« Réponse #23 le: août 25, 2018, 08:39:05 pm »
La routine n’est pas supprimée, elle n’est pas appelée.

Comme dans la vraie vie, une bibliothèque regroupe les livres mais tu ne les lis pas tous en même temps.

DCCpp te permet d’utiliser plusieurs fonctions DCCpp::... qui ne sont pas forcément utilisées.

Tony04

  • Full Member
  • ***
  • Messages: 213
    • Voir le profil
Re : DCC++ Exploitation des commandes de programmation
« Réponse #24 le: août 25, 2018, 08:57:28 pm »
La routine n’est pas supprimée, elle n’est pas appelée.

Je veux bien Yannick, mais comment je fais pour ne pas l'appeler cette p... de routine car elle est appelée au sein même de la librairie NON?

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1709
  • 100% Arduino et N
    • Voir le profil
Re : DCC++ Exploitation des commandes de programmation
« Réponse #25 le: août 25, 2018, 09:42:45 pm »
J’ai jeté un œil sur la bibliothèque DCCpp :

void DCCpp::beginMain(uint8_t inOptionalDirectionMotor,
uint8_t inSignalPin, uint8_t inSignalEnable,
uint8_t inCurrentMonitor)
{

Il suffit de mettre « 0 » dans inCurrentMonitor et le current monitor n’est pas activé. Ensuite tu gères le courant comme tu veux indépendamment de DCCpp.
« Modifié: août 26, 2018, 06:51:43 am par Dominique »

Tony04

  • Full Member
  • ***
  • Messages: 213
    • Voir le profil
Re : DCC++ Exploitation des commandes de programmation
« Réponse #26 le: août 26, 2018, 12:22:32 am »
Merci Dominique pour tes recherches,

quand tu auras un petit moment tu pourras me dire comment tu trouves ce genre de renseignement.

Amicalement
Antoine

Souris verte

  • Newbie
  • *
  • Messages: 26
  • HO, DCC, Arduino...
    • Voir le profil
Re : DCC++ Exploitation des commandes de programmation
« Réponse #27 le: août 26, 2018, 11:41:10 am »
Il faut regarder la bibliothèqu dans l'ordre de l'appel des procédures.
Dans le cas présent, c'est dans le fichier DCCpp.hpp.

Tu verras que pour augmenter le courant max, tu n'es pas obligé de modifier la bibliothèque en dur.
/** Set the maximum current value before an event 'too much current consumption detected !' for main track.
@param inMax Maximum value between 0 and 1023. Default is 300.
*/
static inline void setCurrentSampleMaxMain(float inMax) { mainMonitor.currentSampleMax = inMax; }

/** Set the maximum current value before an event 'too much current consumption detected !' for programming track.
@param inMax Maximum value between 0 and 1023. Default is 300.
*/
static inline void setCurrentSampleMaxProg(float inMax) { progMonitor.currentSampleMax = inMax; }

Pour voie Main:
DCCpp::setCurrentSampleMaxMain (iCurrentMaxM) Pour la voie Prog:
DCCpp::setCurrentSampleMaxProg (iCurrentMaxP)
Plus utile dans ton cas puisque tu passes par une fonction hors bibliothèque.

Bonne lecture.

Tony04

  • Full Member
  • ***
  • Messages: 213
    • Voir le profil
Re : Re : DCC++ Exploitation des commandes de programmation
« Réponse #28 le: août 27, 2018, 12:41:59 pm »
Il suffit de mettre « 0 » dans inCurrentMonitor et le current monitor n’est pas activé. Ensuite tu gères le courant comme tu veux indépendamment de DCCpp.

Bonjour à tous,

quelqu'un a-t-il déjà fait l'essai de supprimer le test de courant avec un 0 dans le begin comme le propose Dominique ?

Voila ce que j'ai mis mais sans succès, le seul moyen a été de passer "inSampleMax" à 2000 dans la ligne 38 de CurrentMonitor.h:
DCCpp::beginMain(UNDEFINED_PIN, DCC_SIGNAL_PIN_MAIN, 3, 0);

Par contre je n'ai pas compris ce que propose Souris verte dans son dernier message.

Merci pour vos réponses.

Cordialement
Antoine

Souris verte

  • Newbie
  • *
  • Messages: 26
  • HO, DCC, Arduino...
    • Voir le profil
Re : DCC++ Exploitation des commandes de programmation
« Réponse #29 le: août 27, 2018, 02:44:18 pm »
Hello,

La commande attend un numéro de pin. Si tu écris 0 alors il initialise la variable avec la pin 0.
Ce que tu veux est de la désactiver, donc soit UNDEFINED_PIN soit 255 (c’est la valeur de UNDEFINE_PIN)

Ensuite pour la valeur max du courant tu peux, via la bibliothèque, changer la valeur par défaut de 300.
Tu ajoutes dans le setup la ligne :
DCCpp::setCurrentSampleMaxMain (1023) Dans ce cas, pas besoin de modifier le CurrentMonitor.h
La valeur devant être dans la plage 0-1023.

Courage
Yannick