LOCODUINO

Forum de discussion
Dépôt GIT Locoduino
Flux RSS

vendredi 6 décembre 2019

68 visiteurs en ce moment

Bibliothèque DCCpp

Encore un DCC++ ? Mais à quoi ça sert ?

. Par : Thierry

Pourquoi une bibliothèque ? Nous sommes devant le cas typique d’un projet dont une bonne partie du code doit pouvoir être ré-utilisée dans d’autres projets. C’est le but d’une bibliothèque, et c’est ce que j’ai décidé de faire après avoir vu tout le monde ici s’en servir, et l’avoir moi-même utilisé dans au moins deux projets différents : Bibliothèque (...)

Retourner à l'article

Vous répondez à :

Bibliothèque DCCpp 4 juin 18:02, par Thierry

Tu as raison pour les deux fichiers, mais je dois m’attaquer à la version ESP32 incessamment, je vais les laisser en attendant. J’ai ajouté des arguments à powerOn() et powerOff() pour couper/restaurer le courant sur les deux voies séparément. Mais en fait c’est une vraie gestion de boosters qu’il faudrait, avec une classe dédiée qui s’occuperai de la gestion du courant. En attendant, j’ai fait une version spécifique de la classe CurrentMonitor pour mieux gérer les court-circuits indépendamment. Cette version permettrai aussi d’ajouter des moniteurs sur chaque booster :

  1. /**********************************************************************
  2.  
  3. CurrentMonitor.h
  4. COPYRIGHT (c) 2013-2016 Gregg E. Berman
  5.  
  6. Part of DCC BASE STATION for the Arduino
  7.  
  8. **********************************************************************/
  9.  
  10. #ifdef ARDUINO_ARCH_AVR
  11. #ifndef CurrentMonitor_h
  12. #define CurrentMonitor_h
  13.  
  14. /** Factor to smooth the result...*/
  15. #define CURRENT_SAMPLE_SMOOTHING 0.01
  16.  
  17. /** Time between two measurements.
  18. @remark Millis() uses TIMER-0. For UNO, we change the scale on Timer-0. For MEGA we do not. This means CURRENT_SAMPLE_TIME is different for UNO then MEGA.
  19. */
  20. #if defined(ARDUINO_AVR_UNO) || defined(ARDUINO_AVR_NANO) // Configuration for UNO
  21. #define CURRENT_SAMPLE_TIME 10
  22. #else // Configuration for MEGA
  23. #define CURRENT_SAMPLE_TIME 1
  24. #endif
  25.  
  26. /** This structure/class describes a current monitor.*/
  27.  
  28. struct CurrentMonitor{
  29. static long int sampleTime; /**< time elapsed since last measurement. This delay is common to all monitors. */
  30. int pin; /**< Attached check pin.*/
  31. int signalPin; /**< signal pin.*/
  32. float currentSampleMax; /**< Value of the maximum current accepted without problem.*/
  33. float current; /**< Value of the last measured current.*/
  34. const char *msg; /**< Message to send when excessive current is measured.*/
  35. /** begin function.
  36. @param pin Attached pin. UNEFINED_PIN to inactivate this monitor.
  37. @param inSignalPin Pin to set LOW if a shortcut is detectexd.
  38.   @param msg Message to send to console when a smoothed current value greater than maximum is detected.
  39.   @param inSampleMax Maximum value of the current. Default is 300.
  40.   */
  41. void begin(int pin, int inSignalPin, const char *msg, float inSampleMax = 300);
  42. /** Checks if sufficient time has elapsed since last update. Common to all monitors.
  43.   */
  44. static boolean checkTime();
  45. /** Checks the current on this monitor.
  46.   */
  47. void check();
  48. };
  49.  
  50. #endif
  51. #endif

Noter le signalPin apparu dans la classe et le begin(), qui correspond à la broche à mettre à LOW si un problème intervient. Et

  1. /**********************************************************************
  2.  
  3. CurrentMonitor.cpp
  4. COPYRIGHT (c) 2013-2016 Gregg E. Berman
  5.  
  6. Part of DCC BASE STATION for the Arduino
  7.  
  8. **********************************************************************/
  9.  
  10. #include "Arduino.h"
  11.  
  12. #ifdef ARDUINO_ARCH_AVR
  13.  
  14. #include "DCCpp_Uno.h"
  15. #include "CurrentMonitor.h"
  16. #include "Comm.h"
  17.  
  18. ///////////////////////////////////////////////////////////////////////////////
  19.  
  20. void CurrentMonitor::begin(int pin, int inSignalPin, const char *msg, float inSampleMax)
  21. {
  22. this->pin = pin;
  23. this->signalPin = inSignalPin;
  24. this->msg = msg;
  25. this->current = 0;
  26. this->currentSampleMax = inSampleMax;
  27. } // CurrentMonitor::begin
  28.  
  29. boolean CurrentMonitor::checkTime()
  30. {
  31. if(millis( ) - sampleTime < CURRENT_SAMPLE_TIME) // no need to check current yet
  32. return(false);
  33. sampleTime = millis(); // note millis() uses TIMER-0. For UNO, we change the scale on Timer-0. For MEGA we do not. This means CURENT_SAMPLE_TIME is different for UNO then MEGA
  34. return(true);
  35. } // CurrentMonitor::checkTime
  36.  
  37. void CurrentMonitor::check()
  38. {
  39. if (this->pin == UNDEFINED_PIN)
  40. return;
  41.  
  42. this->current = (float)(analogRead(this->pin) * CURRENT_SAMPLE_SMOOTHING + this->current * (1.0 - CURRENT_SAMPLE_SMOOTHING)); // compute new exponentially-smoothed current
  43.  
  44. // current overload and Programming Signal is on (or could have checked Main Signal, since both are always on or off together)
  45. if (this->current > this->currentSampleMax && digitalRead(this->signalPin) == HIGH)
  46. {
  47. digitalWrite(this->signalPin, LOW);
  48. DCCPP_INTERFACE.print(this->msg); // print corresponding error message
  49. #if !defined(USE_ETHERNET)
  50. DCCPP_INTERFACE.println("");
  51. #endif
  52. }
  53. } // CurrentMonitor::check
  54.  
  55. long int CurrentMonitor::sampleTime=0;
  56.  
  57. #endif

Noter la fonction check() qui utilise maintenant cette signalPin pour couper le courant. Il faut aussi modifier DCCpp.cpp pour ajouter l’argument manquant du begin.

  1. void DCCpp::beginMain(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnable, uint8_t inCurrentMonitor)
  2. {
  3. ...
  4. mainMonitor.begin(DCCppConfig::CurrentMonitorMain, DCCppConfig::SignalEnablePinMain, (char *) "<p2>");
  5.  
  6. ...
  7. }
  8.  
  9. void DCCpp::beginProg(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnable, uint8_t inCurrentMonitor)
  10. {
  11. ...
  12.  
  13. progMonitor.begin(DCCppConfig::CurrentMonitorProg, DCCppConfig::SignalEnablePinProg, (char *) "<p3>");
  14.  
  15. ...
  16. }
  17.  
  18. void DCCpp::begin()
  19. {
  20. ...
  21.  
  22. mainMonitor.begin(UNDEFINED_PIN, UNDEFINED_PIN, "");
  23. progMonitor.begin(UNDEFINED_PIN, UNDEFINED_PIN, "");
  24.  
  25. ...
  26. }

Ajouter des boosters reviendrait à ajouter de nouvelles instances de la classe avec les pins qui vont bien pour couper le courant juste chez eux si un problème survient.
Je n’ai pas poussé ces modifications dans la bibliothèque officielle d’aujourd’hui parce que je n’ai pas pu tester. Si tu peux le faire, dis moi si ça marche…

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

75 Messages

Rubrique Bibliothèques

La bibliothèque Servo

Bibliothèque SoftWare Serial

Bibliothèque Serial

Bibliothèque EEPROM

Bibliothèque Wire : I2C

Bibliothèque LCD

La bibliothèque ScheduleTable

Bibliothèque MemoryUsage

Bibliothèque EEPROMextent

La bibliothèque SlowMotionServo

Bibliothèque Commanders

Bibliothèque DCCpp

Bibliothèque DcDccNanoController

Bibliothèque Accessories (1)

Bibliothèque Accessories (2)

Un décodeur d’accessoires universel (1)

Un décodeur d’accessoires universel (2)

Un décodeur d’accessoires universel (3)

Bibliothèque LcdUi (1)

Bibliothèque LcdUi (2)

Les derniers articles

La bibliothèque SlowMotionServo


Jean-Luc

Bibliothèque DCCpp


Thierry

Bibliothèque DcDccNanoController


Thierry

Bibliothèque LcdUi (2)


Thierry

Bibliothèque LcdUi (1)


Thierry

Bibliothèque Accessories (2)


Thierry

Bibliothèque Accessories (1)


Thierry

Bibliothèque Commanders


Thierry

Bibliothèque MemoryUsage


Thierry

Bibliothèque Wire : I2C


Dominique, Guillaume

Les articles les plus lus

Bibliothèque Wire : I2C

La bibliothèque Servo

Bibliothèque SoftWare Serial

Bibliothèque DCCpp

Bibliothèque LCD

Bibliothèque EEPROM

Un décodeur d’accessoires universel (1)

Un décodeur d’accessoires universel (2)

Un décodeur d’accessoires universel (3)

Bibliothèque DcDccNanoController