Problèmes d'encodeur EC11

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?

bonjour avec les encodeurs en quadratures , il faut cerner le besoin : entre un A/B 1024 points "au cul" d'un moteur pouvant atteindre des grandes vitesses de rotation et un "bouton" de 16 points sollicité au max à ~ 1t/seconde l'approche n'est pas la meme.

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)

fdufnews:

LamiRene:
J’en déduis que le montage Fritzing du circuit sur la planche d’expérimentation correspond bien au schéma électrique de mon second message ?

Pour le montage je ne peux pas me prononcer je n’utilise pas Fritzing.

Une copie d’écran de Fritzing permettrait déjà à tous de voir le montage.

Bonjour à tous,

Il semble y avoir un problème avec les images de mes messages et cela expliquerait certains de vos commentaires qui m’étaient incompréhensibles.

Je suis sous Linux Kubuntu 14.04 64 bits et j’utilise le navigateur Mozilla Firefox version 31.0 Canonical 1.0 et pour moi l’affiche de mes images est parfaite ici sur le forum arduino.cc (la première fait même toute la largeur de la page et le schéma 1/3 de la page). Je ne me doutais pas qu’il y avait un problème de ce côté-là.

JMe87:

Tu nous envoies sur un site d’un simulateur de vol X-plane qui n’est pas, a ma connaissance, un hebergeur de photos.

Extraits des codes sources des messages :
1er message : http://www.x-plane.fr/attachment.php?attachmentid=10293&d=1409559877
2eme message : http://www.x-plane.fr/attachment.php?attachmentid=10294&d=1409562553

Essai avec Firefox et Chrome rien de visible a l’ecran, acces direct a la photo donne une photo de 1 pixel.

Jacques

N.B.: j’ai laisse volontairement les liens http en texte pour qu’ils soient lisibles.

Il se peut que je n’est pas de problème pour l’affichage du fait que je suis membre du site hébergent les images.

Pour la petite histoire concernant mes problèmes d’encodeur, c’est que je suis à construire un cockpit maison pour le simulateur de vol X-Plane 10. Dans le forum de X-Plane, j’y discute beaucoup de question d’échange de données entre le simulateur et une carte Ethernet sur Arduino Mega R3. Mais je pensais plus judicieux de posé ma question sur les encodeurs ici, car je pensais que le problème était plus un sujet d’électronique que de logiciel.

Vous, comment procédez-vous pour ajouter des images ici (un hyperlien explicatif pour la méthode que je devrais utilisé ici, si possible) ?

Je réessaie ici d’afficher mes images par pièces jointes.

  1. Montage Fritzing
  2. Schéma du circuit

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

Encodeur EC11.jpg

Rebonjour à tous,

Avant que je réoublie, un très grand merci pour votre aide à tous !

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? ...

Les encodeurs sont de 20 pas par tour de 360° et sont pour contrôler le pilote automatique (PA) et les fréquences des radios balises ou des communications dans le simulateur. Par exemple le PA de l'altitude de l'avion ou sa vitesse, etc. Donc pas critique de manquer un pas, mais qu'ils soient au moins cohérents; 1, 2, ou 3 pas dans le sens horaire, c'est un de plus, pas peut-être un pas de moins, etc.

« une résolution moindre. Est-ce un problème? », je pense que non vu l'utilisation. Êtes-vous du même avis ?

Je vois que pour un Mega 2560 R3, il y a 6 interruptions comme vous l'indiquiez : « External Interrupts: 2 (interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4), 20 (interrupt 3), and 21 (interrupt 2). ». Référence : http://arduino.cc/en/Main/ArduinoBoardMega2560

Merci pour l'aide et les conseils.

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

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)