Bonjour,
Ci-dessous la version fonctionnelle d'un servo commandé en DCC, à l'adresse 125 par une Intellibox1, reliée au logiciel RRTC.
Le servo fonctionne aussi bien par la centrale que par le logiciel.
Merci à Thierry qui a adapté Commanders à mon problème. En effet l'Intellibox n'envoie qu'une trame par accessoire, alors qu'apparemment d'autres centrales envoie 2 trames..
Le sketch:
#include <Commanders.h>
#include <Accessories.h>
// Le poussoir...
ButtonsCommanderPush boutonPoussoir;
// Le moteur
AccessoryServo AIGL;
// Les ports pour connecter le moteur...
PortServo portAIGL;
// code pour un accessoire à l'adresse DCC 125 piloté par un bouton On et un bouton Off
#define SERVOMIN DCCINT(125,0)
#define SERVOMAX DCCINT(125,1)
void setup()
{
Commanders::begin(LED_BUILTIN);
// Memoriser les positions des moteurs dans l'EEPROM.
Accessories::begin(0, 500);
// Récupérer le signal DCC sur la broche interruption 3...
DccCommander.begin(0x00, 0x00, digitalPinToInterrupt(3), true);
// Fixe le type de paquet Dcc qui déclenche l'événement, activation ou non (par défaut)
// Dépend de la centrale (utile dans le cas de mon Intellibox1)
// Ou DccCommander.RaiseEventWhen(true,200);
// le second paramètre fixe le délai d'inactivité forcé de DccCommander sur l'accessoire une fois l'événement envoyé.
DccCommander.RaiseEventWhen(true);
// Evènement du bouton 200 branché sur la borne 6...
boutonPoussoir.begin(200, 6);
boutonPoussoir.AddEvent(SERVOMIN, COMMANDERS_EVENT_MOVEPOSITIONID, 0); // Le dernier argument ne sert pas pour ce type d'evenement
boutonPoussoir.AddEvent(SERVOMAX, COMMANDERS_EVENT_MOVEPOSITIONID, 0);
// Les ports avec leurs broches en digital (pas PWM)
portAIGL.begin(12);
// Le servo : pas de durée de mouvement, un débattement entre 95 et 135 degres
// et deux positions stables annoncées avec des identifiants inutiles (mais obligatoires)
AIGL.begin(&portAIGL, 50, 95, 135, 1);
// Les deux positions sont au mini et au maxi :
AIGL.AddMinMaxMovingPositions(SERVOMIN, SERVOMAX);
}
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();
}
Je laisse à Thierry, au besoin, le soin de commenter ce problème et le remercie de sa réactivité.
Cordialement