Auteur Sujet: Bibliothèque Accessories  (Lu 36094 fois)

pierrepv

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Bibliothèque Accessories
« le: septembre 06, 2018, 08:13:24 pm »
  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
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

savignyexpress

  • Invité
Re : Bibliothèque Accessories
« Réponse #1 le: septembre 07, 2018, 07:18:07 am »
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.
« Modifié: septembre 07, 2018, 10:05:42 am par Marc-Henri »

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 745
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #2 le: septembre 07, 2018, 09:35:15 am »
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:

#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();
}

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

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #3 le: novembre 07, 2018, 06:52:06 pm »
   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
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

pierrepv

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #4 le: novembre 17, 2018, 06:08:48 pm »
    Bonjour,

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

J'ai le programme suivant:

// 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();
}

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
« Modifié: novembre 18, 2018, 11:54:36 am par Thierry »
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

pierrepv

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #5 le: novembre 17, 2018, 06:30:46 pm »
   Bonjour,

Pour compléter mon précédent message:

Si j'utilise le moniteur série en deboggage:

- avec le bouton, je reçois tous les messages de mouvement du servo.
- avec l'intellibox qui envoi l'adresse 125, le moniteur série ne me renvoie rien.

   Cordialement
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

pierrepv

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #6 le: novembre 17, 2018, 06:50:50 pm »
   Bonjour,

Pour compléter à nouveau mon message précédent, en passant la bibliothèque Commander en "verbose debug mode", j'obtiens sur le moniteur série:

Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1

lorsque j'appuie sur le bouton de l'aiguillage 125 sur l'Intellibox. Le DCC est donc bien décodé.

Je ne comprend pas???

Cordialement
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 745
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #7 le: novembre 18, 2018, 10:51:21 am »
Bonjour. Pour continuer de tester, il faudrait aussi mettre le mode debug sur accessories, voir quels événements lui arrivent.

pierrepv

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #8 le: novembre 18, 2018, 11:38:21 am »
   Bonjour,

Et merci t'intéresser à mon problème.

J'ai mis le mode debug et "verbose debug mode" sur Accessories, je n'obtiens rien de mieux
Voici le texte du moniteur série lorsque j'appuie 1 fois sur l'aiguillage 125 en droit et une fois en dévié.

J'avais oublié dans mon sketch, le "Commanders::loop(), je l'ai rajouté mais rien de mieux.

Commanders V1.61.1
Created by Thierry Paris.
(c) Locoduino 2016-2018

*** Setup Commanders started.

Accessories V1.1.4
Developed by Thierry Paris.
(c) Locoduino 2016-2018

*** Setup Accessories started.
  PortServo 12 beginByAccessory() Starting pos: 95
*** Setup Commanders Finished.
*** Setup Accessories Finished.
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 1 / 1  converted : 125 / 1 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1

J'ai pourtant l'impression de ne pas être loin du résultat, c'est frustrant...

Cordialement
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 745
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #9 le: novembre 18, 2018, 03:02:22 pm »
Après essai sur mon simulateur, je constate que dans ton code il y a deux fois la définition de SERVOMAX et SERVOMIN, c'est dangereux et devrait même se planter à la compilation... Une fois retiré ce doublon, ça marche pour moi. Comme je suis sur le simulateur et que je n'ai pas de liaison Dcc, j'ai implémenté le SerialCommander qui me permet de lancer des événements manuellement. Lorsque je met 125:0 ou 125:1 qui correspondent aux deux positions, j'ai bien des mouvements de mon servo virtuel... Voici ma version, qui permet de tester avec la console série :
#include <Commanders.h>
#include <Accessories.h>

SERIAL_COMMANDER(Serial);

// 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);
Serial.begin(115200);
SerialCommander.begin();

// 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();
}

pierrepv

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #10 le: novembre 18, 2018, 03:40:21 pm »
    Bonjour,

En effet, avec la console série et ta version, le servo fonctionne.

Déjà, on est sûr que le code est bon

Par contre avec le DCC, rien à faire, le servo ne réagit pas...


Par contre avec ton code et en envoyant 125:0, voilà ce que j'obtiens en réponse:

read 49
read 50
read 53
read 48
read 13
AccessoryServo Move()
AccessoryServo InternalMovePosition()
Accessory start action 20124
  PortServo 12 MovePosition() for 50ms to angle 134
Accessory start action 20175
  PortServo 12 MovePosition() for 50ms to angle 133
Accessory start action 20226
  PortServo 12 MovePosition() for 50ms to angle 132
Accessory start action 20277
  PortServo 12 MovePosition() for........


et avec le DCC:

*** Setup Accessories started.
  PortServo 12 beginByAccessory() Starting pos: 95
*** Setup Commanders Finished.
*** Setup Accessories Finished.
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1
Dcc packet found : real data : 32 / 0 / 1  converted : 125 / 0 / 1......

Le message est très différent.

Que peut-il se passer, il semble que le signal DCC soit reçu pourtant???

Cordialement


R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 745
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #11 le: novembre 18, 2018, 06:24:42 pm »
Le problème semble venir du dernier '1' du message 'DCC packet found'.
Tel que le défini la norme, lorsqu'un accessoire est activé, la centrale envoie trois messages avec le dernier flag, l'activation, à 1, puis un seul avec 0. C'est fait pour les aiguillages à solénoïde qui ne doivent pas rester activé trop longtemps. Du côté de Commanders, je ne réagis qu'au passage du 0, ça m'évite de traiter la moitié des messages. Et Accessories est censée gérer le temps d'allumage elle même, sans tenir compte de ce que dit le Dcc.
Dans tes trames, je ne vois pas de 0, j'ai aussi une MS2 de Trix, et je ne vois pas où serai réglée la durée de l'activation d'un accessoire...

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2218
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #12 le: novembre 18, 2018, 06:25:52 pm »
Bonsoir,
désolé si moi aussi je suis à coté de la fameuse plaque, mais pour avoir déjà souffert sur les commandes d'aiguillages lancées par DCC++, il me semble que l'ordre "dévié" (par exemple) n'est pas envoyé deux fois de suite, il faut un ordre "direct" avant qu'il soit renvoyé.
Apparemment le comportement est différent pour les accessoires. Est-ce le problème ?
Cordialement

pierrepv

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #13 le: novembre 18, 2018, 06:42:48 pm »
    Bonsoir,

Est-ce que celà veut dire que le problème provient de ma centrale? Intellibox1?

Et si oui, que puis-je faire?

A part changer de centrale, mais comment savoir si elle sera compatible avec Accessories?

Cordialement
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 745
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #14 le: novembre 18, 2018, 07:00:04 pm »
Non, pas besoin de changer de centrale, c'est plutôt à Commanders de s'adapter... Il faudrait dans un premier temps confirmer la théorie qui dit qu'il n'y a jamais de code de désactivation. Ca peut se faire avec un sniffeur de trame Dcc. Il y en a un sur Locoduino quelque part... Si c'est le cas, il faut alors que je prévoie une option dans DccCommander pour gérer ce cas correctement...