Go Down

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

LamiRene

Sep 01, 2014, 10:33 am Last Edit: Sep 04, 2014, 03:05 pm by LamiRene Reason: 1
Bonjour,

J'utilise des encodeurs EC11, mais ils fonctionnent imprévisible ! Je tourne pour augmenté et une fois sur trois ils reculent, une fois ils avancent et une autre fois ils ne font rien, c'est aléatoire et pas très utile !

Est-ce la bonne manière de les brancher :




Pour référence technique :

http://www.dx.com/fr/p/rotary-encoder-dode-switch-ec11-audio-digital-potentiometer-green-silver-2-pcs-275658

Voir aussi le fichier Fritzing en pièce jointe.

Merci d'avance pour votre aide !

L'ami René
Tous pour un et un pour tous !
Message modifier pour ajouter les images en pièces jointes.
Tous pour un et un pour tous !

JMe87

Bonjour,
Si tu veux de l'aide il faut publier un shema et une copie de ton code. Sans cela, il faut des dons de voyant pour t'aider.
Un fichier fzz n'est PAS un shema.
Jacques

LamiRene

Bonjour JMe87,

Ma question était plus simple, mais voici :



Est-ce que le montage Fritzing correspond à ce schéma ?

Voir l'archive en pièce jointe pour le code source Arduino (que pour les braves).

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

JMe87

Rene,
Permet moi de te faire remarquer que c'est une question de savoir vivre. Quand on vient sur un forum pour demander de l'aide, il est de bon ton de simplifier au maximum le travail des benevoles auxquels tu fais appel.
- une publicite DX n'est pas un document technique
- je n'ai pas Fritzing installe, crois tu que je vais l'installer pour lire ton fichier
- tu parles de "ce shema" qu'il faut comparer au fichier Fritzing, je ne vois rien a comparer
- tu places en piece jointe un fichier zip qu'il faut charger, dezipper puis ouvrir dans un editeur pour pouvoir le lire!! Ce forum supporte l'inclusion de code et de photos. Utilises ces possibilites.

Comme il a deja ete dit a maintes reprise sur ce forum, un shema a la main sur une feuille de papier que tu scannes ou photographies est beaucoup plus explicite qu'un cablage type Fritzing.
De meme une photo de ton montage peux nous apprendre beaucoup de choses.

Au plaisir de te lire

Jacques

fdufnews

Les encodeurs sont gérés par polling alors que la boucle principale est quand même relativement chargée avec la gestion de l'affichage. Donc il est fort probable que tu rates des événements de temps en temps et que du coup ta fonction n'échantillonne pas les entrées au bon moment faisant croire à un changement du sens de rotation.
Je pense qu'il faudrait sérieusement envisager une gestion par interruption. Il y a 6 interruptions disponibles sur la 2560.
Dans les portions critiques de code, essaies aussi de remplacer les digitalRead() par leur équivalent de la librairie digitalWriteFast. Cette librairie permet des accès directs au port au lieu de la "cuisine" assez lourde qui se cache derrière les fonctions standards de la librairie Arduino.

Autrement, ton code est volumineux et très dense ce qui le rend difficile à lire. Il gagnerait à être découpé en modules. En particulier, la fonction RecevoirDonneesX_Plane qui fait près de 1000 lignes. Il y a par exemple un bloc de lignes, utilisé pour la mise en forme de l'affichage des nombres, qui se répète de nombreuse fois. Ce serait facile d'en faire une fonction.

A de nombreux endroit, tu utilises des flottants pour coder des états discrets que tu identifies ensuite par des tests d'égalité strictes.
Comme cette partie de code par exemple:
Code: [Select]
        Autopilot_Modes_Altitude_Valeur = TemponComUDP.ValeurFormat1Float;
        if (Autopilot_Modes_Altitude_Ancien != Autopilot_Modes_Altitude_Valeur)
        {
          Autopilot_Modes_Altitude_Ancien = Autopilot_Modes_Altitude_Valeur;
          LCD_2.setCursor (18, 2);
          if (Autopilot_Modes_Altitude_Valeur == 0.0)
          {
            LCD_2.print ("O");
          }
          else if (Autopilot_Modes_Altitude_Valeur == 1.0)
          {
            LCD_2.print ("F");
          }
          else if (Autopilot_Modes_Altitude_Valeur == 2.0)
          {
            LCD_2.print ("/");
          }
          else if (Autopilot_Modes_Altitude_Valeur == 3.0)

Cela pose 2 problèmes:

  • la gestion des flottants est très coûteuse en temps CPU sur une cible 8 bits comme la famille ATmega

  • les tests d'égalité stricte sur les flottants ne fonctionnent pas toujours bien du fait que l'encodage des flottants donne des fois des résultats du style 1.999999 au lieu du 2.0 attendu


Pour simplifier ton code et gagner du temps tu devrais peut être faire ça:
Passer la variable Autopilot_Modes_Altitude_Valeur  en byte et ensuite
Code: [Select]
        Autopilot_Modes_Altitude_Valeur = (byte) TemponComUDP.ValeurFormat1Float;  // il y a peut être une méthode plus adaptée ici
        if (Autopilot_Modes_Altitude_Ancien != Autopilot_Modes_Altitude_Valeur)
        {
          Autopilot_Modes_Altitude_Ancien = Autopilot_Modes_Altitude_Valeur;
          LCD_2.setCursor (18, 2);
          if (Autopilot_Modes_Altitude_Valeur == 0)
          {
            LCD_2.print ("O");
          }
          else if (Autopilot_Modes_Altitude_Valeur == 1)
          {
            LCD_2.print ("F");
          }
          else if (Autopilot_Modes_Altitude_Valeur == 2)
          {
            LCD_2.print ("/");
          }
          else if (Autopilot_Modes_Altitude_Valeur == 3)

voir même simplifier encore un peu plus en remplaçant la suite de if par un switch... case.

LamiRene

Bonjour fdufnews,

Un très grand merci pour votre aide, j'apprécie grandement tous vos commentaires et suggestions !

J'en déduis que le montage Fritzing du circuit sur la planche d'expérimentation correspond bien au schéma électrique de mon second message ?

Donc, mon problème ne serait pas du côte du circuit, mais du code. Je vais applique le plus possible vos recommandations, mais pour ce qui est des interruptions, je n'y connais rien. Auriez-vous une référence (lien Internet) francophone avec des exemples de code source Arduino pour que je m'y initie ?

Quote

...
Les encodeurs sont gérés par polling alors que la boucle principale est quand même relativement chargée avec la gestion de l'affichage. Donc il est fort probable que tu rates des événements de temps en temps et que du coup ta fonction n'échantillonne pas les entrées au bon moment faisant croire à un changement du sens de rotation.
...


Une passe complète prend entre 65 et 80 millisecondes selon l'utilisation des encodeurs et de la télécommande.

J'utilise déjà 4 encodeurs, donc 8 broches et il n'y a que 6 "interruptions", je présume que je pourrais passer le signal des 8 broches à une seule interruption ?

Quote

...
essaies aussi de remplacer les digitalRead() par leur équivalent de la librairie digitalWriteFast.
...


Je regarde ça de suite.

Quote

...
Autrement, ton code est volumineux et très dense ce qui le rend difficile à lire. Il gagnerait à être découpé en modules. En particulier, la fonction RecevoirDonneesX_Plane qui fait près de 1000 lignes. Il y a par exemple un bloc de lignes, utilisé pour la mise en forme de l'affichage des nombres, qui se répète de nombreuse fois. Ce serait facile d'en faire une fonction.
...


Remarque et suggestion pertinentes. Mon code n'est qu'en phase brouillon et tests des solutions, et une fonction qui traiterait tous les cas serait une usine à gaz, mais pour le traitement et positionnement à droite des unités, dizaines, centaines, milliers et dix milliers, c'est une très bonne idée.

Je regarde ça de suite.

Quote

...
A de nombreux endroit, tu utilises des flottants pour coder des états discrets que tu identifies ensuite par des tests d'égalité strictes.
...


Remarque et suggestion pertinentes. Bonne idée et merci pour l'exemple de code. Je regarde ça de suite.

Quote

...
voir même simplifier encore un peu plus en remplaçant la suite de if par un switch... case.
...


Remarque et suggestion pertinentes. Bonne idée. Je regarde ça de suite.

Donc, j'ai du boulot qui m'attend !

Je ne pensais pas que ma question sur le montage du circuit mènerait tout de suite au code source et je tiens à vous souligner toute ma reconnaissance pour votre aide !

Merci !

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

fdufnews


J'en déduis que le montage Fritzing du circuit sur la planche d'expérimentation correspond bien au schéma électrique de mon second message ?

Pour le montage je ne peux pas me prononcer je n'utilise pas Fritzing.
Personnellement, je ne suis pas très fan de cet outil et je préfère travailler avec une saisie de schéma. Question d'habitude.
Une copie d'écran de Fritzing permettrait déjà à tous de voir le montage.


Je vais applique le plus possible vos recommandations, mais pour ce qui est des interruptions, je n'y connais rien. Auriez-vous une référence (lien Internet) francophone avec des exemples de code source Arduino pour que je m'y initie ?

On peut ne câbler qu'une des 2 broches de l'encodeur sur une entrée d'interruption. Il y a évidemment une résolution moindre. Est-ce un problème?
Pour la référence, personnellement, je me base sur le playground Arduino. Mais il n'est pas ne français cependant l'utilisation de Google translate permet de comprendre les explications.

JMe87

Bonjour,
Rene, les photos que tu crois poster dans ton 1er et second message et que tu nous demandes de comparer ne sont pas visibles.
Tu nous envoies sur un site d'un simulateur de vol X-plane qui n'est pas, a ma connaissance, un hebergeur de photos.

Extraits des codes sources des messages :
1er message : http://www.x-plane.fr/attachment.php?attachmentid=10293&d=1409559877
2eme message : http://www.x-plane.fr/attachment.php?attachmentid=10294&d=1409562553

Essai avec Firefox et Chrome rien de visible a l'ecran, acces direct a la photo donne une photo de 1 pixel.

Jacques

N.B.: j'ai laisse volontairement les liens http en texte pour qu'ils soient lisibles.

Artouste


...
On peut ne câbler qu'une des 2 broches de l'encodeur sur une entrée d'interruption. Il y a évidemment une résolution moindre. Est-ce un problème?


bonjour
avec les encodeurs en quadratures , il faut cerner le besoin :
entre un A/B 1024 points "au cul" d'un moteur pouvant atteindre des grandes vitesses de rotation et un "bouton" de 16 points sollicité au max à ~ 1t/seconde l'approche n'est pas la meme.

la lib http://www.pjrc.com/teensy/td_libs_Encoder.html

propose une bonne approche entre tout,un peu d'interrupt et que du polling.
le polling pour de la simple "commande" est souvent viable , mais à la condition que le plus grand temps de boucle soit  faible pour ne louper aucun changement d'etat des A/B pour ne pas engendrer du comportement erratique  8)

LamiRene



J'en déduis que le montage Fritzing du circuit sur la planche d'expérimentation correspond bien au schéma électrique de mon second message ?


Pour le montage je ne peux pas me prononcer je n'utilise pas Fritzing.
...
Une copie d'écran de Fritzing permettrait déjà à tous de voir le montage.


Bonjour à tous,

Il semble y avoir un problème avec les images de mes messages et cela expliquerait certains de vos commentaires qui m'étaient incompréhensibles.

Je suis sous Linux Kubuntu 14.04 64 bits et j'utilise le navigateur Mozilla Firefox version 31.0 Canonical 1.0 et pour moi l'affiche de mes images est parfaite ici sur le forum arduino.cc (la première fait même toute la largeur de la page et le schéma 1/3 de la page). Je ne me doutais pas qu'il y avait un problème de ce côté-là.


...
Tu nous envoies sur un site d'un simulateur de vol X-plane qui n'est pas, a ma connaissance, un hebergeur de photos.

Extraits des codes sources des messages :
1er message : http://www.x-plane.fr/attachment.php?attachmentid=10293&d=1409559877
2eme message : http://www.x-plane.fr/attachment.php?attachmentid=10294&d=1409562553

Essai avec Firefox et Chrome rien de visible a l'ecran, acces direct a la photo donne une photo de 1 pixel.

Jacques

N.B.: j'ai laisse volontairement les liens http en texte pour qu'ils soient lisibles.


Il se peut que je n'est pas de problème pour l'affichage du fait que je suis membre du site hébergent les images.

Pour la petite histoire concernant mes problèmes d'encodeur, c'est que je suis à construire un cockpit maison pour le simulateur de vol X-Plane 10. Dans le forum de X-Plane, j'y discute beaucoup de question d'échange de données entre le simulateur et une carte Ethernet sur Arduino Mega R3. Mais je pensais plus judicieux de posé ma question sur les encodeurs ici, car je pensais que le problème était plus un sujet d'électronique que de logiciel.

Vous, comment procédez-vous pour ajouter des images ici (un hyperlien explicatif pour la méthode que je devrais utilisé ici, si possible) ?

Je réessaie ici d'afficher mes images par pièces jointes.

1) Montage Fritzing
2) Schéma du circuit

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

LamiRene

Rebonjour à tous,

Avant que je réoublie, un très grand merci pour votre aide à tous !


...
On peut ne câbler qu'une des 2 broches de l'encodeur sur une entrée d'interruption. Il y a évidemment une résolution moindre. Est-ce un problème?
...


Les encodeurs sont de 20 pas par tour de 360° et sont pour contrôler le pilote automatique (PA) et les fréquences des radios balises ou des communications dans le simulateur. Par exemple le PA de l'altitude de l'avion ou sa vitesse, etc. Donc pas critique de manquer un pas, mais qu'ils soient au moins cohérents; 1, 2, ou 3 pas dans le sens horaire, c'est un de plus, pas peut-être un pas de moins, etc.

« une résolution moindre. Est-ce un problème? », je pense que non vu l'utilisation. Êtes-vous du même avis ?

Je vois que pour un Mega 2560 R3, il y a 6 interruptions comme vous l'indiquiez : « External Interrupts: 2 (interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4), 20 (interrupt 3), and 21 (interrupt 2). ». Référence : http://arduino.cc/en/Main/ArduinoBoardMega2560

Merci pour l'aide et les conseils.

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

LamiRene



...
On peut ne câbler qu'une des 2 broches de l'encodeur sur une entrée d'interruption. Il y a évidemment une résolution moindre. Est-ce un problème?
...

...
la lib http://www.pjrc.com/teensy/td_libs_Encoder.html

propose une bonne approche entre tout,un peu d'interrupt et que du polling.
le polling pour de la simple "commande" est souvent viable , mais à la condition que le plus grand temps de boucle soit  faible pour ne louper aucun changement d'etat des A/B pour ne pas engendrer du comportement erratique  8)


Bonjour Artouste,

Pour le lien, la présentation (mise-en-page) est sobre et claire. De plus, l'anglais écrit semble aussi sobre et clair, car la traduction automatique donne le même type de résultat,  sobre et clair.

Merci !

Dans un autre ordre d'idée et pour information générale, dans mon cas, une boucle complète (le loop ()) prend entre 60 et 85 millisecondes et cela rend la lecture des encodeurs aléatoire comme les résultats de lecture. Donc pour information, 60 millisecondes c'est trop long pour du "polling" !

Est-ce qu'une personne dans la sale c'est qu'elle est la latence maximale admissible pour du "polling" avant perte de la cohérence des lectures d'encodeurs sur Arduino ?

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

LamiRene

Rebonjour,

J'ai installé la bibliothèque « Encoder » suggérée par fdufnews et avec l'exemple « Basic.ino » qui utilise deux interruptions (dans mon cas broche 2 et 3) c'est d'une magnifique précision. Pour chaque pas sur l'encodeur, j'ai quatre changements d'état et une incrémentation de 4 pour le compteur « newPos ». Là, je ne manque plus rien ! Super !

Cela demande deux broches d'interruptions sur les six qu'il y a sur une carte Arduino Mega et j'utilise déjà quatre encodeurs dans mon cockpit et deux autres ne seraient pas de trop.

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

Dans les autres exemples de la bibliothèque, je ne trouve rien qui corrige le problème !?!

Qu'est-ce que je fais de pas correcte ?

En voici ma version francisée :

Code: [Select]

#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 = 2;
const byte ENCODEUR_1_SORTIE_B = 4;
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);
  }
}


Merci d'avance pour vos lumières !

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

fdufnews

#13
Sep 03, 2014, 08:57 am Last Edit: Sep 03, 2014, 09:04 am by fdufnews 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.

Artouste


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

Go Up