Comment réaliser votre propre décodeur DCC ?

C'est tentant hein?..
Et pourtant vous vous dites "j'y arriverai jamais..."

Alors qu'il suffit d'avoir quelques bases en électronique, quelques informations bien utiles, un peu d'outillage, et un peu d'organisation...
La preuve c'est que je suis une véritable bille en électronique, et j'y suis arrivé...

Un décodeur DCC fonctionne avec un microcontrôleur. Qu'est-ce donc? C'est une puce électronique qui comporte une mémoire, un programme, des ports d'entrée-sorties que l'on peut contrôler à l'aide d'un programme. Le microcontrôleur (µC pour les intimes), une fois programmé, est complètement autonome. Dès lors que vous lui donnez une tension, il s'initialise et exécute le programme que vous lui avez rentré.

Si vraiment vous vous sentez mal à l'aise en matière de programmation, il existe des solutions grand public vendues sous la marque "arduino". Elle possède l'avantage de pouvoir être programmée dans trop connaître le langage de programmation puisque (presque) tout peut être fait à partir d'organigrammes. Je ne connais pas cette solution, je ne la développerai pas. Mais son problème c'est que les modules sont un peu chers...

Je ne vais détailler ici que les fonctions les plus importantes du décodeur :
- Adapter le signal  (convertir de +/- 18volts vers 0v/5v)
- Détecter la trame (Le petit détail qui permet de comprendre les informations)
- Décoder la trame (la structure du sous programme de décodage)

La partie "Agir sur le décodeur" est vraiment très simple. Je ne détaillerai que si j'ai le temps...



Les bases... :

- Je ne vais pas refaire un cours d'électronique, quelques sites le font déjà très bien. Sur cette page là, je détaille le fonctionnement de base des principaux composants ainsi que les prérequis indispensables.
Globalement, vous y trouverez les base sur la tension, les résistances, la loi d'Ohm, le diviseur de tension, les condensateurs, le régulateur de tension,le montage d'une LED,

- Il faut aussi quelques bases en logique (codage binaire, décimal, hexadécimal  (b10100010 = #162 = $A2 )  (page en cours de rédaction)

Evidemment, si le microcontrôleur vous fait peur, vous pouvez l'appeler par son petit nom "ma puce" . Ou alors vous pouvez consulter cette page 'le µC pour les nuls". Il ressence les prérequis essentiels pour piger ce qui'il se passe là d'dans !

- En vous entraînant un peu, et avec quelques exercices de base, vous arriverez rapidement à maîtriser le langage C (page à venir prochainement)
. il y a des sites spécialisés pour ça. Ces documents vont venir bientôt.



L'Outillage :
Oui...c'est quand-même bien pratique de travailler avec de bons outils. Je passe sur les outils de base (pinces, fer à souder, étain, multimètre de qualité et fiable, le matériel pour insoler et graver des circuits,...)
Il vous faudra du matos spécifique pour mettre au point votre circuit :
    - un oscilloscope (il existe des applications pas chères avec des PC, mais j'ai pas essayé)
    - un kit de développement : C'est une carte électonique qui permet de programmer les µC, associée à un logiciel de programmation. Pour ma part, j'utilise une carte EasyAVR associée au logiciel MicroC vendu par MikroElectronica. C'est très abordable est ça marche bien. On le branche au PC par le ordon USB. On peut programmer ET TESTER plein de µC différents.

    - Une plaque d'essai (avec plein de petits trous) pour faire vos montages provisoires avant de faire le circuit définitif.



Quelques informations... :
1 - Le décodeur fonctionne à partir d'un composant central : le microcontrôleur. C'est lui qui calcule, gère, communique, temporise, lance les actions, etc... bref, c'est le coeur du système. Dans le programme du décodeur, on n'utilise que quelques fonctions de base. Il en existe des quantités, du plus simple au plus évolué. Ceux que j'utilise ici sont des µC de la famille ATMEL. Celui en exemple ci-dessous est l'ATMEGA8535.Déjà, il est balaise...

Chaque microcontrôleur a son propre brochage. Il est inutile de chercher à les connaître par coeur, il existe des "Datasheets" de tous les composants qui donnent la figure ci-dessus. Sachez simplement qu'il existe deux grandes familles : les "PIC" et les "ATMEL". C'est cette seconde famille que j'ai choisie. (télécharger doc officiel ATMEL, voir page 4)

4 - Le microcontrôleur fonctionne en "logique". C'est à dire qu'il ne connait que "0" ou "1" (qui peut être dit aussi par  "0v" ou "5v", "Oui" ou "non"........ "peu-être" il connaît pas !). C'est l'association de toutes les informations 0 et 1 qui font des informations complètes.

5- A l'intérieur, il comporte des TIMERS qui seront utilisés pour mesurer une durée, générer des signaux, temporiser, etc...on va en utiliser un pour mesurer la durée du signal DCC.

Par exemple, si je règle mon TIMER1 pour qu'il augmente de 1 toutes les 0.5µs, alors au bout de  80µs il aura atteint la valeur 160. ET CA SE FAIT TOUT SEUL ! sans géner le programme,  On peut déclencher et consulter un TIMER quand on veut avec une simple instruction.  C'est TOP !

6-Le µC peut fonctionner à l'aide d'interruptions. Certaines pattes du µC (par exemple "INT0") peuvent être utilisées pour déclencher un sous programme. Le µC interromp alors le programme principal pour exécuter le sous programme, puis revient là où il en était. C'est justement ce qu'on va utiliser pour  "détecter la trame"



L'organisation... :
Programmer c'est une chose. Programmer proprement en est une autre... Votre programme DOIT être architecturé, avec un début et une fin et éviter les situations impossibles ou les bouclages éternels... sinon, c'est le plantage assuré.
Pour un débutant, il est tentant de programmer avec des boucles du style "if....then goto....". C'est la PIRE des solutions. Oubliez la !
La méthode que je préconise consiste à utiliser un algorigramme. (c'est comme ça que fonctionne Arduino)
...qui se traduit en langage C par...

Cet algorigramme doit étudier chaque cas en précisant les tests, et les actions possibles.
ET SURTOUT : les traits de votre algorigramme NE DOIVENT PAS SE CROISER ! sinon c'est le b....l en trois minutes.

C'est donc ainsi que vous résoudrez votre logique avant même que de taper la moindre ligne de programme.


Premier problème à résoudre : "Adapter le signal".
Pour nous, c'est le signal DCC qu'il faut détecter. Vous savez, celui en + /- 18 volts...
Evidemment, une question vous brûle les lèvres :  "Heuuu...le signal DCC il est en +/- 18volts...c'est pas un peu beaucoup pour notre µC ?"

Bien sur que si ! c'est beaucoup trop ! Il grillerait en une fraction de seconde. C'est pourquoi il faut "isoler" le µC pour éviter toute connection avec le 18 Volts.
La solution est purement électronique : Il existe un composant qui fait ça : L'optocoupleur ! (en gris ci-dessous)  Grace à lui, l'information est transmise par de la lumière... il n'y a plus aucun contact entre le DCC et le µC :

Nous venons de résoudre le premier problème. Remarquez que le signal 0v/5v rentre dans le µC par une patte nommée "INT0". Ca tombe bien, on va voir maintenant à quoi elle sert.



Second problème à résoudre :  "Détecter la trame"


Certaines pattes des ports peuvent avoir des rôles particuliers (par exemple : recevoir un programme, surveiller une information particulière pour déclencher un sous programme, communiquer en I2C, j'en passe ce serait trop long...).
Nous utiliserons la patte INT0
(la troisième patte du port D).
Elle a le pouvoir d'interrompre immédiatement le programme principal pour déclencher un autre sous-programme qui va gérer l'évènement qui l'a déclenché.


C'est justement ce petit sous-programme qui va nous permettre de décoder la trame DCC.

On va évidemment l'associer à un TIMER qui nous permettra de chronométrer la durée des créneaux.


Troisième problème à résoudre : "Décoder la trame"

Le signal DCC est introduit dans la patte d'interruption "INT0". Par ailleurs, on programme le µC de façon à ce que la patte réagisse sur chaque front (changement 0v vers 5v,  ou 5v vers 0v)

Début du programme :

Lors d'un changement de front, la première chose à faire est de vérifier s'il s'agit d'un front montant ou descendant. Si le front est montant, alors on déclenche le chronomètre (en l'occurence le fameux TIMER). Si le front est descendant, alors on regarde immédiatement le TIMER pour savoir le temps qui s'est écoulé depuis le front montant.
Si le temps est inférieur à 80microsecondes, alors on a une information DCC=1, dans l'autre cas DCC=0.

Le reste de ce sous-programme va chercher à construire la tramme DCC en cours de transmission.
On va donc :
    - 1°/ valider le préambule avec au moins 10 bits "1" consécutifs,
    - 2°/ remplir bit par bit les octets consécutifs OCTET[i] 
    - 3°/ Détecter le bit de fin de trame (bit zéro après un octet)
    - 4°/ vérifier que la structure de la trame correspond à la trame souhaitée (accessoire/loco/prog.)
    - 5°/ Transmettre les informations reçues pour le programme principal
    - 6°/ effacer les Octets[i] et invalider le préambule pour être prêt à recevoir une nouvelle trame.

Pour les infos sur la structure de la trame, voir ICI, tout est détaillé !

Le mieux est d'observer l'organigramme ci-desous. Ca vaudra mieux qu'un long discours...
Un clic sur l'image vous permettra de télécharger le pdf correspondant..


A partir de ce diagramme, il est possible d'écrire votre programme avec des conditions  du type "if...then....else..."
Le programme en lui-même dépend ensuite du langage et de l'éditeur que vous utiliserez.

Si vous souhaitez des informations particulières, n'hésitez pas à me contacter (enlever les "z" pour que ça marche)
 Haut de page