Ok, vu
ou comment oublier d'avoir des certitudes
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é" , mais 504 ? (ça ne vient pas de chez peugeot , mais de chez HP
)
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.
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
Salut ,
Je profite de ce topic pour poser une question bien bête j'imagine (je suis très débutant ) ...
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 :
Encoder knobLeft(5, 6);
Encoder knobRight(7, 8);
Dans le moniteur série voilà ce que j'ai en tournant 1 cran à droite :
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 :
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
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:
// 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
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...
s1der:
... codeur est un KY040 (5 pins avec switch).Dans la lib de PJRC, je ne comprends pas les lignes :
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)
Oui il faut que tu ne déclare qu'un seul de la façon suivante:
Déclarations:
// 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:
pinMode(CHA, INPUT);
pinMode(CHB, INPUT);
pinMode(SWI, INPUT);
Pour utiliser la commande dans le loop:
readEncoder();// renvoie -1 ou +1 ou 0
La fonction à déclarer après le loop:
// 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;
}