Discussions Générales > Aide

Déclenchement de l’interruption via la bibliothèque dcc_decoder

(1/2) > >>

RV:
Déclenchement de l’interruption via la bibliothèque dcc_decoder


Bonjour,
lecteur assidu de locoduino depuis que j'ai découvert le site en aout (peu de temps après avoir découvert le monde de l’Arduino et le DCC en modélisme ferroviaire), J'ai jusqu’à présent trouvé toutes les réponses a mes questions en explorant les divers articles.
Merci au passage à tous les contributeurs qui ont fait mon éducation sur arduino.

Je suis cette fois ci bloqué honteusement sur un point ou tout le monde semble n'avoir aucun problème :
J'essaie depuis des jours  de mettre en place un décodeur d'accessoires DCC via la librairie dcc_decoder.
Mais je me heurte a une difficulté:  je ne réussi pas à déclencher la routine d’interruption sur réception d'un paquet DCC via le 6N137.

Plusieurs articles abordent le sujet d'une interruption déclenchée par un signal DCC dans locoduino, par exemple
https://www.locoduino.org/spip.php?article103
http://www.locoduino.org/spip.php?article39

J'ai réduit mon programme à une trentaine lignes sur un arduino UNO pour qu'ils soit rapide à lire aux aidants potentiels: je veux juste que la routine d’interruption se déclenche et me le dise, (pas possible de faire plus simple).
la boucle loop affiche simplement la valeur de millis toutes les secondes. pour me dire que le programme est "vivant" et que au moins la loop fonctionne (ce qui est le cas: les secondes défilent sur le moniteur série de l'IDE 2.2.1 de l'arduino).

Pour déclencher l'interruption , j envoie la séquence DCC "a 200 2 1"  via JMRI et une centrale DCC-EX tournant sur un arduino MEGA
Fanatique récent de l'arduino, je n'ai aucun équipement DCC d'une marque du commerce pour piloter un décodeur d'accessoire.
Pour moi la séquence "a 200 2 1" devrait suffire à déclencher l'interruption ,  si le programme fonctionnait.
Pour ceux qui aurait des doutes légitimes sur l'efficacité de mon envoi de séquence, Je précise que les séquences "f 17 144" et "f 17 128" allument et éteignent sans problème les feux de la loco à l'adresse 17 ( sans non plus déclencher l'interruption de l'arduinon UNO )
Ma source d’inspiration pour les séquences DCC à envoyer est ici : https://github.com/DccPlusPlus/BaseStation/wiki/Commands-for-DCCpp-BaseStation

Je ne ferai pas l'injure aux experts ici présents de détailler le schéma utilisé ( avec le 6N137, 3 résistances et une diode proposé sur locoduino dans les articles que j'ai cité ), schéma qui amène le fil interruption en sortie du 6N137 sur la broche D2 de l'arduino uno.  :   https://www.locoduino.org/IMG/jpg/mynabay.jpg
j'ai vérifié 100 fois la connectivité à l’ohmmètre depuis les rails jusqu'à la borne D2 de l'arduino, testé la validité des diodes et résistances, et changé préventivement 3 fois Le 6N137 (sans savoir si les précedents sont endommagés ou non).

Mon code C basiquement reproduit en "boite noire" (setup, loop et routine d’interruption) le code d'autres articles utilisant la librairie DCC_Decoder.
Je dis "en boite noire" car faute d'avoir un fonctionnement reproductible permettant de comprendre les mécanismes de la bibliothèque DCC_decoder, je suis pour l'instant limité à une reproduction aveugle du code.
La lecture du code de la librairie dcc_decoder.h et dcc_decoder.cpp ne font que m'amener d'autres questions.

j'aurais au final trois questions précises (en fait beaucoup plus mais je vais à l'essentiel):
Ai je raison de penser que ma séquence DCC "a 200 2 1" envoyée via JMRI devrait déclencher l’interruption, ou faut il une autre séquence ?
Est ce que la sagacité des membres du forum daignerai jeter un oeil sur mes 30 misérables lignes de code et me signaler toute hérésie énorme qui m'aurait échappé, et qui empêcherai le déclenchement de l'interruption ?
Y aurait il un moyen de valider l'electronique jusqu'a la pin D2 de l'arduino ? (car si il s'agit de mettre en place un sniffer, cela revient à mon pb de départ: comment déclencer l'interruption )

Voila, En espérant que mon premier post n'est ni trop long ni trop ennuyeux. Dans les règles, il est demandé d'être précis sur son problème si l'on veut de l'aide,  j'ai essayé de l'être ...
Le code utilisé comme le cablage sont éprouvés dans de nombreux articles sur locoduino. peut etre le problème est kuste la séquence "a 200 2 1 ", je ne sais pas quoi utiliser d'autre.
J'espère aussi qu'une bonne âme plus éveillée que moi soit révélera la bêtise que j'ai commise et qui devrait me crever les yeux, soit posera la question que je ne me suis pas posé et qui résoudra mon blocage.

Merci aux patients qui ont lu jusqu'ici.

RV

msport:
Bonjour et bienvenue à Locoduino.

Voila une question bien posée !

Et donc qui mérite réponse. Peut-être pas celle que vous attendiez : votre soft marche parfaitement.

C'est donc votre montage qui pose problème. Comme dit la devise Shadok que j'affiche, si on a une chance sur un million d'y arriver, il faut se dépêcher de rater les 999 999 premiers essais.

Le montage Mynabay peut nécessiter un petit condensateur en parallèle de la diode (commencer avec 22pf -> 270pF)
Le test à faire est de trouver environ 2,5 V CC sur la broche 2 de l'Arduino.

Bonne chance.

PS : j'en profite pour faire la pub de mon montage : https://www.locoduino.org/spip.php?article318
Montage qui peut se décliner sous différentes formes (voir sa source chez Rudy Boer)

RV:
Merci pour votre réponse, (et l’appréciation de la "forme" de la question, j'avais fait de mon mieux).

Mais j'aurais pu mieux faire: j'avais déja noté 2.5V sur la broche 2 de l'arduino, mais vu les signaux "DCC" ossillant entre 0 et 5 v, je ne voyais pas d'information pertinente avec cette valeur, et je ne l'avais pas ajouté à la description de mes soucis.
Maintenant, je vois l'information avec votre remarque:  cela voudrait dire que les osillations DCC sont bien transmises "en moyenne" jusqu'à la broche 2 de l'arduino.

En ce qui me concerne , la pub de votre montage n'était  pas nécessaire, j'avais déja repéré (bookmarké) votre article et découvert avec lui le composant ULN28003A et ses nombreuses potentialités d'utilisation "arduinesques".  Il faut aussi que je me mette à kicad et toutes ses possibilités pour pouvoir rebondir (entre autre) sur vos travaux inspirants.

J'avais bien vu que certains montages utilisaient cette capacité que vous signalez comme parfois nécessaire, mais vu que d'autres s'en passaient, je me disais que le problème était ailleurs.
Si pour vous mon soft "minimaliste" devrait fonctionner (merci pour la validation), je vais me reconcentrer sur le hardware ( pourtant lui aussi assez simple ).

Vous n'avez pas fait de remarques sur la séquence DCC "a 200 2 1" supposée déclencher l'interruption, j'en déduit qu'ele doit etre correcte et qu'il faut vraiment se focaliser sur le montage électronique.

Merci pour votre réponse, j'avais un peu abandonné les vérifications hardware (impatience et démotivation au bout de dizaines de vérifications)...je retourne de suite pratiquer votre devise Shadock.   ( je suis personnellement plus "tenacité énervée" de Boris Vian":  Y a quéqu'chos' qui cloch' là-d'dans,  j'y retourne immédiat'ment )



msport:
Bonjour,

le besoin du petit condensateur est très aléatoire, mais pour certains 6N137, c'est rédhibitoire.

Pour tester votre code, je l'ai chargé dans un de mes décodeurs et lui ai envoyé des séquences depuis une de mes manettes avec le code ci-dessous:

donc typiquement <a 3 1 1> et <a 3 1 0> séquence pour commander par exemple un aiguillage (aiguillages et accessoires sont commandés de la même manière). Je ne pense pas qu'il soit nécessaire de renvoyer un 0 après un 1, éventuelle pour protéger les aiguillages.

La séquence <a 200 2 1> est correcte.

Le 2,5V est le résultat des signaux carrés à 50%, image du DCC.



--- Code: ---void doDCCaccessory() {
  Serial.print ("<1>"); 
  Serial.print ("<a ");
  Serial.print ((( AccessoryAddressDble / 2 - 1 ) / 4) + 1 ); // Accessory Address, DCC++ works with address + sub address
  Serial.print (" ");
  Serial.print (( AccessoryAddressDble / 2  - 1 ) % 4 );  // Accessory Sub Address
  if (AccessoryAddressDble % 2 ) {
    Serial.println (" 0 >");
  }
  else {
    Serial.println (" 1 >");
  }
}
--- Fin du code ---

RV:
Je cours donc m'enquérir de ce condensateur dont l'absence devient maintenant très suspecte sous ses airs à priori inooncents.

Et merci pour la réponse "platinium" sur la séquence, ainsi que votre extrait de code: Je comprends certaines choses avant même que cela ne fonctionne.
Je compléterai le "fil" avec le "test condensateur", dès que j'aurais mis la main sur une valeur adéquate pour faire l'essai.



Navigation

[0] Index des messages

[#] Page suivante

Utiliser la version classique