Go Down

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

LamiRene

Bonjour Artouste,

Merci pour l'aide !

Sur la masse, le GND.

Je vais de suite lire le topique.

Merci encore !

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

LamiRene


Peut être cette librairie qui utilise n'importe quelle entrée pour gérer les encodeurs http://code.google.com/p/adaencoder/

ATTENTION: bien lire la doc il y a des restrictions sur les broches utilisées. Les broches affectées à un encodeur doivent faire partie du même port du microcontrôleur.


Bonjour fdufnews,

Merci pour ton aide !

Je ne comprends pas le « Les broches affectées à un encodeur doivent faire partie du même port du microcontrôleur. » ! Je vais voir le lien, mais un exemple ou explication simple pourrait accélérer les choses.

Merci encore !

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

LamiRene

#17
Sep 03, 2014, 11:18 am Last Edit: Sep 03, 2014, 11:46 am by LamiRene Reason: 1
Bonjour,

Notez que j'ai un problème avec les broches 20 et 21 du Mega 2560 R3 pour mon encodeur 3, il n'y a pas de réaction, mais pour mon encodeur 1 sur broches 2 et 3 et l'encodeur 2 sur broches 18 et 19 pas de problème. Et j'ai permuté l'encodeur 2 avec le 3 et c'est bien les broches 20 et 21 qui sont en cause.

Voici la liste des bibliothèques que j'utilise, pour information, car je présume qu'il y a un conflit entre eux et que vous, vous le savez :

#include <Encoder.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include "IRremote.h"
#include "LiquidCrystalFast.h"
#include <SPI.h>


Un teste sans autre bibliothèque que Encodeur.h me permet d'éliminer cette dernière hypothèse.

Merci d'avance pour vos lumières !

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

LamiRene



...
Alors, j'ai passé en mode une broche d'interruption (broche 2) et une broche sans interruption (broche 4) et là, je rencontre un problème. Je me retrouve avec une permutation de 0 et de 1,  au lieu d'un changement d'état de deux ou trois et une incrémentation équivalente pour le compteur « newPos » !

...

bonjour
les communs de tes encodeurs sont cablés sur quoi   ? + ou GND ?
lire ce topic
http://forum.arduino.cc/index.php?topic=231757.msg1671384#msg1671384


Rebonjour Artouste,

Je ne trouve pas de solution à mon problème d'utiliser une seule interruption par encodeur dans ce topique.

Mais je peux vous indiquer que mes encodeurs sont de type pas cher et basique ACB pour l'encodeur et DE pour le bouton.

Une autre piste ?

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

JMe87

Bonjour,
j'ai deja rencontre des problemes avec des encodeurs low cost.
La premiere chose a faire est de cabler ceci :

en remplacant les 2 R par 2 led et 2 R et de faire tourner tout doucement l'axe pour verifier que tu obtiens bien le resultat escompte.

Jacques

N.B.: sans vouloir medire, DX ne vend pas la top qualite garanti 100% fonctionnel.
N.B.2 : ce shema est une copie d'une partie de la doc EC11.pdf de ALPS

Artouste


...

Je ne trouve pas de solution à mon problème d'utiliser une seule interruption par encodeur dans ce topique.

Mais je peux vous indiquer que mes encodeurs sont de type pas cher et basique ACB pour l'encodeur et DE pour le bouton.



bonjour
je ne comprend pas bien ta reponse , la lib gere elle meme les cas interrupt  ou pas
je n'ai pas de quoi tester avant demain , mais si tes canaux A/B sont montés en pull-up (detection sur GND) la lib fonctionne bien.
En tout cas pour moi , entre de l'encodeur "de moteur" et de l'encodeur "de commande" elle "travaille" bien  8)

voir peut etre la section "Optimized Interrupt Option" sur le wiki

jean-I

#21
Sep 03, 2014, 01:45 pm Last Edit: Sep 03, 2014, 02:14 pm by jean-I Reason: 1


Peut être cette librairie qui utilise n'importe quelle entrée pour gérer les encodeurs http://code.google.com/p/adaencoder/

ATTENTION: bien lire la doc il y a des restrictions sur les broches utilisées. Les broches affectées à un encodeur doivent faire partie du même port du microcontrôleur.


Bonjour fdufnews,

Merci pour ton aide !

Je ne comprends pas le « Les broches affectées à un encodeur doivent faire partie du même port du microcontrôleur. » ! Je vais voir le lien, mais un exemple ou explication simple pourrait accélérer les choses.

Merci encore !

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


voir http://arduino.cc/en/uploads/Main/arduino-mega2560_R3-sch.pdf

les pins sont regroupée par groupe de 8 qui forment un "port".
les fonctions (adc, sci, it, ..) du µC sont regroupé par port, meme si elles n'utilise pas l'intérgralité du port.
par exemple, les interruption PCINT16 à 23 sont sur le meme port (PK0 à 7), et les int4 à 7 sont sur un autre port (PE4 à 7).
tu ne pourra pas monter la voie A sur PK0, et la B sur PE4, par exemple, la librairie ne le supporte pas.

EDIT:
http://arduino.cc/en/Reference/attachInterrupt
pin 21 à 18, c'est sur le port PD0-3, pin 2 et 3 sur PE4 et PE5.
tu ne pourra donc gerer que 6 IT, soit 3 codeurs.

LamiRene

Bonjour Jacques,

Merci pour votre aide !


Bonjour,
j'ai deja rencontre des problemes avec des encodeurs low cost.
La premiere chose a faire est de cabler ceci :
...
Jacques

N.B.: sans vouloir medire, DX ne vend pas la top qualite garanti 100% fonctionnel.
N.B.2 : ce shema est une copie d'une partie de la doc EC11.pdf de ALPS


J'avais deux schémas à ma disposition pour faire mon montage, le premier provient de la documentation de chez DX et le second, c'est exactement celui que vous donnez. C'est que j'utilise actuellement deux marque et modèle différent d'encodeur.

Pour ce qui est de la qualité des produits fournit par DX, je confirme vos propos et renchérie, il est très fréquent d'avoir des produits en partie fonctionnels et en moyenne, sur 4 articles, il y en a un de défectueux en partie. Je parle par expérience de client DX.

Bon, pour le second circuit (schéma que vous suggérez), comme j'ai permuté l'encodeur 2 avec le 3 et c'est bien les broches 20 et 21 qui sont en cause, car l'encodeur 3 refonctionne parfaitement du simple fait de le brancher sur les broches 18 et 19, et c'est maintenant l'encodeur 2 qui était sur les broches 18 et 19 qui fonctionnait parfaitement, mais qui ne fonctionne plus sur les broches 20 et 21. Je n'ai rien touché d'autre que ces quatre broches et le problème reste lien au 20 et 21. Donc les encodeurs fonctionnent correctement.

De plus, avant l'utilisation de la bibliothèque « Encoder », mes quatre encodeurs fonctionnaient. Pas très bien, mais ils fonctionnaient tous.

Alors, est-ce bien nécessaire de tester les encodeurs avec un autre circuit ?

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

LamiRene

Rebonjour Artouste,

Je vous remercie de m'aider !



...
Je ne trouve pas de solution à mon problème d'utiliser une seule interruption par encodeur dans ce topique.

Mais je peux vous indiquer que mes encodeurs sont de type pas cher et basique ACB pour l'encodeur et DE pour le bouton.


bonjour
je ne comprend pas bien ta reponse , la lib gere elle meme les cas interrupt  ou pas
...


La question se pose et je la pose aussi !!!

Mais quelle est la réponse ???

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

Artouste


...

La question se pose et je la pose aussi !!!

Mais quelle est la réponse ???

...

Je veux bien aussi jouer "au jesuite"  8) , mais ça risque de durer longtemps sans etre finalement efficace  :smiley-mr-green:

fais plutot un recensement des cas testés

cas 1 , encodeurs connectés comme "ça" A/B sur pins numerotés X/Y , le resultat est :
cas 2 , encodeurs connectés comme "ça" A/B sur pins numerotés X/Y , le resultat est :
...
cas n , encodeurs connectés comme "ça" A/B sur pins numerotés X/Y , le resultat est :

JMe87

Bonjour,
je na sais pas s'il faut tester a nouveau. Ce que je sais c'est que, quand tu apprends a developper sous Arduino tu dois avoir un hardware en BETON. Tu dois etre sur que TOUT fonctionne a 100%, alim contacts etc etc.
Sinon tu ne sais pas localiser facilement la source du probleme.
Dans ton cas, tu fais un petit programme qui utilise un seul codeur et par exemple 2 leds (+ et -).
Et quand cela fonctionne, tu recommences avec un autre encodeur toujours tout seul etc etc
Je suis autodidacte et c'est la methode que j'utilise a mon entiere satisfaction ..... petit a petit, l'oiseau fait son nid  ;)
Jacques

LamiRene

Bonjour Artouste,



...
La question se pose et je la pose aussi !!!

Mais quelle est la réponse ???
...


Je veux bien aussi jouer "au jesuite"  8) , mais ça risque de durer longtemps sans etre finalement efficace  :smiley-mr-green:


Je ne comprendre pas ce que vous cherchez à me dire ?

Je ne suis pas le seul ici à demander si la bibliothèque « Encoder » : http://www.pjrc.com/teensy/td_libs_Encoder.html gère automatiquement les encodeurs qui n'ont qu'une broche ou aucune sur broche d'interruption Arduino !?!?

Pour le moment, personne n'a confirmé, de par son expérience, que dans ces deux derniers cas de figure la bibliothèque « Encoder » donnait de bons résultats.



fais plutot un recensement des cas testés

cas 1 , encodeurs connectés comme "ça" A/B sur pins numerotés X/Y , le resultat est :
cas 2 , encodeurs connectés comme "ça" A/B sur pins numerotés X/Y , le resultat est :
...
cas n , encodeurs connectés comme "ça" A/B sur pins numerotés X/Y , le resultat est :


Mais, c'est déjà fait et en très grande partie, décri dans le présent fils de discussion avec les bibliothèques utilisées et les problèmes rencontrés. Est-ce que vous me demandez de tout rapatrier et de le mettre en une seule réponse ?

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

LamiRene

#27
Sep 03, 2014, 07:13 pm Last Edit: Sep 03, 2014, 07:15 pm by LamiRene Reason: 1
Rebonjour Jacques,

C'est avec joie que je constate que je ne suis pas le seul autodidacte et adepte de petit pas en petit pas. J'ai pratiqué et pratique encore cette méthode pour les problèmes d'encodeurs depuis le début et si nous lisons bien le présent fils de discussion, cela transpire beaucoup cette méthode !


Bonjour,
je na sais pas s'il faut tester a nouveau. Ce que je sais c'est que, quand tu apprends a developper sous Arduino tu dois avoir un hardware en BETON. Tu dois etre sur que TOUT fonctionne a 100%, alim contacts etc etc.
Sinon tu ne sais pas localiser facilement la source du probleme.


Comme déjà mentionné, au point de départ, chez moi ce n'est pas toujours à 100 %, mais à petits pas, je finis par y arriver.


Dans ton cas, tu fais un petit programme qui utilise un seul codeur et par exemple 2 leds (+ et -).


C'est fait et individuellement, les quatre encodeurs fonctionnent très bien, seulement si j'utilise deux broches avec interruption de l'Arduino. Sinon, avec une seule broche dans strictement le même code de programmation, je n'ai en retour que des « O » et des « 1 », et pas de « -1 », donc pas moyen de savoir si j'ai un plus ou un moins, seulement qu'il y a eu un changement, comme en mode binaire, et le code en question est celui de l'exemple « Basic.ino » fourni avec la bibliothèque. Je ne change que le numéro des broches.

En revoici ma version francisé déjà publié ici :

Code: [Select]

/* Encoder Library - Basic Example
* http://www.pjrc.com/teensy/td_libs_Encoder.html
*
* Ce code d'exemple est dans le domaine public.
*/

#include <Encoder.h>

// Changer ces numéros de broches sur les broches connectées à votre encodeur.
// Meilleure performance: Deux broches ont une capacité d'interruption
// Bonnes performances: Seule la première broche est interruptif
// Faible performance: Aucune broche est interruptif
const byte ENCODEUR_1_SORTIE_A = 20;
const byte ENCODEUR_1_SORTIE_B = 22;
Encoder Encodeur_1 (ENCODEUR_1_SORTIE_A, ENCODEUR_1_SORTIE_B);
// Éviter d'utiliser des broches de LED attachés

void setup ()
{
 Serial.begin (115200);
 Serial.println ("Test de base d'Encoder :");
}

long Encodeur_1_EtatPrecedent  = -999;

void loop()
{
 long Encodeur_1_EtatActuel = Encodeur_1.read ();
 if (Encodeur_1_EtatActuel != Encodeur_1_EtatPrecedent)
 {
   Encodeur_1_EtatPrecedent = Encodeur_1_EtatActuel;
   Serial.println (Encodeur_1_EtatActuel);
 }
}


Ou voir en pièce jointe.

Dans mon cas, je devrai utiliser au moins 6 encodeurs dans le même programme, pour le moment j'en suis à 4.


Et quand cela fonctionne, tu recommences avec un autre encodeur toujours tout seul etc etc
Je suis autodidacte et c'est la methode que j'utilise a mon entiere satisfaction ..... petit a petit, l'oiseau fait son nid  ;)
Jacques


Avec la bibliothèque « Encoder », les problèmes apparaissent soit en utilisant la paire des 5 et 6 ième broches d'interruptions de l'Arduino (broches 20 et 21) sur un troisième encodeur ou dès l'utilisation d'un encodeur avec une seule broche sur un connecteur avec interruption. Dans tous ces cas, le problème reste localisé et ne se propage.

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

Artouste

je n'ai pas de quoi tester aujourd'hui
mais essaye ça (tu affecte les pins que tu veux)
Code: [Select]
/* Encoder Library - TwoKnobs Example
* http://www.pjrc.com/teensy/td_libs_Encoder.html
*
* This example code is in the public domain.
*/
#define ENCODER_DO_NOT_USE_INTERRUPTS
#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);
  }
}

LamiRene

#29
Sep 04, 2014, 01:15 am Last Edit: Sep 04, 2014, 01:57 pm by LamiRene Reason: 1
Salut

Merci de poursuivre les recherches de solution avec moi !

J'ai testé ton code sur Arduino Mega R3 avec les trois configurations typiques, et à tour de rôle, une dizaine de clics à droite avec les deux encodeurs, puis une dizaine de clics à gauche avec encore les deux encodeurs :

Code: [Select]

Encoder knobLeft(20, 22);
Encoder knobRight(21, 23);


Et en sortie, ça donne cela :

Quote

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 = 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 = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
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 = 0, Right = 0
Left = -1, Right = 0
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 = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0
Left = -1, Right = 1
Left = -1, Right = 0


À gauche (20, 22),  newLeft ne donne que des 0 et des -1, pas de 1. À droite (21, 23), newRight  ne donne que des 0 et des 1, pas de -1.

J'ai testé ton code avec :

Code: [Select]

Encoder knobLeft(18, 19);
Encoder knobRight(20, 21);


Et en sortie, ça donne cela :

Quote

TwoK0, Right = 0
TwoKnobs Encoder Test:
Left = 0, Right = 0
Left = 1, Right = 0
Left = 2, Right = 0
Left = 3, Right = 0
Left = 4, Right = 0
Left = 5, Right = 0
Left = 6, Right = 0
Left = 7, Right = 0
Left = 8, Right = 0
Left = 9, Right = 0
Left = 10, Right = 0
Left = 11, Right = 0
Left = 12, Right = 0
Left = 13, Right = 0
Left = 14, Right = 0
Left = 15, Right = 0
Left = 16, Right = 0
Left = 17, Right = 0
Left = 18, Right = 0
Left = 19, Right = 0
Left = 20, Right = 0
Left = 19, Right = 0
Left = 18, Right = 0
Left = 17, Right = 0
Left = 16, Right = 0
Left = 15, Right = 0
Left = 14, Right = 0
Left = 13, Right = 0
Left = 12, Right = 0
Left = 11, Right = 0
Left = 9, Right = 0
Left = 8, Right = 0
Left = 7, Right = 0
Left = 6, Right = 0
Left = 8, Right = 0
Left = 7, Right = 0
Left = 6, Right = 0
Left = 5, Right = 0
Left = 4, Right = 0


À gauche (18, 19),  newLeft s'incrémente correctement, mais à droite (20, 21), newRight rien, pas même des 0.

J'ai testé ton code avec :

Code: [Select]

Encoder knobLeft(14, 15);
Encoder knobRight(22, 23);


Et en sortie, ça donne cela :

Quote

TwoKnobs Encoder Test:
Left = 0, Right = 0
Left = 1, Right = 0
Left = 2, Right = 0
Left = 3, Right = 0
Left = 4, Right = 0
Left = 5, Right = 0
Left = 6, Right = 0
Left = 7, Right = 0
Left = 8, Right = 0
Left = 9, Right = 0
Left = 10, Right = 0
Left = 11, Right = 0
Left = 12, Right = 0
Left = 13, Right = 0
Left = 14, Right = 0
Left = 15, Right = 0
Left = 16, Right = 0
Left = 17, Right = 0
Left = 18, Right = 0
Left = 19, Right = 0
Left = 20, Right = 0
Left = 20, Right = -1
Left = 20, Right = -2
Left = 20, Right = -1
Left = 20, Right = -2
Left = 20, Right = -3
Left = 20, Right = -4
Left = 20, Right = -5
Left = 20, Right = -6
Left = 20, Right = -4
Left = 20, Right = -5
Left = 20, Right = -4
Left = 20, Right = -2
Left = 20, Right = 0
Left = 20, Right = -1
Left = 20, Right = -2
Left = 20, Right = -3
Left = 20, Right = -4
Left = 20, Right = -5
Left = 20, Right = -4
Left = 20, Right = -5
Left = 20, Right = -6
Left = 20, Right = -7
Left = 20, Right = -8
Left = 19, Right = -8
Left = 20, Right = -8
Left = 19, Right = -8
Left = 18, Right = -8
Left = 17, Right = -8
Left = 16, Right = -8
Left = 15, Right = -8
Left = 14, Right = -8
Left = 13, Right = -8
Left = 12, Right = -8
Left = 11, Right = -8
Left = 10, Right = -8
Left = 9, Right = -8
Left = 8, Right = -8
Left = 7, Right = -8
Left = 6, Right = -8
Left = 5, Right = -8
Left = 4, Right = -8
Left = 3, Right = -8
Left = 2, Right = -8
Left = 1, Right = -8
Left = 0, Right = -8
Left = -1, Right = -8
Left = -2, Right = -8
Left = -3, Right = -8
Left = -4, Right = -8
Left = -4, Right = -7
Left = -4, Right = -6
Left = -4, Right = -5
Left = -4, Right = -4
Left = -4, Right = -3
Left = -4, Right = -2
Left = -4, Right = -1
Left = -4, Right = 0
Left = -4, Right = 1
Left = -4, Right = 2
Left = -4, Right = 3
Left = -4, Right = 4
Left = -4, Right = 5
Left = -4, Right = 6
Left = -4, Right = 7
Left = -4, Right = 8
Left = -4, Right = 9
Left = -4, Right = 10
Left = -4, Right = 11
Left = -4, Right = 10
Left = -4, Right = 11
Left = -4, Right = 12
Left = -4, Right = 13
Left = -4, Right = 14
Left = -4, Right = 13
Left = -4, Right = 14
Left = -4, Right = 15
Left = -4, Right = 16


À gauche (14, 15),  newLeft s'incrémente correctement. À droite (22, 23), newRight  s'incrémente correctement

Désolé pour les mauvaises données précédentes dues aux mauvais branchements !

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

Go Up