Parlons Arduino > Bibliothèques

bibliothèque Commanders+Accessoires

(1/5) > >>

bagou91:
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:

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

--- Fin du code ---

j'ai activé le mode debug pour voir ce qu'il se passe sur la console série:
au démarrage:

--- Code: ---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.
--- Fin du code ---

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:

--- Code: ---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 !
....
--- Fin du code ---
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.

Thierry:
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.

bagou91:
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()

--- Fin de citation ---

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()
--- Fin de citation ---

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 !
--- Fin de citation ---

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.

Thierry:
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.

bagou91:
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 :)

Navigation

[0] Index des messages

[#] Page suivante

Utiliser la version classique