Problèmes d'encodeur EC11

Bonjour Artouste,

Merci pour votre aide !

Un de mes bogues est l'utilisation du type de variable « byte » qui est non signé, que je suis bête, pour un encodeur, c'est pas fort !?!

J'ai moi aussi trouvé ce bogue qui découle de la version Mega de lecture des encodeurs, mais avec broche interruption, et évidemment, il manque la partie « attachInterrupt... », etc.

J'ai déjà remplacé par :

...
//*****************************************************************************
// FONCTION ActionsEncodeurs.
//*****************************************************************************
void ActionsEncodeurs ()
// Fonction qui est exécutée lorsque des données sont demandées par le Maître.
// Cette fonction est enregistrée comme un événement ("event" en anglais),
// voir la fonction setup ().
{
  if ((Encodeur_1_BoutonEtat == 1) or (Encodeur_1_NombreDePas.EntierSigne != 0))
  {
    Wire.write (Encodeur_1_BoutonEtat);
    Encodeur_1_BoutonEtat = 0;
    Encodeur_1_NombreDePas.EntierSigne = Encodeur_1_NombreDePas.EntierSigne / 2;
    Wire.write (Encodeur_1_NombreDePas.Octet [0]);
    Wire.write (Encodeur_1_NombreDePas.Octet [1]);
    Encodeur_1_NombreDePas.EntierSigne = 0;
    // Faire clignoter la DEL de la carte Nano une fois une seconde.
  }
}
//*****************************************************************************

//*****************************************************************************
// FONCTION LireEncodeurs.
//*****************************************************************************
void LireEncodeurs ()
{
  // Lire l'état du bouton de l'encodeur broche E.
  if (digitalRead (ENCODEUR_1_BOUTON) >= 1)
  { // Répondre avec un message de 1 octet (byte) comme attendu par le maître.
    Encodeur_1_BoutonEtat = 1;
    delay (EncodeurTempsRebond);
  }

  // Lire l'encodeur 1 broche # A.
  bitWrite (Encodeur_1_EtatActuel, 0, !digitalRead (ENCODEUR_1_SORTIE_A));
  // Lire l'encodeur 1 broche # B.
  bitWrite (Encodeur_1_EtatActuel, 1, !digitalRead (ENCODEUR_1_SORTIE_B));
  if (Encodeur_1_EtatActuel != Encodeur_1_EtatPrecedent)
  {
    switch (Encodeur_1_EtatPrecedent)
    {
      case 0:
        if (Encodeur_1_EtatActuel == 1)
        {
          Encodeur_1_Direction = 1;
        }
        else
        {
          Encodeur_1_Direction = 0;
        }
        break;
      case 1: 
      if (Encodeur_1_EtatActuel == 3)
        {
        Encodeur_1_Direction = 1;
        }
      else 
        {
        Encodeur_1_Direction = 0; 
        }
      break;
      case 2:
        if (Encodeur_1_EtatActuel == 0)
        {
          Encodeur_1_Direction = 1;
        }
        else 
        {
          Encodeur_1_Direction = 0;
        }
        break;
      case 3:
        if (Encodeur_1_EtatActuel == 2)
        {
          Encodeur_1_Direction = 1;
        }
        else 
        {
          Encodeur_1_Direction = 0;
        }
        break;
    }
    Encodeur_1_EtatPrecedent = Encodeur_1_EtatActuel;
    // Vérifier si l'encodeur est en position d'arrêt (01 et 10 pour les détentes), 
    // pour exclure le changement de la valeur doublée.
    if (Encodeur_1_EtatActuel == 1 or Encodeur_1_EtatActuel == 2)
    {
      // Pour les autres encodeurs, il peut être 00 ou 11 états (0 à 3), 
      // vérifiez votre codeur.
      if (Encodeur_1_Direction)
      {
        Encodeur_1_NombreDePas.EntierSigne = Encodeur_1_NombreDePas.EntierSigne + 1;
      }
      else
      {
        Encodeur_1_NombreDePas.EntierSigne = Encodeur_1_NombreDePas.EntierSigne - 1;
      }
    }
    delay (EncodeurTempsRebond);
  }
}
//*****************************************************************************
...

Et maintenant le Nano donne les bonnes sorties, tout est cohérent maintenant côté Nano pour la cueillette des données de l'encodeur et son bouton.

Le tout se gâte à la transmission et/ou réception côté Mega.

Dans les deux codes (Mega, Nano) les types de variables sont passés à :

// Variable pour les données de l'encodeur 5 :
// Recoit la valeur indiquant l'état pressé ou non d'un bouton.
byte         Encodeur_5_BoutonEtat    = 0;
// Recoit la valeur indiquant le nombre de pas fait  l'encodeur depuis la dernière
// demande de l'Arduino maître de la communication i2c.
// Unions permettent le même emplacement de mémoire auquel on doit accéder en 
// tant que types de données différents.
union
{
  byte Octet [1];// Deux octets.
  int EntierSigne;
} Encodeur_5_NombreDePas;

Et j'ai les mêmes problèmes si je change pour :

union
{
  char Octet [1];// Deux octets.
  int EntierSigne;
} Encodeur_5_NombreDePas;

Je retour fouiller le code...

Encore merci pour votre aide !

L'ami René