LOCODUINO
Parlons Arduino => Vos projets => Discussion démarrée par: Fantasio le décembre 16, 2019, 08:06:08 pm
-
Bonsoir à tous
Afin de créer de nouvelles animations sur les réseaux de mon club, je souhaiterai utiliser un attiny85 en tant que décodeur d'acessoires.
Je me suis inspiré de ce lien:
https://rudysarduinoprojects.wordpress.com/2019/05/06/fun-with-arduino-29-dcc-accessory-decoder/
Rudy Boer utilise la biblothèque DCC_Decoder.h et son programme tourne sur un arduino Uno. je l'ai testé avec cette carte et il fonctionne parfaitement :)
Je souhaite le faire tourner sur un attiny85. J'ai donc modifier le code pour l'adapter à cette puce, mais rien n'y fait >:(
voici mon code:
/*attiny-decodeur accessoires
* lien: https://rudysarduinoprojects.wordpress.com/2019/05/06/fun-with-arduino-29-dcc-accessory-decoder/
Brochage Attiny85
*
* 5 =|1 U 8|= VCC
* A3 3 =|2 7|= 2 entrée signal DCC
* A2 4 =|3 6|= 1 sortie pour adresse 11
* GND =|4 5|= 0 sortie pour adresse 10
*
*/
#define NUMACCESSORIES 2 // Entrez ici le nombre d'accessoires (max 4)
// ALLER AU setup() POUR CONFIGURER DCC ADDRESSES AND PIN NUMBERS
#include <DCC_Decoder.h>
#define kDCC_INTERRUPT 0
typedef struct DCCAccessoryData {
int address; // Adresse DCC configurable par l'utilisateur
byte outputpin; // Pin Attiny configurable par l'utilisateur
byte dccstate; // Utilisation interne Etat DCC de l'accessoire, 1 = ON, 0 = OFF
};
DCCAccessoryData accessory[NUMACCESSORIES];
// La bibliothèque DCC appelle cette fonction pour activer/désactiver les accessoires.
void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data) {
address -= 1;
address *= 4;
address += 1;
address += (data & 0x06) >> 1;
//address = address - 4; // !!! uncomment cette ligne pour les multi maus Roco ou z21
boolean enable = (data & 0x01) ? 1 : 0;
for (byte i=0; i<NUMACCESSORIES; i++) {
if (address == accessory[i].address) {
if (enable) accessory[i].dccstate = 1;
else accessory[i].dccstate = 0;
}
}
}
void setup() {
// CONFIGURATION DES ACCESSOIRES
// Copier et coller autant de fois que vous avez d'accessoires
// la quantité doit être la même que celle définie dans NUMACCESSORIES
// ne pas oublier d'incrémenter l'index du tableau
accessory[0].address = 10; // adresse DCC
accessory[0].outputpin = 0; // pin Attiny
accessory[1].address = 11; // adresse DCC
accessory[1].outputpin = 1; // pin Attiny
// FIN DE LA CONFIGURATION DES ACCESSOIRES
DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);
DCC.SetupDecoder( 0x00, 0x00, 0 );
// les pins sont définiées en sortie et au niveau 0
for(byte i=0; i<NUMACCESSORIES; i++) {
pinMode (accessory[i].outputpin, OUTPUT);
digitalWrite(accessory[i].outputpin, LOW);
}
}
void loop() {
DCC.loop(); // Appel de la fonction de bibliothèque qui lit les données DCC
for(byte i=0; i<NUMACCESSORIES; i++) {
if (accessory[i].dccstate)
digitalWrite(accessory[i].outputpin, HIGH);
else
digitalWrite(accessory[i].outputpin, LOW);
}
}
bien évidemment si quelqu'un a une idée, je suis preneur.
Merci par avance
-
Un décodeur de fonctions (loco) qui a eu son heure de gloire :
http://forum.locoduino.org/index.php?topic=482.45 (pcb)
explications succinctes :
http://forum.locoduino.org/index.php?topic=333.msg3199#msg3199
-
Effectivement pour le décodeur de fonctions, mais dans mon cas c'est un décodeur d'accessoires...
-
A adapter ...