Commande d'un réseau en DCC avec un module ARDUINO

Les techniques de base


Menu

1. génération des bits à 1 et 0

2 génération d'une trame de base DCC

3. Exemple de programme pour l'ARDUINO UNO ou LEONARDO

4 Booster

5 commande d'accessoires

6 rétrosignalisation

7. Communication entre ARDUINO et PC en Visual Basic

8. Exemple de création d'un signal DCC avec commande par ordinateur

9. Réalisation d'un décodeur DCC

1. génération des bits à 1 et 0



Dans un bit à "1", les deux alternances ont une durée de 58 us chacune. Ainsi, la durée d'un bit à "1" est de 116 us.

Dans un bit à "0", les deux alternances doivent avoir une durée supérieure à 100 us.

Les sous programmes écrits en langage ARDUINO pour générer les bit à "1" et "0" sont les suivants:

void bitun(){ //genere un bit à 1
digitalWrite(sdcc, LOW); // sets the pin off
delayMicroseconds(58); // pauses for 58 microseconds
digitalWrite(sdcc, HIGH); // sets the pin on
delayMicroseconds(58); // pauses for 58 microseconds
}

void bitzero(){ //genere un bit à 0
digitalWrite(sdcc, LOW); // sets the pin off
delayMicroseconds(116); // pauses for 116 microseconds
digitalWrite(sdcc, HIGH); // sets the pin on
delayMicroseconds(116); // pauses for 116 microsec
}

2 génération d'une trame de base DCC

Il faut générer au mons deux paquets qui sont transmis successivement:
- un paquet de base pour la commande de la vitesse et du sens de marche
- un paquet de base pour la commande des fonctions F0 à F4 (fonctions du groupe 1)

2.1 paquet DCC de base pour la commande de la vitesse et du sens de marche



Le paquet DCC de base pour la commande de la vitesse et du sens de marche se compose des éléments suivants:
- une séquence de synchronisation constituée d'un minimum de 14 bits à 1 suivie d'un bit à 0
- un octet d'adresse de loco (bits a0 à a7) suivi d'un bit à 0
- un octet de commande (bits c0 à c7) suivi d'un bit à 0
- un octet de controle (bits e0 à e7) suivi d'un bit à 1 qui signale la fin de la transmission du paquet.

L'adresse de la loco est comprise entre 0 et 127.
En binaire, l'adresse est définie par les bits a[0] à a[6]
Le bit a[7] est égal à zéro.

L'octet de commande transmet la vitesse entre 0 et 28 par les bits c[0] à c[4].
Le bit c[5] définit le sens de marche ( 1 pour la marche avant, 0 pour la marche arrière)
Le bit c[6] est égal à 1 et c[7] = 0.

Les bits e[0] à e[7] de l'octet de controle sont obtenus par l'addition logique bit pour bit de l'octet d'adresse et de l'octet de commande. La fonction logique utilisée est "OU-EXCLUSIF".

2.2 paquet DCC de base pour la commande des fonctions F0 à F4 (groupe 1)

Le paquet DCC de base pour la commande des fonctions F0 à F4 se compose des éléments suivants:
- une séquence de synchronisation constituée d'un minimum de 14 bits à 1 suivie d'un bit à 0
- un octet d'adresse de loco (bits a0 à a7) suivi d'un bit à 0
- un octet de commande (bits b0 à b7) suivi d'un bit à 0
- un octet de controle (bits ef0 à ef7) suivi d'un bit à 1 qui signale la fin de la transmission du paquet.

L'adresse de la loco est comprise entre 0 et 127.
En binaire, l'adresse est définie par les bits a[0] à a[6]
Le bit a[7] est égal à zéro.

L'octet de commande transmet les fonctions avec l'allocation suivante pour les bits b[0] à b[4]:
b[0] = 1 si F1 = 1
b[1] = 1 si F2 = 1
b[2] = 1 si F3 = 1
b[3] = 1 si F4 = 1
b[4] = 1 si F0 = 1
Les aures bits sont: b[5] = 0 b[6] = 0 b[7] = 1

Les bits e[0] à e[7] de l'octet de controle sont obtenus par l'addition logique bit pour bit de l'octet d'adresse et de l'octet de commande. La fonction logique utilisée est "OU-EXCLUSIF".

L'intervalle de temps minimal entre l'émission de 2 paquets est de 5 ms (en pratique, on peut envoyer une suite de 0)

2.3 paquet DCC de base pour la commande des fonctions F5 à F8 (groupe 2)

L'octet de commande transmet les fonctions avec l'allocation suivante pour les bits d[0] à d[4]:
d[0] = 1 si F5 = 1
d[1] = 1 si F6 = 1
d[2] = 1 si F7 = 1
d[3] = 1 si F8 = 1

Les aures bits sont: d(4)=1; d[5] = 1 d[6] = 0 d[7] = 1

Les bits e[0] à e[7] de l'octet de controle sont obtenus par l'addition logique bit pour bit de l'octet d'adresse et de l'octet de commande. La fonction logique utilisée est "OU-EXCLUSIF".

3. Exemple de programme pour l'ARDUINO UNO ou LEONARDO

Ce programme simplifié permet de piloter une loco d'adresse comprise entre 3 et 99 avec 28 crans de vitesse. Il y a 5 fonctions disponibles: F0, F1, F2, F3 et F4.
L'affectation des ports de l'ARDUINO est la suivante.
entrée analogique A0: potentiomètre de réglage de la vitesse et du sens de marche
entrée analogique A1: potentiomètre pour le choix de l'adresse (dizaines)
entrée analogique A2: potentiomètre pour le choix de l'adresse (unités)
entrée numérique 2: interrupteur de commande de la fonction F0
entrée numérique 3: interrupteur de commande de la fonction F1
entrée numérique 4: interrupteur de commande de la fonction F2
entrée numérique 5: interrupteur de commande de la fonction F3
entrée numérique 6: interrupteur de commande de la fonction F4
sortie numérique 13: signal DCC

Le shéma de cablage est donné sur la figure ci-dessous:


Le signal DCC est généré sur la sortie 13 avec une tension de 2 volts efficaces environ, ce qui est évidemment trop faible pour piloter une loco.
Il faut donc un booster pour amplifier le signal et délivrer une tension de 16 Volts environ.

Vous pouvez télécharger ce petit programme appelé "arduino_régulateur_v1" en cliquant
ici.

4 Booster

On peut utiliser comme booster DCC un module de pilotage de moteur L298 pour Arduino que l'on peut trouver chez
TipTopBoards pour moins de 10 Euros.
Ce module possède deux sorties qui peuvent délivrer chacune un courant de 2 ampères, ce qui est suffisant pour un petit réseau.

On peut utiliser aussi comme booster un module avec le cirtcuit LMD18200 que l'on peut trouver facilement sur eBay.
Ce module peut fournir un courant de 3 ampères avec des pointes de 6 ampères.

4.1 Description du booster réalisé avec un module de pilotage de moteur L298

La photo du module est donnée ci-dessous.


Voici le cablage à réaliser pour obtenir une ou deux sorties DCC

Le bornier à vis bleu (3 pins) :
VMS --> Tension VMS de l'alim de puissance de 15 à 20 Volts (sur la source de puissance).
GND, --> Relié à la masse de l'alimentation de puissance et à la masse de l'ARDUINO
+V --> Sortie du régulateur de la carte L298N en +5V. Permet d'alimenter des composants externes éventuels (Intensité de 0 à 36 mA), sinon non connecté.

Les 2 borniers à vis verts (2 x 2 pins)
Le signal DCC est disponible sur les 2 sorties MotorA et MotorB

Signaux de commande sur les 6 pins (logique TTL : 5V = high, 0V = low).
Pour avoir une sortie DCC sur Motor A:
L' entrée EnA est à relier au +5V de l'ARDUINO
Les entrées In1 et In2 sont à relier aux sorties numérique de l'ARDUINO qui délivrent le signal DCC
Pour avoir 2 sorties DCC sur Motor A et motor B, il faut relier ensemble IN1 et IN3, IN2 et IN4, ENA et ENB

L'amplitude du signal DCC dépend de la tension d'alimentation continue appliqué sur l'entrée VMS du module. Avec une alim de 16 Volts, on obtient un signal DCC de 16 Volts efficaces environ. qui est suffisant pour faire fonctionner un décodeur DCC.

Remarque importante

Le L298 est parfait pour piloter un moteur pas à pas mais pose des problèmes pour l'amplification d'un signal DCC. Le LMD 18200 est préférable. En effet, les retards entre le changement d’une entrée du L298 et le changement correspondant de la sortie sont asymétriques. C’est à dire que les retards ne sont pas les même selon que le signal d’entrée passe de 0 à 1 ou de 1 à 0 (ce qui entraine une forte distorsion du signal DCC). Le signal obtenu n'est pas apprécié de certains décodeurs (en particulier les décodeurs LENZ). Le LMD 18200 ne présente pas ce défaut

4.2 Description du booster réalisé avec un module LMD18200

On peut aussi utiliser comme booster un module avec le cirtcuit LMD18200 dont la photo est donnée ci-dessous.


L'entrée GND est à relier à la masse de l'ARDUINO
L'entrée PWM est à relier au +5V
L'entrée DIR est à relier à la sortie DCC de l'ARDUINO ( pin 13)
L'entrée BRAKE est à relier à la masse.

Le signal DCC amplifié est disponible sur les sorties OUT1 et OUT2
L'amplitude du signal DCC dépend de la tension d'alimentation continue appliqué sur l'entrée V+ du module. Avec une alim de 16 Volts, on obtient un signal DCC de 16 Volts efficaces environ. qui est suffisant pour faire fonctionner un petit réseau.

On peut voir sur la figure ci-dessous l'allure du signal DCC en sortie du booster.


4.3 Protection du booster contre les court-circuits

Sur un réseau de trains miniatures, un déraillement provoquant un court-circuit est toujours possible et il faut absolument que le booster soit protégé contre les court-circuits.
Or les modules L298 et LMD 18200 n'ont pas de protection contre les court-circuits et peuvent être détruits au bout de quelques millisecondes. Il est donc absolument nécessaire d'ajouter un circuit de protection contre les court-circuits.

Un montage possible est représenté sur la figure ci-dessous.



Ce montage utilise un opto-coupleur 4N33 ou 4N35. qui détecte la tension en sortie du booster et envoie la valeur à l'ARDUINO sur l'entrée analogique A0. En fonctionnement normal, la diode émettrice de l'optocoupleur est traversée par un courant et l'on obtient une tension de 2 à 3 Volts sur la sortie 5 reliée à A0. En présence d'un court-circuit, la diode ne conduit plus et on a une tension de 5 Volts sur la sortie 5.
Le programme de l'ARDUINO mesure la tension reçue sur A0 et coupe la sortie du booster si la tension est supérieure à 4,5 Volts.
Pour le module LMD 18200, il faut mettre l'entrée BRAKE à +5 Volts (HIGH)
Pour le module L298, c'est l'entrée ENA qu'il faut mettre à la masse (LOW).
La mesure de la tension est effectuée lors d'une alternance positive d'un zéro du signal DCC. Ce montage permet de couper la sortie du booster en moins de 100 µsec et d'éviter ainsi une détérioration.
Il faut prévoir une commande par bouton poussoir pour réactiver la sortie du booster lorsque le court-circuit a été supprimé.
A titre d'exemple, voici le programme ARDUINO qui permet de couper le signal d'un module LMD 18200.
L'entrée BRAKE du module est reliée à la sortie 5 de l'ARDUINO.
Un bouton poussoir est relié à l'entrée 7 de l'ARDUINO.
Le programme qui mesure la tension DCC (vt) pendant l'émission d'un zéro est le suivant



Le programme qui coupe la sortie du module en cas de court-circuit et qui permet de rétablir la sortie DCC est le suivant:



4.4 Autres solutions

Il est aussi possible d'utiliser un ampli audio comme booster, comme expliqué ici.
On peut utiliser par exemple un ampli audio à base d'un circuit TM 3886 qui peut délivrer une puissance de 60 Watts. Cet ampli est disponible ici.

5 commande d'accessoires

5.1 Introduction

Il y a au moins deux approches pour commander les accessoires (aiguilles, feux de signalisation, passage à niveau, etc...)
- la première approche consiste à commander directement les accessoires par les sorties de l'ARDUINO par l'intermédiaire d'une carte à relais. Il est aussi possible de commander directement les servos par l'ARDUINO.
- la deuxième approche consiste à commander les accessoires par des décodeurs d'accesoires. Dans ce cas, il faut que l'ARDUINO génère les paquets de commande d'accessoires La première approche a l'avantage du coût. Son inconvénient est qu'il faut tirer beaucoup de cables si les accessoires sont éloignés de la centrale alors que l'on peut positionner un décodeur d'accessoires au plus près de l'accessoire.
Il est tout à fait possible de combiner les deux approches.

5.2 Commande d'un relais par l'ARDUINO

Le montage est donné sur la figure ci-dessous.



La bobine du relais est reliée d'un côté à l'alim de puissance et de l'autre côté au collecteur d'un transistor BC337 dont l'émetteur est relié à la masse.La base du transistor est reliée à une sortie numérique de l'ARDUINO via une résistance de 10 K.

5.3 Commande de servos par l'ARDUINO

Le fonctionnement d’un servo est relativement simple. Il suffit d’envoyer une impulsion dont la durée est comprise entre 1,0ms et 2,0ms au servo. Cette impulsion déterminera la position du palonnier du servo. Ainsi la valeur de 1,5ms donne au servomoteur la position centrale.

Ces impulsions doivent être envoyées de manière périodique, généralement toutes les 50ms.

Il n’y a rien de compliqué pour brancher un servo. Les servos ont généralement 3 fils:
- un rouge: qui doit être branché à la sortie 6V de l'alimentation
- un noir : qui doit être branché à la masse
- un orange (ou autre couleur) : qui est le fil de tension de commande 0-5V

C’est donc via le fil orange que les commandes seront passées à votre servo. Ce fil devra obligatoirement être relié à l'Arduino sur une broche PWM.

Coté software, là aussi, Arduino nous propose une librairie qui va bien :
Servo.

Voici un exemple de programme pour ARDUINO UNO qui permet la commande d'un servo qui passe de la position 30 à la position 150 en 12 secondes. La sortie servo est 11 et l'entrée 4 est utilisée pour la commande par un interrupteur.

#include

Servo myservo;
int valservo;
int valservomin=30;
int valservomax=150;
long tservo=millis();
int ac0=0;
int pinac0=4;

void setup()
{
pinMode(pinac0, INPUT);
myservo.attach(11);
}

void loop()
{
ac0 = digitalRead(pinac0);

if (ac0 ==0 && millis()>tservo + 100 ) {
valservo=valservo-1;
tservo=millis();
myservo.write(valservo);
}

if (valservo
if (ac0 ==1 && millis()>tservo + 100 ) {
valservo=valservo+1;
tservo=millis();
myservo.write(valservo);
}

if (valservo>valservomax) valservo=valservomax ;

}

5.4 Génération d'un paquet de commande d'accessoires

Les décodeurs d'accessoires sont utilisés pour commander des fonctions simples comme les aiguillages, feux, etc...
Ils comportent en général 8 sorties qui sont groupées en 4 groupes de 2 (1A, 1B, 2A, 2B, 3A, 3B, 4A, 4B) Ainsi, un décodeur permet de commander 4 aiguilles.
Le décodeur d’adresse 1 commande les aiguilles dont les numéros vont de 1 à 4, le décodeur d’adresse 2 commande les aiguilles dont les numéros vont de 5 à 8, le décodeur d’adresse 3 commande les aiguilles dont les numéros vont de 9 à 12, etc
Dans la norme NMRA, cette adresse peut prendre une valeur allant de 1 à 511, et chaque décodeur permettant la commande de 4 aiguilles, il est possible de commander jusqu’à 2044 aiguilles.
Dans le programme que j'ai écrit pour l'ARDUINO, le nombre d'adresses est limité à 63, ce qui permet de commander 252 accessoires.

Le format d'un paquet est le suivant:

{préambule} 0 10AAAAAA 0 1111CDDF 0 EEEEEEEE 1

Les bits A transmettent l'adresse ( 63 adresses possibles)
Le bit C permet d'activer ou de désactiver la sortie.
Les bits D permettent de sélectionner le groupe de sortie (00 correspond au groupe 1, 01 correspond au groupe 2, etc...
Le bit F permet de sélectionner la sortie A ou B dans chaque groupe: F=0 correspond à la sortie A et F=1 correspond à la sortie B.
Un paquet destiné à un décodeur d'adresse 3 s'écrit:
"préambule" 0 10000011 0 1111CDDF 0 EEEEEEEE 1

Dans le programme pour l'ARDUINO, un aiguillage est défini par son numéro (numag) et par sa position (posag): posag=0 ==> aiguille en position directe, posag=1 ==> aiguille en position déviée.
L'adresse du décodeur s'obtient par la relation:
adresse = Int((numag - 1) / 4) + 1
les bits D0 et D1 sont donnés par la relation:
d = numag - 1 - 4 * int((numag - 1)/4)
Si d=0 alors D0=0 et D1=0
Si d=1 alors D0=1 et D1=0
Si d=2 alors D0=0 et D1=1
Si d=3 alors D0=1 et D1=1
F = posag

6 rétrosignalisation

6.1 Introduction

La rétrosignalisation est indispensable pour commander un réseau en automatique avec ou sans ordinateur. Il faut diviser le réseau en cantons, chaque canton étant associé à un ou plusieurs détecteurs de présence d'un train sur le canton. Un canton est défini comme une portion de voie entre deux aiguilles ou entre une aiguille et un butoir.
Lorsqu'un train est détecté sur un canton, l'information doit être transmise à la centrale. C'est ce qu'on appelle la rétrosignalisation. Il existe plusieurs systèmes de rétrosignalisation disponibles dans le commerce. On peut aussi en réaliser soi-même à moindre coût comme on le verra dans la suite.L'ARDUINO présente le grand avantage d'avoir des entrées qui permettent de connecter directement les détecteurs d'occupation sans autres modules d'interface.

6.2 Exemples de détecteurs pour l'ARDUINO

6.2.1 détecteur à ILS

Ce type de détecteur est le plus simple à mettre en oeuvre mais il oblige à poser des aimants sous les locomotives. J'utilise ce type de détecteur sur le train de jardin car les rails ne sont pas alimentés.
Le montage de base consiste à poser le détecteur au milieu du rail et à poser les aimants sous les locos en garantissant une distance comprise entre 0,5 et 1 cm entre l'aimant et le détecteur. Les deux fils du détecteur peuvent être reliés directement à une entrée et à la masse d'un module ARDUINO. Le branchement est identique à celui d'un interrupteur.

6.2.2 détecteur à optocoupleur

Le schéma de ce détecteur qui est très simple à réaliser soi-même est montré sur la figure ci-dessous.


Ce détecteur utilise un pont-redresseur à 4 diodes dont on relie les bornes + et - entre elles. La tension aux bornes des diodes est appliquée à l'entrée d'un optocoupleur 4N35 avec une résistance de 22 Ohms en série. La sortie de l'optocoupleur est connectée à une entrée numérique de l'ARDUINO.
La photo ci-dessous montre deux détecteurs cablés sur un petit circuit imprimé qui peut en recevoir 4.


7. Communication entre ARDUINO et PC en Visual Basic

La liaison entre le PC et l'ARDUINO se fait par l'interface USB qui établit une liaison série avec un port com virtuel.

La librairie Serial est une librairie essentielle du langage Arduino qui permet de visualiser sur le PC des messages reçus depuis la carte Arduino ou de commander la carte Arduino.

En couplant l'utilisation de cette librairie avec Visual Basic côté PC, on dispose d'un outil extrêmement puissant pour réaliser toute sortes d'affichages graphiques sur le PC ou d'interactions entre la carte et le PC (commande de la carte Arduino avec la souris, le clavier ou une IHM avec des boutons de commande).

7.1 Transmission et réception des données par l'ARDUINO

Il faut éctire dans void setup() l'instruction: Serial.begin(9600);

L'envoi des données de l'ARDUINO vers le PC s'effectue avec l'instruction Serial.print ou Serial.println

Les nombres entiers sont envoyés en utilisant les caractères ASCII pour chaque chiffre.
Exemple transmission du chiffre 9: Serial.print(9,DEC);
Transmision du nombre 59: Serial.print(59,DEC);

Les caractères et les chaînes sont transmis tels que entre guillemets
Exemple. Transmission du caractère A: Serial.print("A");

La réception des données utilise l'instruction Serial.read()

L'ARDUINO traite les nombres entiers reçus en ASCII . Pour les valeurs décimales, si la valeur envoyée est N (entre 0 et 9), la valeur de l'octet reçu par l'ARDUINO a pour valeur N + 48.

Voici le programme pour recevoir un nombre à 1 ou 2 chiffres (0 à 99)
n=0;
while (Serial.available() > 0)
{
octet[n] = Serial.read();
n=n+1;
}
if (n==1){
nombre=octet[0]-48) ;
Serial.print("nombre=");
Serial.println(nombre);
}
if (n==2){
nombre=10*(octet[0]-48)+ octet[1]-48;
Serial.print("nombre=");
Serial.println(nombre);
}

7.2 Transmission et réception des données en Visual Basic

En Visual Basic (VB6 et VBA fourni avec Excel), il y a plusieurs méthodes qui permettent d'envoyer les données sur un port COM (port série):
- le contrôle MSCOMM32
- le contrôle NETComm
- l'API Windows Serial Port Software

Voici un lien vers un site qui explique comment gérer le port série en Visual Basic
http://www.pencomdesign.com/support/relay_software/vba_software_example.htm

MSComm32
Ce contrôle est le plus facile à utiliser. Il marche avec VB6 et VBA avec Windows XP mais il ne fonctionne pas toujours avec les versions plus récentes de Windows (il peut être nécessaire de modifier la base de registre)
On trouvera un mode d'emploi complet en Français sur le site Developpez.com

NETComm
Ce contrôle marche avec VB6 et VBA avec toutes les versions de Windows depuis XP jusqu'à Windows 10
C'est le contrôle que je recommande.
Ce contrôle est à télécharger sur le site suivant (il y a une version pour Windows XP et une version pour Windows 7 à 10)
http://www.hardandsoftware.net/NETCommOCX.htm
Quand vous arrivez sur la page d'accueil du site, cliquez sur Updated installer for Windows 7 pour télécharger la version de NETComm pour Windows 7, 8 et 10.
Ce site donne aussi les caractéristiques du contrôle.

API Windows Serial Port Software
Cette méthode marche avec VB6 et VBA avec WinXP mais elle ne marche pas avec Windows 7 et elle est est plus compliquée à utiliser que les autres méthodes.
Vous trouverez une description de cette méthode sur le site ci-dessous
http://www.pencomdesign.com/support/relay_software/vba_software_example_api.htm

Communication en VB6 et VBA avec NETComm

Voici comment insérer le controle NETComm dans un projet VB6
Cliquer sur projet puis composants puis sur parcourir et indiquer le dossier où se trouve le composant NETComm.ocx et l'ouvrir
Une fois le contrôle rajouté, son icône apparaît dans la barre des contrôles. Il suffit d’en placer une instance sur la feuille pour pouvoir l’utiliser. Par défaut, ce contrôle s’appellera NETComm1, et on utisera ce nom pour la suite de l’application

Pour insérer le controle NETComm dans une macro VBA d'un classeur Excel, vous trouverez le mode d'emploi en cliquant sur le lien ci-dessous
http://www.pencomdesign.com/support/relay_software/vba_software_example_net.htm

Envoi des données vers l'ARDUINO en Visual Basic

Les nombres entiers sont envoyés en utilisant les caractères ASCII pour chaque chiffre avec l'instruction Format(N)
Exemple transmission du chiffre 9: NETComm1.output = Format(9)
Transmision du nombre 59: NETComm1.output = Format(5) + Format(9) ou NETComm1.output = Format(59)

Les caractères et les chaînes sont transmis tels que entre guillemets
Exemple. Transmission du caractère A: NETComm1.output = "A"

La réception des données en provenance de l'ARDUINO utilise l'instruction NETComm1.InputData
Voici le programme pour recevoir un nombre entier N à 1 ou 2 chiffres (0 à 99) en provenance de l'ARDUINO (envoyé avec l'instruction Serial.print(N,DEC))

DoEvents
tampon = NETComm1.InputData
n = Len(tampon)
Label3.Caption = n
DoEvents

If n = 1 Then
octet1 = Asc(Mid(tampon, 1, 1))
nombre = octet1 - 48
Label4.Caption = nr
DoEvents
End If

If n = 2 Then
octet1 = Asc(Mid(tampon, 1, 1))
octet2 = Asc(Mid(tampon, 2, 1))
nombre = 10 * (octet1 - 48) + octet2 - 48
Label4.Caption = nombre
DoEvents
End If

7.3 Exemple à télécharger

Cet exemple montre la transmission d'un nombre entre 0 et 99.entre l'ARDUINO et le PC avec Visual Basic.
Ce programme permet d'allumer la LED sur le module ARDUINO correspondant à la sortie 13.
L'envoi par le PC du chiffre 9 ou du nombre 15 allume la LED et l'envoi du chiffre 9 ou du nombre 25 éteint la LED.
Vous pouvez télécharger cet exemple en cliquant ici.

8. Exemple de création d'un signal DCC avec commande par ordinateur

8.1 Montage d'essai

J'ai réalisé un petit montage constitué des éléments suivants:
- un tronçon de rails avec un seul canton
- un module ARDUINO LEONARDO
- un booster LMD 18200
- un détecteur d'occupation relié au canton
- une alimentation 16V pour le booster

L'ARDUINO utilise les broches suivantes:
broche 13: sortie DCC
broche 4: entrée du signal issu du détecteur d'occupation.

Voici une photo du montage réalisé.


Et voici une petite vidéo qui montre un va et vient réalisé par un locotracteur KOF de LENZ sonorisé. Le locotracteur est équipé d'un dételeur automatique.



8.2 Programme ARDUINO

Vous pouvez télécharger cet exemple de programme pour ARDUINO UNO ou LEONARDO intitulé ARDUINO_DCC_PC_v1en cliquant
ici.

Ce programme gére les adresses entre 3 et 99, la vitesse avec 28 crans et les fonctions F0 à F8. Il est utilisable avec JMRI DecoderPro et aussi avec CARTO-DCC que vous pouvez télécharger dans la rubrique consacrée aux logiciels installés sur le PC.
Il faut noter que ce programme simplifié ne gère pas la commande d'accessoires.

9. Réalisation d'un décodeur DCC

Il est très facile de réaliser un décodeur DCC avec un ARDUINO UNO en utilisant la librairie développée par le projet américain
"Model Railroading with Arduino" . Dans ce projet, on trouve un exemple de décodeur d'accessoires.

A titre d'exemple, j'ai écrit avec cette librairie les progammes de deux décodeurs:
- un décodeur de fonction qui délivre un signal 0-5V sur les sorties numériques correspondant à la fonction sélectionnée ainsi qu'une sortie servo
- un décodeur d'accessoires qui délivre un signal 0-5V sur les sorties numériques suivant l'adresse de l'accessoire sélectionné

J'ai également écrit un programme de décodage DCC pour locomotive qui transmet sur la sortie série les commandes de la loco (adresse, sens de marche, vitesse, fonctions F0 à F8). Ce programme intitué "decodeur_dcc_traindejardin" est utilisé dans le récepteur de radiocommande.

Le signal DCC est appliqué entre l'entrée 2 de l'ARDUINO UNO et la masse en insérant un circuit d'adaptation qui permet de réduire l'amplitude du signal DCC issu d'une centrale avec une amplitude de 14 à 16 volts.
Le schéma du circuit est représenté ci-dessous.


Les sorties numériques de l'ARDUINO sont les sorties 3 à 10 (8 sorties).
Le servo utilise la sortie 11 pour le signal de commande.

Le décodeur de fonction a l'adresse 3 que l'on peut évidemment changer dans le programme ARDUINO.
La fonction F0 active le servo
La fonction F1 active la sortie 3 (F1 ON correspont à la sortie HIGH et F1 OFF correspond à la sortie LOW)
La fonction F2 active la sortie 4
La fonction F3 active la sortie 5
La fonction F4 active la sortie 6
La fonction F5 active la sortie 7
La fonction F6 active la sortie 8
La fonction F7 active la sortie 9
La fonction F8 active la sortie 10

Le décodeur d'accessoires est programmé pour les numéros 1 à 4 (adresse1).

Vous pouvez télécharger ces deux exemples ainsi que le décodeur DCC de locomotive et la librairie en cliquant ici.

Le dossier "NmraDcc" qui contient la librairie doit être plaçé dans le dossier "librairies" de l'ARDUINO.



Page suivante


Page précédente


Retour page d'accueil