Problèmes d'encodeur EC11

Artouste:

fdufnews:

On peut ne câbler qu’une des 2 broches de l’encodeur sur une entrée d’interruption. Il y a évidemment une résolution moindre. Est-ce un problème?


la lib http://www.pjrc.com/teensy/td_libs_Encoder.html

propose une bonne approche entre tout,un peu d’interrupt et que du polling.
le polling pour de la simple “commande” est souvent viable , mais à la condition que le plus grand temps de boucle soit faible pour ne louper aucun changement d’etat des A/B pour ne pas engendrer du comportement erratique 8)

Bonjour Artouste,

Pour le lien, la présentation (mise-en-page) est sobre et claire. De plus, l’anglais écrit semble aussi sobre et clair, car la traduction automatique donne le même type de résultat, sobre et clair.

Merci !

Dans un autre ordre d’idée et pour information générale, dans mon cas, une boucle complète (le loop ()) prend entre 60 et 85 millisecondes et cela rend la lecture des encodeurs aléatoire comme les résultats de lecture. Donc pour information, 60 millisecondes c’est trop long pour du “polling” !

Est-ce qu’une personne dans la sale c’est qu’elle est la latence maximale admissible pour du “polling” avant perte de la cohérence des lectures d’encodeurs sur Arduino ?

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

Rebonjour,

J'ai installé la bibliothèque « Encoder » suggérée par fdufnews et avec l'exemple « Basic.ino » qui utilise deux interruptions (dans mon cas broche 2 et 3) c'est d'une magnifique précision. Pour chaque pas sur l'encodeur, j'ai quatre changements d'état et une incrémentation de 4 pour le compteur « newPos ». Là, je ne manque plus rien ! Super !

Cela demande deux broches d'interruptions sur les six qu'il y a sur une carte Arduino Mega et j'utilise déjà quatre encodeurs dans mon cockpit et deux autres ne seraient pas de trop.

Alors, j'ai passé en mode une broche d'interruption (broche 2) et une broche sans interruption (broche 4) et là, je rencontre un problème. Je me retrouve avec une permutation de 0 et de 1, au lieu d'un changement d'état de deux ou trois et une incrémentation équivalente pour le compteur « newPos » !

Dans les autres exemples de la bibliothèque, je ne trouve rien qui corrige le problème !?!

Qu'est-ce que je fais de pas correcte ?

En voici ma version francisée :

#include 

// Changer ces numéros de broches sur les broches connectées à votre encodeur.
// Meilleure performance: Deux broches ont une capacité d'interruption
// Bonnes performances: Seule la première broche est interruptif
// Faible performance: Aucune broche est interruptif
const byte ENCODEUR_1_SORTIE_A = 2;
const byte ENCODEUR_1_SORTIE_B = 4;
Encoder Encodeur_1 (ENCODEUR_1_SORTIE_A, ENCODEUR_1_SORTIE_B);
// Éviter d'utiliser des broches de LED attachés

void setup ()
{
  Serial.begin (115200);
  Serial.println ("Test de base d'Encoder :");
}

long Encodeur_1_EtatPrecedent  = -999;

void loop()
{
  long Encodeur_1_EtatActuel = Encodeur_1.read ();
  if (Encodeur_1_EtatActuel != Encodeur_1_EtatPrecedent)
  {
    Encodeur_1_EtatPrecedent = Encodeur_1_EtatActuel;
    Serial.println (Encodeur_1_EtatActuel);
  }
}

Merci d'avance pour vos lumières !

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

Peut être cette librairie qui utilise n'importe quelle entrée pour gérer les encodeurs http://code.google.com/p/adaencoder/

ATTENTION: bien lire la doc il y a des restrictions sur les broches utilisées. Les broches affectées à un encodeur doivent faire partie du même port du microcontrôleur.

LamiRene: ... Alors, j'ai passé en mode une broche d'interruption (broche 2) et une broche sans interruption (broche 4) et là, je rencontre un problème. Je me retrouve avec une permutation de 0 et de 1, au lieu d'un changement d'état de deux ou trois et une incrémentation équivalente pour le compteur « newPos » !

...

bonjour les communs de tes encodeurs sont cablés sur quoi ? + ou GND ? lire ce topic http://forum.arduino.cc/index.php?topic=231757.msg1671384#msg1671384

Bonjour Artouste,

Merci pour l'aide !

Sur la masse, le GND.

Je vais de suite lire le topique.

Merci encore !

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

fdufnews: Peut être cette librairie qui utilise n'importe quelle entrée pour gérer les encodeurs http://code.google.com/p/adaencoder/

ATTENTION: bien lire la doc il y a des restrictions sur les broches utilisées. Les broches affectées à un encodeur doivent faire partie du même port du microcontrôleur.

Bonjour fdufnews,

Merci pour ton aide !

Je ne comprends pas le « Les broches affectées à un encodeur doivent faire partie du même port du microcontrôleur. » ! Je vais voir le lien, mais un exemple ou explication simple pourrait accélérer les choses.

Merci encore !

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

Bonjour,

Notez que j'ai un problème avec les broches 20 et 21 du Mega 2560 R3 pour mon encodeur 3, il n'y a pas de réaction, mais pour mon encodeur 1 sur broches 2 et 3 et l'encodeur 2 sur broches 18 et 19 pas de problème. Et j'ai permuté l'encodeur 2 avec le 3 et c'est bien les broches 20 et 21 qui sont en cause.

Voici la liste des bibliothèques que j'utilise, pour information, car je présume qu'il y a un conflit entre eux et que vous, vous le savez : #include #include #include #include "IRremote.h" #include "LiquidCrystalFast.h" #include

Un teste sans autre bibliothèque que Encodeur.h me permet d'éliminer cette dernière hypothèse.

Merci d'avance pour vos lumières !

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

Artouste:

LamiRene: ... Alors, j'ai passé en mode une broche d'interruption (broche 2) et une broche sans interruption (broche 4) et là, je rencontre un problème. Je me retrouve avec une permutation de 0 et de 1, au lieu d'un changement d'état de deux ou trois et une incrémentation équivalente pour le compteur « newPos » !

...

bonjour les communs de tes encodeurs sont cablés sur quoi ? + ou GND ? lire ce topic http://forum.arduino.cc/index.php?topic=231757.msg1671384#msg1671384

Rebonjour Artouste,

Je ne trouve pas de solution à mon problème d'utiliser une seule interruption par encodeur dans ce topique.

Mais je peux vous indiquer que mes encodeurs sont de type pas cher et basique ACB pour l'encodeur et DE pour le bouton.

Une autre piste ?

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

Bonjour, j'ai deja rencontre des problemes avec des encodeurs low cost. La premiere chose a faire est de cabler ceci : en remplacant les 2 R par 2 led et 2 R et de faire tourner tout doucement l'axe pour verifier que tu obtiens bien le resultat escompte.

Jacques

N.B.: sans vouloir medire, DX ne vend pas la top qualite garanti 100% fonctionnel. N.B.2 : ce shema est une copie d'une partie de la doc EC11.pdf de ALPS

LamiRene: ...

Je ne trouve pas de solution à mon problème d'utiliser une seule interruption par encodeur dans ce topique.

Mais je peux vous indiquer que mes encodeurs sont de type pas cher et basique ACB pour l'encodeur et DE pour le bouton.

bonjour je ne comprend pas bien ta reponse , la lib gere elle meme les cas interrupt ou pas je n'ai pas de quoi tester avant demain , mais si tes canaux A/B sont montés en pull-up (detection sur GND) la lib fonctionne bien. En tout cas pour moi , entre de l'encodeur "de moteur" et de l'encodeur "de commande" elle "travaille" bien 8)

voir peut etre la section "Optimized Interrupt Option" sur le wiki

LamiRene:

fdufnews: Peut être cette librairie qui utilise n'importe quelle entrée pour gérer les encodeurs http://code.google.com/p/adaencoder/

ATTENTION: bien lire la doc il y a des restrictions sur les broches utilisées. Les broches affectées à un encodeur doivent faire partie du même port du microcontrôleur.

Bonjour fdufnews,

Merci pour ton aide !

Je ne comprends pas le « Les broches affectées à un encodeur doivent faire partie du même port du microcontrôleur. » ! Je vais voir le lien, mais un exemple ou explication simple pourrait accélérer les choses.

Merci encore !

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

voir http://arduino.cc/en/uploads/Main/arduino-mega2560_R3-sch.pdf

les pins sont regroupée par groupe de 8 qui forment un "port". les fonctions (adc, sci, it, ..) du µC sont regroupé par port, meme si elles n'utilise pas l'intérgralité du port. par exemple, les interruption PCINT16 à 23 sont sur le meme port (PK0 à 7), et les int4 à 7 sont sur un autre port (PE4 à 7). tu ne pourra pas monter la voie A sur PK0, et la B sur PE4, par exemple, la librairie ne le supporte pas.

EDIT: http://arduino.cc/en/Reference/attachInterrupt pin 21 à 18, c'est sur le port PD0-3, pin 2 et 3 sur PE4 et PE5. tu ne pourra donc gerer que 6 IT, soit 3 codeurs.

Bonjour Jacques,

Merci pour votre aide !

JMe87: Bonjour, j'ai deja rencontre des problemes avec des encodeurs low cost. La premiere chose a faire est de cabler ceci : ... Jacques

N.B.: sans vouloir medire, DX ne vend pas la top qualite garanti 100% fonctionnel. N.B.2 : ce shema est une copie d'une partie de la doc EC11.pdf de ALPS

J'avais deux schémas à ma disposition pour faire mon montage, le premier provient de la documentation de chez DX et le second, c'est exactement celui que vous donnez. C'est que j'utilise actuellement deux marque et modèle différent d'encodeur.

Pour ce qui est de la qualité des produits fournit par DX, je confirme vos propos et renchérie, il est très fréquent d'avoir des produits en partie fonctionnels et en moyenne, sur 4 articles, il y en a un de défectueux en partie. Je parle par expérience de client DX.

Bon, pour le second circuit (schéma que vous suggérez), comme j'ai permuté l'encodeur 2 avec le 3 et c'est bien les broches 20 et 21 qui sont en cause, car l'encodeur 3 refonctionne parfaitement du simple fait de le brancher sur les broches 18 et 19, et c'est maintenant l'encodeur 2 qui était sur les broches 18 et 19 qui fonctionnait parfaitement, mais qui ne fonctionne plus sur les broches 20 et 21. Je n'ai rien touché d'autre que ces quatre broches et le problème reste lien au 20 et 21. Donc les encodeurs fonctionnent correctement.

De plus, avant l'utilisation de la bibliothèque « Encoder », mes quatre encodeurs fonctionnaient. Pas très bien, mais ils fonctionnaient tous.

Alors, est-ce bien nécessaire de tester les encodeurs avec un autre circuit ?

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

Rebonjour Artouste,

Je vous remercie de m'aider !

Artouste:

LamiRene: ... Je ne trouve pas de solution à mon problème d'utiliser une seule interruption par encodeur dans ce topique.

Mais je peux vous indiquer que mes encodeurs sont de type pas cher et basique ACB pour l'encodeur et DE pour le bouton.

bonjour je ne comprend pas bien ta reponse , la lib gere elle meme les cas interrupt ou pas ...

La question se pose et je la pose aussi !!!

Mais quelle est la réponse ???

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

LamiRene: ...

La question se pose et je la pose aussi !!!

Mais quelle est la réponse ???

...

Je veux bien aussi jouer "au jesuite" 8) , mais ça risque de durer longtemps sans etre finalement efficace :grin:

fais plutot un recensement des cas testés

cas 1 , encodeurs connectés comme "ça" A/B sur pins numerotés X/Y , le resultat est : cas 2 , encodeurs connectés comme "ça" A/B sur pins numerotés X/Y , le resultat est : ... cas n , encodeurs connectés comme "ça" A/B sur pins numerotés X/Y , le resultat est :

Bonjour, je na sais pas s'il faut tester a nouveau. Ce que je sais c'est que, quand tu apprends a developper sous Arduino tu dois avoir un hardware en BETON. Tu dois etre sur que TOUT fonctionne a 100%, alim contacts etc etc. Sinon tu ne sais pas localiser facilement la source du probleme. Dans ton cas, tu fais un petit programme qui utilise un seul codeur et par exemple 2 leds (+ et -). Et quand cela fonctionne, tu recommences avec un autre encodeur toujours tout seul etc etc Je suis autodidacte et c'est la methode que j'utilise a mon entiere satisfaction ..... petit a petit, l'oiseau fait son nid ;) Jacques

Bonjour Artouste,

Artouste:

LamiRene: ... La question se pose et je la pose aussi !!!

Mais quelle est la réponse ??? ...

Je veux bien aussi jouer "au jesuite" 8) , mais ça risque de durer longtemps sans etre finalement efficace :grin:

Je ne comprendre pas ce que vous cherchez à me dire ?

Je ne suis pas le seul ici à demander si la bibliothèque « Encoder » : http://www.pjrc.com/teensy/td_libs_Encoder.html gère automatiquement les encodeurs qui n'ont qu'une broche ou aucune sur broche d'interruption Arduino !?!?

Pour le moment, personne n'a confirmé, de par son expérience, que dans ces deux derniers cas de figure la bibliothèque « Encoder » donnait de bons résultats.

Artouste: fais plutot un recensement des cas testés

cas 1 , encodeurs connectés comme "ça" A/B sur pins numerotés X/Y , le resultat est : cas 2 , encodeurs connectés comme "ça" A/B sur pins numerotés X/Y , le resultat est : ... cas n , encodeurs connectés comme "ça" A/B sur pins numerotés X/Y , le resultat est :

Mais, c'est déjà fait et en très grande partie, décri dans le présent fils de discussion avec les bibliothèques utilisées et les problèmes rencontrés. Est-ce que vous me demandez de tout rapatrier et de le mettre en une seule réponse ?

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

Rebonjour Jacques,

C’est avec joie que je constate que je ne suis pas le seul autodidacte et adepte de petit pas en petit pas. J’ai pratiqué et pratique encore cette méthode pour les problèmes d’encodeurs depuis le début et si nous lisons bien le présent fils de discussion, cela transpire beaucoup cette méthode !

JMe87:
Bonjour,
je na sais pas s’il faut tester a nouveau. Ce que je sais c’est que, quand tu apprends a developper sous Arduino tu dois avoir un hardware en BETON. Tu dois etre sur que TOUT fonctionne a 100%, alim contacts etc etc.
Sinon tu ne sais pas localiser facilement la source du probleme.

Comme déjà mentionné, au point de départ, chez moi ce n’est pas toujours à 100 %, mais à petits pas, je finis par y arriver.

JMe87:
Dans ton cas, tu fais un petit programme qui utilise un seul codeur et par exemple 2 leds (+ et -).

C’est fait et individuellement, les quatre encodeurs fonctionnent très bien, seulement si j’utilise deux broches avec interruption de l’Arduino. Sinon, avec une seule broche dans strictement le même code de programmation, je n’ai en retour que des « O » et des « 1 », et pas de « -1 », donc pas moyen de savoir si j’ai un plus ou un moins, seulement qu’il y a eu un changement, comme en mode binaire, et le code en question est celui de l’exemple « Basic.ino » fourni avec la bibliothèque. Je ne change que le numéro des broches.

En revoici ma version francisé déjà publié ici :

/* Encoder Library - Basic Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * Ce code d'exemple est dans le domaine public.
 */

#include <Encoder.h>

// Changer ces numéros de broches sur les broches connectées à votre encodeur.
// Meilleure performance: Deux broches ont une capacité d'interruption
// Bonnes performances: Seule la première broche est interruptif
// Faible performance: Aucune broche est interruptif
const byte ENCODEUR_1_SORTIE_A = 20;
const byte ENCODEUR_1_SORTIE_B = 22;
Encoder Encodeur_1 (ENCODEUR_1_SORTIE_A, ENCODEUR_1_SORTIE_B);
// Éviter d'utiliser des broches de LED attachés

void setup ()
{
  Serial.begin (115200);
  Serial.println ("Test de base d'Encoder :");
}

long Encodeur_1_EtatPrecedent  = -999;

void loop()
{
  long Encodeur_1_EtatActuel = Encodeur_1.read ();
  if (Encodeur_1_EtatActuel != Encodeur_1_EtatPrecedent)
  {
    Encodeur_1_EtatPrecedent = Encodeur_1_EtatActuel;
    Serial.println (Encodeur_1_EtatActuel);
  }
}

Ou voir en pièce jointe.

Dans mon cas, je devrai utiliser au moins 6 encodeurs dans le même programme, pour le moment j’en suis à 4.

JMe87:
Et quand cela fonctionne, tu recommences avec un autre encodeur toujours tout seul etc etc
Je suis autodidacte et c’est la methode que j’utilise a mon entiere satisfaction … petit a petit, l’oiseau fait son nid :wink:
Jacques

Avec la bibliothèque « Encoder », les problèmes apparaissent soit en utilisant la paire des 5 et 6 ième broches d’interruptions de l’Arduino (broches 20 et 21) sur un troisième encodeur ou dès l’utilisation d’un encodeur avec une seule broche sur un connecteur avec interruption. Dans tous ces cas, le problème reste localisé et ne se propage.

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

Basic.zip (820 Bytes)

je n'ai pas de quoi tester aujourd'hui mais essaye ça (tu affecte les pins que tu veux)

/* Encoder Library - TwoKnobs Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */
#define ENCODER_DO_NOT_USE_INTERRUPTS
#include 

// Change these pin numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder knobLeft(5, 6);
Encoder knobRight(7, 8);
//   avoid using pins with LEDs attached

void setup() {
  Serial.begin(9600);
  Serial.println("TwoKnobs Encoder Test:");
}

long positionLeft  = -999;
long positionRight = -999;

void loop() {
  long newLeft, newRight;
  newLeft = knobLeft.read();
  newRight = knobRight.read();
  if (newLeft != positionLeft || newRight != positionRight) {
    Serial.print("Left = ");
    Serial.print(newLeft);
    Serial.print(", Right = ");
    Serial.print(newRight);
    Serial.println();
    positionLeft = newLeft;
    positionRight = newRight;
  }
  // if a character is sent from the serial monitor,
  // reset both back to zero.
  if (Serial.available()) {
    Serial.read();
    Serial.println("Reset both knobs to zero");
    knobLeft.write(0);
    knobRight.write(0);
  }
}

Salut

Merci de poursuivre les recherches de solution avec moi !

J'ai testé ton code sur Arduino Mega R3 avec les trois configurations typiques, et à tour de rôle, une dizaine de clics à droite avec les deux encodeurs, puis une dizaine de clics à gauche avec encore les deux encodeurs :

Encoder knobLeft(20, 22);
Encoder knobRight(21, 23);

Et en sortie, ça donne cela :

TwoKnobs Encoder Test: Left = 0, Right = 0 Left = -1, Right = 0 Left = 0, Right = 0 Left = -1, Right = 0 Left = 0, Right = 0 Left = -1, Right = 0 Left = 0, Right = 0 Left = -1, Right = 0 Left = 0, Right = 0 Left = -1, Right = 0 Left = 0, Right = 0 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = 0, Right = 0 Left = -1, Right = 0 Left = 0, Right = 0 Left = -1, Right = 0 Left = 0, Right = 0 Left = -1, Right = 0 Left = 0, Right = 0 Left = -1, Right = 0 Left = 0, Right = 0 Left = -1, Right = 0 Left = 0, Right = 0 Left = -1, Right = 0 Left = 0, Right = 0 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0 Left = -1, Right = 1 Left = -1, Right = 0

À gauche (20, 22), newLeft ne donne que des 0 et des -1, pas de 1. À droite (21, 23), newRight ne donne que des 0 et des 1, pas de -1.

J'ai testé ton code avec :

Encoder knobLeft(18, 19);
Encoder knobRight(20, 21);

Et en sortie, ça donne cela :

TwoK0, Right = 0 TwoKnobs Encoder Test: Left = 0, Right = 0 Left = 1, Right = 0 Left = 2, Right = 0 Left = 3, Right = 0 Left = 4, Right = 0 Left = 5, Right = 0 Left = 6, Right = 0 Left = 7, Right = 0 Left = 8, Right = 0 Left = 9, Right = 0 Left = 10, Right = 0 Left = 11, Right = 0 Left = 12, Right = 0 Left = 13, Right = 0 Left = 14, Right = 0 Left = 15, Right = 0 Left = 16, Right = 0 Left = 17, Right = 0 Left = 18, Right = 0 Left = 19, Right = 0 Left = 20, Right = 0 Left = 19, Right = 0 Left = 18, Right = 0 Left = 17, Right = 0 Left = 16, Right = 0 Left = 15, Right = 0 Left = 14, Right = 0 Left = 13, Right = 0 Left = 12, Right = 0 Left = 11, Right = 0 Left = 9, Right = 0 Left = 8, Right = 0 Left = 7, Right = 0 Left = 6, Right = 0 Left = 8, Right = 0 Left = 7, Right = 0 Left = 6, Right = 0 Left = 5, Right = 0 Left = 4, Right = 0

À gauche (18, 19), newLeft s'incrémente correctement, mais à droite (20, 21), newRight rien, pas même des 0.

J'ai testé ton code avec :

Encoder knobLeft(14, 15);
Encoder knobRight(22, 23);

Et en sortie, ça donne cela :

TwoKnobs Encoder Test: Left = 0, Right = 0 Left = 1, Right = 0 Left = 2, Right = 0 Left = 3, Right = 0 Left = 4, Right = 0 Left = 5, Right = 0 Left = 6, Right = 0 Left = 7, Right = 0 Left = 8, Right = 0 Left = 9, Right = 0 Left = 10, Right = 0 Left = 11, Right = 0 Left = 12, Right = 0 Left = 13, Right = 0 Left = 14, Right = 0 Left = 15, Right = 0 Left = 16, Right = 0 Left = 17, Right = 0 Left = 18, Right = 0 Left = 19, Right = 0 Left = 20, Right = 0 Left = 20, Right = -1 Left = 20, Right = -2 Left = 20, Right = -1 Left = 20, Right = -2 Left = 20, Right = -3 Left = 20, Right = -4 Left = 20, Right = -5 Left = 20, Right = -6 Left = 20, Right = -4 Left = 20, Right = -5 Left = 20, Right = -4 Left = 20, Right = -2 Left = 20, Right = 0 Left = 20, Right = -1 Left = 20, Right = -2 Left = 20, Right = -3 Left = 20, Right = -4 Left = 20, Right = -5 Left = 20, Right = -4 Left = 20, Right = -5 Left = 20, Right = -6 Left = 20, Right = -7 Left = 20, Right = -8 Left = 19, Right = -8 Left = 20, Right = -8 Left = 19, Right = -8 Left = 18, Right = -8 Left = 17, Right = -8 Left = 16, Right = -8 Left = 15, Right = -8 Left = 14, Right = -8 Left = 13, Right = -8 Left = 12, Right = -8 Left = 11, Right = -8 Left = 10, Right = -8 Left = 9, Right = -8 Left = 8, Right = -8 Left = 7, Right = -8 Left = 6, Right = -8 Left = 5, Right = -8 Left = 4, Right = -8 Left = 3, Right = -8 Left = 2, Right = -8 Left = 1, Right = -8 Left = 0, Right = -8 Left = -1, Right = -8 Left = -2, Right = -8 Left = -3, Right = -8 Left = -4, Right = -8 Left = -4, Right = -7 Left = -4, Right = -6 Left = -4, Right = -5 Left = -4, Right = -4 Left = -4, Right = -3 Left = -4, Right = -2 Left = -4, Right = -1 Left = -4, Right = 0 Left = -4, Right = 1 Left = -4, Right = 2 Left = -4, Right = 3 Left = -4, Right = 4 Left = -4, Right = 5 Left = -4, Right = 6 Left = -4, Right = 7 Left = -4, Right = 8 Left = -4, Right = 9 Left = -4, Right = 10 Left = -4, Right = 11 Left = -4, Right = 10 Left = -4, Right = 11 Left = -4, Right = 12 Left = -4, Right = 13 Left = -4, Right = 14 Left = -4, Right = 13 Left = -4, Right = 14 Left = -4, Right = 15 Left = -4, Right = 16

À gauche (14, 15), newLeft s'incrémente correctement. À droite (22, 23), newRight s'incrémente correctement

Désolé pour les mauvaises données précédentes dues aux mauvais branchements !

L'ami René

bonjour

avec le code proposé et l'option no interrupt commentée

//#define ENCODER_DO_NOT_USE_INTERRUPTS

sur uno avec un encodeur basique (photo) et en testant les options -1 encodeur tout interrupt , l'autre en polling - encodeurs avec une interrupt chacun - 1 encodeur avec une interrup, l'autre en polling - encodeurs en polling

j'obtiens les resultats escomptés sans probleme pour les # cas testés.

je n'ai pas de mega , mais je doute que ce soit là ton probleme

edit : par acquis de conscience , j'ai fais les tests avec la librarie rechargée (telechargement du jour)

pour qu'il n'y ai pas d'ambiguité , pour les manips je n'utilise qu'un encodeur , je duplique juste les sorties de contacts selon les configs en permutant les canaux , lorsqu'un compte , l'autre decompte :grin:

TwoKnobs Encoder Test: Left = 0, Right = 0 Left = -1, Right = 1 Left = -1, Right = 2 Left = -1, Right = 1 Left = -2, Right = 2 Left = -3, Right = 3 Left = -4, Right = 4 Left = -5, Right = 5 Left = -6, Right = 6 Left = -7, Right = 7 Left = -8, Right = 8 Left = -9, Right = 9 Left = -10, Right = 10 Left = -11, Right = 11 Left = -12, Right = 12 Left = -13, Right = 13 Left = -15, Right = 11 Left = -16, Right = 12 Left = -17, Right = 13 Left = -19, Right = 11 Left = -20, Right = 12 Left = -21, Right = 13 Left = -22, Right = 14