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.

/*************************************************************
project: <DCC Accessory Decoder>
author: <Thierry PARIS>
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();

 }
}

 

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

#define AccessoryNumber 1

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.

#define CISOR_KATO 4

Pour piloter le module L298N il faut un nouveau driver en plus de l’Arduino:

DriverL298n *l298n;

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.

    // crossover kato sur l298n .
 l298n = new DriverL298n();
 l298n->Setup();
 l298n->SetupPortMotor(L298N_PORT_OUT1, 9, 10); //CISOR_KATO

Nous additionnons ici le nombre d’accessoires servos et autres:

 accessories.Setup(
    AccessoryNumber + AccessoryServoNumber,

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.
 new AccessoryMotorTwoWays(26, 0, 26, 1, 5000) // CISOR_KATO     BOUTON 1 CORRESPOND A DROIT SUR MULTIMAUS

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.
MOTOR2WAYS(accessories, CISOR_KATO)->Setup(l298n, L298N_PORT_OUT12, 255);

 

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 : »

this->AddDccPosition(inDccIdLeft, inDccIdAccessoryLeft, RIGHT);

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.