Problèmes d'encodeur EC11

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é

Artouste:

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

Pour faire "louper" de la transition en simple polling qui est-ce qui se produit dans le code de mon cockpit de simulateur.

Bonne "cabane à suc" !

L'ami René

Bonjour a tous,
Un peu de lecture : Gammon Forum : Electronics : Microprocessors : Interrupts
tres complet et tres instructif
Par exemple : duree minimale d'une int sans rien faire dedans : 5,2uS a 16MHz

Encore de la lecture : Multiple rotary encoders - Page 1
avec la possibilite emise, en theorie, d'utiliser 12 rotary.

Sur le forum Arduino.cc, j'ai lu ici :
http://forum.arduino.cc/index.php?topic=125304.msg943543#msg943543
ceci :

Take a look at LS7184
http://www.omnipro.net/lsi-csi/LS7184
Connect rotary encoder to it, chip outputs pulses and a direction line.

C'est un petit circuit integre (cher) que l'on place entre un encodeur optique ou magnetique et un Micro.
Cela m'a donne l'idee d'utiliser un Attiny85 sur chaque encodeur.
En entree : les 2 fils de l'encodeur
En sortie : une impulsion d'interruption. Je cable toutes ces impulsions vers une seule entree INT du Mega au travers de diodes (OU cable).
Il me sort aussi une impulsion d'une duree a definir sur 2 pins INC ou DEC.
Total des pins utilisees sur le Mega : 1 INT + 2 x nombre d'encodeurs
Quand le micro recoit une impulsion, il va lire un ou 2 ports et identifie facilement la pin active. Apres le delai defini dans l'Attiny85, tout retourne a l'etat initial.

Dont cout : +/- 1,20 € par encodeur

Au plaisir de lire vos reactions

Jacques

Bonjour Jacques,

Merci pour ton aide !

Ça, c'est une alternative très intéressante !

Est-ce que tu pourrais nous mettre des images de ton montage et des exemples de ton code source pour nous initier à la chose, un mini mini tuto ?

En passant, tu fais d'une pierre, deux coups, car cela donne en plus, l'idée générale de faire faire le traitement des signaux des encodeurs par autre chose que l'Arduino et de ne récupérer que les plus et les moins des changements de l'encodeur. Ça, c'est très bien vu. Super !

Reste le détail de comment le faire dans le concret et le pratico-pratique (en français, je suis unilingue francophone...) !

Encore merci !

L'ami René

Ce n'est pas une realisation personnelle, c'est une idee.
J'ai utilise ce micro pour faire une alarme de porte ouverte pour un frigo.
C'est tres facile a faire sous Arduino.
Et cela se programme avec n'importe quel Arduino et quelques fils.
Mode d'emploi en francais, la c'est une autre histoire.
La langue vehiculaire de l'electronique / informatique c'est l'anglais !!

Fais une recherche sur Google pour avoir des exemples, il y en a une foultitude. Il y en a aussi sur youtube.

Jacques

JMe87:
Cela m'a donne l'idee d'utiliser un Attiny85 sur chaque encodeur.
En entree : les 2 fils de l'encodeur
En sortie : une impulsion d'interruption. Je cable toutes ces impulsions vers une seule entree INT du Mega au travers de diodes (OU cable).
Il me sort aussi une impulsion d'une duree a definir sur 2 pins INC ou DEC.
Total des pins utilisees sur le Mega : 1 INT + 2 x nombre d'encodeurs
Quand le micro recoit une impulsion, il va lire un ou 2 ports et identifie facilement la pin active. Apres le delai defini dans l'Attiny85, tout retourne a l'etat initial.

Dont cout : +/- 1,20 € par encodeur

Je ne suis pas certain d'avoir compris ce que tu souhaites faire. Une seule bascule D permet déjà de décoder les deux signaux en quadrature pour les transformer en un signal donnant les impulsions et un autre indiquant le sens de rotation. Un 74HC74 ça doit coûter dans les 30 centimes et permet de gérer 2 encodeurs.

Là ton microcontrôleur risque d'être vraiment sous-utilisé. Tant qu'à faire de partir dans cette direction, j'irai encore plus loin, en lui faisant faire le compte par lui-même des impulsions reçues (3 dans un sens, 2 dans l'autre, etc) et en le reliant au microcontrôleur principal par I2C ou SPI. De cette manière le master l'interroge à chaque fois qu'il a le temps et reçoit les données directement pré-calculées, sans avoir à traiter le signal par lui-même.

Mais même comme ça je craint qu'il soit encore sous-utilisé et que le coût n'en vaille pas vraiment la peine. Ou alors peut-être en adjoignant à l'AtTiny85 un multiplexeur pour lui permettre de décoder "plein" d'encodeurs en même temps.

Bonjour haifger,

Merci pour votre aide !

Votre dernier exemple est exactement ce don j'ai besoin !

J'aurais une douzaine d'encodeurs a gérer, mais pour intégrer cette solution, j'aurais besoin d'un coaching pour implanter cette solution. Est-ce que vous seriez disponible dans ce sens ?

Mon principal problème est que je suis unilingue francophone, ce qui me limite beaucoup dans la compréhension des documents technique en anglais.

Ou, avez un hyperlien vers une bonne documentation française d'un montage et code source Arduino Attiny encodeurs qui va dans le sens de mon projet ?

Encore merci !

L'ami René

Rebonjour Jacques,

Avec l'IDE Arduino, on peut programmer ces petites puces pour collaborer avec un Arduino Mega ?

L'idée que oui est emballante !

À la place des Attiny85, est-ce qu'un ATTINY25-20PU ferait le travail ?

Je dois commander à coups de 20 unités pour des ATTINY25-20PU, mais à 50 unités pour des ATTINY85-20PU.

http://www.futureelectronics.com/fr/technologies/semiconductors/microcontrollers/8-bit/Pages/7038205-ATTINY85-20PU.aspx
http://www.futureelectronics.com/fr/technologies/semiconductors/microcontrollers/8-bit/Pages/1038206-ATTINY25-20PU.aspx

L'ami René

Attiny25 convient evidemment pour une application aussi simple.

Haifger, il n'est pas indispensable de remplir un micro completement :wink:
Ceci me semble une bonne occasion d'apprendre l'utilisation d'une nouvelle technologie. Ce n'est pas comme s'il devait fabriquer 10000 pieces!

Rene, il ne faut pas rever, tu ne vas trouver nulle part, en francais qui plus est, une description complete d'une idee que je viens d'avoir en faisant une recherche sur Google.

Encore une fois, le but de ce forum c'est d'aider les debutants a s'en sortir. Pas a leur macher le boulot.

Une petite citation comme tu les aimes : aide-toi, le ciel t'aidera

LamiRene:
Pour faire "louper" de la transition en simple polling qui est-ce qui se produit dans le code de mon cockpit de simulateur.

Bonne "cabane à suc" !

:grin:
Pour resumer ton probleme , tu veux "gerer" 12 encodeurs ? (simples ? = sans contacts autres que les canaux A/B)

passer par un exterieur dedié +/- modulaire , solutions proposées par haifger et JMe87 est surement une bonne voie

sur du polling simple pour un capteur avec l'exemple , il suffit de voir/verifier que le simple fait de passer le serial de 9600 à 115200 permet d'obtenir (par comparaison avec du tout interrupt pour le capteur "de reference" ) des vitesses "de rotation" encodeur polling beaucoup plus elevées (avant que le capteur polling parte dans les choux avec ce simple exemple)

Apres , passer sur du modulaire 1/1 ou 1/X selon le MCU "dedié à la tache" demande de bien reflechir à l'interfaçage.

Intellectuellement à chaud , pour "plein de raisons" :grin: je verrais bien un MCU pour 4 encodeurs , mais ... ça ... ça se discute , calmement 8)

JMe87:
Attiny25 convient evidemment pour une application aussi simple.
...
Ceci me semble une bonne occasion d'apprendre l'utilisation d'une nouvelle technologie. Ce n'est pas comme s'il devait fabriquer 10000 pieces!
...
Encore une fois, le but de ce forum c'est d'aider les debutants a s'en sortir. Pas a leur macher le boulot.
...
Une petite citation comme tu les aimes : aide-toi, le ciel t'aidera

Bonjour JMe87,

Merci pour la confirmation et la citation ! :stuck_out_tongue:

Finalement, merci pour tout !

L'ami René

Bonjour,

Je vais ouvrir un compte chez un autre fournisseur ou les produits peuvent être commandés à l'unité et j'ai les trois choix suivants :

ATTINY85-20PU, 6 x I/O pour 1.99 $CAD
ATTINY84A-PU, 12 x I/O pour 2.12 $CAD
ATTINY861A-PU, 16 x I/O pour 2.99 $CAD

Alors entre 1.99 et 2.99 avec 8 $CAD de frais de livraison, j’irais pour le ATTINY861A-PU s'il ne pose pas de problème comparé aux deux autres.

Vous en pensez quoi ?

L'ami René

Bonjour,
Le 85 est un 8 pins, ok pour cette application
Le 84 est un 14 pins, de trop si tu pars sur un micro par encodeur
De 861 n'est pas supporte par defaut par arduino. Problemes garantis.
http://playground.arduino.cc/Main/ArduinoOnOtherAtmelChips

Personnellement, c'est le genre de truc que je commande sur Ebay, toujours tres satisfait, frais de port gratuit. Seul probleme le delai. Si tu es presse, je peux t'expedier 1 ou 2 pieces pour tes essais.
Jacques

Bonjour Jacques,

Merci encore et toujours pour ton aide !

Je trouvais curieux qu'ici même je ne trouvasse pas de sujet qui mentionnait le ATTINY861A et cela m'a mis la puce à l'oreille. De plus, dans un fichier texte vu je ne me souviens plus ou, qui listait les CI ATTINY supportés il n'y avait pas le "ATTINY86".

Alors mon hypothèse était soit le ATTINY861A était très très récent, soit il y avait un problème avec cette puce.

Je pensais plus a utiliser le moins de circuits intégrés que possible pour minimiser le câblage le plus possible, car l'arrière du tableau de bord de cockpit ressemble déjà à une assiette de spaghetti. Il faut être très méticuleux pour aller y jouer. Comme je devrais dédier les ATTINY aux encodeurs pour évité les latences dans la lecture, plus un CI peut recevoir d'encodeurs, mieux cela sera. On utilise pas deux encodeurs en même temps ! L'idéal serait un CI pour tous les encodeurs.

Alors dommage pour le ATTINY861A, pour son nombre de branchements, il était le meilleur candidat !

J'apprécie grandement ton offre de m'expédier une ou deux pièces ! Comme il y a des chances qu'une commande passée chez mon nouveau fournisseur aujourd'hui ou lundi prochain arrive en même temps que ton envoi, c'est probablement inutile. Mes les conseille eux sont inestimable et important avant mes achats !

Merci pour tout !

L'ami René

LamiRene:
...
Je pensais plus a utiliser le moins de circuits intégrés que possible pour minimiser le câblage le plus possible, car l'arrière du tableau de bord de cockpit ressemble déjà à une assiette de spaghetti.

Bonjour
envisage aussi l'eventualité d'une modularité plus grande 8)

NB et en preambule : je n'ai pas verifié si cela rentre ou pourrait rentrer dedans :grin:

mais dans la mesure où tu souhaiterais conserver "la facilité" arduino
je regarderais à pouvoir eventuellement utiliser un/des 328P dediés (facile d'appro, cout brut MCU , environnement, dispo en DIP , clock interne possible ,etc ...)

Je pense à chaud qu'un 328 peut "facilement" gerer avec les libs dispos 4 encodeurs A/B (eventuellement + 1 contact on/off) et gerer l'info utile à deriver/mettre à dispo en I²C , SPI ou ... 8)

personellement, j'utiliserai soit:

  • un controleur ou fpga dont toutes les entrées seraient interruptives (mircochip en fait. j'ai plus la ref mais ça gerait 8 codeurs) qui serai dédié a traiter les codeurs, qu'on interface par I²C, SPI, ...
    si la prog d'un tel circuit te parait compliqué, tu peut t'orienter vers une solution prés-machée, mais qui a son cout:
    http://www.lextronic.fr/P19557-module-microcontrole-mbed.html

  • un ARDUINO DUE, qui devrai faire pouvoir supporter toutes ces IT codeurs sans broncher.
    (ce serai d'aileur ma préférence, et faut que j'en commande pour un projet a 4 codeurs, des impulsions, de la com, et plein d'autre choses)

Oh bonjour Artouste,

Artouste:

LamiRene:
...
Je pensais plus a utiliser le moins de circuits intégrés que possible pour minimiser le câblage le plus possible, car l'arrière du tableau de bord de cockpit ressemble déjà à une assiette de spaghetti.

Bonjour
envisage aussi l'eventualité d'une modularité plus grande 8)
...
Je pense à chaud qu'un 328 peut "facilement" gerer avec les libs dispos 4 encodeurs A/B (eventuellement + 1 contact on/off) et gerer l'info utile à deriver/mettre à dispo en I²C , SPI ou ... 8)

Tu es très inspiré en ce moment et très en harmonie avec la situation, car je me suis procuré le mois dernier deux ATMEGA328-PU pour expérimenter le transfère de chargeur d'amorçage "BootLoader" avec ma carte Uno au cas ou je brulerais une ou des broches de ce dernier. J'aime bien prendre de l'avance et prévenir au cas où.

Si j'ai bien compris, j'ai donc sans le savoir déjà en main, ce qu'il me faut pour décharger la carte Arduino Mega du traitement des signaux des encodeurs. Ça, c'est une très bonne nouvelle !

Merci à ton inspiration !

Il ne me reste plus qu'a trouver la bonne documentation francophone (ou la traduction, si rien n'est disponible en français) pour que j'expérimente la chose.

Encore merci !

L'ami René

Bonjour jean-I,

Merci pour ton aide et tes suggestions !

jean-I:
personellement, j'utiliserai soit:

  • un controleur ou fpga dont toutes les entrées seraient interruptives (mircochip en fait. j'ai plus la ref mais ça gerait 8 codeurs) qui serai dédié a traiter les codeurs, qu'on interface par I²C, SPI, ...
    si la prog d'un tel circuit te parait compliqué, tu peut t'orienter vers une solution prés-machée, mais qui a son cout:
    http://www.lextronic.fr/P19557-module-microcontrole-mbed.html

  • un ARDUINO DUE, qui devrai faire pouvoir supporter toutes ces IT codeurs sans broncher.
    (ce serai d'aileur ma préférence, et faut que j'en commande pour un projet a 4 codeurs, des impulsions, de la com, et plein d'autre choses)

Oui, pour les puces Microchip, c'est trop pour moi.

Pour le "mbed", c'est un super produit et il y a quelqu'un de brillant chez NXP, car la présentation technique des broches est très bien structurée, claire et limpide, j'adore ! Si sa programmation passait pas l'IDE Arduino et que de bonnes bibliothèques étaient disponibles, c'est un produit qui capterait toute mon attention. Mais dans mon cahier des charges du projet, il y a que tout soient programmable par l'IDE d'Arduino.

Pour ce qui est de passer au Arduino Due, c'est tentant, mais le prix et le 3.3V me refroidissent. Je jongle déjà avec du 9V et du 5V, alors ajoute le jonglage avec du 3.3V, c'est trop risqué pour cramer des Due et mon portefeuille, vu ma petite tête.

Merci encore !

L'ami René