Bonjour
En fait c'est assez simple.
D'un côté vous avez une liste d'accessoires que vous avez appelé 'accessories'. Dans cette liste, vous avez ajouté deux moteurs 'AccessoryMotorOneWay', vous auriez tout aussi bien pu ajouter un 'AccessoryMotorTwoWays', le résultat aurait été le même... Mais ça marche aussi comme ça !
De l'autre côté, vous avez un driver, votre 'arduino'. Ce driver dispose d'une liste de ports, un pour chaque broche utilisée.
Ces deux objets sont indépendants. Rien ne les relie automatiquement dans le code. C'est le rôle des 'Setup' d'accessoire de faire le lien.
En écrivant 'MOTOR1WAY(accessories, BOBINE1)->Setup(arduino, BOBINE1_PORT, 250);'
vous dites que l'élément BOBINE1 (donc 1) de la liste des accessoires 'accessories' est relié au port BOBINE1_PORT (donc 1) de la liste des ports du driver 'arduino'. Accessoirement (si j'ose dire), le délai permet effectivement de limiter le temps d'activation du port à 250ms.
J’espère juste qu'entre les broches de l'Arduino et votre aiguillage il y a bien un L298N ou autre pour apporter assez de courant aux bobines. Sinon c'est un bon motif de friture d'Arduino !
Je voudrais ajouter que ce week-end, je devrais être en mesure de publier un article au sujet du successeur de UAD, j'ai nommé 'Accessories'. Voici la nouvelle version de votre programme pour elle :
#include "Commanders.h"
#include "Accessories.h"
// Accessories
AccessoryMotorOneWay droit, devie;
ButtonsCommanderPush push;
// Drivers
PortOnePin portDroit, portDevie;
#define DCCID_DROIT DCCINT(20, 0)
#define DCCID_DEVIE DCCINT(20, 1)
void setup()
{
Commanders::begin(LED_BUILTIN);
Accessories::begin();
// Setup of the Dcc commander.
DccCommander.begin(0x00, 0x00, digitalPinToInterrupt(3));
// Setup of the buttons, one by accessory
push.begin(3, DCCID_DROIT);
push.AddEvent(DCCID_DEVIE);
// Setup of ports
portDroit.begin(6, DIGITAL);
portDevie.begin(7, DIGITAL);
// Accessories setups
droit.begin(&portDroit, DCCID_DROIT, 255, 250);
devie.begin(&portDevie, DCCID_DEVIE, 255, 250);
}
void loop()
{
unsigned long id = Commanders::loop();
if (id != UNDEFINED_ID)
{
// Renvoie l'événement reçu de Commanders, vers les accessoires...
Accessories::RaiseEvent(id, (ACCESSORIES_EVENT_TYPE) Commanders::GetLastEventType(), Commanders::GetLastEventData());
}
Accessories::loop();
}
Le gain ? Une écriture plus ramassée, pas de pointeurs, beaucoup moins de macros comme MOTOR1WAY, pas d'indices dans des listes... Mais aussi la disparition des Drivers, une gestion étendue à l'ensemble des circuits d'alimentation du marché présents et à venir. Bref, que des avantages... Par contre la partie Commanders a été extraite et doit être aussi utilisée comme une bibliothèque externe. Le loop peut paraître plus compliqué, mais en fait c'est toujours le même, il ne change pas quel que soit le nombre de boutons, de Commanders utilisés (DCC, mais aussi Série, I2C, CAN...) ou d'accessoires !
Cette bibliothèque est déjà disponible ici :
https://git.framasoft.org/locoduino.org/Accessories/blob/master/Accessories.zip.
De son côté, Commanders est dispo ici:
https://framagit.org/locoduino.org/Commanders/blob/master/Commanders.zipBon courage.