LOCODUINO

Parlons Arduino => Bibliothèques => Discussion démarrée par: pierrepv le septembre 06, 2018, 08:13:24 pm

Titre: Bibliothèque Accessories
Posté par: pierrepv 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
Titre: Re : Bibliothèque Accessories
Posté par: savignyexpress 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 (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 (http://www.locoduino.org/spip.php?article74).



Bonne suite et meilleures salutations.
Titre: Re : Bibliothèque Accessories
Posté par: Thierry 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é...
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv 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
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv 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
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv 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
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv 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
Titre: Re : Bibliothèque Accessories
Posté par: Thierry 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.
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv 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
Titre: Re : Bibliothèque Accessories
Posté par: Thierry 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();
}
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv 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


Titre: Re : Bibliothèque Accessories
Posté par: Thierry 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...
Titre: Re : Bibliothèque Accessories
Posté par: msport 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 ?
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv 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
Titre: Re : Bibliothèque Accessories
Posté par: Thierry 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...
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 18, 2018, 07:28:01 pm
   Bonsoir,

Je crois savoir où est le sniffer (c'est Rudy je crois qui en a un...), je regarde de mon côté et je te tiens au courant.

Je vais réaliser ce sniffer et je transmets les résultats.

Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 18, 2018, 07:35:36 pm
     Bonjour,

J'ai trouvé sur l'Intellibox, le menu où se règle les durées d'impulsion des accessoires.

En usine le réglage est de:

- 100ms minimum, c'est à dire que même une brève impulsion sur une touche sera envoyée pendant 100ms

- 5000ms maximun, c'est à dire que si on garde la touche appuyée, l'impulsion cesse au bout de 5000ms..

Faut-il changer ce réglage?


Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 18, 2018, 08:09:12 pm
   Bonsoir,

J'ai réalisé le "sniffeur de Rudy" et j'obtiens les résultats suivants en appuyant successivement sur les 2 touches de l'aiguillage 125:

---
DCC Packet Analyze started
Updates every 4 seconds
---
Idle
Idle
-
Idle
Acc 125 32:0 1 Off  10100000 11111000
Idle
Idle
-
Idle
Idle
Idle
Acc 125 32:0 1 On  10100000 11111001
-
Idle
Idle

J'espère que tu trouveras la réponse à ton interrogation.
.
Merci de me dire comment aller plus loin.

Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: Thierry le novembre 18, 2018, 08:25:31 pm
J'ai l'impression que ce n'est pas un problème de durée, mais de désactivation non demandée. Il devrait y avoir au moins deux paquets Dcc, l'un en activation et l'autre en désactivation. Voir par exemple la video de Rudy au sujet de son sniffer (https://www.youtube.com/watch?time_continue=103&v=UC2eJa6SEmM (https://www.youtube.com/watch?time_continue=103&v=UC2eJa6SEmM), à partir de 1'43"). Dans son test, chaque appui sur sa centrale génère deux paquets différents. Il semble donc bien que le problème soit lié à un réglage de l'Ecos...
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 18, 2018, 08:54:12 pm
   Bonsoir,

En effet on voit deux trames DCC.

Il y a un paramètrage dans l'Intellibox pour les aiguillages:

- MOTOROLA
- ou DCC

Elle est réglée sur DCC

Il n'y a pas d'autres réglages.

Comment vois-tu la suite, y a -t-il une solution ou dois-je abandonner?

Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: Thierry le novembre 18, 2018, 09:00:21 pm
Je vais essayer de jeter un oeil plus attentif sur la norme demain pour voir s'il n'y aurait pas des exceptions à la règle du activé/désactivé...  Bonne soirée.
Titre: Re : Re : Bibliothèque Accessories
Posté par: msport le novembre 18, 2018, 09:27:16 pm
   Bonsoir,

Je crois savoir où est le sniffer (c'est Rudy je crois qui en a un...), je regarde de mon côté et je te tiens au courant.

Je vais réaliser ce sniffer et je transmets les résultats.

Cordialement

Adaptation de ce montage :
http://forum.locoduino.org/index.php?topic=460.0
http://forum.locoduino.org/index.php?topic=461.0
Titre: Re : Bibliothèque Accessories
Posté par: Thierry le novembre 19, 2018, 09:28:24 am
Après vérification de la norme :

Citer
Basic Accessory Decoder Packet Format

     The format for packets intended for Accessory Digital Decoders is:
            {preamble} 0 10AAAAAA 0 1AAACDDD 0 EEEEEEEE 1

Accessory Digital Decoders can be designed to control momentary or constant-on devices, the duration of time each output is active being controlled by configuration variables CVs #515 through 518. Bit 3 of the second byte "C" is used to activate or deactivate the addressed device. (Note if the duration the device is intended to be on is less than or equal the set duration, no deactivation is necessary.) Since most devices are paired, the convention is that bit "0" of the second byte is used to distinguish between which of a pair of outputs the accessory decoder is activating or deactivating. Bits 1 and 2 of byte two are used to indicate which of 4 pairs of outputs the packet is controlling. The most significant bits of the 9-bit address are bits 4-6 of the second data byte. By convention these bits (bits 4-6 of the second data byte) are in ones complement.

(source https://www.nmra.org/sites/default/files/s-9.2.1_2012_07.pdf)

Il est bien dit que deux paquets doivent être envoyés, l'un en activation et l'autre en désactivation, mais il est aussi précisé que lorsque la désactivation peut être évitée si le délai de fonctionnement de l'accessoire est inférieur au délai d'activation... On est probablement dans ce cas. Je vais voir ce soir si je peux modifier Commanders pour gérer ce cas précis.
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 19, 2018, 10:11:35 am
    Bonjour,

En effet, je crois qu'on est dans ce cas puisque sur" l'Intellibox1", les délais sont réglables.

Merci beaucoup de t'intéresser à mon problème.

J'aimerais beaucoup utiliser cette bibliothèque car j'utilise déjà la rétrosignalisation de LOCODUINO, et je souhaiterais être "full Arduino" sur mon réseau.

  Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: Thierry le novembre 19, 2018, 05:41:30 pm
Voilà des modifications pour gérer ton cas particulier, même si on va certainement le retrouver chez d'autres utilisateurs de l'Ecos... Copie les deux fichiers joints dans le répertoire Commanders/src . Pense à copier src AVANT pour pouvoir remettre en état après les tests. Si ça marche, je pousserai une nouvelle version de Commanders assez vite.

J'ai ajouté une petite fonction de réglage à appeler après le begin de DccCommander : RaiseEventWhen() avec deux arguments. Le premier fixe le type de paquet Dcc qui déclenche l'événement, activation ou non (par défaut), le second fixe le délai d'inactivité forcé de DccCommander sur cet accessoire précis une fois l'événement envoyé. Ce délai est fixé par défaut à 200ms.
Donc tu devras ajouter

   DccCommander.RaiseEventWhen(true);

ou

   DccCommander.RaiseEventWhen(true, 200);

Le seul problème potentiel que je vois est la collision de plusieurs paquets d'accessoires différents au même moment, ce qui pourrait arriver avec des commandes envoyées très rapidement par logiciel. Pour éviter ça, il faut réduire au maximum le délai. Par exemple le descendre à 100 et voir s'il l'on ne répète pas le même ordre plusieurs fois.
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 19, 2018, 06:24:22 pm
   Bonjour,

Et merci.

Quelques erreurs à la compilation:

C:\Users\Pierre\Documents\Arduino\libraries\Commanders\src\DccCommander.cpp:162:2: error: stray '\262' in program

 DCC.lo²op()

  ^

C:\Users\Pierre\Documents\Arduino\libraries\Commanders\src\DccCommander.cpp: In static member function 'static void DccCommanderClass::DccAccessoryDecoderPacket(int, boolean, uint8_t)':

C:\Users\Pierre\Documents\Arduino\libraries\Commanders\src\DccCommander.cpp:65:18: error: 'this' is unavailable for static member functions

  if (activate == this->RaiseEventOnActivation)

                  ^

C:\Users\Pierre\Documents\Arduino\libraries\Commanders\src\DccCommander.cpp:68:19: error: 'this' is unavailable for static member functions

    if (millis() - this->LastEventDate < this->RaiseEventDebounceDelay)

                   ^

C:\Users\Pierre\Documents\Arduino\libraries\Commanders\src\DccCommander.cpp:68:41: error: 'this' is unavailable for static member functions

    if (millis() - this->LastEventDate < this->RaiseEventDebounceDelay)

                                         ^

C:\Users\Pierre\Documents\Arduino\libraries\Commanders\src\DccCommander.cpp:79:3: error: 'this' is unavailable for static member functions

   this->LastEventDate = millis();

   ^

C:\Users\Pierre\Documents\Arduino\libraries\Commanders\src\DccCommander.cpp:93:4: error: 'this' is unavailable for static member functions

    this->LastDccId = DCCINT(realAddress, data);

    ^

C:\Users\Pierre\Documents\Arduino\libraries\Commanders\src\DccCommander.cpp: In member function 'virtual long unsigned int DccCommanderClass::loop()':

C:\Users\Pierre\Documents\Arduino\libraries\Commanders\src\DccCommander.cpp:162:6: error: 'class DCC_Decoder' has no member named 'lo'

  DCC.lo²op();

      ^

exit status 1
Erreur de compilation pour la carte Arduino/Genuino Uno

J'ai bien trouvé les erreurs DCC.lo²op(), par contre pour les erreurs avec "this", là je câle...

Cordialement



Titre: Re : Bibliothèque Accessories
Posté par: Thierry le novembre 19, 2018, 08:21:43 pm
Oups, tu as raison. J'ai fait ça en temps masqué au bureau, je n'ai pas pu compiler avec l'IDE. J'ai juste compilé avec mon simulateur, mais je ne me suis pas rappelé que lui ne disposait pas du Dcc... Voici les fichiers corrigés.
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 19, 2018, 08:33:37 pm
   Bonsoir,

Pas de souçis, dans une autre vie je développais des logiciels de gestion alors les erreurs de compil, j'en ai fait plus souvent
qu'à mon tour.

Je teste ça et te tiens au courant.

Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 19, 2018, 08:49:57 pm
   Bonsoir,

Je viens de faire le test et....miracle ça fonctionne, le servo se déplace normalement aussi bien avec l'Intellibox que par commande dans RRTC.

Chapeau l'artiste...

Je vais pouvoir continuer et commander mes 35 aiguillages.

Je n'hésiterais pas à te recontacter en cas d'interrogation.

Bravo à toi et à toute l'équipe LOCODUINO.

   Très Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: Thierry le novembre 20, 2018, 09:09:07 am
Super. Heureux que ça fonctionne. Pour l'eexmple, tu pourrais poster ici la version corrigée de ton sketch ?
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 20, 2018, 11:45:49 am
   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
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 21, 2018, 04:00:56 pm
   Bonjour,

Maintenant que le servo fonctionne avec Accessories, je voudrais aller plus loin en commandant le passage du courant vers la pointe de cœur de
mes aiguillages "PECO Electrofrog".

Pour celà, j'ai imaginé un système à base de triacs, qui enverra le courant d'un côté ou de l'autre.

Je voudrais éviter de passer par des micro-interrupteurs commandés par le servo ( très efficace, mais trop compliqué mécaniquement ).

J'ai donc besoin de savoir:

- à quel moment le servo démarre
- dans quel sens il tourne (horaire ou anti-horaire)

... et je ne sais pas quelle variable du code il faut tester pour celà.

Pourrais-tu m'aiguiller (c'est le cas de le dire), pour celà?

   Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: Thierry le novembre 23, 2018, 10:13:49 am
Si tu regardes l'exemple livré 'SimpleButtons'

void ReceiveEvent(unsigned long inId, COMMANDERS_EVENT_TYPE inEvent, int inData)
{
COMMANDERS_PRINT_EVENT(inId, inEvent, inData);
}

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

Left.begin(100, 4); // Arduino pin 4, id 100
Dc.begin(101, 6);
Right.begin(102, 8);
pushEPS.begin(103, 10);
pushTJD.begin(104, 11);
}

void loop()
{
Commanders::loop();
}

La fonction ReceiveEvent reçoit tous les événements, tu peux y tester qu'un mouvement mini ou maxi a été demandé. Tu auras à la fois le début du mouvement, et sa nature.
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 23, 2018, 03:43:23 pm
   Bonjour,

Merci beaucoup de l'info.

Décidément cette bibliothèque est une mine de solutions.
Il faudrait une vraie formation pour tout appréhender.

J'étudie ça.

Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 26, 2018, 07:14:24 pm
   Bonjour,

Je souhaite utiliser cette bibliothèque sur l'ensemble de mon réseau, avec plusieurs NANO faisant fonctionner chacun plusieurs servos.

- que se passe-t-il si un ordre DCC arrive sur un NANO pour un servo, alors que le NANO est en train de faire tourner un autre servo.

Cet ordre est-il perdu, car j'ai chronométré le temps de déplacement d'un servo à environ 1,5 s.
Or lorsque mon logiciel RRTC établi un trajet, il commute les aiguillages les uns à la suite des autres, les ordres DCC se suivent donc assez rapidement.


- d'autre part suite à ma question sur le post précédent:

- j'arrive à détecter le moment où le servo démarre et son sens de rotation, mais je ne trouve pas l'information qui me dit qu'il a fini de tourner.
En effet, c'est à ce moment que je veux inverser le courant sur la pointe de coeur pour éviter tout court-circuit.
Si j'inverse le courant au démarrage du servo, j'ai le risque que les lames ne soient pas encore décollées et que les polarités ne soient pas bonnes.

Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: Thierry le novembre 26, 2018, 08:24:02 pm
Les mouvements ne sont pas bloquants dans Accessories, la réception de messages dans Commanders non plus. Les ordres Dcc ne devraient pas être perdus, mais on est pas à l'abri d'une erreur...
Il n'y a pas d'info sur la fin de mouvement... C'est une idée d'amélio pour le futur...
Dans ton cas, peut être qu'une tempo serait suffisante en attendant : inverser le courant juste une seconde après le démarrage du mouvement... Pas avec du 'delay()' hein, sinon tout est bloqué et le mouvement ne se fera pas :) !
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le novembre 26, 2018, 08:37:23 pm
   Bonsoir,

Merci de ta réactivité.

Bien sûr je ne vais pas utiliser delay().

Par contre je pense que je vais utiliser un deuxième Arduino qui ne sera affecté qu'à la gestion des pointes de coeur.

L'idée est de lui envoyer l'information de démarrage des servos, et c'est lui qui sur ces sorties alimentera les pointes de coeur avec du délai (typiquement en utilisant "millis() dans le "void loop()") et par l'intermédiaire de triac pour la puissance.

En fait ce deuxième Arduino remplacera les contacts de fin de course qu'on trouve sur certains aiguillages type "Tortoise" ou Conrad" ou autres.

   Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le décembre 05, 2018, 06:57:46 pm
   Bonjour,

J'ai résolu mon problème avec les pointes de coeur en utilisant un 2° Arduino.

Il me reste un problème:

- parfois il y a un mouvement incontrôlé du servo.
- le mieux serait donc de l'alimenter un petit peu avant qu'il démarre et couper son alimentation un petit peu après.

J'ai tenté quelque chose, mais le résultat n'est pas à la hauteur de mes espérances

Je me suis dit que "Accessories" a peut-être ça en standard "cachée" quelque part? Mais où???

   Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le décembre 06, 2018, 11:42:18 am
   Bonjour,

En fouillant dans "Accessories.cpp", j'ai trouvé une commande "SetPowerCommand" qui remplirait parfaitement ce que je veux faire.

Mais je n'arrive pas à l'utiliser dans le sketch.

Une idée???

   Cordialement
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le décembre 06, 2018, 11:44:38 am
Non, pas dans Accessories.cpp, mais dans "AccessoryServo.hpp"
Titre: Re : Bibliothèque Accessories
Posté par: Thierry le décembre 06, 2018, 12:24:34 pm
Comme on ne peut pas simplement couper l'alimentation d'un servo, il faut mettre un relais ou un transistor, commandé par une broche particulière. C'est le rôle de SetPowerCommand(). Si une broche est déclarée, elle sera activée uniquement au moment du besoin et coupée le reste du temps.
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le décembre 06, 2018, 01:34:54 pm
     Bonjour,

Merci de ton retour.

Mais comment et où est-ce qu’on insère la commande
SetPowerCommand dans le .ino?
Il faut une fonction void? Mais comment on l’appelle?

C’est là que je bloque.

Cordialement
Titre: Re : Biblioth�que Accessories
Posté par: Thierry le décembre 06, 2018, 02:09:24 pm
Ça ressemblerait à AIGL.SetPowerCommand(10); pour la broche 10. A la fin du setup()...
Titre: Re : Bibliothèque Accessories
Posté par: pierrepv le décembre 06, 2018, 02:54:02 pm
   Bonjour,

C'est ça, ca marche!!!

Ci-dessous le sketch complet pour ceux que ça intéresse... En gras la partie que j'ai rajouté selon tes instructions.

#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);
 
  // Commande de l'alimentation du servo sur la broche 10, avec une tempo de 200ms...
  AIGL.SetPowerCommand(10, 200);
}

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

La broche 10 dans ce cas peut en effet commander un relais ou un transistor en insérant le Servo dans le circuit de collecteur.

    Cordialement