Bien entendu ça va etre partagé Dominique, je veux d'abord finaliser / packager un poil le truc.
Le montage est le suivant (désolé, pas de schéma, mais c'est tout ce qu'il y a de plus classique) :
- Arduino MEGA tout ce qu'il y a de plus habituel
- Carte moteur L 9110
- Alimentation 12v de labo
- Convertisseur réglable DC/DC pour descendre le 12v à 5v pour alimenter l'arduino
- Circuit ACS712 monté en coupure sur l'une des deux lignes allant à la voie
Rien de bien spécial donc.
Le branchement : j'utilise bien entendu un PWM de l'Arduino pour piloter le signal, peu importe lequel : 1, 3, 4 ou 5 sur le méga, pourvu que ce soit un 16 bits. Pas essayé avec un 8 bits mais le code est prévu pour (ça viendra).
Comme pour toutes les centrales DCC : sortie OUTPUT COMPARE B du timer reliée à la broche DIRECTION du shield moteur. Broche PWM du shield moteur reliée à VCC ou pilotée par une broche DIGITAL OUTPUT de l'arduino pour faire le ON/OFF de la voie de programmation.
La broche OUTPUT de l'ACS712 reliée sur A0.
Donc encore une fois, très classique.
Le code est constitué d'une ré-écriture intégrale de DCC++ inspirée à la fois de l'original, des travaux de Thierry, mais aussi repris de zéro à partir de la version actuelle de la norme du NMRA.
Voici ce que donne le sketch principal de test : il s'agit de lire en boucle les CV du décodeur (test d'endurance).
Le truc à tourné toute la nuit sans broncher avec une de mes locos équipée d'un décodeur LaisDCC de base.
#include "DuinoBaseStation.h"
#include "SystemToolkit/SystemToolkit.h"
#include "DccToolkit/DccToolkit.h"
// Create a current sensor reading on A0 with VCC = 5.0 volts
ACS712CurrentSensor currentSensor(A0, 5000);
// Create a signal generator using timer 1, allowed to issue service mode commands
SignalGenerator generator(1, true);
// Create a track driver using previous generator & current sensor
TrackDriver driver(&generator, ¤tSensor);
void readCV(byte cv)
{
Serial.print("CV ");
Serial.print(cv);
Serial.print(" = ");
byte value;
if (driver.readCV(cv, &value))
{
Serial.println(value);
}
else
{
Serial.print(value);
Serial.println(" : Failed to read !");
}
}
void setup()
{
Serial.begin(115200);
Serial.println("Initializing !");
pinMode(11, OUTPUT); // PWM compare A output enabled : Connect to PWM on motor
pinMode(12, OUTPUT); // PWM compare B output enabled : Connect to DIR on motor
digitalWrite(11, HIGH); // Turn on power
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;
}
Les deux libs SystemToolkit et DccToolkit seront bientot mises en ligne librement sous forme de package compatible avec l'IDE arduino. Bien entendu libres d'usage pour ceux qui le voudront et sous licence GPL 2 ou 3.
Je précise que la lib DccToolkit mentionne en Acknowledgement à la fois Gregg E Berman et Thierry et comporte les liens vers les projets respectifs DCC++ et lib DCCpp, sur Locoduino.
S'il y en a qui ont la possibilité (et surtout l'envie !) de participer à la mise au point en réalisant des campagnes de test sur d'autres décodeurs (donc qui ont la possibilité de réaliser sans aide le montage indiqué et si besoin de chercher un peu pour ajuster....), ils sont les bienvenus.
Quant à savoir pourquoi j'ai choisi de repartir d'une feuille blanche, je vous en parlerais quand je mettrais la lib en ligne, ce qui ne saurait tarder...
@Dominique : je pense qu'il est temps d'ouvrir un sujet dédié dans la bonne section pour la suite...je vais m'en occuper en fin de journée ce dimanche.
Seb