Parlons Arduino > Bibliothèques

Bibliothèque Accessories

(1/9) > >>

pierrepv:
  Bonjour,

J'essaie avec cette bibliothèque de commander mes aiguillages par des servos, le tout avec la configuration suivante:

- Centrale Intellibox1
- Logiciel de pilotage RRTC Silver

J'ai fait un petit sketch pour commander un servo avec un bouton poussoir.
Ca fonctionne, le sketch est le suivant:

#include <Accessories.h>
#include <Commanders.h>
 

// Le poussoir...
ButtonsCommanderPush boutonPoussoir;
 
// Le moteur
AccessoryServo AIGL;

 
// Les ports pour connecter le moteur et les DELs.
PortServo portAIGL;

 
void setup()
{
   Commanders::begin(LED_BUILTIN);

  DccCommander.begin(0x00, 0x00, digitalPinToInterrupt(3), true);
  // Memoriser les positions des moteurs dans l'EEPROM.
  Accessories::begin(0, 500);
 
  // Evènement du bouton 100 branché sur la borne 6...
  boutonPoussoir.begin(100, 6); // premier événement pour le déclanchement
 
  // 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(456, 789);
}
 


void loop()
{
  Accessories::loop();

  unsigned long id = Commanders::loop();
  // si le Poussoir est activé...
  if (id == 100)
  {
  AIGL.MoveMaximum();
  AIGL.MoveMinimum();
  // Plus rien à faire, attendons l'étape suivante.
  return;
  }
}

Quand j'appuie une fois sur le BP, le servo tourne dans un sens, si je rappuie, il tourne dans l'autre sens.

Maintenant je voudrais que lorsque je clique sur l'aiguillage à l'adresse 125 dans RRTC par exemple, le servo tourne dans un sens,
et si je reclique, il tourne dans l'autre sens.

J'ai capturé le signal DCC sur la borne 3 et c'est fonctionnel, mais au niveau du programme, je n'arrive pas à faire l'affectation
de l'adresse physique ( 125 dans ce cas), et à remplacer le bouton poussoir par le signal DCC.

  Une idée???

Cordialement

savignyexpress:
Bonjour Pierrepv,

Oups, j'ai lu ton message en diagonale et ma réponse est à côté de la plaque (tournante  :)).
Avec toutes mes plus plates excuses.

Pour ce comportement, il est nécessaire que le programme mémorise le sens dans lequel il actionne le servo. À chaque pression sur le bouton, il peut changer de sens. Une petite machine à états devrait le faire. Cet article illustre les grands principes: http://www.locoduino.org/spip.php?article6

Par contre, il faut prendre garde à filtrer les rebonds du bouton, par exemple à l'aide de la librairie décrite dans cet article: http://www.locoduino.org/spip.php?article74.



Bonne suite et meilleures salutations.

Thierry:
La réponse la plus simple tient dans les identifiants 'inutiles' ! Au lieu de 456, mets DCCINT(125,0)...

Tel que tu l'as codé, le bouton poussoir envoie un seul événement que tu gères manuellement dans le loop. Tu peux aussi laisser Commanders et Accessories discuter entre eux : tu fixes deux événements au lieu d'un pour le poussoir, et tu donnes le même identifiant au servo. Bien entendu, il ne faut pas oublier le Commanders::loop(); !
Voici ma version avec l'option DCC en remarque:


--- Code: ---#include <Accessories.h>
#include <Commanders.h>
 

// Le poussoir...
ButtonsCommanderPush boutonPoussoir;
 
// Le moteur
AccessoryServo AIGL;

 
// Les ports pour connecter le moteur et les DELs.
PortServo portAIGL;

#define SERVOMIN  201
#define SERVOMAX  202
 
// code pour un accessoire à l'adresse DCC 125 piloté par un bouton On et un bouton Off (cas de ma MS2 Marklin...)
//#define SERVOMIN  DCCINT(125,0)
//#define SERVOMAX  DCCINT(125,1)
 
void setup()
{
  Commanders::begin(LED_BUILTIN);

  DccCommander.begin(0x00, 0x00, digitalPinToInterrupt(3), true);
  // Memoriser les positions des moteurs dans l'EEPROM.
  Accessories::begin(0, 500);
 
  // Evènement du bouton 100 branché sur la borne 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);
  boutonPoussoir.begin(200, 6); // premier événement pour le déclanchement
 
  // 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()
{
  Commanders::loop();
  Accessories::loop();
}
--- Fin du code ---

Dans cette version, le DCC et le poussoir restent tous les deux actifs sur le même servo puisqu'ils génèrent les mêmes événements !

PS: je ne suis pas sur mon PC perso, alors ce n'est ni compilé ni testé...

pierrepv:
   Bonjour,

J'ai testé le programme que tu m'as fourni.

J'ai l'impression qu'il manque le : Accessories::RaiseEvent(id, (ACCESSORIES_EVENT_TYPE) Commanders::GetLastEventType(), Commanders::GetLastEventData());

Si je le rajoute, ça marche avec le poussoir, mais pas avec le DCC.

J'ai un peu de mal à comprendre le #define SERVOMIN 201 et 202..., je ne vois pas comment c'est relié au reste.

Comment serait le code s'il n'y avait pas de bouton poussoir, mais juste le DCC?

Cordialement

pierrepv:
    Bonjour,

Je tente d'actionner un servo pour aiguillage avec la bibliothèque Accessories+Commander.

J'ai le programme suivant:


--- Code: ---// Le poussoir...
ButtonsCommanderPush boutonPoussoir;
 
// Le moteur
AccessoryServo AIGL;
 
// Les ports pour connecter le moteur...
PortServo portAIGL;

#define SERVOMIN  201
#define SERVOMAX  202
 
// code pour un accessoire à l'adresse DCC 125 piloté par un bouton On et un bouton Off (cas de ma MS2 Marklin...)
#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);
     
  // 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();
}
--- Fin du code ---

Avec le poussoir, le servo fonctionne de la manière suivante:*
- 1° appui:     rien
- 2° appui      déplacement dans un sens
- 3° appui      déplacement en sens inverse
- 4° appui      rien....etc

Avec le signal DCC, et mon intellibox calé sur l'accessoire 125, rien ne se passe. La led clignote en permanence indiquant la présence du DCC, mais
impossible de déplacer le servo.

Est-ce que quand j'envoie 125 à partir de mon intellibox, le décodeur décode bien 125 ou autre chose? et si oui quoi??

J'ai vraiment besoin d'une idée...

   Cordialement

Navigation

[0] Index des messages

[#] Page suivante

Utiliser la version classique