Je n'ai pas trouvé de décodeur d'accessoires que l'on peut faire avec un arduino qui puisse être programmé avec votre centrale DCC (pour moi une Ecos ESU et un Lokprogrammer).
Après recherche, c'est normal, car les montages avec l'arduino ne comporte pas de circuit "ACK". En effet pour pouvoir dialoguer avec votre centrale, le décodeur doit augmenter sa consommation de 60ma pendant 6 millisecondes.
J'utilise la librairie NMRA.H d'Alex Shepherd. que l'on trouve sur github
J'ai eu quelques échanges de mail avec Alex qui m'ont permi de faire des décodeurs avec des TEENSY (3.2 et 4.0) et de programmer mon décodeur avec ma centrale....encore merci Alex.
Pour que le décodeur puisse communiquer avec la centrale il faut ajouter un circuit "ACK" qui sera piloté par une sortie de l'arduino.
Il est composé
- D'un pont de diode, pour auto-alimenter le "circuit ACK" et de transmettre la surconsommation.
- D'un transistor BC560 PNP pour amplifier le signal de l'arduino.
- D'une résistence (80 à100 ohms) de consommation (très peu).
- D'un optocoupleur PC817 pour isoler le décodeur.
Une fois vos composants implantés, voici des explications sur la librairie NMRA.H
Déclarer l'utilisation de la librairie
#include <nmra.h>
Initialiser les objets
NmraDcc Dcc ;
DCC_MSG Packet ;
#define DCC_PIN 2
#define DccAckPin 3
struct CVPair{
uint16_t CV;
uint8_t Value;
};
La procédure notifyCVAck est appelée par la librairie à chaque fois qu'elle a besoin de communiquer avec la centrale. Elle met à l'état haut la sortie DccAkPin (ici pin 3) pendant 6ms afin que le "circuit ACK" génére une surconsommation de 60ma.
void notifyCVAck(void){
digitalWrite( DccAckPin, HIGH );
delay( 6 ); // Attention ne pas changer
digitalWrite( DccAckPin, LOW );
}
La procédure callback notifyCVChange est appelée à chaque fois que vous avez changé un CV. Elle peut servir pour mettre à jour des variables
void notifyCVChange(uint16_t CV, uint8_t Valeur){
// votre code si besoin
// Vous avez à votre disposition CV qui est le numéro du CV modifié et Valeur qui est sa valeur (0-255)
}
La procédure callback notifyDccAccTurnoutOutput est appelée à chaque fois qu'un ordre accessoire DCC a été envoyé par votre centrale.
void notifyDccAccTurnoutOutput( uint16_t Addr, uint8_t Direction, uint8_t OutputPower ){
// votre code une série de tests sur Addr (numéro de l'accéssoire et de Direction (sa position 0 ou 1)
}
Dans votre SETUP
void setup(){
pinMode( DccAckPin, OUTPUT ); // sortie ACK ici la pin 3
#ifdef digitalPinToInterrupt
Dcc.pin(DCC_PIN, 0); // pour les Teensy 3.2 et 4.0 (testé)
#else
Dcc.pin(0, DCC_PIN, 1); //pour les Nano
#endif
Dcc.init( MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0 );
}
Dans votre LOOP
void loop()
{
Dcc.process();
}
Vous avez là le code minimal à écrire pour faire un décodeur. Vous devez définir vos CV, pour ma par je commence au CV40. en effet pour le DCC il y a des CV importants de CV0 à CV29. Pour l'arduino cela correspond à l'adresse eeprom 40. C'est simple le CV55 est en eeprom 55.
Sans ce circuit "ACK", il est a noter que vous pouvez écrire un CV avec votre centrale...mais elle vous retournera une erreur. Mais surtout ce qui plus génant c'est que vous ne pouvez pas lire vos CV avec votre centrale.
Voici le plan d'un décodeur 8 sorties "leds" amplifiées et de 8 servomoteurs. Je vous ferai un article sur le décodeur avec explications des effets programmables par CV avec votre centrale (Cela fonctionne avec une ECOS ESU et un LOKPROGRAMMER) Mise à jour l'article est ici
- Clignotant configurable
- ON/OFF avec ou non effet "néon"
- Gyrophare configurable
- Feux 2 ou 3 leds
- Hasard configurable
Pour les servos
- Borne minimun
- Borne maximun
- Vitesse
- Initialisation
- Inversion
|