Go Down

Topic: Problèmes d'encodeur EC11 (Read 39539 times) previous topic - next topic

LamiRene


Bonjour,
Juste pour être sûr (je n'ai pas regardé le code pour l'instant) les résistances sont bien présentes sur le bus I²C ?


Bonjour haifger, icare et fdufnews,

Merci pour votre aide !

Des résistances sur le bus I²C ! Oh, OK voilà probablement la source des problèmes. Non,  je n'ai pas de résistances sur le bus I²C. J'ignorais qu'il en fallait. Je fais les recherches et les changements requis et je vous reviens avec les résultats.

Gros gros merci !

L'ami René

Tous pour un et un pour tous !

icare

Bonjour,
Pas besoin de grande recherche, tu mets une résistances de 4.7k entre le +5V et le SDA et une autre de 4.7k entre le +5V et le SCL.
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

LamiRene

Bonjour icare,

Merci pour votre aide !

Avant de vous lire, j'ai trouvé :

http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html

Quote

The value of the resistors is not critical. I have seen anything from 1k8 (1800 ohms) to 47k (47000 ohms) used. 1k8, 4k7 and 10k are common values, but anything in this range should work OK. I recommend 1k8 as this gives you the best performance. If the resistors are missing, the SCL and SDA lines will always be low - nearly 0 volts - and the I2C bus will not work.


Traduction :

Quote

La valeur des résistances n'est pas critique. J'ai vu quelque chose de 1k 8 (1 800 ohms) à 47k (47000 ohms) utilisé. 1k 8, 4 k 7 et 10 k sont des valeurs communes, mais quelque chose dans cette gamme devrait fonctionner OK. Je recommande 1k 8 car cela vous donne les meilleures performances. Si les résistances sont manquants, les lignes SCL et SDA sera toujours faibles - presque 0 Volt - et le bus I2C ne fonctionneront pas.


Donc, j'utilise deux résistances 1K?, est-ce important selon vous, dois-je changer pour 4.7K? ?

En pièce jointe, montage Fritzing aux formats FZZ, PDF, et JPG, du circuit, est-il correct ?

Les résistances changent un peu les choses, mais le problème reste entier, les valeurs sont incohérentes que l'encodeur et son bouton soient manipulés ou non.

Encore merci !

L'ami René
Tous pour un et un pour tous !

Artouste

#123
Sep 15, 2014, 02:06 pm Last Edit: Sep 15, 2014, 02:11 pm by Artouste Reason: 1


...
Les résistances changent un peu les choses, mais le problème reste entier, les valeurs sont incohérentes que l'encodeur et son bouton soient manipulés ou non.



Bonjour
l'exposé de ta constation n'est pas exploitable
il te faut faire une demarche "de scientifique  sur paillasse"  

le "changent un peu les choses" , ça se traduit exactement comment/par quoi ?  le "peu" consiste en quoi ?

tu utilise quoi comme codes basiques de validation d'echange entre tes 2 cartes/MCU  ?



fdufnews

#124
Sep 15, 2014, 02:35 pm Last Edit: Sep 15, 2014, 02:41 pm by fdufnews Reason: 1
D'après la spécification I²C, pour un circuit en 5V, la résistance ne devrait pas être inférieure à 1,2k.
Toujours d'après la spécification sa valeur max ne devrait pas excéder 4,7k environ en mode Fast (SCL = 400kHz) si le bus est faiblement capacitif.
Une valeur trop haute augmente le temps de monté des signaux et peut rendre la communication instable.
Une valeur trop basse fait tirer trop de courant sur le collecteur ouvert de sortie et peut entraîner un niveau 0 hors spécification.

Idéalement une 2,2k serait la valeur passe partout. La valeur de 4,7k souvent préconisée est valable si le bus reste court.

Ce serait bien de nous mettre le code que tu utilises pour tes tests.

Artouste

#125
Sep 15, 2014, 02:51 pm Last Edit: Sep 15, 2014, 02:53 pm by Artouste Reason: 1

...

Idéalement une 2,2k serait la valeur passe partout. La valeur de 4,7k souvent préconisée est valable si le bus reste court.

Ce serait bien de nous mettre le code que tu utilises pour tes tests.

bonjour fdufnews
bien d'accord
je penche plus  pour un probleme  purement "soft"  plutot qu'un probleme de validation/levée de doute  de la comm I²C
et ce d'autant que plus haut Lamirené expose :   :smiley-mr-green:

Quote
Je viens de réussir une première communication I2C entre Arduino Mega et Nano en mode « Master Reader » pour la lecture de l'état d'un bouton pression. C'est d'une grande simplicité !



LamiRene

Bonjour Artouste et fdufnews,

Les valeurs incohérentes sont plus petites, probablement que comme la communication et plus rapide, le nombre des boucles exécuté par le Nano est moindre entre les demandes du Mega. La valeur pour « Encodeur_1_BoutonEtat » est maintenant toujours proche de 12, ±1, et pour « Encodeur_1_NombreDePas », toujours fixe à 255 quand je ne touche pas à l'encodeur. Quand je le manipule, la valeur pour « Encodeur_1_BoutonEtat » est maintenant toujours proche de 4, ±3, et pour « Encodeur_1_NombreDePas », toujours fixe à 255.

Mais, « Encodeur_1_BoutonEtat » est un binaire (0/1), alors comme expliquer les « 12, ±1, » et « 4, ±3 » ?

Je ne suis pas sur de comprendre le sens de la question « tu utilise quoi comme codes basiques de validation d'echange entre tes 2 cartes/MCU  ?  », mais pour ce que j'en comprends, je valide par l'affichage sur écran LCD des deux valeurs immédiatement après réception de ces données et sans les modifier ou les convertir :

Pour le Nano :
Code: [Select]

...
    Wire.write (byte (Encodeur_1_BoutonEtat));
//    Wire.write (char (Encodeur_1_BoutonEtat));
    Encodeur_1_BoutonEtat = 0;
    Wire.write (byte (round (Encodeur_1_NombreDePas / 2)));
//    Wire.write (char (byte (round (Encodeur_1_NombreDePas / 2))));
    Encodeur_1_NombreDePas = 0;
...


Pour le Mega :
Code: [Select]

...
    Encodeur_5_BoutonEtat = (boolean (Wire.read ()));
    Encodeur_5_NombreDePas = (byte (Wire.read ()));
    LCD_2.setCursor (14, 3);
    LCD_2.print ("      ");
    LCD_2.setCursor (14, 3);
    LCD_2.print (Encodeur_5_BoutonEtat);
    LCD_2.setCursor (17, 3);
    LCD_2.print (Encodeur_5_NombreDePas);
...


Pour "validation d'echange entre tes 2 cartes/MCU", je n'utilise rein d'autre.

OK pour 2,2k qui serait la valeur passe-partout et 4,7k. Je teste et reviens avec les constats.

Un grand merci pour votre aide !

L'ami René
Tous pour un et un pour tous !

haifger

Perso, pour déboguer, je commencerai pas faire envoyer à la Nano des valeurs "fixes" (ie connues à l'avance, par exemple 1 et 77). Si cette étape ne fonctionne pas, il n'est pas pertinent de passer à l'envoi de données dynamiques.

Artouste


...
Je ne suis pas sur de comprendre le sens de la question « tu utilise quoi comme codes basiques de validation d'echange entre tes 2 cartes/MCU  ?  »,

ce ne sont pas des codes basiques
pour rester dans l'environnement de base
test simplement la comm I²C en utilisant seulement  le serial en debug (à vitesse elevée 115200)
pas en utilisant de l'afficheur LCD (lib conso en temps de calcul)

edit , et bien d'accord avec la proposition de haifger  8)

LamiRene


...
Ce serait bien de nous mettre le code que tu utilises pour tes tests.


En pièce jointe tout le code mis à jour il y a 2 minutes.

Merci pour votre aide !

L'ami René
Tous pour un et un pour tous !

LamiRene


...
Idéalement une 2,2k serait la valeur passe partout. La valeur de 4,7k souvent préconisée est valable si le bus reste court.
...


Pour des 2.2K? ou des 4.7K?, la valeur pour « Encodeur_1_BoutonEtat » est toujours proche de 12, ±1, et pour « Encodeur_1_NombreDePas », toujours fixe à 255 quand je ne touche pas à l'encodeur. Quand je le manipule, la valeur pour « Encodeur_1_BoutonEtat » est maintenant 1 et 126, et pour « Encodeur_1_NombreDePas », toujours fixe à 255.

Je teste avec la sortie du terminal série de l'IDE Arduino et je vous recopierai ici les sorties.

L'ami René
Tous pour un et un pour tous !

LamiRene

Et voici la sortie du terminal (Pour des 4.7K?, autres test ?) :

Quote


********************************************************************************
*                               MegaNano01xEncoM                               *
********************************************************************************
*        Broche pour initialiser la broche RESET des CI Slave activer !        *
********************************************************************************
*    Broche des boutons pour selection des radios NAV, COM et ADF activer !    *
********************************************************************************
*                       Broche du (((Buzzer))) activer !                       *
********************************************************************************
*            Broche du capteur infrarouge de telecommande activer !            *
********************************************************************************
*          Broche de la DEL de la carte Arduino et Ethernet activer !          *
********************************************************************************
*                  Broche des encodeurs et poussoir activer !                  *
********************************************************************************
*            Broche du bouton pour Entrer/Sortir les roues activer !           *
********************************************************************************
*                      Broche des interrupteurs activer !                      *
********************************************************************************
*                     Communication Ethernet UDP activer !                     *
********************************************************************************
********************************************************************************
*                  Broche pour la communication I2C activer !                  *
*              Debut du programme principal boucle >>> loop () <<<             *
********************************************************************************
********************************************************************************
* TempsActuele = 3791, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 3863, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 3934, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 4004, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255

* TempsActuele = 6277, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6348, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6419, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6490, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6561, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6632, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6703, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6774, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255

Note : Début des réponses du Nano :

* TempsActuele = 6845, Encodeur_5_BoutonEtat = 10, Encodeur_5_NombreDePas = 255
* TempsActuele = 6917, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 6987, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
...
* TempsActuele = 16094, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 16164, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 16236, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255

Note : Début de mes manipulations de l'encodeur et de son bouton :

* TempsActuele = 16307, Encodeur_5_BoutonEtat = 127, Encodeur_5_NombreDePas = 255
* TempsActuele = 16378, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 16449, Encodeur_5_BoutonEtat = 126, Encodeur_5_NombreDePas = 255
* TempsActuele = 16521, Encodeur_5_BoutonEtat = 126, Encodeur_5_NombreDePas = 255
* TempsActuele = 16591, Encodeur_5_BoutonEtat = 1, Encodeur_5_NombreDePas = 255
* TempsActuele = 16663, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 16734, Encodeur_5_BoutonEtat = 120, Encodeur_5_NombreDePas = 255
* TempsActuele = 16805, Encodeur_5_BoutonEtat = 120, Encodeur_5_NombreDePas = 255
* TempsActuele = 16876, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 16948, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 17018, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 17090, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 17161, Encodeur_5_BoutonEtat = 126, Encodeur_5_NombreDePas = 255
* TempsActuele = 17232, Encodeur_5_BoutonEtat = 124, Encodeur_5_NombreDePas = 255
* TempsActuele = 17303, Encodeur_5_BoutonEtat = 127, Encodeur_5_NombreDePas = 255
* TempsActuele = 17375, Encodeur_5_BoutonEtat = 2, Encodeur_5_NombreDePas = 255
* TempsActuele = 17445, Encodeur_5_BoutonEtat = 127, Encodeur_5_NombreDePas = 255
* TempsActuele = 17517, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 17588, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 17659, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 17730, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 17802, Encodeur_5_BoutonEtat = 4, Encodeur_5_NombreDePas = 255
* TempsActuele = 17872, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 17944, Encodeur_5_BoutonEtat = 127, Encodeur_5_NombreDePas = 255
* TempsActuele = 18015, Encodeur_5_BoutonEtat = 125, Encodeur_5_NombreDePas = 255
* TempsActuele = 18086, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 18157, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 18229, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 18299, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 18371, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 18442, Encodeur_5_BoutonEtat = 127, Encodeur_5_NombreDePas = 255



L'ami René
Tous pour un et un pour tous !

LamiRene

Bonjour,

Voici la sortie du terminal série du Nano :

Quote

********************************************************************************
*          En attente des demandes du maitre de la communication I2C !         *
********************************************************************************
* TempsActuele = 4071, Encodeur_1_BoutonEtat = 0, Encodeur_1_NombreDePas = 1
* TempsActuele = 4076, Encodeur_1_BoutonEtat = 0, Encodeur_1_NombreDePas = 2
* TempsActuele = 4082, Encodeur_1_BoutonEtat = 0, Encodeur_1_NombreDePas = 3
...
* TempsActuele = 6451, Encodeur_1_BoutonEtat = 0, Encodeur_1_NombreDePas = 98
* TempsActuele = 6458, Encodeur_1_BoutonEtat = 0, Encodeur_1_NombreDePas = 99
* TempsActuele = 6464, Encodeur_1_BoutonEtat = 0, Encodeur_1_NombreDePas = 100

Note : Début de mes manipulations du bouton de l'encodeur :

* TempsActuele = 6474, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 101
* TempsActuele = 6481, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 102
* TempsActuele = 6489, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 103
...
* TempsActuele = 8085, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 77
* TempsActuele = 8091, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 78
* TempsActuele = 8098, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 79
* TempsActuele = 8104, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8112, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81

Note : Début de mes manipulations de l'encodeur :

* TempsActuele = 8118, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8125, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8132, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8138, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8145, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8152, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 79
* TempsActuele = 8159, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 78
* TempsActuele = 8165, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 79
* TempsActuele = 8172, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8178, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 79
* TempsActuele = 8185, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 78
* TempsActuele = 8193, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 77
* TempsActuele = 8199, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 78
* TempsActuele = 8206, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 79
* TempsActuele = 8212, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8219, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8225, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 82
* TempsActuele = 8232, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8239, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8246, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8253, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8259, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8266, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 82
...
* TempsActuele = 8293, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 82
* TempsActuele = 8299, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8306, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 82
...


Donc, il y a un problème ici, l'encodeur incrémente, sans qu'il soit manipulé. Je regarde le montage du circuit et revérifie le code source...

Merci pour les conseils et les méthodes !

L'ami René
Tous pour un et un pour tous !

Artouste


Encodeur_1_NombreDePas », toujours fixe à 255 quand je ne touche pas à l'encodeur. Quand je le manipule, la valeur pour « Encodeur_1_BoutonEtat » est maintenant 1 et 126, et pour « Encodeur_1_NombreDePas », toujours fixe à 255.



bonjour
j'ai regardé rapidement et testé ton code MegaNano01xEncoS avec un encodeur

ça ne lit pas du tout les encodeurs
voir ça
Code: [Select]
void LireEncodeurs ()
{
 // Lire l'état du bouton de l'encodeur broche E.
 if (digitalRead (ENCODEUR_1_BOUTON) == OUI)
 { // Répondre avec un message de 1 octet (byte) comme attendu par le maître.
   Encodeur_1_BoutonEtat = 1;
 }

 // Lire l'encodeur 1 broche A et B.
 if (digitalRead (ENCODEUR_1_SORTIE_A) == digitalRead (ENCODEUR_1_SORTIE_B))
 {
   Encodeur_1_NombreDePas = Encodeur_1_NombreDePas + 1;
 }
 else
 {
   Encodeur_1_NombreDePas = Encodeur_1_NombreDePas - 1;
 }
}

ça ne compte/decompte pas en fonction de l'action sur l'encodeur
ça fait juste en permanence du +1 ou -1  , mais ça ne lit pas l'encodeur
c'est facile à voir en mettant ça en loop

Code: [Select]
void loop()
// La fonction loop () s'exécute sans fin en boucle aussi longtemps que
// l'Arduino est sous tension.
{
 // Ici les instructions à exécuter par le programme principal.
 LireEncodeurs ();
 Serial.println (Encodeur_1_NombreDePas);
}


regle déjà ça , sinon tu n'avancera pas
pour faire simple une gestion d'encodeurs en quadrature necessite qq part une sauvegarde de l'etat des pin A/B pour comparaison , il n'y a rien de tout ça dans ton code


LamiRene

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 :

Code: [Select]

...
//*****************************************************************************
// 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 à :

Code: [Select]

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

Code: [Select]

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


Je retour fouiller le code...

Encore merci pour votre aide !

L'ami René
Tous pour un et un pour tous !

Go Up