LOCODUINO
Discussions Générales => Aide => Discussion démarrée par: Jocelyn le février 26, 2023, 06:40:59 pm
-
Bonjour,
J'essaie depuis quelques jours de compiler deux programmes afin de pouvoir commander un passage à niveau depuis la multimouse Roco.
J'ai utilisé naïvement utilisé le programme 2 feux qui permet de lire et allumer deux feux selon la commande de la MM et le programme de passage à niveau "classique".
Voici mon dernier test, mais ne va toujours pas.
Votre aide me serait précieuse.
Merci d'avance
-
Bonsoir Jocelyn,
je travaille moi-même en ce moment sur le sketch decodeur DCC, je te propose de rajouter ces 2 lignes après la ligne 56:
Serial.print("address = ");
Serial.println(address);
Cela te permettra déjà de voir si ta commande arrive à bon port.
Cordialement
A. STUYTS
-
BonjourTony
Merci de ta réponse
En tapant ce code, je ne vois rien passer sur le monitor!
-
Bonsoir,
il faut mettre :
void setup() {
Serial.begin(115200);
et 115200 bds dans le moniteur
et il y a un décalage de 4 adresses entre LENZ et la NMRA.
-
Merci, ça ne change rien,
Le moniteur ne marque que l'adresse et l'heure
-
c'est l'adresse que vous commandez depuis la MM ?
bizarre : d'où peut venir l'heure ?
Au fait, où a été publié le code source ?
-
J'ai essayer de compiler deux programmes, l'un pour la lecture de codes, qui modifie les sorties 3 et 4 en fonction du signal DCC reçu sur la broche 2 et l'autre depuis le code de locoduino pour les passages à niveau
-
bizarre : d'où peut venir l'heure ?
N'est ce pas l'horodatage de la console qui est activé ?
-
si j'ai bien compris la fonction heure,ne sert que pour le clignotement des feux
-
le message du monitor est l'heure, suivi de address = address et le pour le montage, le servo tourne en boucle et les leds du 6 clignotent
-
bizarre : d'où peut venir l'heure ?
N'est ce pas l'horodatage de la console qui est activé ?
Bien sur, mon cher Watson ...
-
Cela pourrait être aussi l'horodatage du moniteur de l'IDE (case à cocher ou décocher sur la dernière ligne du moniteur "Afficher l'horodatage"). ;)
-
Merci de votre aide. Oui, c'était bien la fonction horodatage qui était activée. Seul le message "address = address" apparait sur le monitor.
-
Et où en es-tu du fonctionnement du sketch aujourd'hui ?
-
Seul le message "address = address" apparait sur le monitor.
Cela voudrait dire qu'à la ligne 56 il y a :
Serial.print("address = ");
Serial.println("address");
et non
Serial.print("address = ");
Serial.println(address);
-
Ok, si je mets address sans les "", plus rien n'apparait dans le monitor
-
Cela veut dire que l'ordre DCC n'est pas arrivé dans ton Arduino, voila pourquoi je t'avais demandé de mettre ces lignes.
Maintenant il faut chercher du coté du câblage de ton opto-coupleur qui reçoit les signaux DCC.
Peux-tu envoyer un schéma ?
-
Bonjour,
voici le programme utilisé pour recevoir l'information depuis la centrale. Il allume une led verte sur la broche 3 si la fonction enable est envoyée sur l'adresse 117, et rouge sur la broche 4 dans le cas contraire.
C'est à partir de là que j'ai ajouté les fonctions du PN, certainement très maladroitement.
// Utilisation de la librairie DCC Decoder pour lire les trames DCC
#include "DCC_Decoder.h"
// Adresse de base du Arduino-Decodeur
#define baseAdresse 117
// Déclaration des éléments par rapport aux broches de l'Arduino
// La LED verte est connectée à la broche 3
// La LED rouge est connectée à la broche 4
const int Led_Verte = 3;
const int Led_Rouge = 4;
// 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;
// Ex: si 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 2 LEDs.
switch (address) {
case (baseAdresse):
if (enable) {
digitalWrite(Led_Rouge, LOW);
digitalWrite(Led_Verte, HIGH);
} else {
digitalWrite(Led_Rouge, HIGH);
digitalWrite(Led_Verte, LOW);
}
break;
// Cas pour les adresses suivantes
/*
case (baseAdresse + 1):
break;
case (baseAdresse + 2):
break;
*/
}
}
void setup() {
// Broche des LEDs en mode "Sortie"
pinMode(Led_Rouge, OUTPUT);
pinMode(Led_Verte, OUTPUT);
// Init les Voyants, par défaut Rouge actif
digitalWrite(Led_Rouge, HIGH);
digitalWrite(Led_Verte, LOW);
// Les 2 lignes suivantes permettent d'initialiser la librairie DCC Decoder
DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);
DCC.SetupDecoder( 0x00, 0x00, 0 );
}
void loop() {
// Appel de la librairie DCC pour lire les valeurs
DCC.loop();
}
-
Envoie le programme avec les lignes "Serial...." que je t'ai demandé stp
-
voici le fichier, merci de ton aide
-
Je reviens à ma réponse précédente, c'est au niveau de la réception du signal que tu dois avoir le problème, c'est pourquoi il me faut le schéma
-
Peux-tu remplacer tes 2 Serial.print par ces lignes et me donner le résultat ?
Serial.print("address = ");
Serial.println(address);
char buf[20];
sprintf(buf, "%d", address);
String stringTo = buf;
Serial.print("longueur = ");
Serial.println(stringTo.length());
-
en ajoutant ces lignes, le circuit fonctionne mais sans changer d'état. La led rouge d'occupation est allumée, les feux clignotent et le module sonore agit une fois.
Comme tu le dis, j'ai l'impression qu'il ne reçoit pas le signal DCC.
je t'ai mis le schéma synthétique de branchement, en symbolisant le circuit du 6N137 et du module son
-
Quand tu dis le circuit fonctionne, qu'est ce qui s'affiche dans la console série ?
Ton schéma n'aide en rien à résoudre ton problème, de quel schéma es-tu parti pour la partie récupération/traitement DCC ?
Si tu n'es pas plus précis dans tes réponses, je ne pourrais plus t'aider malheureusement.
-
Le schéma est le schéma classique avec un optocoupleur 6N137. Je viens de vérifier les branchements et en installant un sniffer, les trames sont bien lues sur le monitor
-
et ma question sur ce qui s'affiche maintenant dans la console série ?
-
toujours rien!
-
et en installant un sniffer, les trames sont bien lues sur le monitor
Qu'appelles-tu installer un sniffer ? As-tu juste téléversé un programme de sniffer dans ton UNO que tu utilises pour ton PN ? Et si oui lequel ?
On tourne en rond je crois...
-
celui de Doc Marco
-
celui de Doc Marco
??? Qu'esako ?
-
je te joins le programme
-
Ce serait bien d'avoir une photo du montage où on voit les tenants et aboutissants ...
-
Pour voir si le signal arrive à l'Arduino, on utilise un multimètre en gamme "continu" et on regarde si on a 2,5V sur l'entrée D2 par rapport au GND.
C'est la valeur moyenne du signal carré.
-
je te joins le programme
et ce programme tu l'as téléversé dans ton montage relié au PN ou l'as-tu mis dans un autre Arduino ?
-
dans le meme
-
Peux-tu envoyer une copie écran de la console série avec le sketch Doc Marco ?
-
J'ai 1,4 volts entre le gnd et la sortie trame. Tu as raison, ce ne sont que des trames vides.
J'ai pourtant deux circuits avec deux arduino et deux opto, et ils font la meme chose!
-
Tu es sur la bonne voie, il semblerait que ta centrale n'envoie rien de cohérent.
Bon courage pour la suite et bonne soirée
Cordialement
Antoine
-
Ce serait bien d'avoir une photo du montage où on voit les tenants et aboutissants ...
Je suis totalement d'accord avec Michel, une photo et surtout un schéma précis (juste de la partie 6N137) serait utile.
-
merci de tes réponses.
Le schéma du 6N137 est celui de la page 8 du document joint. J'en ai réalisé 2, l'un sur une plaque d'essais, l'autre sur un circuit imprimé fabriqué par un membre du forum.
-
Ce qui est encore plus étrange est lorsque j'ai ajouté les lignes que tu m'as proposées sur le programme 2 feux que j'ai utilisé au départ, les fonctions s'activent!!!
-
merci de tes réponses.
Le schéma du 6N137 est celui de la page 8 du document joint. J'en ai réalisé 2, l'un sur une plaque d'essais, l'autre sur un circuit imprimé fabriqué par un membre du forum.
Sur la plupart des schémas de sniffer il y a une capa d'environ 27pF en parallèle sur la diode D4, tu peux toujours essayer puis enlever les lignes de code que je t'ai proposées pour voir si cela fonctionne.
-
toujours pareil, le monitor est désespérément vide! >:(
-
J'ai 1,4 volts entre le gnd et la sortie trame.
Si sortie trame = D2, le montage est bancal. Ou la mesure mal prise : c'est avec le calibre continu ? car si le sniffer décode les packets idle, c'est que l’interface fonctionne. Vérifier que le sniffer n'affiche rien si le DCC est déconnecté.
-
Ce qui est étonnant c'est que lorsque je televerse le programme simple qui inverse les deux les leds avec l'adresse 117 , il fonctionne !
-
Bonjour Jocelyn,
peux-tu faire l'essai suivant:
Tu installes la librairie Nmra suivante: https://github.com/mrrwa/NmraDcc
Puis tu téléverses le sketch ci-joint sur ton Arduino équipé du sniffer et relies 1 servo à la pin A0.
Tu devrais voir sur la console série les adresses que tu envoies par ta centrale et le servo devrait faire un va et vient.
Bon essai
Cordialement
Antoine
-
Super, cela fonctionne!
Merci du temps que tu passes.
C'est donc dans le programme qu'il y a un bug alors?
-
Oui, mais je pense que la librairie servo et DCCDecoder ont du mal à cohabiter, mais cela n'engage que moi.
A toi d'adapter le sketch à la librairie NmraDCC.
Cordialement
Antoine
-
Merci Antoine. Je pense que dans mon sketch il y a deux parties, l'une qui est sensée recevoir le DCC, et l'autre qui assure les différents événements. Je crois que la deuxième fonctionne et attend l'information de la première. Qu'en penses-tu ?
-
Bonjour Jocelyn,
c'est tout a fait cela, et les 2 parties sont bien distinctes. Par contre je ne comprends pas trop ce que tu veux faire car la partie PN est sensée fonctionner avec des capteurs sur les voies (IR ou autre), or si j'ai bien compris toi tu veux le commander avec ta MM.
Je te propose de réaliser ton sketch en 2 étapes. La première serait de gérer simplement les leds afin qu'elles répondent à ton besoin.
Ensuite quand cela fonctionne tu peux passer à la gestion du PN.
Quand tu auras réussi la première étape, envoie moi le sketch avant de passer à l'étape suivante.
Cordialement
Antoine
-
Je viens de faire des essais avec ton sketch "Decodeur_2_feux_26_fevrier.ino" et c'est bien la partie gestion des servos qui bloque le programme.
Le voici avec la gestion des servos désactivée, tu peux essayer pour voir si cela fonctionne
Comme il y a plusieurs delay() dans les boucles des servos, je pense que cela empêche la détection correcte des trames DCC.
Il vaut mieux partir sur la librairie SlowMotion comme l'exemple que je t'ai fourni.
Bon courage, tu vas y arriver :)
-
Merci Antoine
Tu as raison, maintenant la première partie fonctionne, les leds verte et rouge s'inversent en actionnant l'adresse 117, par contre, le clignotement ne démarre pas!
-
Aie!!!
es-tu sûr de ne pas avoir attaqué trop difficile pour commencer ? Car j'ai l'impression qu'il te manque pas mal de bases pour la suite des opérations.
Mais rassure-toi, je peux continuer à t'aider, il faut juste que tu sois plus concis dans tes messages et pour ne pas "polluer" inutilement le forum, pourquoi ne pas communiquer en direct par nos messageries persos.
Tu peux m'envoyer ton mail par messagerie privé si tu le souhaites.