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é