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 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 sur eBay ou bien ici..
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.
En associant ce module à un ARDUINO UNO, on obtient une centrale DCC pour moins de 20 Euros. Qui dit mieux?
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 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;
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
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 Windows 7 et Windows 8 (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 WinXP et Win7 (il marche peut-être avec Windows 8, mais je n'ai pas essayé)
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 Win XP et une version pour Win 7) https://home.comcast.net/~hardandsoftware/NETCommOCX.htm
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
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.