Go Down

Topic: Problèmes d'encodeur EC11 (Read 39203 times) previous topic - next topic

JMe87

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

LamiRene

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é
Tous pour un et un pour tous !

Artouste

#47
Sep 05, 2014, 03:12 pm Last Edit: Sep 05, 2014, 03:14 pm by Artouste Reason: 1

...
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  :smiley-mr-green:

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)




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)

LamiRene

Oh bonjour Artouste,



...
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é
Tous pour un et un pour tous !

LamiRene

Bonjour jean-I,

Merci pour ton aide et tes suggestions !


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é
Tous pour un et un pour tous !

jean-I

#51
Sep 05, 2014, 09:58 pm Last Edit: Sep 05, 2014, 10:34 pm by jean-I Reason: 1
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:
Code: [Select]

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

jean-I

#52
Sep 05, 2014, 10:21 pm Last Edit: Sep 05, 2014, 10:42 pm by jean-I Reason: 1
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;

LamiRene

Rebonjour Jean,

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


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)

Quote

tu veux rester en 5V.


Oui.

Quote

t'as une MEGA2560.


Oui.

Quote

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


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

Quote

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.

Quote

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


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

Quote

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.

Quote

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

Code: [Select]

...
#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 !

Quote

voir:
http://playground.arduino.cc/Main/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é
Tous pour un et un pour tous !

LamiRene


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é
Tous pour un et un pour tous !

jean-I

Whaou, ça c'est du datasheet: aucune certitude avant d'avoir le produit dans les mains.

20 clics, c'est pas divisible par 4, on suppose donc 20 par tours, sur chacune chacune des 2 voies.
avec mon code, tu devrai donc avoir 40 points a chaque tour codeur.

pour ce qui est des interruption 6 et 7 en broche 8 et 9, faut vraiment en avoir besoin, parce que vu ou il faut aller les chercher, t'as interret a faire une soudure correcte:
http://arduino.cc/en/uploads/Main/arduino-mega2560_R3-sch.pdf

j'essaierai des que j'aurai recupéré quelques heure de sommeil.

LamiRene

Houait, j'ai déjà vu mieux.

Merci pour les infos... !

Bon sommeil, qu'il soit régénérateur et fortifiant !

A+

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

LamiRene

Bonjour à tous,

Je devrai partir à la recherche des exemples des codes sources d'un Mega qui communique avec un ATMEGA328-PU enfiché sur une plaque d'expérimentation sans soudure "BreanBoard" pour récupérer les données d'un capteur (ex. : potentiomètre ou encodeur, capteur de température ou de luminosité, etc.). Si j'étais chanceux, ce serait d'un encodeur, mais peu importe, du moment qu'il y a un capteur et la transmission des données du ATMEGA328-PU vers la carte Mega.

Alors, si vous avez déjà vu ça quelque part dans les bibliothèques d'Arduino (standard ou pas) ou sur le Web, ou si vous avec ça sous le coude, J'apprécierais que vous m'en fassiez part, avant, que je parte à sa recherche !

Et merci d'avance !

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

LamiRene

Bonjour Monsieur Jean,

Je ne peux que vous appeler Monsieur Jean, car votre exemple de code ma donné la joie de mon premier vol avec CINQ encodeurs pleinement fonctionnent, car cela faisait déjà quelques semaines que je travaillais et recherchais des solutions aux problèmes rencontrés. Même les broches d'interruption  20 et 21 qui n'avaient jamais fonctionné d'aucuns des trois modes de branchement, elles fonctionnent en mode une broche d'interruption ! Bravo ! Super ! Fantastique !!!

Et le sommeil, bien et suffisamment long, je le souhaite ?

Pour intégrer dans ma dernière version du code du cockpit et harmoniser le tout, voici ce qu'est devenu votre exemple qui passe de 2 à 5 codeurs :

Code: [Select]

...
// Câblage pour Encodeur avec interrupteur sur la planche d'expérimentation.
const byte ENCODEUR_1_SORTIE_A = 2;
const byte ENCODEUR_1_BOUTON   = 32;
const byte ENCODEUR_1_SORTIE_B = 14;
const byte ENCODEUR_2_SORTIE_A = 3;
const byte ENCODEUR_2_BOUTON   = 33;
const byte ENCODEUR_2_SORTIE_B = 15;
const byte ENCODEUR_3_SORTIE_A = 18;
const byte ENCODEUR_3_BOUTON   = 34;
const byte ENCODEUR_3_SORTIE_B = 16;
const byte ENCODEUR_4_SORTIE_A = 19;
const byte ENCODEUR_4_BOUTON   = 36;
const byte ENCODEUR_4_SORTIE_B = 17;
const byte ENCODEUR_5_SORTIE_A = 20;
const byte ENCODEUR_5_BOUTON   = 36;
const byte ENCODEUR_5_SORTIE_B = 22;

volatile int Encodeur_1_EtatActuel = 0;
volatile int Encodeur_2_EtatActuel = 0;
volatile int Encodeur_3_EtatActuel = 0;
volatile int Encodeur_4_EtatActuel = 0;
volatile int Encodeur_5_EtatActuel = 0;

  attachInterrupt (0, Encodeur_1_A_Interruption, CHANGE);
  attachInterrupt (1, Encodeur_2_A_Interruption, CHANGE);
  attachInterrupt (5, Encodeur_3_A_Interruption, CHANGE);
  attachInterrupt (4, Encodeur_4_A_Interruption, CHANGE);
  attachInterrupt (3, Encodeur_5_A_Interruption, CHANGE);
....

void Encodeur_1_A_Interruption()
{
  if (digitalRead(ENCODEUR_1_SORTIE_A) == digitalRead(ENCODEUR_1_SORTIE_B)) {
    Encodeur_1_EtatActuel++;
  } else {
    Encodeur_1_EtatActuel--;
  }
}

void Encodeur_2_A_Interruption()
{
  if (digitalRead(ENCODEUR_2_SORTIE_A) == digitalRead(ENCODEUR_2_SORTIE_B)) {
    Encodeur_2_EtatActuel++;
  } else {
    Encodeur_2_EtatActuel--;
  }
}

void Encodeur_3_A_Interruption()
{
  if (digitalRead(ENCODEUR_3_SORTIE_A) == digitalRead(ENCODEUR_3_SORTIE_B)) {
    Encodeur_3_EtatActuel++;
  } else {
    Encodeur_3_EtatActuel--;
  }
}

void Encodeur_4_A_Interruption()
{
  if (digitalRead(ENCODEUR_4_SORTIE_A) == digitalRead(ENCODEUR_4_SORTIE_B)) {
    Encodeur_4_EtatActuel++;
  } else {
    Encodeur_4_EtatActuel--;
  }
}

void Encodeur_5_A_Interruption()
{
  if (digitalRead(ENCODEUR_5_SORTIE_A) == digitalRead(ENCODEUR_5_SORTIE_B)) {
    Encodeur_5_EtatActuel++;
  } else {
    Encodeur_5_EtatActuel--;
  }
}


Je crois utile de mettre cet exemple de code pour favoriser la prise de conscience que la numérotation des broches d'interruptions non pas une numérotation linéaire, mais comme suit :

Quote

Interruption 0, broche 2
Interruption 1, broche 3
Interruption 2, broche 21
Interruption 3, broche 20
Interruption 4, broche 19
Interruption 5, broche 18


Référence : http://arduino.cc/en/Reference/AttachInterrupt

J'attends la livraison de plusieurs autres encodeurs, pour poursuivre le peuplement du tableau de bord.

Alors, vous avez toute ma gratitude pour l'aide que vous m'avez apportée ! Merci !

Je vous salut bien bas Monsieur Jean en je vous remercie CINQ foix !   ;)

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

JMe87

Bonjour Rene,
j'ai le catalogue complet ALPS EC11 devant moi, il n'y a pas de modele 20 detentes, c'est 18, 30 ou 36.
Dans le message #39 tu disais que tu avais besoin de 12 encodeurs, comment vas-tu faire ?
De combien de pins disponibles pour tes encodeurs disposes-tu sur ton Mega ?
Bonne fin de nuit
Jacques

Go Up