Arduino Forum

International => Français => Topic started by: jpjcb66 on Apr 08, 2014, 02:39 pm

Title: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 02:39 pm
Bonjour à tous,

J'ai suivi les différents fils sur le sujet et testé différents sketchs.
Le dernier et plus court que l'on retrouve un peu partout vient de
http://bildr.org/2012/08/rotary-encoder-arduino/ (http://bildr.org/2012/08/rotary-encoder-arduino/)
Je suis sur un arduino uno, l'encodeur est une réf. sélectronic avec bouton axial.
https://www.flickr.com/photos/64022727@N02/13715610163/ (https://www.flickr.com/photos/64022727@N02/13715610163/)
(Pas encore compris la combine pour insérer une image !!!  Pas étonnant que je ne comprenne pas l'encodeur...)
Le problème comme pour beaucoup est un comptage irrégulier. J'ai essayé les différentes possibilité  (CHANGE, RISING, FALLING, LOW) mais je n'arrive pas à obtenir un comptage un par un.
Quelqu'un  aurait, il une petite idée.  Merci
Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 08, 2014, 02:43 pm
J'ai utilisé cette lib jointe si ça peux t'aider...

Je l'utilise pour mon projet Relaix box control (http://johnlenfr.1s.fr/index.php?option=com_content&view=article&id=496&Itemid=112)

Avec:

Code: [Select]
#include <QuadEncoder.h>
// encoder variables
#define SWI 2 // Intr 0 = Pin 2 but finally I don't use interupt
#define CHA 6
#define CHB 7
#define MENULED 5
// initialize the encoder
QuadEncoder encoder(CHA,CHB); // initialize the encoder
// has the encoder moved in a loop?
boolean moved = false;

///// SETUP /////
void setup() {
       pinMode(CHA, INPUT);
       pinMode(CHB, INPUT);
       pinMode(SWI, INPUT);
}


La détection du bouton se fait par (pas interruptions):
Code: [Select]
if(digitalRead(SWI)==LOW){
    digitalWrite(MENULED,HIGH); // menu led is on when we are in the menu
    menu();
  }


L'encodeur se fait par:
Code: [Select]
// returns 1 for right, -1 for left, or 0 for no movement
int readEncoder() {
  moved = true;
  switch(encoder.hb()) {
    case '>': return 1;
    case '<': return -1;
  }
  moved = false;
  return 0;
}
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 08, 2014, 02:49 pm

Bonjour à tous,

J'ai suivi les différents fils sur le sujet et testé différents sketchs.
Le dernier et plus court que l'on retrouve un peu partout vient de
http://bildr.org/2012/08/rotary-encoder-arduino/ (http://bildr.org/2012/08/rotary-encoder-arduino/)
Je suis sur un arduino uno, l'encodeur est une réf. sélectronic avec bouton axial.
https://www.flickr.com/photos/64022727@N02/13715610163/ (https://www.flickr.com/photos/64022727@N02/13715610163/)
(Pas encore compris la combine pour insérer une image !!!  Pas étonnant que je ne comprenne pas l'encodeur...)
Le problème comme pour beaucoup est un comptage irrégulier. J'ai essayé les différentes possibilité  (CHANGE, RISING, FALLING, LOW) mais je n'arrive pas à obtenir un comptage un par un.
Quelqu'un  aurait, il une petite idée.  Merci


bonjour
le plus simple avec les encodeurs en quadratures et arduino est d'utiliser
cette lib (et l'exemple basic)
http://www.pjrc.com/teensy/td_libs_Encoder.html

attention , elle est tres efficace (4 points) et selon les encodeurs il faut savoir si ils comportent une detente mecanique.

Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 08, 2014, 02:50 pm
Tiens, vais l'essayer ce soir celle la  :smiley-mr-green:
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 08, 2014, 02:55 pm

Tiens, vais l'essayer ce soir celle la  :smiley-mr-green:

anecdotiquement
je suis actuellement en train de jouer avec sur un encodeur 2000 imp/tours  8)
Title: Re: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 03:00 pm
Merci les gars je vais tester ça tout à l'heure.
Salut artouste !  Ca turbine ?

Si on peut m'expliquer pour les images. J'ai demandé au modo mais apparemment je n'ai pas compris.
Décidemment j'comprends pas grand chose. L'âge surement = viscosité mentale !!!  ;))
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 08, 2014, 03:06 pm

Merci les gars je vais tester ça tout à l'heure.
Salut artouste !  Ca turbine ?

Si on peut m'expliquer pour les images. J'ai demandé au modo mais apparemment je n'ai pas compris.
Décidemment j'comprends pas grand chose. L'âge surement = viscosité mentale !!!  ;))

:smiley-mr-green:
pour moi , la prochaine mise en route approuvée , ce sera vendredi  :smiley-mr-green:

retour lib
perso pour moi , tres bonne librairie
pour demo , un petit encodeur basique  20 click/tour +push  à coté d'un encodeur libre 2000 pas
(http://cjoint.com/14av/DDipmTwLy1i_encod3.jpg)

pour inserer une image , une fois que tu a le lien , tu l'insere avec la balise img  sous le Italique
Title: Re: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 03:31 pm
Merci, c'est qu'est ce que j'fais pour les images mais rien n'apparait.  Pour ça que j'ai mis le lien direct à "flickr".
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 08, 2014, 03:39 pm

Merci, c'est qu'est ce que j'fais pour les images mais rien n'apparait.  Pour ça que j'ai mis le lien direct à "flickr".


pour simple exemple
lien vers une page selectronic
http://www.selectronic.fr/encodeur-numerique-bi-phase-20-impulsions-t.html

lien vers l'image (pas sur qu'il soit pérenne)
http://www.selectronic.fr/media/catalog/product/cache/1/image/800x600/17f82f742ffe127f42dca9de82fb58b1/e/n/encodeur-numerique-bi-phase-20-impulsions--ta.png

et image affichée
(http://www.selectronic.fr/media/catalog/product/cache/1/image/800x600/17f82f742ffe127f42dca9de82fb58b1/e/n/encodeur-numerique-bi-phase-20-impulsions--ta.png)
Title: Re: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 04:28 pm
C'est bien ce que j'ai fait.
Bon je réessairai plus tard, je dois m'absenter.
Merci
Title: Re: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 05:44 pm
Bon j'ai testé en premier la proposition d'Artouste.

Ca plante sur 'Encoder myEnc(5, 6); ' does not name a type  juste avant  void setup()
Je cherche.....

Code: [Select]
/* Encoder Library - Basic Example
* http://www.pjrc.com/teensy/td_libs_Encoder.html
*
* This example code is in the public domain.
*/

#include <Encoder.h>

// Change these two 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 myEnc(5, 6);
//   avoid using pins with LEDs attached

void setup() {
 Serial.begin(9600);
 Serial.println("Basic Encoder Test:");
}

long oldPosition  = -999;

void loop() {
 long newPosition = myEnc.read();
 if (newPosition != oldPosition) {
   oldPosition = newPosition;
   Serial.println(newPosition);
 }
}
Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 08, 2014, 06:16 pm
Tu n'as pas du placer la librairie au bon endroit du coup il connait pas ta déclaration Encoder...
Title: Re: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 06:26 pm
Le fait que ce soit une version .pde  au lieu de .ino, ça ne joue pas ? Elle y est bien avec les autres ma lib.
Je chercherai après souper. Mais ça fait plusieurs fois que ça me fait. J'ai calé aussi sur le même genre de déclaration objet avec ton code.
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 08, 2014, 06:40 pm

Le fait que ce soit une version .pde  au lieu de .ino, ça ne joue pas ? Elle y est bien avec les autres ma lib.
Je chercherai après souper. Mais ça fait plusieurs fois que ça me fait. J'ai calé aussi sur le même genre de déclaration objet avec ton code.

J'ai juste modifié les .pde en .ino
ça tourne sans probleme pour moi (test avec un uno) sous IDE 1.05
la librairie est bien reprise dans les exemples
Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 08, 2014, 07:43 pm

Je chercherai après souper. Mais ça fait plusieurs fois que ça me fait. J'ai calé aussi sur le même genre de déclaration objet avec ton code.


Alors t'a trouvé ou jte donne la réponse?
Title: Re: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 08:16 pm
Je veux bien la réponse parce que maintenant ça compile normalement.
Je l'ai réenresitré en .ino.  Après avoir relancé l'IDE tout est renté dans l'ordre.
Par contre en utilisant les pins 56 rien ne se passe quand je tourne.
Si je connecte l'encodeur sur 2 & 3 il affiche par rafales de 4 voir plus
genre : première rafale une vingtaine de 0  -1  puis -1  -2  -3  -4  etc
Déjà la librairie m'inverse les pins par rapport aux autres essais.
Basic Encoder Test:
0
-1
0
-1
0
-1
0
-1
0
-1
0
-1
0
-1
0
-1
0
-1
0
-1
0
-1
0
--------
-1
-2
-3
-4
-------
-5
-4
-5
-6
-7
-8
-------
-9
-8
-9
-8
-9
-----
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 08, 2014, 08:22 pm

...
Déjà la librairie m'inverse les pins par rapport aux autres essais.
Basic Encoder Test:


:smiley-mr-green:
Il est cablé comment ton encodeur ?
le commun va sur quoi  ? +5V ou GND
Title: Re: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 08:44 pm
C'est pas grave ça, il suffit d'inverser dans "Encoder myEnc(3, 2);" ou alors inverser matériellemnt les connexions.
Je suis en train de regarder comment est foutue la librairie .h
En fait, à peine je touche le bouton et le programme réagit, avant même le passage du cran.

C'est du sport ces encodeurs.. Pourtant c'est censé marcher. Celui-là n'a pas servi. J'avais réussi à le faire tourner sous Mikrobasic.
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 08, 2014, 08:48 pm

C'est pas grave ça, il suffit d'inverser dans "Encoder myEnc(3, 2);" ou alors inverser matériellemnt les connexions.
Je suis en train de regarder comment est foutue la librairie .h
En fait, à peine je touche le bouton et le programme réagit, avant même le passage du cran.

C'est du sport ces encodeurs.. Pourtant c'est censé marcher. Celui-là n'a pas servi. J'avais réussi à le faire tourner sous Mikrobasic.

Jje crois que tu n'a pas compris ma question  8)
la broche commune aux canaux A et B de ton encodeur est cablée sur quoi ? (elle n'est pas en l'air  :smiley-mr-green: )
la librairie utilise les pull-up interne , il faut pour avoir un fonctionnement OK avec les impulsions connecter ce pin à GND
Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 08, 2014, 08:49 pm

Si je connecte l'encodeur sur 2 & 3 il affiche par rafales de 4 voir plus


Moi pareil, que ce soit avec les pins 2 et 3 ou  5 et 6.

Le cablage est celui ci: http://snootlab.com/shields-snootlab/339-encodeur-rotatif-24-positions-bleu-breakout-board.html

Et ça reste beaucoup trop sensible. Je fais comment pour changer la sensibilité?
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 08, 2014, 08:59 pm


Si je connecte l'encodeur sur 2 & 3 il affiche par rafales de 4 voir plus


Moi pareil, que ce soit avec les pins 2 et 3 ou  5 et 6.

Le cablage est celui ci: http://snootlab.com/shields-snootlab/339-encodeur-rotatif-24-positions-bleu-breakout-board.html



ça c'est normal  :smiley-mr-green:
Quote
Encoder provides 4X counting mode and highly optimized code (explained below) when running on Teensy or Arduino boards.

çà permet de quadrupler la resolution , ce n'est pas tres utile avec de l'encodeur basique pour entrée d'info equipé de detente (le click  8) ) , mais avec de l'encodeur de moteur c'est au contraire tres utile.

Quote
Et ça reste beaucoup trop sensible. Je fais comment pour changer la sensibilité?

division/4 ou comptage sur modulo 4
Title: Re: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 09:13 pm
Ah! ma réponse est restée coincée.
les deux communs sont à la masse puisque les pattes actives sont sur pullup.
Il est c^blé bizarre cet encodeur. les deux pattes seules opposées aux trois de l'autre côté sont les deux sorties encodeur.
Côté trois pattes deux sont les communs et la dernière le bouton.


Quote
division/4 ou comptage sur modulo 4

Et tu l'écris comment ça en "C". je vais chercher.  :D
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 08, 2014, 09:23 pm

Ah! ma réponse est restée coincée.
les deux communs sont à la masse puisque les pattes actives sont sur pullup.
Il est c^blé bizarre cet encodeur. les deux pattes seules opposées aux trois de l'autre côté sont les deux sorties encodeur.
Côté trois pattes deux sont les communs et la dernière le bouton.

Alors on va reprendre  :smiley-mr-green:
pour l'instant on oublie le contact poussoir (les 2 pins du meme coté)

ne t'occupe que du coté 3 pins
il n'y a pas 2 communs , mais normalement un seul
(donne le lien exact chez selectronic de ton encodeur )
en general les petits encodeurs sont cablés comme ça
ACB où :
A= canal A
B= canal B
C = Commun
tu connecte C à GND
A sur pin 5
B sur pin 6

Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 08, 2014, 09:29 pm

division/4 ou comptage sur modulo 4


/4 fonctionne mais pas %4
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 08, 2014, 09:31 pm


division/4 ou comptage sur modulo 4


/4 fonctionne mais pas %4

si mais à condition de faire un test sur condition=0  :smiley-mr-green:
pas utile là
Title: Re: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 09:39 pm
le câblage est là :
https://www.flickr.com/photos/64022727@N02/13715610163/  Voir figure 4  A et B encodeur, enface deux communs et un SW
C'est le premier de ta photo lien sélectro, il y a l'icône pdf en dessous.

Ca marche avec  /4  mais faudra le sortir de la boucle pour l'affichage. sinon :

Code: [Select]

0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
2
2
2
2
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 08, 2014, 09:54 pm
Pas besoin de le sortir de la boucle suffit de diviser par 4 avant le prélèvement.

J'ai testé une petite modif qui me renvoie -1 ou 1 suivant le sens de rotation ce qui permet de se servir de l'encodeur pour gérer un menu par exemple:

Code: [Select]
/* Encoder Library - Basic Example
* http://www.pjrc.com/teensy/td_libs_Encoder.html
*
* This example code is in the public domain.
*/

#include <Encoder.h>

// Change these two 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 myEnc(5, 6);
//   avoid using pins with LEDs attached

void setup() {
 Serial.begin(9600);
 Serial.println("Basic Encoder Test:");
}

long oldPosition  = -999;

void loop() {
 long newPosition = myEnc.read()/4;
 if (newPosition != oldPosition) {
   Serial.println(newPosition);
   Serial.print("pos=");
   Serial.println(oldPosition-newPosition);
   oldPosition = newPosition;
 }
}


Code: [Select]
Basic Encoder Test:
0
pos=-999
-1
pos=1
-2
pos=1
-3
pos=1
-4
pos=1
-5
pos=1
-4
pos=-1
-3
pos=-1
-2
pos=-1
-1
pos=-1
0
pos=-1
-1
pos=1


Je pense que ça va venir remplacer ma lib actuellement utilisée  car c'est crai qu'elle est plus performante.

Merci Artouste  ;)
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 08, 2014, 09:56 pm

le câblage est là :
https://www.flickr.com/photos/64022727@N02/13715610163/  Voir figure 4  A et B encodeur, enface deux communs et un SW
C'est le premier de ta photo lien sélectro, il y a l'icône pdf en dessous.

Ca marche avec  /4  mais faudra le sortir de la boucle pour l'affichage. sinon :

Code: [Select]

0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
2
2
2
2
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3


ton affichage vient juste de l'exemple basic de la lib encoder ?
pas de modifs de ta part ?
c'est etonnant parce que l'affichage serial ne se fait qu'en cas de changement de valeurs
balises citations assumée et pas code pour mise en valeur  8)
Quote
void loop() {
 long newPosition = myEnc.read();
 if (newPosition != oldPosition) {
   oldPosition = newPosition;
   Serial.println(newPosition);
 }
}
Title: Re: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 10:21 pm
C'est bien Artouste, compliments.
Si t'es aussi bon au manche qu'en "C" tu vivras vieux,  (comme moi  :D  )
Pour les tests avec une tempo c'est sympa et on voit l'efficacité des interrupts.
Bon avec ta modif  ( long newPosition = myEnc.read()/4;)  c'est nickel.

La librairie est plutôténorme. Tout ça pour ça.......

Bon je vais pouvoir m'attaquer enfin au menu de ma nouvelle régulation solaire.
Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 08, 2014, 10:23 pm
Clair que la lib est énorme mais elle est super efficace et prend en charge quasi toutes les cartes
Title: Re: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 10:31 pm
Bonne nuit, merci pour le coup de main.  ;)
Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 08, 2014, 10:32 pm

çà permet de quadrupler la resolution , ce n'est pas tres utile avec de l'encodeur basique pour entrée d'info equipé de detente (le click  8) ) , mais avec de l'encodeur de moteur c'est au contraire tres utile.

Pourrais tu préciser pourquoi?
Title: Re: Encodeur rotatif
Post by: jpjcb66 on Apr 08, 2014, 10:52 pm
Pratique ta modif  +1  -1 pour menu  john_lenfr. 
Que des bons sur ce forum. Sympa aussi ton site.
@+
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 09, 2014, 12:37 pm


La librairie est plutôténorme. Tout ça pour ça.......

Bon je vais pouvoir m'attaquer enfin au menu de ma nouvelle régulation solaire.



Clair que la lib est énorme mais elle est super efficace et prend en charge quasi toutes les cartes

Bonjour
Tant mieux si ça vous convient , si la lib est assez imposante en elle meme, la taille du code généré est en revanche plutot compact e.



çà permet de quadrupler la resolution , ce n'est pas tres utile avec de l'encodeur basique pour entrée d'info equipé de detente (le click  8) ) , mais avec de l'encodeur de moteur c'est au contraire tres utile.

Pourrais tu préciser pourquoi?

pourquoi quoi ?  :smiley-mr-green:
le quadruplement de resolution n'est pas utile avec des petits encodeurs "d'entrée de valeur" , en general ils emportent par construction mecanique "une detente" (encliquetage) , ça ne sert à rien (ou à pas grand chose)  de quadrupler le nombre d'impulsions, ce qui est important c'est de faire +1 ou -1 entre 2 clicks.

en revanche pour faire de l'asservissement de motorisation (vitesse et/ou position) cela revient à quadrupler la resolution.

là je teste un asservissement de position avec un encodeur 2000 imp/tours
la resolution angulaire theorique est donc de 360/2000 = 0.18°
si pour positionnement j'utilise une tige filetée standard metrique ? 16 (pas de 2) , j'ai une resolution theorique de deplacement lineaire au µ .
(evidemment la theorie, c'est sans tenir compte des "lutins sournois" des jeux mecaniques  8) )
Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 09, 2014, 01:46 pm
Je ne saisi quand meme pas trop le principe car "click" ou pas "click" quand on bouge d'un pas on bouge d'un pas.
En quoi le fait d'avoir 4 fois la meme valeur pour un pas change?
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 09, 2014, 02:00 pm

Je ne saisi quand meme pas trop le principe car "click" ou pas "click" quand on bouge d'un pas on bouge d'un pas.
En quoi le faire d'avoir 4 fois la meme valeur pour un pas change?

8)
oui et non  :smiley-mr-green:
le crantage,detente (click) impose un maintien mecanique, ce maintien mecanique impose la position du dephasage des canaux A/B.
Si tu teste les sorties de ton encodeur 20 pas/click  (20  pour la demo, mais ça vaut pour d'autres valeurs) et que tu releve à l'ohmetre la table de verité A/B à chaque cran, tu va recupérer une table qui va boucler toutes les 20 positions etablies.
Si tu supprime ce "crantage" (en general une bille ou un cliquet)  ton encodeur est en mesure de te fournir 4 fois plus de positions .
Tu n'a pas 4 fois la meme valeur si tu ne divise pas par 4 , tu a des valeurs uniques , mais masquée par l'etat stable
un encodeur "20 clicks" renvoi 80 imp/tours ou plus exactement 80 changements d'etats combinés 2 à 2  par tour

Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 09, 2014, 02:24 pm
Ok, tout dépend de la résolution de l'encodeur alors.
On ne peux quand même pas aller au delà de la résolution de l'encodeur, même quand il est débridé?
Donc si je débride mon encodeur en enlevant le système à bille, normalement je me retrouve avec un encodeur classique 'libre" pour lequel les 4 positions veulent dire quelque chose, bien que les doigts humains ne puisse pas les déceler c'est bien ça? (sauf à mettre un bras de levier important pour pouvoir tourner tout doucement au niveau angulaire).

En revanche pour du positionnement de moteurs pas à pas où le µm compte cela a un intéret.
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 09, 2014, 02:40 pm

Ok, tout dépend de la résolution de l'encodeur alors.
On ne peux quand même pas aller au delà de la résolution de l'encodeur, même quand il est débridé?
...

8)
evidemment
il faut que tu raisonne en changement d'etat/dephasage
pour demo : si tu te fous comme de ta premiere chemise du sens dce rotation
ce n'est In fine que du comptage de changement d'etat

si tu prend un disque avec 4 secteurs alternés noirs et blancs
tu peux detecter facilement l'etat actuel d'un secteur (noir ou blanc )
mais aussi detecter le nombre de transitions d'un etat à un autre,  qui lui est de 2 par secteur = une transition en entrée , une transition en sortie , et si tu dephase physiquement de 90 ° (ou plus exactement là une demi distance de secteur)  2 capteurs
tu recupere 4 signaux differenciés et de quoi en determiner le sens de rotation.
Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 09, 2014, 02:52 pm
Ok, je comprends mieux pourquoi ça s'apelle un "quad"encoder  :smiley-mr-green:

Et donc l'encodeur à bille avec environ 20pas a une résolution très mauvaise du coup.
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 09, 2014, 03:02 pm

Ok, je comprends mieux pourquoi ça s'apelle un "quad"encoder  :smiley-mr-green:

Et donc l'encodeur à bille avec environ 20pas a une résolution très mauvaise du coup.

non , il est prevu pour etablir mecaniquement  toujours un etat stable toujours déphasé  :smiley-mr-green:
ça existe depuis longtemps,  simplement aujourd'hui il est devenu aussi  interessant (puissance de calcul) de ne pas/plus simplement verifier un etat fini, mais aussi de regarder la relations de transitions  :smiley-mr-green:

une bonne et didactique explication est sur la page de PJRC
http://www.pjrc.com/teensy/td_libs_Encoder.html
voir l'animation sous Understanding Quadrature Encoded Signals

Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 09, 2014, 05:00 pm
Ok, vu  ;)
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 10, 2014, 02:57 pm
ou comment oublier d'avoir des certitudes  :smiley-mr-green:
Un petit retour avec des encodeurs "etrangers" = pas de datasheet dispo
comme expliqué plus haut , je fais un systeme de positionnement X/Y en utilsant de l'encodeur derriere un moteur CC
Apres une rapide verif (lib encoder) , je determine un disque 500 secteurs = super une belle valeur entiere
mais en situation , je derive,  faiblement mais je derive sur le positionnement.
Apres un test sur plusieurs tours , je m'aperçois que l'erreur de derive est constante, le retour à zero sur le nombre d'impulsion se fait bien.
Je determine facilement que je n'ai pas 2000 imp/tour mais 2016 , ce qui correspondrait à un disque de 504 secteurs.
500 ou 512 je n'aurais pas été "perturbé"  :smiley-mr-green: , mais 504 ? (ça ne vient pas de chez peugeot , mais de chez HP  :smiley-mr-green: )

Idée : ça doit etre un 512 et je  dois avoir des decoupes/gravures  bouchées/empoussiérée sur le disque (déjà vu)
passage à l'analyseur logique (à rotation constante) pour voir si je detecte de l'anomalie de creneaux = nada
Je me decide donc à regret d'ouvrir l'encodeur pour verifier l'etat du disque et là gros comme un nez au milieu d'une figure
un beau 504 gravé sur le disque.  :smiley-mr-green:
Il y a surement une bonne raison de conception initiale pour ce choix de 504 , le principal c'est que maintenant je ne derive plus  :smiley-mr-green:
(http://cjoint.com/14av/DDkpbPtl1of_enc504.jpg)


Title: Re: Encodeur rotatif
Post by: s1der on Apr 20, 2014, 06:19 pm
Salut ,
Je profite de ce topic pour poser une question bien bête j'imagine (je suis très débutant  :smiley-sad-blue: ) ...
Je voudrais utiliser un codeur rotatif pour naviguer dans un menu et pour dimmer des leds en PWM.
J'ai essayé plusieures lib mais je ne parviens pas à incrémenter ou décrémenter de +1/-1 de manière stable.
J'utilise les pins 6 et 7 sur mon arduino uno R3 et le codeur est un KY040 (5 pins avec switch).

Dans la lib de PJRC, je ne comprends pas les lignes :
Code: [Select]
Encoder knobLeft(5, 6);
Encoder knobRight(7, 8);


Dans le moniteur série voilà ce que j'ai en tournant 1 cran à droite :
Code: [Select]
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 = 1, Right = -1
Left = 1, Right = 0
Left = 1, Right = -1
Left = 0, Right = -1
Left = 1, Right = -1
Left = 0, Right = -1
Left = 0, Right = 0

et un cran à gauche :
Code: [Select]
TwoKnobs Encoder Test:
Left = 0, Right = 0
Left = 0, Right = -1
Left = 1, Right = -1
Left = 0, Right = -1
Left = 1, Right = -1
Left = 1, Right = 0
Left = 1, Right = -1
Left = 1, Right = 0
Left = 0, Right = 0

Ce n'est jamais 2 fois pareil et right est toujours en -1 et left en +1...

Ma question est donc quel est le moyen le plus simple d'incrémenter une variable de +1 ou -1, avec quelle lib etc ...

Merci de votre aide  :smiley-sweat:
Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 20, 2014, 07:10 pm
Si tu remontes un peu plus haut dans ce topic:
http://forum.arduino.cc/index.php?PHPSESSID=tmrjm8rn0brqrv3hgnhffmls36&topic=231757.msg1671603#msg1671603

Tu verras que j'avais justement donné la solution concernant le+1 -1 avec la lib encoder.h dont Artouste a donné le lien

Depuis la réponse que j'avais fait j'ai légèrement modifié la routine en:
Code: [Select]
// returns 1 for right, -1 for left, or 0 for no movement
int readEncoder() {
 // if 'int' is not enough, use 'long' instead (int: -32768 to +32767 and long: -2147483648 to +2147483647)
 // for a lcd menu 'int' is OK
 moved = true;
 int newPosition = encoder.read()/4; // the lib is so accurate that it provides 4X counting mode and is highly optimized code when running on Teensy or Arduino boards
 int pos=0;
 if (newPosition != oldPosition) {
   pos = oldPosition-newPosition;
   oldPosition = newPosition;
   return pos;
 }
 moved = false;
 return pos;
 
}


Le lien pour la librairie est celui ci:
http://www.pjrc.com/teensy/td_libs_Encoder.html
Title: Re: Encodeur rotatif
Post by: s1der on Apr 20, 2014, 09:08 pm
Merci john_lenfr
mais je ne saisis pas bien ce que tu veux dire par modifier la routine.
J'ai essayé le code que tu as mis en page 2 mais je ne comprends pas quoi remplacer par ton code page 3 ...
le code page 2 fonctionne à peu près (j'ai changé les numéros de pins).
encoder devient myEnc dans ta nouvelle routine je pense et après...  :smiley-roll-sweat:
Title: Re: Encodeur rotatif
Post by: Artouste on Apr 21, 2014, 11:40 am

... codeur est un KY040 (5 pins avec switch).

Dans la lib de PJRC, je ne comprends pas les lignes :
Code: [Select]
Encoder knobLeft(5, 6);
Encoder knobRight(7, 8);


...

Bonjour
tu utilise là l'exemple pour utiliser deux encodeurs differents
si tu a un seul encodeur c'est inutile (et meme contreproductif)  8)
Title: Re: Encodeur rotatif
Post by: john_lenfr on Apr 21, 2014, 07:02 pm
Oui il faut que tu ne déclare qu'un seul de la façon suivante:

Déclarations:
Code: [Select]

// include lib
#include <Encoder.h>

// encoder variables
#define SWI 2 // Intr 0 = Pin 2 but finally I don't use interupt so this pin is used as normal digital pin
#define CHA 6 // pin A encoder
#define CHB 7 // pin B encoder

// initialize the encoder
Encoder encoder(CHA,CHB); // initialize the encoder
int oldPosition  = -999; // init for 1st loop


Dans le setup:
Code: [Select]

pinMode(CHA, INPUT);
pinMode(CHB, INPUT);
pinMode(SWI, INPUT);


Pour utiliser la commande dans le loop:
Code: [Select]

readEncoder();// renvoie -1 ou +1 ou 0


La fonction à déclarer après le loop:
Code: [Select]
// returns 1 for right, -1 for left, or 0 for no movement
int readEncoder() {
 // if 'int' is not enough, use 'long' instead (int: -32768 to +32767 and long: -2147483648 to +2147483647)
 // for a lcd menu 'int' is OK
 moved = true;
 int newPosition = encoder.read()/4; // the lib is so accurate that it provides 4X counting mode and is highly optimized code when running on Teensy or Arduino boards
 int pos=0;
 if (newPosition != oldPosition) {
   pos = oldPosition-newPosition;
   oldPosition = newPosition;
   return pos;
 }
 moved = false;
 return pos;
 
}


;)