Bon, la promenade avec Chienchien étant faite, je reprends . . .
Facile, facile, pas si facile que ça d'analyser les trames !
Heureusement, apparemment je ne suis pas le premier à m'intéresser à la chose et d'autres se sont penchés sur la question et il existe plusieurs bibliothèques qui font ça très bien .
Comme je vais utiliser le programme du club de Rouen , la bibliothèque retenue est " DCC_Decoder " . Cette bibliothèque n'est pas dans l'IDE arduino . Il faut donc la télécharger ou, pour les flemmards, la voici :
.
DCC_Decoder-master.zip
.
Cette bibliothèque utilise les interruptions .
INTERRUPT 0 impose de relier le montage à la pinoche D2 de l'arduino
INTERRUPT 1 imposerait D3 .
Ceci dit, voici le programme que j'ai utilisé, c'est quasiment un copier-coller de celui du club de Rouen auquel j'ai apporté quelques modifs .
Code : Tout sélectionner
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * *
* * * * * Décodeur d'accessoires * * * * *
* * * * * * * * * *
* * * * * Vu sur le site : * * * * *
* * * * * Seine Modèle Club Ferroviaire - SMCF * * * * *
* * * * * https://www.modelisme-ferroviaire-rouen.fr/ * * * * *
* * * * * * * * * *
* * * * * version ROCO * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Utilisation de la librairie DCC Decoder pour lire les trames DCC
#include "DCC_Decoder.h"
#define DCC_INTERRUPT 0
// Adresse de base du Arduino-Decodeur
#define baseAdresse 100
// Déclaration des éléments par rapport aux broches de l'Arduino
// La LED1 est connectée à la broche 6
// La LED2 est connectée à la broche 7
// La LED3 est connectée à la broche 8
// La LED4 est connectée à la broche 9
const int Led_1 = 6;
const int Led_2 = 7;
const int Led_3 = 8;
const int Led_4 = 9;
// Cette fonction est appelée par la librairie pour
// chaque activer / désactiver au niveau des adresses
void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data) {
address -= 1;
address *= 4;
address += 1;
address += (data & 0x06) >> 1;
address = address + 4; // cette ligne devra être décommentée
// si centrale RocoMouse et/ou z21
boolean enable = (data & 0x01) ? 1 : 0;
Serial.print(F(" Adresse DCC Claire : "));
Serial.print(address);
Serial.print(" Enable : ");
Serial.print(enable);
Serial.print(" Activate : ");
Serial.println(activate);
// Ex: si l'adresse de base est 100
// alors l'arduino réagit aux adresse 100, 101, 102,...
// Si l'adresse accessoire envoyée par la centrale
// correspond à l'une de notre programme
// Alors on récupère son état (activé/désactivé)
// et on exécute en conséquence les actions
// Ici la gestion de l'alimentation de 4 LEDs.
switch (address) {
case (baseAdresse):
if (enable) {
digitalWrite(Led_1, LOW);
digitalWrite(Led_2, HIGH);
} else {
digitalWrite(Led_1, HIGH);
digitalWrite(Led_2, LOW);
}
break;
case (baseAdresse + 1):
if (enable) {
digitalWrite(Led_3, LOW);
digitalWrite(Led_4, HIGH);
} else {
digitalWrite(Led_3, HIGH);
digitalWrite(Led_4, LOW);
}
break;
/* Et ainsi de suite
case (baseAdresse + 2):
break;
*/
}
}
void setup() {
Serial.begin(9600);
// Broche des LEDs en mode "Sortie"
pinMode(Led_1, OUTPUT);
pinMode(Led_2, OUTPUT);
pinMode(Led_3, OUTPUT);
pinMode(Led_4, OUTPUT);
// Init les Voyants, par défaut Rouge actif
digitalWrite(Led_1, HIGH);
digitalWrite(Led_2, LOW);
digitalWrite(Led_3, LOW);
digitalWrite(Led_4, LOW);
// Les 2 lignes suivantes permettent d'initialiser la librairie DCC Decoder
DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);
DCC.SetupDecoder( 0x00, 0x00, DCC_INTERRUPT ); // DCC_INTERRUPT
}
void loop() {
// Appel de la librairie DCC pour lire les valeurs
DCC.loop();
}
La ligne : address = address + 4; à été décommentée car j'utilise une z21 pour mes essais .
ATTENTION, il y a une erreur sur l'originale : ils ont mis -4 au lieu de +4 .
Autre modif, sur les conseils de Rémy , j'ai ajouté ces lignes
Serial.print(F(" Adresse DCC Claire : "));
Serial.print(address);
Serial.print(" Enable : ");
Serial.print(enable);
Serial.print(" Activate : ");
Serial.println(activate);
Ce qui va permettre de visualiser sur l'écran série de l'IDE si tout se passe bien .
Le programme ètant chargé et la platine raccordée à la centale DCC, voilà ce que ça donne :
Et sur le moniteur série :
.
20260212_150801.jpg
.
Voilà, premiers essais concluents

Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.