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

pierrepv

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #30 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
« Modifié: novembre 20, 2018, 03:18:35 pm par Thierry »
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

pierrepv

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #31 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
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 500
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #32 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.

pierrepv

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #33 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
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

pierrepv

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #34 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
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 500
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #35 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 :) !

pierrepv

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #36 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
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

pierrepv

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #37 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
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

pierrepv

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #38 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
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

pierrepv

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #39 le: décembre 06, 2018, 11:44:38 am »
Non, pas dans Accessories.cpp, mais dans "AccessoryServo.hpp"
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 500
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #40 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.

pierrepv

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #41 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
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 500
    • Voir le profil
Re : Biblioth�que Accessories
« Réponse #42 le: décembre 06, 2018, 02:09:24 pm »
Ça ressemblerait à AIGL.SetPowerCommand(10); pour la broche 10. A la fin du setup()...

pierrepv

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Bibliothèque Accessories
« Réponse #43 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
R�seau en N - 70m de voie - R�trosignalisation sur Arduino Mega2560 - RRTC Siver sous Windows10