Problèmes d'encodeur EC11

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 Google Code Archive - Long-term storage for Google Code Project Hosting.

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 <Encoder.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include "IRremote.h"
#include "LiquidCrystalFast.h"
#include <SPI.h>

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
Encodeur rotatif - #17 by Artouste - Français - Arduino Forum

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 Google Code Archive - Long-term storage for Google Code Project Hosting.

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:

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 :wink:
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 » : Encoder Library, for Measuring Quadarature Encoded Position or Rotation Signals 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 <Encoder.h>

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

Bonjour,

Bon, je viens de mettre à jour les données de mon dernier message d'hier avec cette fois les bons branchements et les vrais résultats (Réf.) :

http://forum.arduino.cc/index.php?topic=264297.msg1867882#msg1867882

Maintenant, pour simuler le même code source intégré dans mon programme de cockpit maison pour le simulateur de vol X-Plane 10, je reprends la dernière configuration des broches sans broche d'interruption Arduino et j'ajoute une latence équivalente à ce que j'ai mesuré pour une boucle « loop () ». Pour cela, je ne fais qu'ajouter à la fin du code de Artouste un délai « delay (80); ».

En voici tout le code :

/* 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 <Encoder.h>

// 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(14, 15);
Encoder knobRight(22, 23);
//   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);
  }
  delay (80);
}

Et je teste à tour de rôle, une dizaine de clics à droite avec les deux encodeurs, puis une dizaine de clics à gauche avec encore les deux encodeurs :

Et en sortie, ça donne cela :

TwoKnobs Encoder Test:
Left = 0, Right = 0
Left = -1, Right = 0
Left = 0, Right = 0
Left = -2, Right = 0
Left = -4, Right = 0
Left = -3, Right = 0
Left = -2, Right = 0
Left = -1, Right = 0
Left = -2, Right = 0
Left = -3, Right = 0
Left = -3, Right = 2
Left = -3, Right = 1
Left = -3, Right = 0
Left = -1, Right = 0
Left = -2, Right = 0
Left = -1, Right = 0
Left = -2, Right = 0
Left = -4, Right = 0
Left = -5, Right = 0
Left = -3, Right = 0
Left = -1, Right = 0
Left = -2, Right = 0
Left = -2, Right = 1
Left = -2, Right = 0
Left = -2, Right = 2
Left = -2, Right = 3
Left = -2, Right = 2
Left = -2, Right = 4
Left = -2, Right = 5
Left = -2, Right = 4

Et c'est exactement ce que je rencontre dans mon code actuel sans la bibliothèque « Encoder ».

Pour rappel, c'est ce type de résultats d'encodeurs qui m’ont amené a lancer ce fils de discussion.

Pour faire le point de la situation, dans mon code actuel, j'ai des résultats parfaite avec la bibliothèque « Encoder », mais seulement avec deux encodeurs qui utilise chacun deux broches d'interruption Arduino (Encodeur_1 broche d'interruption 2 et 3, Encodeur_2 broche d'interruption 18 et 19).

Mais comme démontré, pour l'encodeur 3 (Encodeur_3 broche d'interruption 20 et 21) il n'y a pas de réaction à la lecture de l'encodeur, et j'ai testé sur deux cartes Arduino Mega R3 différentes.

Donc, que deux encodeurs utilisable, pour 6 broches d'interruptions utilisées, mais les besoins est au minimum l'utilisation de 6 encodeurs parfaitement fonctionnels.

Voilà pour ce qui est du point sur la situation.

Un grand merci à tous ceux qui participent à ce fils de discussion et y apportent leur contribution !

Toute hypothèse de solution est la bien venue, mais je voudrais éviter d'utiliser une autre carte à la place de la Mega ou en plus de la Mega.

L'ami René

LamiRene:
... équivalente à ce que j'ai mesuré pour une boucle « loop () ». Pour cela, je ne fais qu'ajouter à la fin du code de Artouste un délai « delay (80); ».

Là faut que j'aille à "la cabane à suc" :grin:
Mais AMHA et d'instinct 80 ms de temps de boucle c'est enorme pour faire (ou surtout louper) de la transition en simple polling

Bonjour Artouste,

Merci de te donner tant d'ouvrage pour la résolution du problème, je l'apprécie grandement !

Très intéressent les résultats de ton dernier test :

Artouste:
...

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

...

Il n'y a pas exactitude dans la lecture !?!

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

Elle est explicable cette inexactitude ?

Encore un grand merci !

L'ami René