Décodeur d’accessoires avec un Arduino, partie 4
Grace aux 3 précédents articles nous pouvons maintenant piloter plusieurs servos depuis notre centrale grâce à un Arduino Uno.
Sur mon réseau T-trak je possède une jonction double Kato qu’il me faut piloter. Les aiguillages Kato sont motorisés par des bobines à 2 fils, il suffit d’inverser la polarité aux bornes de la bobine pour passer l’aiguillage de la position droite à la position déviée.
Dans le cas de la jonction double, elle est composée de 4 aiguillages donc 4 bobines, et il y a donc un appel de courant de l’ordre de 2 Ampère lors de l’activations de celles-ci.
Afin de pouvoir passer ces 2 Ampère sous une tension de 12V continu, il faut utiliser un petit module pilotable par l’Arduino: un L298N.
Voici donc l’adaptation du code disponible dans le précédent article afin de piloter cet aiguillage Kato.
[pastacode lang= »cpp » message= » » highlight= » » provider= »manual »]
/*************************************************************
project:
author:
description: <4 servos driven by dcc arduino>
*************************************************************/
#include "UniversalAccessoryDecoder.h"
/* kDCC_INTERRUPT values :
Board int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1 7
*/
#define kDCC_INTERRUPT 0
// REGLAGE DE LA PIN D'ENTREE DU SIGNAL DCC ICI POUR UN UNO PIN 2
///////////////////////////////////////////////////////////////
// The target is to move 4 servos, by DCC adress, DEFINITION DES SERVOS
#define AccessoryServoNumber 4
#define SERVO1 0
#define SERVO2 1
#define SERVO3 2
#define SERVO4 3
#define SERVO1_PORT 0
#define SERVO2_PORT 1
#define SERVO3_PORT 2
#define SERVO4_PORT 3
#define AccessoryNumber 1
#define CISOR_KATO 4
// Accessories
Accessories accessories;
DccCommander dccCommander;
// Drivers
DriverArduino *arduino;
DriverL298n *l298n;
//////////////////////////////////
//
// Setup
//
void setup()
{
UAD_StartSetup();
// Setup of Dcc commander
dccCommander.Setup(0x00, 0x00, kDCC_INTERRUPT);
dccCommander.SetStatusLedPin(13);
// Drivers setups
// List of the ports on the Arduino. Pors 9,10 and 11 are handled in analog mode for fading.
arduino = new DriverArduino(0,AccessoryServoNumber); // IMPORTANT DE LAISSER LE 0 SI UNIQUEMENT DES SERVOS
arduino->Setup();
arduino->SetupPortServo(SERVO1_PORT, 4); // LE SERVO_PORT1 CORRESPONDANT AU SERVO 1 EST CONNECTE PIN 4
arduino->SetupPortServo(SERVO2_PORT, 5);
arduino->SetupPortServo(SERVO3_PORT, 6);
arduino->SetupPortServo(SERVO4_PORT, 7);
// crossover kato sur l298n .
l298n = new DriverL298n();
l298n->Setup();
l298n->SetupPortMotor(L298N_PORT_OUT1, 9, 10); //CISOR_KATO
// Accessories setups
// Declare accessories with Dcc codes.
accessories.Setup(
AccessoryNumber + AccessoryServoNumber,
new AccessoryServo(27, 0, 27, 1, 20), // PREMIER SERVO ADRESSE DCC 27 SUR LA CENTRALE, OU 31 CHEZ ROCO CAR DECALLEGE DE + 4
new AccessoryServo(28, 0, 28, 1, 20), // 0 CORRESPOND AU PREMIER BOUTON DE LA CENTRALE POUR BOUGER UN AIGUILLAGE A L'ANGLE MINI DEFINI
new AccessoryServo(29, 0, 29, 1, 20), // 1 CORRESPOND AU DEUXIEME BOUTON DE LA CENTRALE POUR ANGLE MAXI
new AccessoryServo(30, 0, 30, 1, 20), // 20 CORRESPOND A TEMPS EN MS ENTRE CHAQUE DECALLAGE DE 1DEGRES DU SERVO
new AccessoryMotorTwoWays(26, 0, 26, 1, 5000) // CISOR_KATO BOUTON 1 CORRESPOND A DROIT SUR MULTIMAUS
);
// Attach the servos to their driver/ports.
SERVO(accessories, SERVO1)->Setup(arduino, SERVO1_PORT, 20, 145); // SERVO 1 ATTACHE AU PORT 1 DONC PIN 4 ARDUINO BOUGE DE 20 A 145 DEGRE
SERVO(accessories, SERVO2)->Setup(arduino, SERVO2_PORT, 20, 90);
SERVO(accessories, SERVO3)->Setup(arduino, SERVO3_PORT, 0, 145);
SERVO(accessories, SERVO4)->Setup(arduino, SERVO4_PORT, 20, 180);
MOTOR2WAYS(accessories, CISOR_KATO)->Setup(l298n, L298N_PORT_OUT12, 255);
UAD_EndSetup();
}
void loop()
{
// Run the Loop on all items, if Dcc Loop agrees !
if (dccCommander.Loop())
{
accessories.Loop();
}
}
[/pastacode]
Voyons en détails les nouvelles lignes de code :
Nous commençons par définir le nombre de nouvel accessoire qui n’est pas un servo, ici 1
[pastacode lang= »cpp » message= » » highlight= » » provider= »manual »]
#define AccessoryNumber 1
[/pastacode]
Cet accessoire est le 4ème dans la numérotation interne de l’Arduino, et pour plus de clarté dans le code nous le nommons CISOR_KATO.
[pastacode lang= »cpp » message= » » highlight= » » provider= »manual »]
#define CISOR_KATO 4
[/pastacode]
Pour piloter le module L298N il faut un nouveau driver en plus de l’Arduino:
[pastacode lang= »cpp » message= » » highlight= » » provider= »manual »]
DriverL298n *l298n;
[/pastacode]
Nous définissons le driver en disant que le PORT 1 du L298N est piloté par les broches 9 et 10 de l’Arduino. Les broches 9 et 10 sont connectées sur les entrée IN1 et IN2 du L298N.
[pastacode lang= »cpp » message= » » highlight= » » provider= »manual »]
// crossover kato sur l298n .
l298n = new DriverL298n();
l298n->Setup();
l298n->SetupPortMotor(L298N_PORT_OUT1, 9, 10); //CISOR_KATO
[/pastacode]
Nous additionnons ici le nombre d’accessoires servos et autres:
[pastacode lang= »cpp » message= » » highlight= » » provider= »manual »]
accessories.Setup(
AccessoryNumber + AccessoryServoNumber,
[/pastacode]
Les bobines sont considérées comme des moteurs à courant continu, à 2 sens de rotation. Ceci permet d’alimenter une fois dans un sens et une fois dans l’autre la bobine pour changer l’état de l’aiguillage.
Voyons le détail de la ligne:
- 26: est l’adresse DCC de l’accessoire en tenant compte ici du décalage de +4 de la centrale Multimaus.
- 0: correspond au code du premier bouton de manoeuvre des aiguillages sur la centrale
- 26: est l’adresse DCC de l’accessoire en tenant compte ici du décalage de +4 de la centrale Multimaus.
- 1: correspond au code du deuxième bouton de manoeuvre des aiguillages sur la centrale
- 5000: est le temps d’activation de la sortie du L298N. Attention cette valeur correspond à 5 secondes ce qui est beaucoup trop pour l’alimentation d’une bobine. Cette valeur est programmée pour avoir le temps de visionner les changements de tension sur un multimètre. Pour piloter la bobine je pense qu’une valeur de 150ms est suffisante.
[pastacode lang= »cpp » message= » » highlight= » » provider= »manual »]
new AccessoryMotorTwoWays(26, 0, 26, 1, 5000) // CISOR_KATO BOUTON 1 CORRESPOND A DROIT SUR MULTIMAUS
[/pastacode]
Nous finissons par attacher l’accessoire à son port. Ici
- PORT12 correspond à la sortie 1 (bornes 1 et 2) du L298N
- 255 correspond à la tension que nous souhaitons sur cette sortie. La valeur peut aller de 0 à 255. 0 pour 0v et 255 pour la tension maximum suivant la tension d’alimentation du L298N, elle peut donc aller jusque 35v mais dans mon cas cela fait 12v.
[pastacode lang= »cpp » message= » » highlight= » » provider= »manual »]
MOTOR2WAYS(accessories, CISOR_KATO)->Setup(l298n, L298N_PORT_OUT12, 255);
[/pastacode]
Il reste une dernière correction à faire dans la librairie de l’UAD. Cette astuce m’a été donnée par Thierry l’auteur du code.
« Il y a effectivement une bêtise dans AccessoryMotorTwoWays.cpp : remplace LEFT par RIGHT sur cette ligne, juste le dernier argument : »
[pastacode lang= »cpp » message= » » highlight= » » provider= »manual »]
this->AddDccPosition(inDccIdLeft, inDccIdAccessoryLeft, RIGHT);
[/pastacode]
Thierry est en train de préparer une nouvelle version de UAD permettant de gérer correctement les feux de signalisation complexes français sans grand codage, et il ajoutera cette modif dans le lot… Il n’y aura donc plus besoin de corriger le fichier de la bibliothèque une fois la nouvelle version sortie.
Bonjour, Je me pose une question concernant le controle des aiguillages bobines à 3 fils genre Jouef/Roco avec un LN298. D’aprés vous est il possible de les controler avec 1 seule sortie du LN298: On brancherait les 2 fils de commande sur la même sortie mais avec des diodes dans des sens opposés. ainsi, en inversant la polarité, on sélectionnerait l’un ou l’autre des fils.
Je ne suis pas trés expérimenté en électronique et je n’ai pas de notion du courant que peut supporter une diode pendant 2-300 ms
Cela permettrait de controler 2 aiguillages avec 1 seul LN298
Merci pour vos explications