LOCODUINO

Parlons Arduino => Bibliothèques => Discussion démarrée par: bagou91 le octobre 17, 2017, 10:34:31 pm

Titre: bibliothèque Commanders+Accessoires
Posté par: bagou91 le octobre 17, 2017, 10:34:31 pm
Bonsoir,

J'ai repris les exemples fournis dans la bibliothèque Accessoires pour actionner un aiguillage type Jouef 2 solenoïdes (via ULN2003).
Je tente de l'actionner avec un bouton poussoir, ou bien un interrupteur et hélas ça ne se passe pas comme prévu  :'(

voici le code:
#include <Commanders.h>
#include "Accessories.h"

ButtonsCommanderPush push;
ButtonsCommanderSwitch boutonAiguillageGauche;

// Accessories
AccessoryMotorTwoWays aiguille;

// Drivers
PortTwoPins port;

#define DCCID_DROIT   DCCINT(20, 0)
#define DCCID_DEVIE   DCCINT(20, 1)

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

void setup()
{
  Serial.begin(115200);
 
  Commanders::begin(ReceiveEvent, LED_BUILTIN);
  Accessories::begin();
 
  I2CCommander.begin(0x10); // I2C Slave identifier.
 
  // Setup of ports
  port.begin(4, 5, DIGITAL);

  // Accessories setups
  push.AddEvent(DCCID_DEVIE);
  push.begin(DCCID_DROIT,8);
 
  boutonAiguillageGauche.AddEvent(DCCID_DROIT, 6);
  boutonAiguillageGauche.AddEvent(DCCID_DEVIE, 7);
  boutonAiguillageGauche.begin();
 
  aiguille.beginTwoWays(&port, DCCID_DROIT, DCCID_DEVIE, 255, 250);
}

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

j'ai activé le mode debug pour voir ce qu'il se passe sur la console série:
au démarrage:
Commanders V1.40
Developed by Thierry Paris.
(c) Locoduino 2016-2017

*** Setup Commanders started.

Accessories V1.0
Developed by Thierry Paris.
(c) Locoduino 2016-2017

*** Setup Accessories started.
*** Setup Commanders Finished.
Commander event : Address : 20 / MOVE ON
Commander event : Address : 10020 / MOVE OFF
*** Setup Accessories Finished.

Si j'actionne mon interrupteur, rien ne se passe et aucune réaction de la ledbuiltin, ou des sorties vers l'aiguillage.

Si j'appuie sur le bouton poussoir:
Commander event : Address : 10020 / MOVEPOSITIONID
ButtonsCommanderButton id:10020 selected !
Same position : Cant move !
Same position : Cant move !
Same position : Cant move !
Same position : Cant move !
Same position : Cant move !
Same position : Cant move !
....
et au bout de plusieurs dizaine de lignes du même message, l'arduino redémarre (il n'a pas dû aimé :()

Pouvez vous me venir en aide ?

Merci.

PS: quand le TCO local fonctionnera, je voudrais envoyer les ordres via I2C avec un autre Arduino.
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: Thierry le octobre 17, 2017, 11:31:42 pm
C'est une erreur de ma part, corrigée dans la version 1.01 disponible sur Framagit : https://framagit.org/locoduino.org/Accessories/blob/master/Accessories.zip (https://framagit.org/locoduino.org/Accessories/blob/master/Accessories.zip).
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: bagou91 le octobre 18, 2017, 07:26:53 pm
Thierry,

Je viens de récupérer tes nouvelles sources: ça fonctionne en TCO local !   :D
sortie console:
Citer
Commander event : Address : 20 / MOVEPOSITIONID
ButtonsCommanderButton id:20 selected !
4 / 5 PortTwoPins MoveRightDir()
4 / 5 PortTwoPins MoveStop()
Commander event : Address : 10020 / MOVEPOSITIONID
ButtonsCommanderButton id:10020 selected !
4 / 5 PortTwoPins MoveLeftDir()
4 / 5 PortTwoPins MoveStop()

maintenant je m'attaque à l'envoi/réception par I2C et je rencontre à nouveau des petits soucis:
j'ai repris l'exemple I2CSender.ino de Commanders.
j'ai ajouté quelques lignes de debug dans I2CCommander.cpp pour me sortir les données reçues par I2C.
au 1er appui sur un bouton-poussoir, la sortie d'aiguille réagit bien:
Citer
I2CCommander::ReceiveHandler: chars read : 7
data received from I2C: 20 0 0 0 5 0 0
Commander event : Address : 20 / MOVEPOSITIONID
4 / 5 PortTwoPins MoveRightDir()
4 / 5 PortTwoPins MoveStop()

par contre un second appui sur BP ne donne rien sur la sortie:
Citer
I2CCommander::ReceiveHandler: chars read : 7
data received from I2C: 20 0 0 0 5 1 0
Commander event : Address : 20 / MOVEPOSITIONID
Same position : Cant move !

coté sketch I2CSender.ino, je met juste la commande envoyée:
1er appui: Commanders_I2C_SendEvent(0x10, 20, COMMANDERS_EVENT_MOVEPOSITIONID, 0);
2eme appui:  Commanders_I2C_SendEvent(0x10, 20, COMMANDERS_EVENT_MOVEPOSITIONID, 1);

si par contre pour le 2eme appui je met:
 Commanders_I2C_SendEvent(0x10, 10020, COMMANDERS_EVENT_MOVEPOSITIONID, 1);
ma sortie d'aiguille réagit bien et je peux faire bouger correctement l'aiguillage à chaque appui sur le BP.

Mon interrogation:
Je pensais que le dernier argument de Commanders_I2C_SendEvent() indiquait la sous-fonction à activer sur l'ID indiqué.

De mon point de vue, je trouve bizarre en TCO que l'appui sur le BP fasse changer l'adresse reçue par CommanderEvent,
à moins qu'il n'y ait plus de notion d'adresse mais seulement des ID unique lier aux événements ajouter aux boutons...
mais pourquoi alors déclarer comme ceci les 2 actions que le BP gère:
push.AddEvent(DCCINT(20,1));
push.begin(DCCINT(20,0),PIN_BP);

Peux tu m'éclaircir mon interrogation ?
Merci.
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: Thierry le octobre 18, 2017, 08:31:47 pm
Je vois que tu progresses, c'est bien. La différence vient de la non utilisation de DCCINT du côté de l'envoyeur. Parce que DCCINT(20,1) donne 10020 ! C'est pour ça que ça marche quand tu mets 10020 du côté de l'envoyeur, interprété ensuite à la réception comme '20,1' . Pour être cohérent, tu devrais ajouter la macro DCCINT trouvée dans DccCommander.hpp, au source de l'envoyeur et l'utiliser pour définir le message à envoyer :

#define DCCINT(id, acc)      ((acc) * 10000UL + (id))

Commanders_I2C_SendEvent(0x10, DCCINT(20,0), COMMANDERS_EVENT_MOVEPOSITIONID, 0);
Commanders_I2C_SendEvent(0x10, DCCINT(20,1), COMMANDERS_EVENT_MOVEPOSITIONID, 0);

Le dernier argument n'a pas de sens pour un moteur à deux positions, c'est l'id de l'événement qui fait le boulot.

Dernier point, je n'avais pas imaginé que quelqu'un ferait un appel à AddEvent avant begin ! Mais je constate avec plaisir que ça marche quand même...

Pour tenter de répondre à ta question que je crains de ne pas avoir totalement comprise, un bouton poussoir dispose d'une liste d'événements. Le begin pose le premier, les AddEvent suivants en ajoutent (ou l'inverse  8) ). Le fait d'appuyer sur ce bouton va envoyer le premier événement. L'appui suivant enverra l'événement suivant, et ainsi de suite jusqu'à la fin de la liste. A ce moment là on recommence au début.
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: bagou91 le octobre 18, 2017, 08:46:36 pm
OK je comprend mieux d'où vient ce "10020" que m'affiche la sortie console.

Je vais faire les modifications pour prendre en compte cette macro.

J'avais bien compris la liste d'événements associé au BP.
Ma dernière question (interrogation) est résolue par ce que tu m'as répondu sur la macro :)
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: bagou91 le octobre 18, 2017, 10:03:34 pm
J'ai réussi à envoyer les commandes correctement par I2C  :D
en PJ le sketch.

Maintenant j'aimerai réutiliser le principe de la librairie Accessoire au niveau des déclarations des boutons et des ID d'événements liés.
Ceci afin de rendre plus propre et plus structurer le code.

Seulement à chaque fois que j'utilise ma fonction d'envoi de trame I2C, l'arduino freeze et ne répond plus et rien ne se passe au niveau réception.
Sur la console, la sortie est incomplète, par exemple:
Citer
10020 5 0
Commander event : Address : 10020 / MOVEPOSITIONID
I2C send Commanders event: 10020/5/0
I2C sender

Voici le code:
#include <Commanders.h>
#include "Accessories.h"
#include <Wire.h>

ButtonsCommanderPush push;

#define CONSOLE

#define ADDR_I2C 0x10

#define DCCID_DROIT   DCCINT(20, 0)
#define DCCID_DEVIE   DCCINT(20, 1)

bool Commanders_I2C_SendEvent(uint8_t inID, unsigned long inEventID, COMMANDERS_EVENT_TYPE inEventType, int inEventData)
{
#ifdef CONSOLE
  Serial.print(F("I2C send Commanders event: "));
  Serial.print(inEventID, DEC);
  Serial.print(F("/"));
  Serial.print((char) ('0' + (char)inEventType));
  Serial.print(F("/"));
  Serial.println(inEventData, DEC);
#endif
 
  Wire.beginTransmission(inID);

  int nb = Wire.write((const uint8_t *)&inEventID, sizeof(unsigned long));
  nb += Wire.write((char )inEventType);
  nb += Wire.write((const uint8_t *)&inEventData, sizeof(int));

#ifdef CONSOLE
  Serial.print(F("I2C sender : nb byte transmitted : "));
  Serial.println(nb, DEC);
#endif

  Wire.endTransmission(true);

  return true;
}

void ReceiveEvent(unsigned long inId, COMMANDERS_EVENT_TYPE inEvent, int inData)
{
  COMMANDERS_PRINT_EVENT(inId, inEvent, inData);
  //if (inId != UNDEFINED_ID){
  //  Commanders_I2C_SendEvent(ADDR_I2C, inId, inEvent, inData);
  //}
}

void setup()
{
  Serial.begin(115200);
 
  Commanders::begin(ReceiveEvent, LED_BUILTIN);
  Accessories::begin();
 
  // Setup of the buttons, one by accessory
  push.AddEvent(DCCINT(20, 1));
  push.begin(DCCINT(20, 0),4);
}

void loop()
{
  unsigned long id = Commanders::loop();
 
  if (id != UNDEFINED_ID)
  {
    //Commanders_I2C_SendEvent(ADDR_I2C, id, Commanders::GetLastEventType(), Commanders::GetLastEventData());
    // Renvoie l'événement reçu de Commanders, vers les accessoires...
    Accessories::RaiseEvent(id, (ACCESSORIES_EVENT_TYPE) Commanders::GetLastEventType(), Commanders::GetLastEventData());
  }
 
  Accessories::loop();
}

J'ai laissé commenter les endroits où j'utilise la fonction d'envoi I2C pour montrer les divers endroits ou j'ai testé sans succès.

Si tu as une idée du problème, je suis preneur :)

Merci de ton aide.
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: Thierry le octobre 20, 2017, 09:20:27 am
Pour moi, le problème vient de l'utilisation d'Accessories ici qui n'est pas justifié. Le rôle d'Accessories, si on simplifie au maximum, est de recevoir des événements qu'elle va traduire en niveaux HIGH/LOW sur les broches de l'Arduino. Ma version de ton code:

#include <Commanders.h>
#include <Wire.h>

ButtonsCommanderPush push;

#define CONSOLE

#define ADDR_I2C 0x10

#define DCCID_DROIT   DCCINT(20, 0)
#define DCCID_DEVIE   DCCINT(20, 1)

bool Commanders_I2C_SendEvent(uint8_t inID, unsigned long inEventID, COMMANDERS_EVENT_TYPE inEventType, int inEventData)
{
#ifdef CONSOLE
  Serial.print(F("I2C send Commanders event: "));
  Serial.print(inEventID, DEC);
  Serial.print(F("/"));
  Serial.print((char) ('0' + (char)inEventType));
  Serial.print(F("/"));
  Serial.println(inEventData, DEC);
#endif
 
  Wire.beginTransmission(inID);

  int nb = Wire.write((const uint8_t *)&inEventID, sizeof(unsigned long));
  nb += Wire.write((char )inEventType);
  nb += Wire.write((const uint8_t *)&inEventData, sizeof(int));

#ifdef CONSOLE
  Serial.print(F("I2C sender : nb byte transmitted : "));
  Serial.println(nb, DEC);
#endif

  Wire.endTransmission(true);

  return true;
}

void setup()
{
  Serial.begin(115200);
 
  Commanders::begin(LED_BUILTIN);
 
  // Setup of the buttons, one by accessory
  push.begin(DCCINT(20, 0),4);
  push.AddEvent(DCCINT(20, 1));
}

void loop()
{
  unsigned long id = Commanders::loop();
 
  if (id != UNDEFINED_ID)
  {
    Commanders_I2C_SendEvent(ADDR_I2C, id, Commanders::GetLastEventType(), Commanders::GetLastEventData());
  }
}

Le problème du plantage vient peut être de l'utilisation d'Accessories sans aucun accessoires déclaré !
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: bagou91 le octobre 20, 2017, 07:03:42 pm
bonsoir,

Je viens de tester en enlevant la partie Accessoires:
Toujours le même freeze de l'arduino lorsque j'appuie sur le bouton poussoir.
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: Thierry le octobre 22, 2017, 03:23:46 pm
Je reproduis le freeze sur mon nano. Il semble qu'en réalité la fonction Wire.EndTransmission() attende indéfiniment un accusé de réception ou similaire depuis le bus. Ce qui n'arrive pas puisque, en tout cas chez moi, il n'y a rien au bout...
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: bagou91 le octobre 23, 2017, 10:09:46 am
Sur ma plateforme de test, j'ai bien un device slave sur l'I2C: un arduino nano avec le sketch qui active un aiguillage (celui en début de ce sujet).
Avec le 1er sketch d'envoi I2C que j'ai fait (PJ du 18/10 22h03), cela fonctionne bien.

C'est en essayant d'associer la bibliothèque Commanders et l'envoi I2C avec la fonction récupérer dans l'exemple I2C_Sender que cela freeze.
En recherchant sur le net, je trouve beaucoup de sujets sur des problèmes de freeze similaire en I2C...

Je testerai ce soir avec une librairie I2C alternative et revérifierai le bon fonctionnement avec mon 1er sketch.
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: bagou91 le octobre 23, 2017, 09:27:36 pm
bonsoir,

j'ai revérifié mes 2 sketchs:
dans celui intégrant la librairie Commanders, j'avais oublié Wire.begin() dans le setup()  :-[

Ca fonctionne bien à présent !  :D

je joint le sketch entier.
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: lapive le mai 15, 2018, 01:09:13 am
Bonjour Thierry,

Tout d'abord MERCI pour la création et le PARTAGE de ce merveilleux duo, Accessories et Commanders, qui nous facilite grandement la programmation de nos petits Arduino !

C'est en USANT et ABUSANT de tes deux bibliothèques que je me suis retrouvé dans des cas ou mon arduino NANO et arduino PRO avaient des comportements erratiques allant parfois jusqu'au RESET.

Voici le .ino pour le test d'un bouton poussoir et d'un relais:
#include <Commanders.h>
#include <Accessories.h>

const int buttonPin = 3;     // broche du poussoir
ButtonsCommanderPush Bouton;
PortOnePin           Port;
AccessoryLight       Relais;

void ReceiveEvent(unsigned long inId, COMMANDERS_EVENT_TYPE inEventType, int inEventData)
{
Accessories::ReceiveEvent(inId, (ACCESSORIES_EVENT_TYPE)inEventType, inEventData);
}

void setup()
{
Serial.begin(115200); // console ARDUINO PC

Commanders::begin(ReceiveEvent);
Accessories::begin();

Bouton.begin(100, buttonPin);
Port.begin(4, DIGITAL_INVERTED);
Relais.begin(&Port, 100);
    PRINT_COMMANDERS()
PRINT_ACCESSORIES
}

void loop(void)
{
Commanders::loop();
Accessories::loop();
}
Après avoir activé les modes debug des bibliothèques, ainsi qu'ajouté beaucoups de print supplémentaires dans le fichier Accessory.cpp, voici ce que j'ai remarqué:
L'affichage de multiples "Debounce : Cant move !" et puis parfois un RESET !

Console:
Opening port
Port open

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

*** Setup Commanders started.

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

*** Setup Accessories started.
AccessoryBaseLight OFF
AccessoryBaseLight SetState OFF
********* Commanders List
Commander: ButtonsCommander
    Push - Pin :3
        Event Id: 100 / Event type: MOVEPOSITIONID
********* End of List
********* Accessories List
    Light : ID 100 / Fading Step: 0 / Fading Delay: 0 / Blinking Delay: 0 / [PortOnePin pin: 4 (DIGITAL_INVERTED)]
********* End of Accessories
*** Setup Commanders Finished.
*** Setup Accessories Finished.
GetLastMoveTime : 0 GetDebounceDelay : 58823
Heap size:65
Stack size:47
Free ram:1383
Debounce : Cant move ! ++++++++++++++++++++++++++
GetLastMoveTime : 0, GetDebounceDelay : 58823
Heap size:65
Stack size:47
Free ram:1383
Accessory id 100, Event 5, Data 0 Action ADD event **************************
ButtonsCommanderButton id:100 selected !
GetLastMoveTime : 0 GetDebounceDelay : 58823
Heap size:75
Stack size:28
Free ram:1392
Debounce : Cant move ! ++++++++++++++++++++++++++
GetLastMoveTime : 0, GetDebounceDelay : 58823
Heap size:75
Stack size:28
Free ram:1392
Accessory id 100, Event 5, Data 0 Action ADD event **************************
GetLastMoveTime : 0 GetDebounceDelay : 58823
Heap size:85
Stack size:28
Free ram:1382
Debounce : Cant move ! ++++++++++++++++++++++++++
GetLastMoveTime : 0, GetDebounceDelay : 58823
Heap size:85
Stack size:28
Free ram:1382
... après une longue série .... la fin de l'affichage ... où l'on voit que la RAM dispo = 132 octets !!
Accessory id 100, Event 5, Data 0 Action ADD event **************************
GetLastMoveTime : 0 GetDebounceDelay : 58823
Heap size:1335
Stack size:28
Free ram:132
Debounce : Cant move ! ++++++++++++++++++++++++++
GetLastMoveTime : 0, GetDebounceDelay : 58823
Heap size:1335
Stack size:28
Free ram:132
Accessory id 5, Event 5, Data 0 Action ADD event **************************

On remarque la grande valeur de GetDebounceDelay 58855, valeur que nulle part je ne trouve et que je n'ai pas initialisée.

J'ai fait un affichage de la SRAM libre, et elle diminuait après chaque affichage de "Debounce : Cant move !" se soldant parfois par un RESET.
Le message "Debounce : Cant move" ce situe dans le fichier accessory.cpp dont un extrait ci-dessous:
bool Accessory::IsMovementPending()
{
#ifdef ACCESSORIES_DEBUG_MODE
Serial.print(F("GetLastMoveTime : "));
Serial.print(GetLastMoveTime());
Serial.print(F("\tGetDebounceDelay : "));
Serial.println(GetDebounceDelay());
MEMORY_PRINT_HEAPSIZE
MEMORY_PRINT_STACKSIZE
MEMORY_PRINT_FREERAM
#endif
if (this->IsActionDelayPending())
{
#ifdef ACCESSORIES_DEBUG_MODE
Serial.println(F("ActionPending : Cant move !"));
#endif
return true;
}

if (millis() - this->GetLastMoveTime() <= this->GetDebounceDelay())
{
#ifdef ACCESSORIES_DEBUG_MODE
Serial.println(F("Debounce : Cant move ! ++++++++++++++++++++++++++"));
Serial.print(F("GetLastMoveTime : "));
Serial.print(GetLastMoveTime());
Serial.print(F(", GetDebounceDelay : "));
Serial.println(GetDebounceDelay());
MEMORY_PRINT_HEAPSIZE
MEMORY_PRINT_STACKSIZE
MEMORY_PRINT_FREERAM
#endif
return true;
}

this->SetLastMoveTime();
return false;
}
La conséquence de la très grande valeur (58855 ici) retournée par GetDebounceDelay(), fera que le code ci-dessous retournera TRUE
if (millis() - this->GetLastMoveTime() <= this->GetDebounceDelay())
{
             return true;
}

La fonction Accessory::IsMovementPending(), est appelée par:
void Accessory::ExecuteEvent(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent, int inData)
{
Accessory *acc = GetById(inId);

if (acc != NULL)
{
if (acc->IsMovementPending() || (ActionsStack::FillingStack && inEvent != ACCESSORIES_EVENT_EXTERNALMOVE))
{
ActionsStack::Actions.Add(inId, inEvent, inData);
#ifdef ACCESSORIES_DEBUG_MODE
Serial.print(F("Accessory id "));
Serial.print(inId);
Serial.print(F(", Event "));
Serial.print(inEvent);
Serial.print(F(", Data "));
Serial.print(inData);
Serial.println(F(" Action ADD event **************************"));
#endif
return;
}

if (inEvent == ACCESSORIES_EVENT_MOVEPOSITIONINDEX && (inData < 0 || inData >= acc->GetMovingPositionSize()))
{
#ifdef ACCESSORIES_DEBUG_MODE
Serial.print(F("Accessory id "));
Serial.print(inId);
Serial.print(F(" bad MovePositionIndex event "));
Serial.println(inData);
#endif
return;
}

acc->Event(inId, inEvent, inData);
}
}
D'après ce que je comprends, le retour TRUE de IsMovementPending() va appeler ActionsStack::Actions.Add(inId, inEvent, inData);
c'est cette dernière qui va consommer de la RAM .....

Bref, j'ai testé l'initialisation de debounceDelay=50 dans le constructeur de Accessory et là, plus de RESET, plus de consommmation de la SRAM, et plus de message Cant move !!!!

Il semblerai que debounceDelay prenait "ce qu'il trouvait" en SRAM après l'allumage du NANO ou le upload d'un nouveau programme.

Je joins les copies du moniteur série, ainsi que le fichier Accessory.cpp pour montrer où j'ai inséré les print qui ont permis cet affichage.

J'espère ne pas être trop à côté de la plaque dans les"explications" que j'ai trouvé à mon problème ! Et je fais confiance à Thierry pour me le dire très franchement :) car il s'agit peut-être tout simplement que je ne sais pas utiliser la bibliothèque ! :-[

Toutes mes amitiés à l'équipe de Locoduino qui, on ne se lasse pas de le dire, fait un remarquable travail.
Cyrille

Titre: Re : bibliothèque Commanders+Accessoires
Posté par: bagou91 le mai 15, 2018, 11:52:53 am
Bonjour lapive,

Merci pour ces infos.

Il est vrai que j'ai aussi constaté ce plantage et reset dans mes nombreux tests, mais je pensais que c'était plus dû à mes appuis sur BP trop frénétiques :)
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: Thierry le mai 15, 2018, 01:38:10 pm
Tu as tout à fait raison lapive, il manquait une initialisation. A ma décharge, je teste dans Visual-Studio qui introduit un changement lié au mode 'debug'. En Debug, tout est initialisé à 0. Lorsque l'on compile en release pour mettre en production comme l'IDE Arduino, les variables ne sont plus initialisées et prennent ce qui traîne à leur emplacement mémoire comme leur valeur. Voilà pourquoi, 'normalement', j'initialise toujours toutes les données d'une classe même si ça ne parait pas nécessaire à la lecture... C'est ce qui a manqué ici. Mea culpa !

Une version 1.1.2 a été poussée sur Github et devrait pouvoir être récupérée bientôt (il y a un petit délai) depuis l'interface de l'IDE par une mise à jour de la bibliothèque.
Bonne continuation.
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: lapive le mai 15, 2018, 07:53:21 pm
Merci Thierry pour la rapidité avec laquelle tu nous a mis à disposition cette nouvelle version.

Un petit clin d'oeil  ;) : tu as omis ton petit Serial.println(F("Accessories V1.1.2")); dans Accessories.cpp
Rien de bien grave !!!  ;D

Si je peux abuser de ta patience, je n'ai jamais fait de bibliothèque pour Arduino et je remarque que le fichier library.properties contient version=1.1.1
Cela aurait-il une incidence sur l'IDE arduino pour rechercher une nouvelle mise à jour ? (j'ai récupéré la version depuis Github)

Très bonne soirée.
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: Thierry le mai 15, 2018, 09:52:04 pm
Ce que c'est de vouloir aller trop vite tout en assurant un service minimum au boulot... Heureusement que le service qualité passe par là ! C'est corrigé, et oui, la version ne devait pas demander à se mettre à jour sans le bon library.properties .

Merci pour la vigilance.
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: Jean-Luc le mai 15, 2018, 09:58:54 pm
Mmmm, c’est pas le library.properties qui est dans la release qui doit avoir l’attribut version a la même valeur que le nom de la release ?
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: Thierry le mai 15, 2018, 10:11:29 pm
J'ai bien mis 1.1.2 dans library.properties, mais je mets toujours v1.*.* dans le nom de la release... Je pense que le nom n'a pas d'importance et que ce qui compte, c'est le library.properties dans les sources ou le zip associés à une release. Mais je peux me tromper...
Le fait est que SlowMotionServo me permet de remonter dans les versions en réinstallant une vieille version, tandis que Accessories ne me le permet pas... Je ne sais pas si c'est le nom de la release qui est en cause, je n'ai fait que suivre les instructions données dans l'encadré de droite de la page de saisie des releases.
Mais peut être que pour l'IDE Arduino, il faut éviter le 'v' du tag de la release ?
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: Jean-Luc le mai 15, 2018, 10:25:32 pm
J’en sais rien à vrai dire, la doc n’est pas très claire. Mais dans les libs officielles que j’ai regardées, les nom des releases sont exactement les mêmes que la version dans library.properties.
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: Jeje_12_34 le avril 13, 2020, 05:20:10 pm
Bonjour

Je continue mon apprentissage .
Comme je n'ai aucun aiguillage a solénoïde, je suis passé directement à l'exemple  6, celui du passage à niveau sur voie unique.

Je l'ai modifié par l'ajout d'une Led verte allumée et par l'extinction des deux rouges dès que la barrière est grande ouverte.

Je me suis un peu creusé la tète, pour arriver à cela. Mais ca fonctionne (presque) parfaitement.

Pourquoi presque ?
Parce que le premier appui sur le bouton ne fait pas baisser lentement la barrière. Elle descend d'un coup  quand elle reçoit l'ordre de remonter, puis remonte lentement.
Les LEDS font exactement ce que je leur demande.
Et les appuis suivants sur le bouton de déclanchement entrainent une animation parfaite. Ce n'est que le premier appui qui "foire".

Qu'ai je raté  ?

Oui, je sais, je pinaille :)

Merci de votre aide (qui n'urge pas du tout) :)


/* Programme 6 exemple Accessorie modifié par Jerome
 Effets  recherchés par les modifications:
 - en fin d'animation, les LEDS changent d etat après que les barrieres soient levées.
 - une LED verte indique que la passage est autorisé.
 */

#include <Accessories.h>
#include <Commanders.h>
 
#define TEMPO  20000                //duree de l animation, 20 secondes
 
// L'ILS ...
ButtonsCommanderPush boutonILS;     // remplacé par un poussoir sur pin A2 et GND
 
// Le moteur
AccessoryServo PN;                  // "donnée" sur sur pin3
 
// Les DELS
AccessoryLightMulti Dels;           //Deux rouges sur pin7&8, une verte sur pin9.

// Les ports pour connecter le moteur et les DELs.
PortServo portPN;                   //servo
PortOnePin portLight1;              //LED Rouge 1
PortOnePin portLight2;              //LED Rouge 2 (ou une jaune)
PortOnePin portLight3;              //LED Verte

bool etatPN;                        //position de la barriere
 
void setup()
{
  Commanders::begin(LED_BUILTIN);
 
  Accessories::begin();
 
  // Un seul bouton, mais deux événements pour le PN
  boutonILS.begin(1234, 6); // premier événement pour le déclanchement
 
  // Les ports avec leurs broches en digital (pas PWM)
  portPN.begin(3);
  portLight1.begin(7, DIGITAL);
  portLight2.begin(8, DIGITAL);
  portLight3.begin(9, DIGITAL);     //LED Verte
 
  // begin de l'accessoire de 2 Dels qui doivent clignoter à 500ms d'intervalle.
  Dels.begin(0, 3, 500);
   
  // Les DELs avec pour chaque, le port utilisé.
  Dels.beginLight(0, &portLight1);
  Dels.beginLight(1, &portLight2);
  Dels.beginLight(2, &portLight3);
 
  // On fait clignoter les leds...
  Dels.SetBlinking(0, 500);
  Dels.SetBlinking(1, 500);
 
  // Le servo : pas de durée de mouvement, un débattement entre 90 et 160 degres
  // et deux positions stables annoncées avec des identifiants inutiles (mais obligatoires)
  PN.begin(&portPN, 75, 90, 160, 1);
  // Les deux positions sont au mini et au maxi :
  PN.AddMinMaxMovingPositions(456, 789);

 // initialisation barriere ouverte et led verte allumée
 Dels.LightOff();       // extinction des 3 LEDS
 Dels.LightOn(2);       // allumage de la LED Verte.
 PN.MoveMaximum();      //barriere grande ouverte
 Accessories::loop();   // et on fait bouger tout ca.
 }
   
unsigned long dateFermeture = 0;
 
void loop()

  Accessories::loop();
  etatPN=PN.IsMaximumOrGreaterPosition(); // on recupere la position de la barriere : 1 si grande ouverte
 
  unsigned long id = Commanders::loop();
 
  // si l'ils est activé !
  if (id == 1234)
  {
    if (dateFermeture== 0)
    {
      dateFermeture = millis();
 
      // mise en route clignotement des rouges et extinction de la verte.
      Dels.Blink();       //en fait les 3 clignotent, mais on eteint la verte juste apres.
      Dels.LightOff(2);
      //Dels.LightOn(1);  // si on veut garder une rouge fixe.
 
      // mouvement servo : fermeture de la barriere
      PN.MoveMinimum();
 
      // Plus rien à faire, attendons l'étape suivante.
      return;
    }
    else
    {
      dateFermeture = millis();
    }
  }
 
  if (dateFermeture > 0)
  {
    if (millis() - dateFermeture > TEMPO)
    {
      // Fin de l'animation. On ouvre les barrières, puis on éteint les LED
      PN.MoveMaximum();   //on ouvre les barrieres
      if(etatPN == 1)     // 1 si la barriere est en haut
      {
      Dels.LightOff();    // extinction des 3 LEDS
      Dels.LightOn(2);    // allumage de la LED Verte.
      dateFermeture = 0;
      }
      //sinon on ne modifie pas l etat des LEDS
  }
}
}
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: Thierry le avril 13, 2020, 05:54:02 pm
Là comme ça, le seul bémol que je mettrais sur ce code, c'est l'usage de Accessories.loop() dans  le setup... Dans un mouvement de servo avec une durée comme le tien (75ms entre deux petits mouvements), c'est à chaque appel d'Accessories.loop() que le mouvement est fait. Il en faut donc plusieurs, voire beaucoup pour faire le mouvement complet !
Titre: Re : bibliothèque Commanders+Accessoires
Posté par: Jeje_12_34 le avril 13, 2020, 06:20:56 pm
Merci  Thierry .

Je précise que ce comportement était présent avant mes modifications et que justement, j'ai mis une partie initialisation dans le setup pour essayer d'y pallier.

Si on supprime toute la partie initialisation,  le sketch fonctionne parfaitement, dès le deuxième appui sur le bouton.  :)