Problèmes d'encodeur EC11

Bonjour Artouste,

Artouste:

LamiRene:
...
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 :grin:

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

Je ne suis pas le seul ici à demander si la bibliothèque « Encoder » : Encoder Library, for Measuring Quadarature Encoded Position or Rotation Signals 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.

Artouste:
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 !

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 !

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.

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.

JMe87:
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 :

/* 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.

JMe87:
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 :wink:
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 !

Basic.zip (820 Bytes)

je n'ai pas de quoi tester aujourd'hui
mais essaye ça (tu affecte les pins que tu veux)

/* 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);
  }
}

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 :

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

Et en sortie, ça donne cela :

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 :

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

Et en sortie, ça donne cela :

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 :

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

Et en sortie, ça donne cela :

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é

bonjour

avec le code proposé et l'option no interrupt commentée

//#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 :grin:

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

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 :

/* 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 :

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é

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" :grin:
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

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 :

Artouste:
...

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 !?!

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é

Artouste:

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" :grin:
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é

Bonjour a tous,
Un peu de lecture : Gammon Forum : Electronics : Microprocessors : Interrupts
tres complet et tres instructif
Par exemple : duree minimale d'une int sans rien faire dedans : 5,2uS a 16MHz

Encore de la lecture : Multiple rotary encoders - Page 1
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 :

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

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é

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

JMe87:
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.

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é

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é

Attiny25 convient evidemment pour une application aussi simple.

Haifger, il n'est pas indispensable de remplir un micro completement :wink:
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

LamiRene:
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" !

:grin:
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" :grin: je verrais bien un MCU pour 4 encodeurs , mais ... ça ... ça se discute , calmement 8)

JMe87:
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 ! :stuck_out_tongue:

Finalement, merci pour tout !

L'ami René

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é

Bonjour,
Le 85 est un 8 pins, ok pour cette application
Le 84 est un 14 pins, de trop si tu pars sur un micro par encodeur
De 861 n'est pas supporte par defaut par arduino. Problemes garantis.
http://playground.arduino.cc/Main/ArduinoOnOtherAtmelChips

Personnellement, c'est le genre de truc que je commande sur Ebay, toujours tres satisfait, frais de port gratuit. Seul probleme le delai. Si tu es presse, je peux t'expedier 1 ou 2 pieces pour tes essais.
Jacques