Problèmes d'encodeur EC11

Bonjour ,

Un très grand merci !

Je viens de corriger les deux codes sources (Mega et Nano), le « byte Octet [1];// Deux octets. » pour « byte Octet [2];// Deux octets. ».

L'ordre d'envoi est :

...
  if ((Encodeur_1_BoutonEtat != 0) 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;
  }
...

L'ordre de réception est :

...
  Wire.requestFrom (int (ADRESSE_TINY_1), 3);
  if (Wire.available ())
  { // Réception de l'octet (byte) comme caractère.
    // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
    Encodeur_5_BoutonEtat = byte (Wire.read ());
    // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la 
    // dernière demande de l'Arduino maître de la communication i2c.
    Encodeur_5_NombreDePas.Octet [0] = byte (Wire.read ());
    Encodeur_5_NombreDePas.Octet [1] = byte (Wire.read ());
...

Alors, cela serait correct ?

Mais, pour ce qui est de la sortie sur le terminal série de l'Arduino Mega, le résultat est le même :

...


  • TempsActuele = 3271, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 3336, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 3400, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
    ...
  • TempsActuele = 8460, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 8524, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 8589, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1

Note : Début de mes manipulations du bouton de l'encodeur (pas de réaction...) :

  • TempsActuele = 8652, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 8717, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 8780, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
    ...
  • TempsActuele = 8845, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 8908, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 8973, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1

Note : Début de mes manipulations de l'encodeur, et c'est la valeur du bouton qui change, pas le nombre de pas :

  • TempsActuele = 9101, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 9164, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 9230, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
    ...
  • TempsActuele = 11153, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 11217, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 11283, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 11348, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
  • TempsActuele = 11412, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
    ...

Mais par curiosité, j'inverse l'ordre dans l'envoi et la réception :

L'ordre d'envoi est :

...
  if ((Encodeur_1_BoutonEtat != 0) or (Encodeur_1_NombreDePas.EntierSigne != 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;
    Wire.write (Encodeur_1_BoutonEtat);
    Encodeur_1_BoutonEtat = 0;
  }
...

L'ordre de réception est :

...
  Wire.requestFrom (int (ADRESSE_TINY_1), 3);
  if (Wire.available ())
  { 
    // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la 
    // dernière demande de l'Arduino maître de la communication i2c.
    Encodeur_5_NombreDePas.Octet [0] = Wire.read ();
    Encodeur_5_NombreDePas.Octet [1] = Wire.read ();
    // Réception de l'octet (byte) comme caractère.
    // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
    Encodeur_5_BoutonEtat = Wire.read ();
...

Mais, pour ce qui est de la sortie sur le terminal série de l'Arduino Mega, le résultat est :


  • MegaNano01xEncoM *
    ...

  • TempsActuele = 3271, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
  • TempsActuele = 3340, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
  • TempsActuele = 3408, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
    ...
  • TempsActuele = 11180, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
  • TempsActuele = 11247, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
  • TempsActuele = 11316, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256

Note : Début de mes manipulations de l'encodeur (pas de réaction...) :

  • TempsActuele = 11384, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
  • TempsActuele = 11452, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
  • TempsActuele = 11521, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256

Note : Début de mes manipulations du bouton de l'encodeur, et c'est la valeur du nombre de pas qui change de 256 à 255, mais la valeur du bouton reste à 255 :

  • TempsActuele = 15137, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
  • TempsActuele = 15206, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
  • TempsActuele = 15275, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
  • TempsActuele = 15342, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
  • TempsActuele = 15411, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
  • TempsActuele = 15478, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
  • TempsActuele = 15547, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
    ...

C'est pour le moins surprenant !

Ce qui pour moi a tendance a démontrer qu'il y a un problème dans la communication i2c !

Actuellement j'utilise des 4.7K?, comme résistant pour l'i2c.

Qu'en pensez-vous !

J'ai aussi inversé dans la définition des variables (mais même résultat) :

union
{
  int EntierSigne = 0;
  byte Octet [2];// Deux octets.
} Encodeur_5_NombreDePas;

L'ami René