Bonjour à tous
Je vous propose ci-dessous deux bibliothèques permettant de réaliser des montages notamment autour du DCC.
Pourquoi de nouvelles bibliothèques diront certains ?
Tranchons dans le vif une fois pour toute quant à cette question :
a) C'est un loisir, moi ça m'amusait de le faire, alors je l'ai fait et c'est ce qui compte le plus !
b) J'ai considéré que les bibliothèques existantes, issues de DCC++ de Gregg E Berman avait quelques lacunes, et j'ai souhaité proposer une approche beaucoup plus structurée et flexible.
Tout ceci n'enlève rien au travail de Gregg ni, plus encore, à celui de Thierry ici présent : j'ai juste une approche différente, chacun choisira la voie qui lui convient le mieux. Enfin notez que j'ai bien intégré à la fois Gregg et Thierry dans le README / Remerciements car je considère leur travail comme très important ET qu'il m'a servi de base de comparaison / reflexion / compréhension de pas mal de choses.
Ceci étant posé (je n'y reviendrait pas : je ne suis pas là pour pinailler), parlons de choses concretes !
Ces deux librairies vous proposent des classes relativement abouties pour gérer :
- Des mécanismes assez complexes au niveau système, de façon plus simple / générique que si vous devez vous taper chaque spécificité de chaque modèle d'arduino / chaque timer, par exemple
- Des briques de base spécialisées et très modulaires permettant de construire des dispositifs autour du DCC, là aussi sans devoir gérer les spécificités détaillées de nombre de choses
Installation des bibliotheques
Pour le moment elles ne sont pas dans le gestionnaire officiel (ça viendra). Vous pouvez les télécharger en pièce joint de ce message. Je mettrais un rappel dans les messages suivants qui pointera vers celui-ci.
Une fois ces bibliothèques installées, vous pouvez les ajouter à votre projet.
Il y a déjà pas mal de choses implémentées MAIS pour le moment je suis en phase de test de la partie échanges DCC sur la voie. Notamment : j'ai besoin de tests significatifs de lecture de CV.
Voici un sketch qui fait le job, à adapter selon votre matériel :
#include <SignalGenerator.h>
#include <TrackDriver.h>
#include <ACS712CurrentSensor.h>
#include <Max471CurrentSensor.h>
// Create a current sensor reading on A0 with VCC = 5.0 volts
ACS712CurrentSensor currentSensor(A0, 5000);
//Max471CurrentSensor currentSensor(A0, 5000);
// Create a signal generator using timer 1, and pin 12, allowed to issue service command
SignalGenerator generator(1, 12, true);
// Create a track driver using output pin 11 and previous generator & current sensor
TrackDriver driver(11, &generator, ¤tSensor);
void readCV(byte cv)
{
byte value = 0;
bool result = driver.readCV(cv, &value);
Serial.print("CV ");
Serial.print(cv);
Serial.print(" = ");
Serial.print(value);
if (result)
Serial.println(" : OK");
else
Serial.println(" : Failed to read !");
}
void setup()
{
Serial.begin(115200);
Serial.println("Initializing !");
// Start all the stuff : DCC signal is there and running starting from here
driver.start();
Serial.println("Initialization done !");
}
int x = 1;
bool up = true;
void loop()
{
delay(2000);
if (up)
readCV(x++);
else
readCV(x--);
if (x <= 1)
up = true;
if (x >= 140)
up = false;
}
Notez bien les broches utilisées :
- La sortie 12 du MEGA va sur l'entrée DIR du shield moteur
- La sortie 11 du MEGA va sur l'entrée PWM du shield moteur
L'usage de la sortie 12 dépend du timer utilisé. Il faut dans tous les cas utiliser le signal OUTPUT COMPARE B du timer concerné. Sur le MEGA, OC1B est sur la sortie 12. Si vous changez de timer ou d'arduino il peut y avoir besoin d'ajuster le code.
L'usage de la sortie 11 pour faire le ON/OFF de génération du signal électrique est par contre un choix arbitraire, sans relation avec des contraintes du matériel. Ca marchera avec n'importe quelle sortie digitale pour peu que vous branchiez le fil sur la pin dont le numéro est passé en parametre lors de l'instanciation de l'objet TrackDriver.
Si vous utilisez une mesure de courant à base de MAX, vous devez utiliser la bonne classe de CurrentSensor, faute de quoi ça va délirer complètement. Pour le moment ce code fonctionne chez moi avec :
- Un ACS712 placé en coupure sur la ligne d'alimentation de la VOIE (certains montages mesurent sur la ligne d'alimentation du shield moteur)
- ou Un Max471 placé en coupure sur la ligne d'alimentation du SHIELD MOTEUR
- Un MEGA 2560
- Une carte L 9110 S