Parlons Arduino > Bibliothèques

bibliothèque Commanders+Accessoires

<< < (2/5) > >>

bagou91:
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
--- Fin de citation ---

Voici le code:

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

--- Fin du code ---

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.

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


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

Le problème du plantage vient peut être de l'utilisation d'Accessories sans aucun accessoires déclaré !

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

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

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

Navigation

[0] Index des messages

[#] Page suivante

[*] Page précédente

Utiliser la version classique