probleme d'encodeur

Bonjour à tous, je m'appelle André Chaillous et je débute dans la programmation Arduino. Je viens de finir la réalisation d'un double chronométre pour mon ULM (voir ici:olympe.in - This website is for sale! - olympe Resources and Information.)
Je souhaite maintenant réaliser un horizon artificiel à partir du sketch de Marc Robitaille.
Je rencontre un soucis dans la gestion de l'encodeur. J'utilise un encodeur du commerce et la bibliothéque encoder.h
Avec un sketch simple je n'arrive pas à avoir une décrémentation de la valeur et de plus pour une rotation d'un cran de mon encodeur, j'ai trois valeurs qui s'incrémente!
Quelqu'un à-t-il déja eu ce soucis?
Merci de votre aide
Cordialement
André Chaillous

bonjour
lien vers le sketch ?
lien vers la doc de ton encodeur ?
lien vers la lib encoder.h ?

A chaud ça sent le comptage X4 sur front

Bonsoir Artouste,
Pour la librairie de l’encodeur voici le lien:http://www.pjrc.com/teensy/arduino_libraries/Encoder.zip

Voici le code que j’utilise pour mes tests:

/* Encoder Library - TwoKnobs Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */

#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(5, 6);
Encoder knobRight(7, 8);
//   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);
  }
}

Et l’encodeur est un modéle provenant de chez Atlantique composant dont je n’ai pas la doc technique.

Merci de ton aide

A_Chaillous:
Bonsoir Artouste,
Pour la librairie de l’encodeur voici le lien:http://www.pjrc.com/teensy/arduino_libraries/Encoder.zip

Voici le code que j’utilise pour mes tests:

perso , je considere que c’est actuellement la meilleure lib maintenue “sous arduino” pour de l’encodeur A/B 8)

A priori ton probleme vient surement du phenomene de detente de ton encodeur
1 “cran” = +/- 4 renvoyé par la lib = faut adapter selon ton sketch

Et l’encodeur est un modéle provenant de chez Atlantique composant dont je n’ai pas la doc technique.

moi je ne monte pas dans un truc dont je ne dispose pas de la doc :grin:

effectivement pour un cran passé sur l'encodeur j'ai en général trois valeurs qui s'affiche sur le moniteur série. Quand tu parles d'adapter peux tu me dire sur quoi je dois intervenir STP (lib ou sketch)?

A_Chaillous:
effectivement pour un cran passé sur l'encodeur j'ai en général trois valeurs qui s'affiche sur le moniteur série. Quand tu parles d'adapter peux tu me dire sur quoi je dois intervenir STP (lib ou sketch)?

C'est toujours ... ou en général ? :grin:

La premiere fois c'est quatre et ensuite toujours trois

A_Chaillous:
La premiere fois c'est quatre et ensuite toujours trois

voilà
tu fais un simple /4 pour retomber sur le crantage

Bonjour Artouste
J’ai modifié mon sketch ainsi:

/* Encoder Library - TwoKnobs Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */

#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(5, 6);
Encoder knobLeft(0, 1);
//Encoder knobRight(7, 8);
Encoder knobRight(7, 8);


//   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()/4;
  
  if (newLeft != positionLeft || newRight != positionRight) {
    Serial.print("Left = ");
    Serial.print(newLeft);
    Serial.print(", Right = ");
    Serial.print(newRight);
    Serial.println();
    positionLeft = newLeft;
    positionRight = newRight;
    delay (300);
  }
  // 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);
  }
}

j’obtiens le résultat suivant: lorsque je tourne l’encodeur dans un sens pas de problème incrémentation de 1 mais dans l’autre sens j’affiche deux valeurs à suivre d’abord -1 puis +1:

, Right = 0
, Right = 1
, Right = 2 rotation horaire cran par cran pour 6 crans: OK
, Right = 3
, Right = 4
, Right = 5
, Right = 6

, Right = 5
, Right = 6
, Right = 5
, Right = 6 rotation anti horaire cran par cran pour 3 crans!!
, Right = 5
, Right = 6

??
A+

Pourquoi utiliser les pins 0&1 qui sont réservées a u port série ?

J'utilise les pins 7 et 8 pour mon encodeur, Le sketch est fait pour deux encodeurs

A_Chaillous:
Bonjour Artouste
J’ai modifié mon sketch ainsi:

bonsoir
ça c’est assez typique d’un encodeur mal cablé
tu a le schema de cablage? , tu a fait un relevé à l’ohmetre ?
c’est un encodeur à contact sec ou un encodeur à sortie collecteurs ouverts ?

bonsoir Artouste, (comme la turbine du même nom?)
C'est un encodeur qui ressemble à un potentiometre avec 3 pins . J'utilise celle du milieu pour la masse et les deux autres au port analogique !
Encodeur à contact sec ou un encodeur à sortie collecteurs ouverts ? comment puis-je le savoir?
Merci de ton aide

as tu mis des condensateurs et résistances de filtrage sur les contacts ?

A_Chaillous:
C'est un encodeur qui ressemble à un potentiometre avec 3 pins . J'utilise celle du milieu pour la masse et les deux autres au port analogique !

bonjour
a partir de quoi a tu determiné que le pin du milieu soit bien le "commun" ?

Simple déduction a partir de site internet et de plus cela me semble logique. Mais si il y a un autre brochage, je suis preneur d'une méthode pour le déterminer.
Cordialement
André

Est ce quelqu'un pourrait essayer le sketch que j'ai fourni au dessus avec un encodeur et me dire si le résultat est à l'attendu?
Est-t-il nécessaire d'ajouter des résistances et condensateurs de filtrage (qui ne sont pas prévu dans le sketch d'origine)?
A+
André

A_Chaillous:
Simple déduction a partir de site internet et de plus cela me semble logique. Mais si il y a un autre brochage, je suis preneur d'une méthode pour le déterminer.
Cordialement
André

bonjour
dans la mesure ou ça semble etre du "contact sec" tu peux determiner le brochage à l'ohmetre :
tu test pour une position donnée la continuité entre les 3 pins et tu recommence pour les 3 crans suivants et tu remplis un petit tableau.
pour ton code ,je n'ai pas de quoi faire des tests avant mardi.

j'ai essaye ton sketch #8 avec cet codeur ky-040-arduino-rotary, il fonctionne après avoir modifier newRight = knobRight.read()/2;mais il présente les défauts que tu décrit si tu tourne trop vite
je l'ai essayé sur les pins 2 & 3 (avec interruptions) et la c'est beaucoup mieux

Merci de ta réponse , je vais essayer en modifiant le sketch pour voir.
J'ai essayé avec toute les combinaisons possibles de brochages et j'obtiens au mieux le même résultat au pire un non fonctionnement.
J'ai commandé un encodeur "Arduino" et je vais également faire des essais avec.
Je vous tiens au courant
A+