Problèmes d'encodeur EC11

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é

si j'ai bien compris, tu as 4 encodeurs, voie A et B (pas de Z).
tu veux rester en 5V.
t'as une MEGA2560.

tes codeurs on une resolution de ? (points/tours?), a quelle vitesse?
un codeur 1000pts/tour peut etre geré en x1, x2 et x4 (=1000, 2000 ou 4000 point de resolution)
tolere tu de n'avoir que du x2?

doit tu garder des broches interruptive pour autre chose? combien?

tu as 6 entrées interruptive sur la MEGA (+2 qui sont pas ressortie, sauf erreur - jamais essayé)

en gros, sans aucune lib, le principe (qui marche, deja essayé), tu est capable de gerer 6 codeurs 1/2 interruptifs, et potentielement 8:

...
#define pinCodeur1A=2;
#define pinCodeur1B=4;
#define pinCodeur2A=3;
#define pinCodeur2B=5;

volatile int codeur1=0;
volatile int codeur2=0;

attachInterrupt(0, Codeur1A_IT, CHANGE);
attachInterrupt(1, Codeur2A_IT, CHANGE);
....

void Codeur1A_IT() {
  if (digitalRead(pinCodeur1A) == digitalRead(pinCodeur1B)) {
    codeur1++;
  } else {
    codeur1--;
  }

void Codeur2A_IT() {
  if (digitalRead(pinCodeur2A) == digitalRead(pinCodeur2B)) {
    codeur2++;
  } else {
    codeur2--;
  }

//     AB
// 0 : 00
// 1 : 01
// 2 : 11
// 3 : 10

il n'y a que 2 cas ou les voies A et B sont identiques lorsque l'interruption est déclenchée:
1 vers 2 => ++, sinon --
3 vers 0 => ++, sinon --
tu n'est pas en quadrature x4, mais x2, ca peut etre suffisant, avec une entrée IT par codeur.

voir:
http://playground.arduino.cc/Main/RotaryEncoders

les 2 manquantes sont INT6 et INT7, sur PE6 et PE7, broche 8 et 9 du controleur.
elles ne ressortent pas de la carte, mais devraient pourvoir etre expoiltée:

extrait de wiring_private.h:
#if defined(AVR_ATmega1280) || defined(AVR_ATmega2560)
#define EXTERNAL_NUM_INTERRUPTS 8

et Winterrupts.c:
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
if(interruptNum < EXTERNAL_NUM_INTERRUPTS) {
intFunc[interruptNum] = userFunc;

Rebonjour Jean,

Un chaleur merci pour votre aide, que j'apprécie grandement !

jean-I:
si j'ai bien compris, tu as 4 encodeurs, voie A et B (pas de Z).

Oui, et revoici les références :

Codeur Dode Commutateur / EC11 / Audio potentiomètre numérique - vert + Silver (2 PCS)
MaiTech manche court 5 broches molette commutateurs - argent (2 PCS)

tu veux rester en 5V.

Oui.

t'as une MEGA2560.

Oui.

tes codeurs on une resolution de ? (points/tours?).

Ce que je peux dire, c'est 20 clics par 360° de la molette.

un codeur 1000pts/tour peut etre geré en x2 et x4 (=1000, 2000 ou 4000 point de resolution)
tolere tu de n'avoir que du x2?

J'ai des clics qui produisent habituellement 4 émissions de signaux pour un clic. Ce qui me donne entièrement satisfaction avec le code exemple utilisé et pour les besoins du cockpit. Et le besoin est pour un clic, un plus ou un moins.

doit tu garder des broches interruptive pour autre chose? combien?

Non, et c'est la première fois que j'utilise cette fonctionnalité.

tu as 6 entrées interruptive sur la MEGA (+2 qui sont pas ressortie, sauf erreur - jamais essayé)

Oui, 6 entrées interruptives sur la MEGA. Pour le reste de votre phrase, je ne sais pas.

en gros, sans aucune lib, le principe (qui marche, deja essayé), tu est capable de gerer 6 codeurs 1/2 interruptifs, et potentielement 8:

...

#define pinCodeur1A=2;
#define pinCodeur1B=4;
#define pinCodeur2A=3;
#define pinCodeur2B=5;

volatile int codeur1=0;
volatile int codeur2=0;

attachInterrupt(0, Codeur1A_IT, CHANGE);
attachInterrupt(1, Codeur2A_IT, CHANGE);
....

void Codeur1A_IT() {
 if (digitalRead(pinCodeur1A) == digitalRead(pinCodeur1B)) {
   codeur1++;
 } else {
   codeur1--;
 }

void Codeur2A_IT() {
 if (digitalRead(pinCodeur2A) == digitalRead(pinCodeur2B)) {
   codeur2++;
 } else {
   codeur2--;
 }

//     AB
// 0 : 00
// 1 : 01
// 2 : 11
// 3 : 10




il n'y a que 2 cas ou les voies A et B sont identiques lorsque l'interruption est déclenchée:
1 vers 2 => ++, sinon --
3 vers 0 => ++, sinon --
tu n'est pas en quadrature x4, mais x2, ca peut etre suffisant

Ça, c'est une très bonne nouvelle ! Un grand merci pour le code d'exemple, je le teste dès que possible ! J'apprécie beaucoup !

voir:
Arduino Playground - RotaryEncoders

Ça, cette page, son contenu et ses liens et avec la traduction automatique, c'est pas gagné et c'est pas de la tarte...

Merci pour tout !

L'ami René

jean-I:
les 2 manquantes sont INT6 et INT7, sur PE6 et PE7, broche 8 et 9 du controleur.
elles ne ressortent pas de la carte, mais devraient pourvoir etre expoiltée:

extrait de wiring_private.h:
#if defined(AVR_ATmega1280) || defined(AVR_ATmega2560)
#define EXTERNAL_NUM_INTERRUPTS 8

et Winterrupts.c:
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
if(interruptNum < EXTERNAL_NUM_INTERRUPTS) {
intFunc[interruptNum] = userFunc;

Je teste aussi dès que possible et reviens avec les constats !

Merci, merci !

L'ami René