Go Down

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

Artouste

#30
Sep 04, 2014, 12:10 pm Last Edit: Sep 04, 2014, 02:34 pm by Artouste Reason: 1
bonjour

avec le code proposé et l'option  no interrupt commentée
Code: [Select]
//#define ENCODER_DO_NOT_USE_INTERRUPTS
sur uno avec un encodeur basique (photo) et en testant  les options
-1 encodeur tout interrupt , l'autre en polling
- encodeurs avec une interrupt chacun
- 1 encodeur avec une interrup, l'autre en polling
- encodeurs en polling

j'obtiens les resultats escomptés sans probleme pour les # cas testés.

je n'ai pas de mega , mais je doute que ce soit là ton probleme

edit : par acquis de conscience , j'ai fais les tests avec la librarie rechargée (telechargement du jour)



pour qu'il n'y ai pas d'ambiguité , pour les manips
je n'utilise qu'un encodeur , je duplique juste les sorties de contacts selon les configs
en permutant les canaux , lorsqu'un compte , l'autre decompte  :smiley-mr-green:


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






LamiRene

Bonjour,

Bon, je viens de mettre à jour les données de mon dernier message d'hier avec cette fois les bons branchements et les vrais résultats (Réf.) :

http://forum.arduino.cc/index.php?topic=264297.msg1867882#msg1867882

Maintenant, pour simuler le même code source intégré dans mon programme de cockpit maison pour le simulateur de vol X-Plane 10, je reprends la dernière configuration des broches sans broche d'interruption Arduino et j'ajoute une latence équivalente à ce que j'ai mesuré pour une boucle « loop () ». Pour cela, je ne fais qu'ajouter à la fin du code de Artouste un délai « delay (80); ».

En voici tout le code :

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(14, 15);
Encoder knobRight(22, 23);
//   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);
  }
  delay (80);
}


Et je teste à tour de rôle, une dizaine de clics à droite avec les deux encodeurs, puis une dizaine de clics à gauche avec encore les deux encodeurs :

Et en sortie, ça donne cela :

Quote

TwoKnobs Encoder Test:
Left = 0, Right = 0
Left = -1, Right = 0
Left = 0, Right = 0
Left = -2, Right = 0
Left = -4, Right = 0
Left = -3, Right = 0
Left = -2, Right = 0
Left = -1, Right = 0
Left = -2, Right = 0
Left = -3, Right = 0
Left = -3, Right = 2
Left = -3, Right = 1
Left = -3, Right = 0
Left = -1, Right = 0
Left = -2, Right = 0
Left = -1, Right = 0
Left = -2, Right = 0
Left = -4, Right = 0
Left = -5, Right = 0
Left = -3, Right = 0
Left = -1, Right = 0
Left = -2, Right = 0
Left = -2, Right = 1
Left = -2, Right = 0
Left = -2, Right = 2
Left = -2, Right = 3
Left = -2, Right = 2
Left = -2, Right = 4
Left = -2, Right = 5
Left = -2, Right = 4


Et c'est exactement ce que je rencontre dans mon code actuel sans la bibliothèque « Encoder ».

Pour rappel, c'est ce type de résultats d'encodeurs qui m'ont amené a lancer ce fils de discussion.

Pour faire le point de la situation, dans mon code actuel, j'ai des résultats parfaite avec la bibliothèque « Encoder », mais seulement avec deux encodeurs qui utilise chacun deux broches d'interruption Arduino (Encodeur_1  broche d'interruption 2 et 3, Encodeur_2 broche d'interruption 18 et 19).

Mais comme démontré, pour l'encodeur 3 (Encodeur_3  broche d'interruption 20 et 21) il n'y a pas de réaction à la lecture de l'encodeur, et j'ai testé sur deux cartes Arduino Mega R3 différentes.

Donc, que deux encodeurs utilisable, pour 6 broches d'interruptions utilisées, mais les besoins est au minimum l'utilisation de 6 encodeurs parfaitement fonctionnels.

Voilà pour ce qui est du point sur la situation.

Un grand merci à tous ceux qui participent à ce fils de discussion et y apportent leur contribution !

Toute hypothèse de solution est la bien venue, mais je voudrais éviter d'utiliser une autre carte à la place de la Mega ou en plus de la Mega.

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

Artouste


... équivalente à ce que j'ai mesuré pour une boucle « loop () ». Pour cela, je ne fais qu'ajouter à la fin du code de Artouste un délai « delay (80); ».



Là faut que j'aille à "la cabane à suc"  :smiley-mr-green:
Mais AMHA et d'instinct 80 ms de temps de boucle c'est enorme pour faire (ou surtout louper) de la transition en simple polling

LamiRene

Bonjour Artouste,

Merci de te donner tant d'ouvrage pour la résolution du problème, je l'apprécie grandement !

Très intéressent les résultats de ton dernier test :


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

...


Il n'y a pas exactitude dans la lecture !?!

Quote

TwoKnobs Encoder Test:
Left = 0, Right = 0
Left = -1, Right = 1
Left = -1, Right = 2
...


Elle est explicable cette inexactitude ?

Encore un grand merci !

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

LamiRene



... équivalente à ce que j'ai mesuré pour une boucle « loop () ». Pour cela, je ne fais qu'ajouter à la fin du code de Artouste un délai « delay (80); ».


Là faut que j'aille à "la cabane à suc"  :smiley-mr-green:
Mais AMHA et d'instinct 80 ms de temps de boucle c'est enorme pour faire (ou surtout louper) de la transition en simple polling



Pour faire "louper" de la transition en simple polling qui est-ce qui se produit dans le code de mon cockpit de simulateur.

Bonne "cabane à suc" !

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

JMe87

Bonjour a tous,
Un peu de lecture : http://www.gammon.com.au/forum/?id=11488
tres complet et tres instructif
Par exemple : duree minimale d'une int sans rien faire dedans :  5,2uS a 16MHz

Encore de la lecture : http://www.eevblog.com/forum/projects/multiple-rotary-encoders/
avec la possibilite emise, en theorie, d'utiliser 12 rotary.

Sur le forum Arduino.cc, j'ai lu ici :
http://forum.arduino.cc/index.php?topic=125304.msg943543#msg943543
ceci :
Quote
Take a look at LS7184
http://www.omnipro.net/lsi-csi/LS7184
Connect rotary encoder to it, chip outputs pulses and a direction line.


C'est un petit circuit integre (cher) que l'on place entre un encodeur optique ou magnetique et un Micro.
Cela m'a donne l'idee d'utiliser un  Attiny85 sur chaque encodeur.
En entree : les 2 fils de l'encodeur
En sortie : une impulsion d'interruption. Je cable toutes ces impulsions vers une seule entree INT du Mega au travers de diodes (OU cable).
Il me sort aussi une impulsion d'une duree a definir sur 2 pins INC ou DEC.
Total des pins utilisees sur le Mega : 1 INT + 2 x nombre d'encodeurs
Quand le micro recoit une impulsion, il va lire un ou 2 ports et identifie facilement la pin active. Apres le delai defini dans l'Attiny85, tout retourne a l'etat initial.

Dont cout : +/- 1,20 € par encodeur

Au plaisir de lire vos reactions

Jacques

LamiRene

Bonjour Jacques,

Merci pour ton aide !

Ça, c'est une alternative très intéressante !


Est-ce que tu pourrais nous mettre des images de ton montage et des exemples de ton code source pour nous initier à la chose, un mini mini tuto  ?

En passant, tu fais d'une pierre, deux coups, car cela donne en plus, l'idée générale de faire faire le traitement des signaux des encodeurs par autre chose que l'Arduino et de ne récupérer que les plus et les moins des changements de l'encodeur. Ça, c'est très bien vu. Super !

Reste le détail de comment le faire dans le concret et le pratico-pratique (en français, je suis unilingue francophone...) !

Encore merci !

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

JMe87

Ce n'est pas une realisation personnelle, c'est une idee.
J'ai utilise ce micro pour faire une alarme de porte ouverte pour un frigo.
C'est tres facile a faire sous Arduino.
Et cela se programme avec n'importe quel Arduino et quelques fils.
Mode d'emploi en francais, la c'est une autre histoire.
La langue vehiculaire de l'electronique / informatique c'est l'anglais !!

Fais une recherche sur Google pour avoir des exemples, il y en a une foultitude. Il y en a aussi sur youtube.

Jacques

haifger


Cela m'a donne l'idee d'utiliser un  Attiny85 sur chaque encodeur.
En entree : les 2 fils de l'encodeur
En sortie : une impulsion d'interruption. Je cable toutes ces impulsions vers une seule entree INT du Mega au travers de diodes (OU cable).
Il me sort aussi une impulsion d'une duree a definir sur 2 pins INC ou DEC.
Total des pins utilisees sur le Mega : 1 INT + 2 x nombre d'encodeurs
Quand le micro recoit une impulsion, il va lire un ou 2 ports et identifie facilement la pin active. Apres le delai defini dans l'Attiny85, tout retourne a l'etat initial.

Dont cout : +/- 1,20 € par encodeur

Je ne suis pas certain d'avoir compris ce que tu souhaites faire. Une seule bascule D permet déjà de décoder les deux signaux en quadrature pour les transformer en un signal donnant les impulsions et un autre indiquant le sens de rotation. Un 74HC74 ça doit coûter dans les 30 centimes et permet de gérer 2 encodeurs.

Là ton microcontrôleur risque d'être vraiment sous-utilisé. Tant qu'à faire de partir dans cette direction, j'irai encore plus loin, en lui faisant faire le compte par lui-même des impulsions reçues (3 dans un sens, 2 dans l'autre, etc) et en le reliant au microcontrôleur principal par I2C ou SPI. De cette manière le master l'interroge à chaque fois qu'il a le temps et reçoit les données directement pré-calculées, sans avoir à traiter le signal par lui-même.

Mais même comme ça je craint qu'il soit encore sous-utilisé et que le coût n'en vaille pas vraiment la peine. Ou alors peut-être en  adjoignant à l'AtTiny85 un multiplexeur pour lui permettre de décoder "plein" d'encodeurs en même temps.

LamiRene

Bonjour haifger,

Merci pour votre aide !

Votre dernier exemple est  exactement ce don j'ai besoin !

J'aurais une douzaine d'encodeurs a gérer, mais pour intégrer cette solution, j'aurais besoin d'un coaching pour implanter cette solution. Est-ce que vous seriez disponible dans ce sens ?

Mon principal problème est que je suis unilingue francophone, ce qui me limite beaucoup dans la compréhension des documents technique en anglais.

Ou, avez un hyperlien vers une bonne documentation française d'un montage et code source Arduino Attiny encodeurs qui va dans le sens de mon projet ?

Encore merci !

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

LamiRene

Rebonjour Jacques,

Avec l'IDE Arduino, on peut programmer ces petites puces pour collaborer avec un Arduino Mega ?

L'idée que oui est emballante !

À la place des Attiny85, est-ce qu'un  ATTINY25-20PU ferait le travail ?

Je dois commander à coups de 20 unités pour des  ATTINY25-20PU, mais à 50 unités pour des  ATTINY85-20PU.

http://www.futureelectronics.com/fr/technologies/semiconductors/microcontrollers/8-bit/Pages/7038205-ATTINY85-20PU.aspx
http://www.futureelectronics.com/fr/technologies/semiconductors/microcontrollers/8-bit/Pages/1038206-ATTINY25-20PU.aspx

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

JMe87

Attiny25 convient evidemment pour une application aussi simple.

Haifger, il n'est pas indispensable de remplir un micro completement ;-)
Ceci me semble une bonne occasion d'apprendre l'utilisation d'une nouvelle technologie. Ce n'est pas comme s'il devait fabriquer 10000 pieces!

Rene, il ne faut pas rever, tu ne vas trouver nulle part, en francais qui plus est, une description complete d'une idee que je viens d'avoir en faisant une recherche sur Google.

Encore une fois, le but de ce forum c'est d'aider les debutants a s'en sortir. Pas a leur macher le boulot.

Une petite citation comme tu les aimes : aide-toi, le ciel t'aidera

Artouste



Pour faire "louper" de la transition en simple polling qui est-ce qui se produit dans le code de mon cockpit de simulateur.

Bonne "cabane à suc" !



:smiley-mr-green:
Pour resumer ton probleme , tu veux "gerer" 12 encodeurs ?  (simples ? = sans contacts autres que les canaux A/B)

passer  par un exterieur dedié +/- modulaire , solutions proposées par haifger et JMe87 est surement une bonne voie

sur du polling simple pour un capteur avec l'exemple , il suffit de voir/verifier que le simple fait de passer le serial de 9600 à 115200 permet d'obtenir (par comparaison avec du tout interrupt pour le  capteur "de reference"  )  des vitesses "de rotation" encodeur polling beaucoup plus elevées (avant que le capteur polling parte dans les choux avec ce simple exemple)

Apres , passer sur du modulaire 1/1 ou 1/X selon le MCU "dedié à la tache" demande de bien reflechir à l'interfaçage.

Intellectuellement à chaud , pour "plein de raisons"   :smiley-mr-green:   je verrais bien un MCU pour 4 encodeurs , mais ... ça ... ça se discute , calmement   8)



LamiRene


Attiny25 convient evidemment pour une application aussi simple.
...
Ceci me semble une bonne occasion d'apprendre l'utilisation d'une nouvelle technologie. Ce n'est pas comme s'il devait fabriquer 10000 pieces!
...
Encore une fois, le but de ce forum c'est d'aider les debutants a s'en sortir. Pas a leur macher le boulot.
...
Une petite citation comme tu les aimes : aide-toi, le ciel t'aidera


Bonjour JMe87,

Merci pour la confirmation et la citation !  :P

Finalement, merci pour tout !

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

LamiRene

Bonjour,

Je vais ouvrir un compte chez un autre fournisseur ou les produits peuvent être commandés à l'unité et j'ai les trois choix suivants :

ATTINY85-20PU, 6 x  I/O pour 1.99 $CAD
ATTINY84A-PU, 12 x  I/O pour 2.12 $CAD
ATTINY861A-PU, 16 x  I/O pour 2.99 $CAD

Alors entre 1.99 et 2.99 avec 8 $CAD de frais de livraison, j'irais pour le ATTINY861A-PU s'il ne pose pas de problème comparé aux deux autres.

Vous en pensez quoi ?

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

Go Up