Arduino Forum

International => Français => Topic started by: LamiRene on Sep 01, 2014, 10:33 am

Title: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 01, 2014, 10:33 am
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 (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.
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 01, 2014, 10:40 am
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
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 01, 2014, 11:15 am
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 !
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 01, 2014, 12:17 pm
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
Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 01, 2014, 01:02 pm
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:

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.
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 01, 2014, 10:01 pm
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 !
Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 02, 2014, 09:16 am

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 (http://playground.arduino.cc/Main/RotaryEncoders). Mais il n'est pas ne français cependant l'utilisation de Google translate permet de comprendre les explications.
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 02, 2014, 10:43 am
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.
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 02, 2014, 01:57 pm

...
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)
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 03, 2014, 01:38 am


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 !
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 03, 2014, 02:46 am
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 (http://arduino.cc/en/Main/ArduinoBoardMega2560)

Merci pour l'aide et les conseils.

L'ami René
Tous pour un et un pour tous !
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 03, 2014, 03:33 am


...
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 !
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 03, 2014, 05:35 am
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 !
Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 03, 2014, 08:57 am
Peut être cette librairie qui utilise n'importe quelle entrée pour gérer les encodeurs http://code.google.com/p/adaencoder/ (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.
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 03, 2014, 10:36 am

...
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 (http://forum.arduino.cc/index.php?topic=231757.msg1671384#msg1671384)
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 03, 2014, 10:47 am
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 !
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 03, 2014, 10:53 am

Peut être cette librairie qui utilise n'importe quelle entrée pour gérer les encodeurs http://code.google.com/p/adaencoder/ (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 !
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 03, 2014, 11:18 am
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 !
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 03, 2014, 11:54 am


...
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 (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 !
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 03, 2014, 12:14 pm
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
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 03, 2014, 01:16 pm

...

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
Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 03, 2014, 01:45 pm


Peut être cette librairie qui utilise n'importe quelle entrée pour gérer les encodeurs http://code.google.com/p/adaencoder/ (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.
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 03, 2014, 01:48 pm
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 !
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 03, 2014, 01:56 pm
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 !
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 03, 2014, 02:08 pm

...

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 :
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 03, 2014, 02:13 pm
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
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 03, 2014, 06:22 pm
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 (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 !
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 03, 2014, 07:13 pm
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 !
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 03, 2014, 07:27 pm
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);
  }
}
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 04, 2014, 01:15 am
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é
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 04, 2014, 12:10 pm
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





Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 04, 2014, 02:46 pm
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 (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é
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 04, 2014, 02:56 pm

... é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
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 04, 2014, 02:57 pm
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é
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 04, 2014, 03:11 pm


... é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é
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 04, 2014, 05:06 pm
Bonjour a tous,
Un peu de lecture : http://www.gammon.com.au/forum/?id=11488 (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/ (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 (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
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 04, 2014, 05:59 pm
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é
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 04, 2014, 06:28 pm
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
Title: Re: Problèmes d'encodeur EC11
Post by: haifger on Sep 04, 2014, 07:08 pm

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.
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 04, 2014, 07:38 pm
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é
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 04, 2014, 07:53 pm
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/7038205-ATTINY85-20PU.aspx)
http://www.futureelectronics.com/fr/technologies/semiconductors/microcontrollers/8-bit/Pages/1038206-ATTINY25-20PU.aspx (http://www.futureelectronics.com/fr/technologies/semiconductors/microcontrollers/8-bit/Pages/1038206-ATTINY25-20PU.aspx)

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 04, 2014, 08:24 pm
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
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 04, 2014, 08:57 pm


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)


Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 04, 2014, 11:16 pm

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é
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 05, 2014, 02:03 am
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 (http://www.digikey.ca/product-detail/en/ATTINY85-20PU/ATTINY85-20PU-ND/735469)
ATTINY84A-PU, 12 x  I/O pour 2.12 $CAD (http://www.digikey.ca/product-detail/en/ATTINY84A-PU/ATTINY84A-PU-ND/2774082)
ATTINY861A-PU, 16 x  I/O pour 2.99 $CAD (http://www.digikey.ca/product-detail/en/ATTINY861A-PU/ATTINY861A-PU-ND/1914741)

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é
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 05, 2014, 05:10 am
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 (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
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 05, 2014, 02:50 pm
Bonjour Jacques,

Merci encore et toujours pour ton aide !

Je trouvais curieux qu'ici même je ne trouvasse pas de sujet qui mentionnait le ATTINY861A et cela m'a mis la puce à l'oreille. De plus, dans un fichier texte vu je ne me souviens plus ou, qui listait les CI ATTINY supportés il n'y avait pas le "ATTINY86".

Alors mon hypothèse était soit le ATTINY861A était très très récent, soit il y avait un problème avec cette puce.

Je pensais plus a utiliser le moins de circuits intégrés que possible pour minimiser le câblage le plus possible, car l'arrière du tableau de bord de cockpit ressemble déjà à une assiette de spaghetti. Il faut être très méticuleux pour aller y jouer. Comme je devrais dédier les ATTINY aux encodeurs pour évité les latences dans la lecture, plus un CI peut recevoir d'encodeurs, mieux cela sera. On utilise pas deux encodeurs en même temps ! L'idéal serait un CI pour tous les encodeurs.

Alors dommage pour le ATTINY861A, pour son nombre de branchements, il était le meilleur candidat !

J'apprécie grandement ton offre de m'expédier une ou deux pièces ! Comme il y a des chances qu'une commande passée chez mon nouveau fournisseur aujourd'hui ou lundi prochain arrive en même temps que ton envoi, c'est probablement inutile. Mes les conseille eux sont inestimable et important avant mes achats !

Merci pour tout !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 05, 2014, 03:12 pm

...
Je pensais plus a utiliser le moins de circuits intégrés que possible pour minimiser le câblage le plus possible, car l'arrière du tableau de bord de cockpit ressemble déjà à une assiette de spaghetti.


Bonjour
envisage aussi l'eventualité d'une modularité plus grande  8)

NB et en preambule : je n'ai pas verifié si cela rentre ou pourrait rentrer dedans  :smiley-mr-green:

mais dans la mesure où tu  souhaiterais conserver "la facilité" arduino
je regarderais à pouvoir eventuellement utiliser un/des  328P  dediés (facile d'appro, cout brut MCU  , environnement,  dispo en DIP , clock interne possible ,etc  ...)

Je pense à chaud qu'un 328 peut "facilement" gerer avec les libs dispos 4 encodeurs A/B (eventuellement + 1 contact on/off)  et gerer l'info utile à deriver/mettre à dispo  en I²C ,  SPI ou ...  8)



Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 05, 2014, 06:58 pm
personellement, j'utiliserai soit:
- un controleur ou fpga dont toutes les entrées seraient interruptives (mircochip en fait. j'ai plus la ref mais ça gerait 8 codeurs) qui serai dédié a traiter les codeurs, qu'on interface par I²C, SPI, ...
si la prog d'un tel circuit te parait compliqué, tu peut t'orienter vers une solution prés-machée, mais qui a son cout:
http://www.lextronic.fr/P19557-module-microcontrole-mbed.html (http://www.lextronic.fr/P19557-module-microcontrole-mbed.html)

- un ARDUINO DUE, qui devrai faire pouvoir supporter toutes ces IT codeurs sans broncher.
(ce serai d'aileur ma préférence, et faut que j'en commande pour un projet a 4 codeurs, des impulsions, de la com, et plein d'autre choses)
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 05, 2014, 08:20 pm
Oh bonjour Artouste,



...
Je pensais plus a utiliser le moins de circuits intégrés que possible pour minimiser le câblage le plus possible, car l'arrière du tableau de bord de cockpit ressemble déjà à une assiette de spaghetti.

Bonjour
envisage aussi l'eventualité d'une modularité plus grande  8)
...
Je pense à chaud qu'un 328 peut "facilement" gerer avec les libs dispos 4 encodeurs A/B (eventuellement + 1 contact on/off)  et gerer l'info utile à deriver/mettre à dispo  en I²C ,  SPI ou ...  8)


Tu es très inspiré en ce moment et très en harmonie avec la situation, car je me suis procuré le mois dernier deux ATMEGA328-PU pour expérimenter le transfère de chargeur d'amorçage "BootLoader" avec ma carte Uno au cas ou je brulerais une ou des broches de ce dernier. J'aime bien prendre de l'avance et prévenir au cas où.

Si j'ai bien compris, j'ai donc sans le savoir déjà en main, ce qu'il me faut pour décharger la carte Arduino Mega du traitement des signaux des encodeurs. Ça, c'est une très bonne nouvelle !

Merci à ton inspiration !

Il ne me reste plus qu'a trouver la bonne documentation francophone (ou la traduction, si rien n'est disponible en français) pour que j'expérimente la chose.

Encore merci !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 05, 2014, 08:59 pm
Bonjour jean-I,

Merci pour ton aide et tes suggestions !


personellement, j'utiliserai soit:
- un controleur ou fpga dont toutes les entrées seraient interruptives (mircochip en fait. j'ai plus la ref mais ça gerait 8 codeurs) qui serai dédié a traiter les codeurs, qu'on interface par I²C, SPI, ...
si la prog d'un tel circuit te parait compliqué, tu peut t'orienter vers une solution prés-machée, mais qui a son cout:
http://www.lextronic.fr/P19557-module-microcontrole-mbed.html (http://www.lextronic.fr/P19557-module-microcontrole-mbed.html)

- un ARDUINO DUE, qui devrai faire pouvoir supporter toutes ces IT codeurs sans broncher.
(ce serai d'aileur ma préférence, et faut que j'en commande pour un projet a 4 codeurs, des impulsions, de la com, et plein d'autre choses)


Oui, pour les puces Microchip, c'est trop pour moi.

Pour le "mbed", c'est un super produit et il y a quelqu'un de brillant chez NXP, car la présentation technique des broches est très bien structurée, claire et limpide, j'adore ! Si sa programmation passait pas l'IDE Arduino et que de bonnes bibliothèques étaient disponibles, c'est un produit qui capterait toute mon attention. Mais dans mon cahier des charges du projet, il y a que tout soient programmable par l'IDE d'Arduino.

Pour ce qui est de passer au Arduino Due, c'est tentant, mais le prix et le 3.3V me refroidissent. Je jongle déjà avec du 9V et du 5V, alors ajoute le jonglage avec du 3.3V, c'est trop risqué pour cramer des Due et mon portefeuille, vu ma petite tête.

Merci encore !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 05, 2014, 09:58 pm
si j'ai bien compris, tu as 4 encodeurs, voie A et B (pas de Z).
tu veux rester en 5V.
t'as une MEGA2560.

tes codeurs on une resolution de ? (points/tours?), a quelle vitesse?
un codeur 1000pts/tour peut etre geré en x1, x2 et x4 (=1000, 2000 ou 4000 point de resolution)
tolere tu de n'avoir que du x2?

doit tu garder des broches interruptive pour autre chose? combien?

tu as 6 entrées interruptive sur la MEGA (+2 qui sont pas ressortie, sauf erreur - jamais essayé)

en gros, sans aucune lib, le principe (qui marche, deja essayé), tu est capable de gerer 6 codeurs 1/2 interruptifs, et potentielement 8:
Code: [Select]

...
#define pinCodeur1A=2;
#define pinCodeur1B=4;
#define pinCodeur2A=3;
#define pinCodeur2B=5;

volatile int codeur1=0;
volatile int codeur2=0;

attachInterrupt(0, Codeur1A_IT, CHANGE);
attachInterrupt(1, Codeur2A_IT, CHANGE);
....

void Codeur1A_IT() {
 if (digitalRead(pinCodeur1A) == digitalRead(pinCodeur1B)) {
   codeur1++;
 } else {
   codeur1--;
 }

void Codeur2A_IT() {
 if (digitalRead(pinCodeur2A) == digitalRead(pinCodeur2B)) {
   codeur2++;
 } else {
   codeur2--;
 }

//     AB
// 0 : 00
// 1 : 01
// 2 : 11
// 3 : 10



il n'y a que 2 cas ou les voies A et B sont identiques lorsque l'interruption est déclenchée:
1 vers 2 => ++, sinon --
3 vers 0 => ++, sinon --
tu n'est pas en quadrature x4, mais x2, ca peut etre suffisant, avec une entrée IT par codeur.

voir:
http://playground.arduino.cc/Main/RotaryEncoders
Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 05, 2014, 10:21 pm
les 2 manquantes sont INT6 et INT7, sur PE6 et PE7, broche 8 et 9 du controleur.
elles ne ressortent pas de la carte, mais devraient pourvoir etre expoiltée:

extrait de wiring_private.h:
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define EXTERNAL_NUM_INTERRUPTS 8

et Winterrupts.c:
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
 if(interruptNum < EXTERNAL_NUM_INTERRUPTS) {
   intFunc[interruptNum] = userFunc;
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 05, 2014, 10:44 pm
Rebonjour Jean,

Un chaleur merci pour votre aide, que j'apprécie grandement !


si j'ai bien compris, tu as 4 encodeurs, voie A et B (pas de Z).


Oui, et revoici les références :

Codeur Dode Commutateur / EC11 / Audio potentiomètre numérique - vert + Silver (2 PCS) (http://www.dx.com/fr/p/rotary-encoder-dode-switch-ec11-audio-digital-potentiometer-green-silver-2-pcs-275658)
MaiTech manche court 5 broches molette commutateurs - argent (2 PCS) (http://www.dx.com/fr/p/maitech-5-pin-short-handle-rotary-encoder-switches-silver-2-pcs-302050)

Quote

tu veux rester en 5V.


Oui.

Quote

t'as une MEGA2560.


Oui.

Quote

tes codeurs on une resolution de ? (points/tours?).


Ce que je peux dire, c'est 20 clics par 360° de la molette.

Quote

un codeur 1000pts/tour peut etre geré en x2 et x4 (=1000, 2000 ou 4000 point de resolution)
tolere tu de n'avoir que du x2?


J'ai des clics qui produisent habituellement 4 émissions de signaux pour un clic. Ce qui me donne entièrement satisfaction avec le code exemple utilisé et pour les besoins du cockpit. Et le besoin est pour un clic, un plus ou un moins.

Quote

doit tu garder des broches interruptive pour autre chose? combien?


Non, et c'est la première fois que j'utilise cette fonctionnalité.

Quote

tu as 6 entrées interruptive sur la MEGA (+2 qui sont pas ressortie, sauf erreur - jamais essayé)


Oui, 6 entrées interruptives sur la MEGA. Pour le reste de votre phrase, je ne sais pas.

Quote

en gros, sans aucune lib, le principe (qui marche, deja essayé), tu est capable de gerer 6 codeurs 1/2 interruptifs, et potentielement 8:

Code: [Select]

...
#define pinCodeur1A=2;
#define pinCodeur1B=4;
#define pinCodeur2A=3;
#define pinCodeur2B=5;

volatile int codeur1=0;
volatile int codeur2=0;

attachInterrupt(0, Codeur1A_IT, CHANGE);
attachInterrupt(1, Codeur2A_IT, CHANGE);
....

void Codeur1A_IT() {
 if (digitalRead(pinCodeur1A) == digitalRead(pinCodeur1B)) {
   codeur1++;
 } else {
   codeur1--;
 }

void Codeur2A_IT() {
 if (digitalRead(pinCodeur2A) == digitalRead(pinCodeur2B)) {
   codeur2++;
 } else {
   codeur2--;
 }

//     AB
// 0 : 00
// 1 : 01
// 2 : 11
// 3 : 10



il n'y a que 2 cas ou les voies A et B sont identiques lorsque l'interruption est déclenchée:
1 vers 2 => ++, sinon --
3 vers 0 => ++, sinon --
tu n'est pas en quadrature x4, mais x2, ca peut etre suffisant


Ça, c'est une très bonne nouvelle ! Un grand merci pour le code d'exemple, je le teste dès que possible ! J'apprécie beaucoup !

Quote

voir:
http://playground.arduino.cc/Main/RotaryEncoders


Ça, cette page, son contenu et ses liens et avec la traduction automatique, c'est pas gagné et c'est pas de la tarte...

Merci pour tout !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 05, 2014, 10:49 pm

les 2 manquantes sont INT6 et INT7, sur PE6 et PE7, broche 8 et 9 du controleur.
elles ne ressortent pas de la carte, mais devraient pourvoir etre expoiltée:

extrait de wiring_private.h:
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define EXTERNAL_NUM_INTERRUPTS 8

et Winterrupts.c:
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
 if(interruptNum < EXTERNAL_NUM_INTERRUPTS) {
   intFunc[interruptNum] = userFunc;


Je teste aussi dès que possible et reviens avec les constats !

Merci, merci !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 05, 2014, 11:13 pm
Whaou, ça c'est du datasheet: aucune certitude avant d'avoir le produit dans les mains.

20 clics, c'est pas divisible par 4, on suppose donc 20 par tours, sur chacune chacune des 2 voies.
avec mon code, tu devrai donc avoir 40 points a chaque tour codeur.

pour ce qui est des interruption 6 et 7 en broche 8 et 9, faut vraiment en avoir besoin, parce que vu ou il faut aller les chercher, t'as interret a faire une soudure correcte:
http://arduino.cc/en/uploads/Main/arduino-mega2560_R3-sch.pdf

j'essaierai des que j'aurai recupéré quelques heure de sommeil.
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 05, 2014, 11:42 pm
Houait, j'ai déjà vu mieux.

Merci pour les infos... !

Bon sommeil, qu'il soit régénérateur et fortifiant !

A+

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 06, 2014, 12:06 am
Bonjour à tous,

Je devrai partir à la recherche des exemples des codes sources d'un Mega qui communique avec un ATMEGA328-PU enfiché sur une plaque d'expérimentation sans soudure "BreanBoard" pour récupérer les données d'un capteur (ex. : potentiomètre ou encodeur, capteur de température ou de luminosité, etc.). Si j'étais chanceux, ce serait d'un encodeur, mais peu importe, du moment qu'il y a un capteur et la transmission des données du ATMEGA328-PU vers la carte Mega.

Alors, si vous avez déjà vu ça quelque part dans les bibliothèques d'Arduino (standard ou pas) ou sur le Web, ou si vous avec ça sous le coude, J'apprécierais que vous m'en fassiez part, avant, que je parte à sa recherche !

Et merci d'avance !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 06, 2014, 09:14 am
Bonjour Monsieur Jean,

Je ne peux que vous appeler Monsieur Jean, car votre exemple de code ma donné la joie de mon premier vol avec CINQ encodeurs pleinement fonctionnent, car cela faisait déjà quelques semaines que je travaillais et recherchais des solutions aux problèmes rencontrés. Même les broches d'interruption  20 et 21 qui n'avaient jamais fonctionné d'aucuns des trois modes de branchement, elles fonctionnent en mode une broche d'interruption ! Bravo ! Super ! Fantastique !!!

Et le sommeil, bien et suffisamment long, je le souhaite ?

Pour intégrer dans ma dernière version du code du cockpit et harmoniser le tout, voici ce qu'est devenu votre exemple qui passe de 2 à 5 codeurs :

Code: [Select]

...
// Câblage pour Encodeur avec interrupteur sur la planche d'expérimentation.
const byte ENCODEUR_1_SORTIE_A = 2;
const byte ENCODEUR_1_BOUTON   = 32;
const byte ENCODEUR_1_SORTIE_B = 14;
const byte ENCODEUR_2_SORTIE_A = 3;
const byte ENCODEUR_2_BOUTON   = 33;
const byte ENCODEUR_2_SORTIE_B = 15;
const byte ENCODEUR_3_SORTIE_A = 18;
const byte ENCODEUR_3_BOUTON   = 34;
const byte ENCODEUR_3_SORTIE_B = 16;
const byte ENCODEUR_4_SORTIE_A = 19;
const byte ENCODEUR_4_BOUTON   = 36;
const byte ENCODEUR_4_SORTIE_B = 17;
const byte ENCODEUR_5_SORTIE_A = 20;
const byte ENCODEUR_5_BOUTON   = 36;
const byte ENCODEUR_5_SORTIE_B = 22;

volatile int Encodeur_1_EtatActuel = 0;
volatile int Encodeur_2_EtatActuel = 0;
volatile int Encodeur_3_EtatActuel = 0;
volatile int Encodeur_4_EtatActuel = 0;
volatile int Encodeur_5_EtatActuel = 0;

  attachInterrupt (0, Encodeur_1_A_Interruption, CHANGE);
  attachInterrupt (1, Encodeur_2_A_Interruption, CHANGE);
  attachInterrupt (5, Encodeur_3_A_Interruption, CHANGE);
  attachInterrupt (4, Encodeur_4_A_Interruption, CHANGE);
  attachInterrupt (3, Encodeur_5_A_Interruption, CHANGE);
....

void Encodeur_1_A_Interruption()
{
  if (digitalRead(ENCODEUR_1_SORTIE_A) == digitalRead(ENCODEUR_1_SORTIE_B)) {
    Encodeur_1_EtatActuel++;
  } else {
    Encodeur_1_EtatActuel--;
  }
}

void Encodeur_2_A_Interruption()
{
  if (digitalRead(ENCODEUR_2_SORTIE_A) == digitalRead(ENCODEUR_2_SORTIE_B)) {
    Encodeur_2_EtatActuel++;
  } else {
    Encodeur_2_EtatActuel--;
  }
}

void Encodeur_3_A_Interruption()
{
  if (digitalRead(ENCODEUR_3_SORTIE_A) == digitalRead(ENCODEUR_3_SORTIE_B)) {
    Encodeur_3_EtatActuel++;
  } else {
    Encodeur_3_EtatActuel--;
  }
}

void Encodeur_4_A_Interruption()
{
  if (digitalRead(ENCODEUR_4_SORTIE_A) == digitalRead(ENCODEUR_4_SORTIE_B)) {
    Encodeur_4_EtatActuel++;
  } else {
    Encodeur_4_EtatActuel--;
  }
}

void Encodeur_5_A_Interruption()
{
  if (digitalRead(ENCODEUR_5_SORTIE_A) == digitalRead(ENCODEUR_5_SORTIE_B)) {
    Encodeur_5_EtatActuel++;
  } else {
    Encodeur_5_EtatActuel--;
  }
}


Je crois utile de mettre cet exemple de code pour favoriser la prise de conscience que la numérotation des broches d'interruptions non pas une numérotation linéaire, mais comme suit :

Quote

Interruption 0, broche 2
Interruption 1, broche 3
Interruption 2, broche 21
Interruption 3, broche 20
Interruption 4, broche 19
Interruption 5, broche 18


Référence : http://arduino.cc/en/Reference/AttachInterrupt (http://arduino.cc/en/Reference/AttachInterrupt)

J'attends la livraison de plusieurs autres encodeurs, pour poursuivre le peuplement du tableau de bord.

Alors, vous avez toute ma gratitude pour l'aide que vous m'avez apportée ! Merci !

Je vous salut bien bas Monsieur Jean en je vous remercie CINQ foix !   ;)

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 06, 2014, 09:31 am
Bonjour Rene,
j'ai le catalogue complet ALPS EC11 devant moi, il n'y a pas de modele 20 detentes, c'est 18, 30 ou 36.
Dans le message #39 tu disais que tu avais besoin de 12 encodeurs, comment vas-tu faire ?
De combien de pins disponibles pour tes encodeurs disposes-tu sur ton Mega ?
Bonne fin de nuit
Jacques
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 06, 2014, 12:09 pm
Bonjour Jacques,


Bonjour Rene,
j'ai le catalogue complet ALPS EC11 devant moi, il n'y a pas de modele 20 detentes, c'est 18, 30 ou 36.


Si vous regardez dans le nom et descriptif du premier produit, il y à « Codeur Dode Commutateur / EC11 / ... ». Et je viens de recompter le nombre des clics pour 360° directement sur l'encodeur et c'est bien 20 clics. Je n'ai pas d'autres sources d'information.

Codeur Dode Commutateur / EC11 / Audio potentiomètre numérique - vert + Silver (2 PCS) (http://www.dx.com/fr/p/rotary-encoder-dode-switch-ec11-audio-digital-potentiometer-green-silver-2-pcs-275658)
MaiTech manche court 5 broches molette commutateurs - argent (2 PCS) (http://www.dx.com/fr/p/maitech-5-pin-short-handle-rotary-encoder-switches-silver-2-pcs-302050)

Quote

Dans le message #39 tu disais que tu avais besoin de 12 encodeurs, comment vas-tu faire ?


Oui, environ 12 encodeurs, et de nouvelles perspectives s'ouvrent à moi.

Je devrais sûrement arriver (avec un peu d'aide) à déporté le travaille de lecture des encodeurs à des CI dédiés qu'a cela, ainsi je n'aurai plus de perte de clic ou de portion de clic dû au 60 à 85 millisecondes de la boucle « loop () ». Et le besoin des broches avec interruptions disparait pour les encodeurs.

Je devrais partir prochainement à la recherche des exemples des codes sources d'un Mega qui communique avec un ATMEGA328-PU ou ATTINY84 ou Arduino Nano enfiché sur plaque d'expérimentation sans soudure "BreanBoard" pour récupérer les données d'un capteur (ex. : potentiomètre ou encodeur, capteur de température ou de luminosité, etc.). Si je suis chanceux, je trouverai avec un encodeur, mais peu importe, du moment qu'il y a un capteur et la transmission des données du CI enfiché, vers la carte Mega.

Quote

De combien de pins disponibles pour tes encodeurs disposes-tu sur ton Mega ?
Bonne fin de nuit
Jacques


La question est ambiguë, de base, toutes les broches de Mega peuvent être utilisées. Pourriez-vous préciser votre question ?

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 06, 2014, 01:21 pm

...
Je devrais sûrement arriver (avec un peu d'aide) à déporté le travaille de lecture des encodeurs à des CI dédiés qu'a cela, ainsi je n'aurai plus de perte de clic ou de portion de clic dû au 60 à 85 millisecondes de la boucle « loop () ». Et le besoin des broches avec interruptions disparait pour les encodeurs.
...



bonjour
si tu pars vers cette solution, il faut aussi te poser la question du protocole de mise à dispositions des infos (et lesquelles ) vers ton MCU de gestion globale.

si toujours tu veux partir sur tes 328 (DIP* ) je partirais sur de la mise à disposition par I²C
sous reserves d'erreurs , il te resterait dispo 16 pins exploitables pour de l'encodeur simple A/B  (soit 8 encodeurs)

les pins 1, 2,3,7,8,9,10,20,21,22,27,28 du 328 etant "reservés" = en vrac les alims/serial/I²C/reset/QZ

le temps de boucle en polling reste extrement faible (pour de l'encodeur "manuel" , mais pas pour de l'encodeur derriere moteur) , il suffit donc simplement de mettre à jour un compteur par encodeur , compteurs lisibles par le MCU de gestion en I²C.
ce qui est largement à la portée du 328

Intuitivement , je verrais bien un "pseudo protocole" consistant à interroger regulierement/polling  I²C les "modules X encodeurs" qui renverraient une reponse " à l'ouest rien de nouveau"  :smiley-mr-green:  ou "il y a eu du changement  :smiley-mr-green: " avec action en consequence.

AMHA , la reflexion doit  surtout etre portée sur l'organisation des "compteurs"  (valeurs absolues ou pas ? , etendue, flag de changement, etc) et la discussion I²C qui doit rester la plus concise possible (= si je n'ai rien d'interessant à dire , je repond juste que je n'ai rien à dire  :smiley-mr-green:  )

* sauf à me planter les 328 en CMs (nano dispose de 2 pins de plus)

Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 06, 2014, 01:32 pm
pour deux interruption supplementaire voir http://forum.arduino.cc/index.php?topic=265311.msg1870993#msg1870993
il t'en manquera quand meme 4.

il te reste une solution, si tu as assez de broches, c'est d'utiliser une interruption sur changement d'etat d'un port complet.
tu aura besoin de 2 port, de preference dédié uniquement a ca.
http://playground.arduino.cc/Main/PinChangeIntExample

le code sera un peu plus compliqué, car il faut traiter tout les codeurs du port.
cette routine sera necessairement un peu plus longue, la frequence admissible sera donc legerement moindre.

j'ai jamais fait sur ATMEL, mais ca marchais bien ailleurs.
et c'est certainement ce que tu fera si tu dedie un circuit a faire du comptage codeur.

malheureusement, sur le MEGA, tu n'as que le pin ana 8 à 15 (pcint16 à 23), les pwm 10 à 13, MISO, MOSI, et SCK (pcint1 à 7), Tx, RX  (pcint9 et 10). les autres ne ressortent pas.
du coup si t'as besoin de ces fonction ca limite quand meme, mais tu peut panacher les 2 solutions INT et PCINT.

tu peut egalement utiliser cette solution PCINT sur le 328, pour les 2 INT0 et INT1 dispo, et communiquer ensuite avec le MEGA.
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 06, 2014, 01:50 pm
Bonjour,
ce n'est pas ma question qui est ambigue, c'est ta reponse.
Le probleme est tout different si tu utilises deja 4 ou 40 pins sur ton Mega.
A part que ta boucle Loop tourne en 80mS, on ne sait pas grand chose sur ton montage.
Mes felicitations pour ton effort pour te mettre a l'anglais. Juste pour info, on n'ecrit pas "BreanBoard" qui ne veux rien dire mais "BreadBoard" que les francophiles traduisent par "planche a pain"
Je te souhaite bien du plaisir pour relier 2 ou 3 328 a ton Mega.
Jacques
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 07, 2014, 09:04 am
Bonjour à tous,

Et merci pour votre aide et votre support !



...
déporté le travaille de lecture des encodeurs à des CI dédiés qu'a cela,
...

...
si tu pars vers cette solution, il faut aussi te poser la question du protocole de mise à dispositions des infos
...


Oui, l'I²C, SPI et Wire font partie des possibles, mais je ne connais aucunes de ces technologies et solutions.

Ça me fait beaucoup d'études à faire et de choix à prendre, je me donne au moins la semaine pour lire et suivre vos conseils, suggestions et hyperlien et fouillé le Web pour trouver la solution qui allie le plus la performance et la simplicité de mise en oeuvre.

Quote

si toujours tu veux partir sur tes 328 (DIP* ) je partirais sur de la mise à disposition par I²C
sous reserves d'erreurs , il te resterait dispo 16 pins exploitables pour de l'encodeur simple A/B  (soit 8 encodeurs)

les pins 1, 2,3,7,8,9,10,20,21,22,27,28 du 328 etant "reservés" = en vrac les alims/serial/I²C/reset/QZ
...
il suffit donc simplement de mettre à jour un compteur par encodeur , compteurs lisibles par le MCU de gestion en I²C. ce qui est largement à la portée du 328
...


Oui, c'est une bonne option, 8 encodeurs, plus les 5 ou 6 déjà sur la carte Mega, ça peut donc allé jusqu'à 14 encodeurs. Je suis sur la bonne voie. Je pense à drapeau et compteur ou texte de la commande a exécuter.


pour deux interruption supplementaire voir http://forum.arduino.cc/index.php?topic=265311.msg1870993#msg1870993
il t'en manquera quand meme 4.

il te reste une solution, si tu as assez de broches, c'est d'utiliser une interruption sur changement d'etat d'un port complet.
...


J'élimine ces deux options par manque de dextérité et de connaissances. Et trop complexe pour ma tête.


Bonjour,
ce n'est pas ma question qui est ambigue, c'est ta reponse.
Le probleme est tout different si tu utilises deja 4 ou 40 pins sur ton Mega.


Là, je comprends mieux ton contexte de la question.

Je ne pouvais répondre à la question, car je suis en progression dans tout ce processus et à mesure que je maîtrise une technique, je l'incorpore dans le prototype alpha du tableau de bore du cockpit.

Mais on peut être sûr que côté broches disponible, il n'y aura pas de gaspillage, 98 % devraient être utilisés, j'en suis à 46 sur le Mega (2 x écrans LCD, 12 boutons, 5 encodeurs, 9 interrupteurs et un capteur infrarouge pour signaux de télécommande). C'est un cockpit générique, donc pour petit Cessa, gros Airbus ou Boeing en passant par le militaire et les chasseurs. Ça fait des centaines de boutons de toutes sortes, interrupteurs deux ou trois position et manettes et plusieurs écrans LCD 20x4 au moins 3.

Dans le cahier des charges, une carte maître Arduino Mega avec une carte d'extension "sheild" Ethernet. Un ou des CI en renfort, c'est OK. Mais le nombre final des bidules m'est inconnu pour le moment, c'est les broches qui le détermineront.

Quote

Mes felicitations pour ton effort pour te mettre a l'anglais. Juste pour info, on n'ecrit pas "BreanBoard" qui ne veux rien dire mais "BreadBoard" que les francophiles traduisent par "planche a pain"


Oups !

Ça me fait bien rigoler, mais je trouvais justement illogique le lien - plaque d'expérimentation - "planche a pain", là je comprends. Merci de faire le point sur le sujet.

Quote

Je te souhaite bien du plaisir pour relier 2 ou 3 328 a ton Mega.
Jacques


Je ne suis pas sadomasochiste, alors si je peux m'en sortir avec un , c'est OK pou moi.

Encore merci à vous tous !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 07, 2014, 01:03 pm


Oui, l'I²C, SPI et Wire font partie des possibles, mais je ne connais aucunes de ces technologies et solutions.

Ça me fait beaucoup d'études à faire et de choix à prendre, je me donne au moins la semaine pour lire et suivre vos conseils, suggestions et hyperlien et fouillé le Web pour trouver la solution qui allie le plus la performance et la simplicité de mise en oeuvre.



bonjour
rapide
par hasard ton"systeme" n'embarquerait pas "déjà"  une rtc ds1307 ?
Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 07, 2014, 01:32 pm
tu peut economiser du cablage et des pin pour tes afficheur lcd egalement
voir le fil
http://forum.arduino.cc/index.php?topic=265217.msg1872036#msg1872036
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 07, 2014, 03:01 pm
Bonjour Rene,
ton probleme est mal pose a la base. Tu parles de quelques encodeurs puis dans le dernier message, ton mega est super-plein.
Pour resoudre ton probleme tu dois passer par des "I/O expanders"

Un petit exemple je j'ai eu a resoudre il y a quelques annees.
Soit une platine de demo Atmel "Butterfly"
http://www.atmel.com/tools/avrbutterfly.aspx (http://www.atmel.com/tools/avrbutterfly.aspx)
qui utilise un AtMega169 qui est un circuit 100 pins mais dont beaucoup d'entre-elles sont utilisees par le display.
Pas beaucoup de possibilites d'ajouter des entrees/sorties.
J'ai utilise un ou 2 PCA9555
www.nxp.com/documents/data_sheet/PCA9555.pdf (http://www.nxp.com/documents/data_sheet/PCA9555.pdf)
Il y a plein de modeles semblables a ce circuit en 8 ou 16bit de large.
Suppose que tu as 16 boutons ou interrupteurs, tu les connectes a ton I/O expander et, quand tu en actionnse un, le circuit demande une interruption au micro et le micro vient questionner le circuit pour voir quel bouton a ete actionne.
Si tu as besoin de 17 boutons, tu installes un 2eme circuit et cela te permet d'avoir de 17 a 32 entrees avec seulement 3 pins utilisees sur le micro.
A la place de boutons en entree, tu peux utiliser des leds en sortie.
Ce qui veux dire que la limite pour ton Mega devient software.
Tu peux imaginer 200 boutons et 200 leds sans probleme.
Pour tes encodeurs, il doit etre possible de connecter 8 encodeurs sur un PCA9555 ou equivalent.
Je n'ai jamais vu une telle realisation mais j'estime que cela doit etre possible. Sinon, un tout petit micro par encodeur et 1,5 I/O expander pour 8 encodeurs.
Bonne reflexion
Jacques


Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 07, 2014, 03:54 pm

...
bonjour
rapide
par hasard ton"systeme" n'embarquerait pas "déjà"  une rtc ds1307 ?


Bonjour Artouste,

Le DS1307, je connais pas. C'est un « 64 x 8, Serial, I2C Real-Time Clock », je ne voie pas ce que cela apporterait de plus au projet qu'un Arduino Nano ou un ATMEGA328-PU ou un ATTINY8X et est-ce programmable par l'IDE Arduino ?

L'ami René

Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 07, 2014, 04:06 pm

tu peut economiser du cablage et des pin pour tes afficheur lcd egalement
voir le fil
http://forum.arduino.cc/index.php?topic=265217.msg1872036#msg1872036


Bonjour Monsieur Jean,

Je garde la référence sous le coude, au cas où.

Merci !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 07, 2014, 05:14 pm
Bonjour Jacques,

Merci pour l'aide !


Bonjour Rene,
ton probleme est mal pose a la base. Tu parles de quelques encodeurs puis dans le dernier message, ton mega est super-plein.


J'ai parlé, du cockpit dans mon troisième ou quatrième message pourtant. Mais, je suis désolé si cela est source de confusion.

Cela semble s'imposer que j'explique ma situation. Par hasard, l'an passé je suis tombé sur la programmation Arduino avec son langage C. Je suis donc presque novice en la matière. Mais programmeur informatique de 1989 à 1999, j'ai une bonne base en programmation en langage Pascal sur PC et Mac, de l'époque. Mais pour ce qui est de l'électronique pure et des autres contrôleurs programmables, je suis un vrai bleu, même pas un vert ! Il y a un mois, je ne savais pas ce qu'était un encodeur et il y a deux ou trois ans, je n'avais jamais fait de soudure ou joué avec des résistances ou des condensateurs. Je suis unilingue francophone et j'ai 52 ans.

Passionné d'aviation, j'ai toujours utilisé depuis leurs sorties, les simulateurs de vol les plus réalistes du moment. Mais piloter un simulateur de vol comme X-Plane 10 aujourd'hui, avec les quatre modes (normal, Contrôle, Majuscule et AltCar) des touches d'un clavier étendu, c'est pas toujours la joie. Une planche de tableau de bord et de console de cockpit, ça agrémenterait bien les vols.

Il y a deux mois, l'idée m'est venue de fusionner mon ancienne passion (simulateur de vol) et la nouvelle (l'électronique programmable, les contrôleurs). Cela me faisait un projet concret sur lequel poursuivre mon apprentissage de ma nouvelle passion.

Mais ne perdez pas de vue que j'ai tout a apprendre... ou presque !

Quote

Pour resoudre ton probleme tu dois passer par des "I/O expanders"
...


Si cela se programme avec l'IDE Arduino et qu'il y a des exemples de code source pour l'utiliser, je vais regarder ça, sinon, pour ce projet, je n'y toucherai pas.

Mais, merci, j'apprécie toujours votre aide !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 07, 2014, 05:36 pm
Rene,
c'est sur que cela se programme avec un Arduino.
tu vas sur Google et tu cherches : "I/O expander Arduino" et il y a 110.000 liens.
bonne lecture.
Que font les autres passionnes de simulateurs ? Quel hardware utilisent-ils ? Il n'y a pas des forums specialises qui parlent de realisations de simulateurs ?.
Jacques
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 07, 2014, 06:39 pm
Rebonjour Jaques,

Merci pour l'information !


...
c'est sur que cela se programme avec un Arduino.


J'avais l'impression du contraire.

Quote

tu vas sur Google et tu cherches : "I/O expander Arduino" et il y a 110.000 liens.
...


C'est ce que je vais faire.

Quote

Que font les autres passionnes de simulateurs ? Quel hardware utilisent-ils ? Il n'y a pas des forums specialises qui parlent de realisations de simulateurs ?.
Jacques


Ça existe, mais s'est rare et les bons, encore plus rares. Je suis sur le seul bon en français que j'ai trouvé, et je me suis basé pour partir mon projet, sur les codes sources d'exemples d'un site en anglais, mais je n'y suis pas inscrit, la langue étant une barrière pour moi.

Mais comble de chance, cette nuit, j'y ai trouvé une nouvelle publication « X-Plane I/O library for Arduino --- (Current version - 1.0 / Sept. 01.2014) » et qui va dans le sens de mon projet avec un exemple de communication entre des cartes Arduino par I2C. Entre mes passages ici, j'étudie les codes sources qu'ils fournissent. Donc, Mega et Nano, je tiens peut-être une bonne solution.

Pour ATTINY et ATMEGA328-PU, je n'ai pas trouvé d'exemple là ou ailleurs, pour le moment.

Merci pour ton support !

L'ami René

Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 07, 2014, 07:41 pm
j'ai pas grand chose de plus a dire, sinon que la solution i2c me parait la meilleur.
Si c'est avec un I/O exander tu aura juste a comuniquer avec, et tu pourra meme y gerer des codeurs dans de bonnes conditions grace a la sortie INT s'il y en a (c'est le cas pour le pca9555)
Si c'est avec un autre µC, au hasard, le ATMEGA328, tu aura sa programation en plus a faire, mais tu pourra y gerer d'autres fonctions en plus.

il ne te "reste plus qu'a" plancher sur l'i2c.
(et eventuelement prendre des cours d'anglais. surpenant pour un canadien, meme quebequois, pas du tout anglophone!)
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 07, 2014, 07:59 pm
Rebonjour Jean,

Je pense à tout ça ! Un grand merci pour tout. J'ai trouvé ici même sur le forum de quoi faire pour ATTINY et j'ai d'autres sites a écumer.

Il ne me manque que des exemples avec ATMEGA328-PU, mais je n'ai pas terminé mes recherches.

Un détail, si j'ai bien compris, si je développe avec Mega en I2C avec Nano, côté programmation, je pourrai après remplacer le Nano par un ATMEGA328-PU sans rien changer au code source ?

Et si je reste simple en déportant du Mega (pas de bibliothèque exotique), il pourrait en être de même avec ATTINY, à l'exception des numéros des broches qui pourraient varier ?

Là, j'ai sommeil..., bon dimanche !

Merci encore pour tout !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 07, 2014, 08:06 pm
presque rien, sinon l'adressage des pinoches.
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 07, 2014, 09:10 pm


...
bonjour
rapide
par hasard ton"systeme" n'embarquerait pas "déjà"  une rtc ds1307 ?


Bonjour Artouste,

Le DS1307, je connais pas. C'est un « 64 x 8, Serial, I2C Real-Time Clock », je ne voie pas ce que cela apporterait de plus au projet qu'un Arduino Nano ou un ATMEGA328-PU ou un ATTINY8X et est-ce programmable par l'IDE Arduino ?




:smiley-mr-green:
si le ds1307 est avant tout une RTC c'est aussi 56 bytes de RAM disponibles et accessibles en ecriture/lecture I²C   
et comme le DS1307 doit etre la RTC la plus utilisée "sur arduino"  , si  je posais a question , c'est que cela  "aurait" pu permettre une gestion assez simple de la "passerelle" I2C
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 08, 2014, 04:28 am
Bonjour Jacques,

Voici un complément de réponse à :


Bonjour Rene,
ton probleme est mal pose a la base. Tu parles de quelques encodeurs puis dans le dernier message, ton mega est super-plein.
Pour resoudre ton probleme tu dois passer par des "I/O expanders"
...


Le titre de la discussion reste bon « Problèmes d'encodeur EC11 », car ce n'est qu'avec ce type de composante que j'avais un problème de fonctionnement et d'incohérent, pas un manque de broche disponible.

Le problème de manque de broche est apparu par le fait que la solution du problème des encodeurs passait par des broches avec interrupteur et que sur le Mega il y en a que six et j'envisageais d'en utiliser plus d'encodeurs que cela, mais sans savoir avec exactitude, combien, mais proche d'une douzaine. Mais il me reste une trentaine de broches de disponibles. Ce n'est donc toujours pas le problème. Et la base trouvée du problème était un temps de boucle « loop () » trop long.

De plus, dans mon projet, pour optimiser les broches disponibles, j'utilise un capteur de signaux infrarouge de télécommande. Alors, avec une broche je me retrouve avec 44 boutons a dispositions !

Je pourrais très bien recycler une autre télécommande de plus ou moins 40 boutons, sans broche supplémentaire et redisposée d'une quarantaine de capteurs à disposition et donc, les broches de disponibles n'est pas le problème.

Pour résumer et synthétiser mon propos; dans mon cahier des charges du projet, il y a :

- Par l'entremise d'un projet concret de réalisation d'un cockpit maison de simulateur de vol, parfaire mon apprentissage de l'électronique programmable et des cartes Arduino.

- Utiliser une carte Mega et la presque totalité de ses broches pour peupler un tableau de bord et console de manette et bouton d'un cockpit générique avec des écrans LCD texte et des actionneurs de tout type.

- La limite des composantes étant le très grand nombre de broches d'une carte Arduino Mega.

Soyez tous assurés que je prends bonne note de tous les conseils, suggestions et recommandations que vous me faite. Cela m'ouvre des horizons de possibilités pour ce projet et d'éventuels autres projets.

C'est grâce a vous tous que je découvre l'étendu des possibilités des ... !!! ...

Vraiment, un très grand merci à vous tous de vous prêtez à l'exercice !

Il me reste beaucoup d'études et des recherches a faire, donc j'y retourne.

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 08, 2014, 08:20 am
parmis tes 12 codeurs, tu en a certainement qui ne sont pas critiques, ceux que tu peut faire travailler dans la boucle loop quitte a perdre des pas?
sur le meme principe qu'en IT:
Code: [Select]

...
#define pinCodeur1A=5;
#define pinCodeur1B=6;
#define pinCodeur2A=7;
#define pinCodeur2B=8;

int codeur1=0;
int codeur1AOld=LOW;
int codeur1AMem=LOW;
int codeur2=0;
int codeur2AOld=LOW;
int codeur2AMem=LOW;

....
  codeur1AMem = digitalRead(pinCodeur1A);
  if ((codeur1AOld == LOW) && (codeur1AMem == HIGH)) {  // front montant uniquement, codeur en x1
    if (digitalRead(pinCodeur1B) == LOW) {
      codeur1--;
    } else {
      codeur1++;
    }
  codeur1AOld = codeur1AMem;

  codeur2AMem = digitalRead(pinCodeur2A);
  if (codeur2AOld != codeur2AMem) {  // front CHANGE, codeur en x2
    if (digitalRead(pinCodeur2B) == codeur2AMem) {
     codeur2++;
    } else {
     codeur2--;
    }
  codeur2AOld = codeur2AMem;

//     AB
// 0 : 00
// 1 : 01
// 2 : 11
// 3 : 10
...


voir:
http://playground.arduino.cc/Main/RotaryEncoders

Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 08, 2014, 12:10 pm
Bonjour Jean,

Non, je n'en utilise qu'un à la fois, mais quand j'en utilise un, je ne veux pas perdre de pas, quel qu'il soit.

Et le gros des 60 à 85 millisecondes n'est pas dû aux encodeurs, mais par des fonctions d'échange de données avec le simulateur par connexion Ethernet en mode UDP.

Merci pour l'idée.

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 08, 2014, 12:28 pm
Bonjour à tous,

Je viens de réussir une première communication I2C entre Arduino Mega et Nano en mode « Master Reader » pour la lecture de l'état d'un bouton pression. C'est d'une grande simplicité !

Est-ce que nous pouvons communiquer par un autre format que par « char » de l'exemple de base, car j'ai eu de la difficulté avec ce format au lieu de binaire et j'ai horreur de triturer les données pour les faire passer par un trou de souris ?

Merci de m'avoir mis sur la piste de l'I2C !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 08, 2014, 01:29 pm



Je viens de réussir une première communication I2C entre Arduino Mega et Nano en mode « Master Reader » pour la lecture de l'état d'un bouton pression. C'est d'une grande simplicité !

Est-ce que nous pouvons communiquer par un autre format que par « char » de l'exemple de base, car j'ai eu de la difficulté avec ce format au lieu de binaire et j'ai horreur de triturer les données pour les faire passer par un trou de souris ?

Merci de m'avoir mis sur la piste de l'I2C !


Bonjour
Attention à une chose avec ta demarche : I²C ou pas , si tu confie toujour le decodage des A/B à ton MCU (etats des contacts)
tu ne fait que complexifier le/ton probleme, tu reste tributaire de ton temps de boucle (et meme tu l'amplifie par la gestion I²C de simple lecture des contacts)

La solution I²C n'est In fine viable que si tu recupere de la maniere la plus concise les valeurs de compteurs ayant changés.
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 08, 2014, 01:59 pm
Bonjour Artouste,

Merci pour l'avertissement !

J'avais pensé à demander à chaque boucle de la « loop () » un compteur (format : byte) par encodeur, depuis la dernière demande du Mega, donc peu importe le temps d'une « loop () ».

Le compteur serait le nombre de pas de l'encodeur. Ce chiffre pouvant être 0 et pouvant aller jusqu'à 255.

Et l'ordre du compteur correspondrait au numéro de l'encodeur.

Alors si j'ai 9 encodeurs sur la carte Nano, il me retournera 9 * un octet « byte », et il remettra ses compteurs à 0.

Est-ce correct ?

Merci encore !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 08, 2014, 02:17 pm


Merci pour l'avertissement !

J'avais pensé à demander à chaque boucle de la « loop () » un compteur (format : byte) par encodeur, depuis la dernière demande du Mega, donc peu importe le temps d'une « loop () ».

Le compteur serait le nombre de pas de l'encodeur. Ce chiffre pouvant être 0 et pouvant aller jusqu'à 255.

Et l'ordre du compteur correspondrait au numéro de l'encodeur.

Alors si j'ai 9 encodeurs sur la carte Nano, il me retournera 9 * un octet « byte », et il remettra ses compteurs à 0.




perso et rapide reflexion , si je devais faire , je passerais par de la ram I²C (cas du DS1307) evoqué plus haut pour la simplification de programmation.

le MCU dedié encodeur ne faisant qu'ecrire dans une adresse memoire dédiée à son rang (si un byte te suffit c'est encore mieux , mais tu peux etendre la portée)  ET generer un flag de mise à jour
avec un octet dédié aux drapeaux et des simples operations bitwise tu peux gerer/verifier 8 encodeurs
si ton octet de flag = 0 il n' a pas eu de MAJ , je passe à autre chose
si ton octet de flag = 1 , le compteur 1 a été mis a jour = à lire la valeur compteur 2  et remettre le bit 1 de l'octet à zero
"                                   " = 2 le compteur 2 "                                                                                             " 2 "                          "
si ton octet de flag = 5 les compteurs 1 et 3 ont étés mis à jour = agir en consequence bit à bit.
si ton octet de flag  = 255 tous les compteurs ont été mis à jour = IDEM
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 08, 2014, 02:50 pm
Rebonjour Artouste,

Je note l'exemple et merci !

Les meilleurs résultats que j'ai eus avec les encodeurs étaient en phase de test sans broche d'interruption et prétraitement des signaux. J'ai eu l'impression dans ce cas, que 100 % des changements des valeurs sur mes afficheurs correspondaient aux manipulations que je faisais sur l'encodeur.

Alors, comme le Nano devrait que traiter le signal des encodeurs, il va aussi en faire le prétraitement et ne me retourner que la somme des pas de chaque encodeur, pas la somme des signaux des encodeurs.

J'ai gardé le code source de cette phase de test et je vais le déporter sur le Nano.

Et comme je ne manipule qu'un encodeur à la fois, il ne devrait (le Nano) jamais être débordé de travail.

Donc pour l'avantage du prétraitement du signal, je privilégierais une solution qui permet cette déportation du code source, ce qui n'est pas possible avec le DS1307. Est-ce que je me trompe ?

Merci...

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 08, 2014, 03:03 pm

...
Donc pour l'avantage du prétraitement du signal, je privilégierais une solution qui permet cette déportation du code source, ce qui n'est pas possible avec le DS1307. Est-ce que je me trompe ?


non
l'option RAM DS1307 est/etait dans mon esprit un simple confort de mise ne oeuvre.

si ton/tes  "MCU encodeurs"  gere lui meme la mise à disposition I²C de la valeurs des compteurs , c'est inutile
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 09, 2014, 07:59 am
Bonjour,

Je viens de recevoir les Tiny (références) :

4 x ATTINY84A-PU (http://www.digikey.ca/scripts/DkSearch/dksus.dll?Detail&itemSeq=156740347&uq=635458148898833290)


4 x ATTINY85-20PU (http://www.digikey.ca/scripts/DkSearch/dksus.dll?Detail&itemSeq=156729111&uq=635458148898833290)


4 x ATTINY861A-PU (http://www.digikey.ca/scripts/DkSearch/dksus.dll?Detail&itemSeq=156729078&uq=635458148898833290)


J'ai téléchargé et installé les bibliothèques suivantes :

Arduino Tiny for 1.0 (http://code.google.com/p/arduino-tiny/downloads/detail?name=arduino-tiny-0100-0018.zip)
Arduino Tiny for 1.5 (http://code.google.com/p/arduino-tiny/downloads/detail?name=arduino-tiny-0150-0020.zip)

TinyWireM.zip (http://playground.arduino.cc/uploads/Code/TinyWireM.zip)
TinyWireS.zip (http://playground.arduino.cc/uploads/Code/TinyWireS.zip)

Et j'ai réussi à faire faire mon premier Blink par un Tiny (ATTINY85-20PU).

J'utilise sous Linux Kubuntu 14.04 64 bits le paquet des dépôts standards « Arduino 1.0.5+dfsg2-2 », avec ces nouvelles bibliothèques.

Pour passer mon code « Mega_I2C_TinyE_MasterReader », et bien, ça ne passe pas et j'ai besoin de vos lumières.

C'est le même code que « Mega_I2C_NanoE_MasterReader » qui fonctionne bien avec un Nano au lieu d'un Tiny.

Mais les bibliothèques Wire et TinyWireS n'ont pas toutes les mêmes fonctions. Évidemment, « write », je remplace par « send », mais à première vue, pas de « TinyWireS.onRequest » d'un côté et pas de « TinyWireS.available » de l'autre ! Alors, avant de m'arracher les cheveux, je vous sollicite pour résoudre cette situation.

Je suis très loin de ne devoir que changer les numéros des broches.

Toutes formes d'aide sera la bien venue et merci d'avance aux âmes charitables !

L'ami René
P. S. : Tous ces CIs ne sont pas pour le projet cockpit, je prends simplement les devants sur les futurs besoins ou les accidents.
Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 09, 2014, 08:23 am
tu as certainement un probleme dans les version des librairies.
ce fil t'aiderai peut etre:
http://forum.arduino.cc/index.php?topic=265217.new%3btopicseen#new
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 09, 2014, 10:48 pm
Rebonjour,

J'ai trouvé une de mes sources de problèmes ! J'utilisais des chartes des broches des Tiny84 et Tiny85 erroné et/ou incomplet trouvés ces derniers jours. En voici les liens (donc à ne pas utiliser) :

http://www.ledsandchips.com/upload/cards/attiny.jpg (http://www.ledsandchips.com/upload/cards/attiny.jpg)

http://www.akafugu.jp/images/microcontroller-reference-sheet.png (http://www.akafugu.jp/images/microcontroller-reference-sheet.png)

Voir en pièces jointes.

Il faudrait aviser les gens du premier hyperlien (site anglophone), je me charge de second (francophone) !

Est-ce que vous auriez une charte équivalente, mais qui ne comporte pas d'erreurs ou d'omissions comme ces deux dernières ?

Merci !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 09, 2014, 11:28 pm
La Reference :
www.atmel.com/images/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf (http://www.atmel.com/images/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf)
Bonne lecture
Jacques
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 09, 2014, 11:38 pm
Bonjour,

Bon, après la découverte des erreurs dans ma documentation sur les Tiny (mon message précédent), soulagement intellectuel de voir que je ne suis pas aussi bête que ça ! Fierté d'avoir surmonté l'embûche et joie de voir mon code source d'échange en i2c entre Mega et Nano fonctionner entre Mega et Tini85 et Tiny84, du fait d'utiliser maintenant les bonnes broches de ces circuits intégrés !

Il me faut maintenant tester l'équivalent avec un ATMEGA328-PU sur planche d'expérimentation, puis, testé les trois types de circuits (Nano, ATMEGA328-PU et Tiny84) avec quelques encodeurs (je pense à 4) pour finalement pouvoir choisir judicieusement quelle CI intégrer à mon projet de cockpit, avant de tout chambouler derrière le cockpit actuel.

Mais, vous, de par vos expériences dans le concret, à ma place, que choisiriez-vous ?

Avez-vous un penchant plus prononcé pour l'une de ces solutions ?

Pour quoi ?

Je suis curieux de vous lire !

Merci pour tout !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 10, 2014, 12:00 am

La Reference :
www.atmel.com/images/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf (http://www.atmel.com/images/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf)
Bonne lecture
Jacques


Bonjour Jacques,

Oui, je sais bien, c'est l'ultime référence, mais c'est en anglais, ça fait 234 pages. Pas pratique au travers des minuscules composantes d'électronique de mon microscopique atelier, qui n'est qu'un bout de table recyclé.

C'est pour cela que je souhaiterais avoir une feuille, une image du type du premier lien « http://www.ledsandchips.com/upload/cards/attiny.jpg (http://www.ledsandchips.com/upload/cards/attiny.jpg) », qui fait la corrélation entre les broches des cartes Arduino, des broches des CI ATMEGA328-PU et des broches des CI Tiny85 et Tiny84.



Et j'y pense, je m'y collerais si le logiciel qui a servi à faire ce montage graphique était sous Linux Kubuntu. Alors, connaissez-vous le logiciel qui a servi à ce montage graphique ?

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 10, 2014, 12:26 am
mon avis:
1) soit tu colle un attiny45/85 derriere chaque codeur,
2) soit tu mets un 328 pour l'ensemble des codeurs qui te manquerait sur le 2560.

la solution 1 est a previlegier si tu veut un truc modulaire-extensible
la solution 2 est a previlegier si tu veut gerer d'autres chose avec (par exemple les 3 lcd)

la solution 2 a l'avantage d'avoir sa platine UNO pour laquelle tu devrai deja etre familier.
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 10, 2014, 12:40 am
Rebonjour Jean,

Une fois de plus vos recommandations sont très judicieuses et c'est la première fois que le cas des Tiny85 attirent mon attention, je l'est trouvaient trop limité en nombre de broches, mais ici le côté modulaire resurgir plus qu'avant.

Il va vraiment falloir que je réfléchisse bien à tout cela et que je priorise une option ou une autre.

Merci bien !

J'espère que beaucoup d'autres personnes me feront leurs recommandations, la différence d'opinions et de points de vue est une richesse...

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 10, 2014, 08:28 am

C'est pour cela que je souhaiterais avoir une feuille, une image du type du premier lien
.....
Et j'y pense, je m'y collerais si le logiciel qui a servi à faire ce montage graphique était sous Linux Kubuntu. Alors, connaissez-vous le logiciel qui a servi à ce montage graphique ?


Sous Linux, il y a Inkscape qui permet de faire ça http://www.inkscape.org/fr/ (http://www.inkscape.org/fr/). Tu le trouveras dans les dépôts standards.
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 10, 2014, 09:57 am
Bonjour fdufnews,

Merci pour l'info et le lien !

Inkscape est un éditeur de graphismes vectoriels génériques très performants et je pensais plus à un produit spécialisé, du genre Fritzing, mais avec des formats de puce (CI) que l'on place sur une feuille blanche et une liste d'autres icônes que l'on place à côté et que l'on personnalise et relie entre eux.

Mais s'il existait un modèle Inkscape de circuit et brochage que je pourrais recycler. Par exemple, si j'avais le modèle Inkscape d'une seule des puces Tiny ou Uno, avec du copier/coller je m'en sortirais, mais partir de zéro avec Inkscape cela serait trop laborieux.

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 10, 2014, 10:18 am
Bonjour,
les informations de brochage dans la doc Atmel sont sur la page 2, je crois que c'est accessible meme a un Francophone !
Tu peux aussi aller voir ici :
https://sites.google.com/site/mechatronicsguy/arduinocheatsheet (https://sites.google.com/site/mechatronicsguy/arduinocheatsheet)



il y a plein d'infos utiles soft et hard.
Jacques
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 10, 2014, 11:01 am
Rene,
pourrais-tu nous dire clairement ce que tu recherches.
Je viens de relires tes quelques derniers messages, c'est du n'importe quoi.
Tu dis qu'il y a des erreurs et omissions sur une documentations d'un site anglophone et tu nous demandes de les en informer sans nous dire de quoi il s'agit.
Tu es parvenu a faire UNE liaison I2C entre UN Tinny85 et un Mega et tu nous demandes un avis. Si tu as besoin de 8 encodeurs supplementaires, il va te plein de Tinny supplementaires et un soft autrement complexe a developper.
Je t'ai dis qu'il existait des I/O Expander faits pour cela. Tout le travail est prepare, il suffit de configurer.
Si tu veux un Micro distant pour lire tes encodeurs, alors choisis un micro 40 pins, par exemple le 644. Supporte par Arduino, il gere tous les encodeurs et discute avec le Mega en I2C. C'est plus facile a mettre en route.
Je trouve que memoriser a distance un certain nombre de clics d'encodeur et envoyer la somme vers le Mega, cela va avoir pour consequence un affichage qui saute des pas. Deconcertant.
Jacques
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 11, 2014, 04:36 am
Bonjour à tous,

Voici l'une des choses dont un débutant comme moi avec un nouveau circuit imprimé (CI) a besoin pour partir avec une puce comme la Tiny84 :

Quote

Tyny84
Numéro ----- Dans
de ----------- le ------- Les
Broche ------ code ---- fonctions
physique # -- source -- de la broche
1 ------------- N/A ---- +5V
2 ------------- 0 ------ PB0 (PCINT8/XTAL1/CLKI)
3 ------------- 1  ------ PB1 (PCINT9/XTAL2)
4 ------------- 3 ------ PB3 (PCINT11/RESET/dW)
5 ------------- 2 ------ PB2 (PCINT10/INT0/OC0A/CKOUT)
6 ------------- ? ------ PA7 (PCINT7/ICP/OC0B/ADC7)
7 ------------- 4 ------ PA6 (PCINT6/SDA/MOSI/DI/ADC6)
8 ------------- 5 ------ PA5 (PCINT5/OC1B/MISO/DO/ADC5)
9 ------------- 6 ------ PA4 (PCINT4/T1/SCL/USCK/ADC4)
10 ------------ 7 ------ PA3 (PCINT3/T0/ADC3)
11 ------------- 8 ------ PA2 (PCINT2/AIN1/ADC2)
12 ------------- 9 ------ PA1 (PCINT1/AIN0/ADC1)
13 ------------ 10 ------ PA0 (PCINT0/AREF/ADC0)
14------------- N/A ---- GND

N/A = Non Applicable

Donc, le numéro de la broche physique sur le CI, le nom à utiliser dans le code source pour la désigner et les désignations des fonctions associées à la broche. Exemple, pour utilisé la fonction MOSI de la broche physique # 7, dans le code source Arduino je dois écrire « 4 ».

Malheureusement, c'est avec une démarche essai/erreur sur chaque broche avec le code source Blink.ino et en passant la valeur de la DEL de 0 à 20 et de A0 à A5, que j'ai finalement constitué le tableau qui précède.

J'aurais deux questions :

1) Dans les codes sources Arduino, quel est le nom ou numéro a utilisé pour la broche physique # 6, car si vous regardez le tableau, je n'ai rien trouvé pour cette broche et il semblerait que ce n'est pas une valeur entre 0 à 20 et de A0 à A5 ?

2) Comment cela se fait-il que je doive passer par une démarche essai/erreur pour avoir ce genre d'information fondamental pour utiliser un CI (sujet sous-jacent dans nos deniers messages de la présente discussion) ?

Merci d'avance pour votre compréhension et votre aide à un débutent, parfois un peu stupide comme moi ?

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: jean-I on Sep 12, 2014, 12:25 am
???
sur quoi t'est tu basé pour ajouter le support du tiny84 dans l'ide?
il n'y a pas des explications sur le site ou tu as downloadé ?

tu doit avoir dans arduino-1.0.5/hardware/arduino/variants/tiny14/pins_arduino.h
tout ce que t'as besoin
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 12, 2014, 02:07 am
Bonjour Jean,

Merci pour la piste que je devais suivre « /hardware/arduino/variants/tiny14/pins_arduino.h » !

Je n'ai pas cette structure de fichier chez moi, mais en regardant le « README » de l'archive « arduino-tiny-0100-0018 », il est question de :

Quote

* Extract the contents of the archive into the "hardware" folder.  For example,
  if the Arduino Sketch folder is...

      C:\Projects\Arduino

  After extracting, the following files / folders should exist...

      C:\Projects\Arduino\hardware\tiny\license.txt
      C:\Projects\Arduino\hardware\tiny\Prospective Boards.txt
      C:\Projects\Arduino\hardware\tiny\README
      C:\Projects\Arduino\hardware\tiny\bootloaders\
      C:\Projects\Arduino\hardware\tiny\cores\


Donc, chez moi, sous Linux Kubuntu, c'est plus du genre :

Pour Arduino 1.0.5+dfsg2-2 :
Code: [Select]
/usr/share/arduino/hardware/tiny/cores/tiny

Pour Arduino partagé :
Code: [Select]
/home/rene/Arduino/libraries/

Pour Arduino 1.0.5 (directement du site arduino.cc) :
Code: [Select]
/home/rene/sda6/Électroniques/Arduino_Linux_1.0.5/hardware/tiny

Pour Arduino 1.5.7 beta (directement du site arduino.cc) :
Code: [Select]
/home/rene/sda6/Électroniques/Arduino_Linux_1.5.7/hardware/tiny

Et dans le fichier « ~/Arduino_Linux_1.0.5/hardware/tiny/cores/tiny/pins_arduino.h », c'est du chinois pour moi !

Mais dans le fichier « ~/Arduino_Linux_1.0.5/hardware/tiny/cores/tiny/pins_arduino.c », j'ai trouvé :

Code: [Select]

#if defined( __AVR_ATtinyX5__ )

// ATMEL ATTINY45 / ARDUINO
//
//                           +-\/-+
//  Ain0       (D  5)  PB5  1|    |8   VCC
//  Ain3       (D  3)  PB3  2|    |7   PB2  (D  2)  INT0  Ain1
//  Ain2       (D  4)  PB4  3|    |6   PB1  (D  1)        pwm1
//                     GND  4|    |5   PB0  (D  0)        pwm0
//                           +----+

...
Code: [Select]

#if defined( __AVR_ATtinyX4__ )

// ATMEL ATTINY84 / ARDUINO
//
//                           +-\/-+
//                     VCC  1|    |14  GND
//             (D  0)  PB0  2|    |13  AREF (D 10)
//             (D  1)  PB1  3|    |12  PA1  (D  9)
//                     PB3  4|    |11  PA2  (D  8)
//  PWM  INT0  (D  2)  PB2  5|    |10  PA3  (D  7)
//  PWM        (D  3)  PA7  6|    |9   PA4  (D  6)
//  PWM        (D  4)  PA6  7|    |8   PA5  (D  5)        PWM
//                           +----+

...
Code: [Select]

#if defined( __AVR_ATtinyX313__ )

// On the Arduino board, digital pins are also used
// for the analog output (software PWM).  Analog input
// pins are a separate set.

// ATMEL ATTINY2313
//
//                   +-\/-+
//      (D 17) PA2  1|    |20  VCC
// RX   (D  0) PD0  2|    |19  PB7 (D  16)
// TX   (D  1) PD1  3|    |18  PB6 (D  15)
//      (D  2) PA1  4|    |17  PB5 (D  14)
//      (D  3) PA0  5|    |16  PB4 (D  13)*
// INT0 (D  4) PD2  6|    |15  PB3 (D  12)*
// INT1 (D  5) PD3  7|    |14  PB2 (D  11)*
//      (D  6) PD4  8|    |13  PB1 (D  10)
//     *(D  7) PD5  9|    |12  PB0 (D  9)
//             GND 10|    |11  PD6 (D  8)
//                   +----+
//
// * indicates PWM port


Et c'est très près de ce que cherche un néophyte francophone comme moi.

Encore Merci !

L'ami René
P.-S. Si à 52 ans un bonhomme vivant au Québec n'est pas devenu bilingue (français, anglais), c'est qu'il y a de bonnes raisons... Alors il faut être réaliste, cela n'est pas dans cette vie-ci que je le deviendrai, à mon grand regret, vous vous en doutez bien !!!
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 12, 2014, 06:58 am
Rebonjour,

Et voici ce que j'ai fait des informations que j'ai trouvées. À défaut d'un logiciel graphique spécialisé, avec un éditeur de code source basique. La principale différence est que j'ai tout regroupé en une seul page et coller au plus proche du numéro des broches, le libellé à utiliser dans le code source Arduino pour désigner les broches. Ça peut donner cela comme aide mémoire pour débuter avec Arduino et Tiny :

Code: [Select]

/*
           Programmation sur Breadboard
            :--- De ----:---- à ---- :
Arduino / CI : Uno  Mega : 328P 84 85 :
Slave reset  : 10   53   : 1    4  1  :
MOSI         : 11   51   : 17   7  5  :
MISO         : 12   50   : 18   8  6  :
SCK          : 13   52   : 19   9  7  :
            :-----------:------------:

Mettre une DEL (avec résistance de 220?) sur les broches suivantes :
9 : En action     - Montre que le programme est en exécution (Verte).
8 : Erreur        - S'allume si quelque chose va mal (Rouge)
7 : Programmation - En communication avec l'esclave (Jaune)

                                   Atmel Tiny 85
                                      +-\/-+
      dW RESET Ain0 ADC0 PCINT5 PB5 5 |1  8|   VCC
CLKI OC1B XTAL1 Ain3 ADC3 PCINT3 PB3 3 |2  7| 2 PB2 PCINT2 ACD1 INT0 USCK SCK  SCL T0 Ain1
CLKO OC1B XTAL2 Ain2 ADC2 PCINT4 PB4 4 |3  6| 1 PB1 PCINT1 AIN1 OC1A OC0B MISO     DO PWM1
                                GND   |4  5| 0 PB0 PCINT0 AIN0 OC1A OC0A MOSI SDA DI PWM0 AREF
                                      +----+

                                 Atmel Tiny 84
                                    +--\/--+
                              VCC   |1   14|   GND
           CLKI XTAL1 PCINT8  PB0 0 |2   13| 10 PA0 PCINT0 ADC0 AREF
                XTAL2 PCINT9  PB1 1 |3   12|  9 PA1 PCINT1 ADC1 AIN0
             dW RESET PCINT11 PB3   |4   11|  8 PA2 PCINT2 ADC2 AIN1
  PWM INT0 OC0A CKOUT PCINT10 PB2 2 |5   10|  7 PA3 PCINT3 ADC3 T0
  PWM ICP  OC0B ADC7  PCINT7  PA7 3 |6    9|  6 PA4 PCINT4 ADC4 T1 USCK SCL
DI PWM SDA  MOSI ADC6  PCINT6  PA6 4 |7    8|  5 PA5 PCINT5 ADC5 DO OC1B MISO PWM
                                    +------+

                         Atmel Mega 328P
                            +---\/---+
        RESET PCINT5  PC6   |1     28| A5 PC5 PCINT13 ADC5 SCL
        RXD   PCINT16 PD0 0 |2     27| A4 PC4 PCINT12 ADC4 SDA
        TXD   PCINT17 PD1 1 |3     26| A3 PC3 PCINT11 ADC3
        INT0  PCINT18 PD2 2 |4     25| A2 PC2 PCINT10 ADC2
PWM OC2B INT1  PCINT19 PD3 3 |5     24| A1 PC1 PCINT9  ADC1
   XCK  TO    PCINT20 PD4 4 |6     23| A0 PC0 PCINT8  ADC0
                      VCC   |7     22|    GND
                      GND   |8     21|    AREF
   OSC1 XTAL1 PCINT6  PB6   |9     20|    VCC
   OSC2 XTAL2 PCINT7  PB7   |10    19| 13 PB5 PCINT5      SCK
PWM OC0B T1    PCINT21 PD5 5 |11    18| 12 PB4 PCINT4      MOSI
PWM OC0A AIN0  PCINT22 PD6 6 |12    17| 11 PB3 PCINT3 OC2A MISO PWM
        AIN1  PCINT23 PD7 7 |13    16| 10 PB2 PCINT2 OC18 SS   PWM
   ICP1 CLKO  PCINT0  PB0 8 |14    15|  9 PB1 PCINT1 OC1A      PWM
                            +--------+
*/


Pour la section « Programmation sur Breadboard », est-ce qu'il faut inversé les MOSI et MISO du "Master" vs "Slave" et donc corriger le tableau ?

Si j'ai fait des erreurs, m'en aviser, pour que je corrige le document.

En pièce jointe, une version txt et pdf de cet aide mémoire.

Merci de m'avoir indiqué la bonne piste à suivre !

L'ami René
P. s. Pour copier/coller dans les entêtes de nos codes sources et pour circulation le plus large possible...
Modif. : Pour Tiny 85 rajout de SDA et doublon PCINT2 pour PCINT0, corrections des fichiers.
Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 12, 2014, 09:04 am
Pour faire des fiches sans inkscape il y a aussi une solution simple avec une feuille de tableur.
En pièce jointe un modèle que j'ai fait pour une carte Nucleo.
Un peu moins de deux heures de travail avec le module calc de libre office.
Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 12, 2014, 09:14 am
Tiens un lien qui devrait te plaire : http://www.pighixxx.com/else/?q=attiny (http://www.pighixxx.com/else/?q=attiny)
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 12, 2014, 09:27 am
Bonjour fdufnews,

Super bonne idée et super travail, très inspirant !

Le côté ajout des couleurs à sa grande efficacité, le repérage rapide des types de broches, etc.

Un grand merci !

Bon, pour aujourd'hui, j'en ai un peu ras le bol des « ...PCINT0 AIN0 OC1A OC0A MOSI SDA DI PWM0 AREF... », et je viens de corriger deux ou trois erreur et omission que j'ai faite. Alors, au cas ou vous en trouveriez d'autres, il est plus sage que je me change les idées ailleurs.

Mais dans les jours qui viennent, je passe le tout à Libre Office Calc avec couleur et image.

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 12, 2014, 09:47 am

Tiens un lien qui devrait te plaire : http://www.pighixxx.com/else/?q=attiny (http://www.pighixxx.com/else/?q=attiny)


Comment t'as deviné que j'aimerais beaucoup ? :P

Non, mais avec quel logiciel ils ont fait ça, je peux pas croire que c'est avec un logiciel de graphisme générique ???

Y a pas un logiciel genre CI-zing pour faire ça ?

Merci, oui j'adore, c'est du super boulot, tout tout y est, imprimé chez mois, le temps d'écrire cette ligne !

Quelle fut ta démarche pour arriver à cette fiche de rêve, elle devrait être partout ?

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 12, 2014, 10:06 am
Une petite recherche su Google avec arduino type de micro et pinout et tu vas trouver des dizaines d'images de ce que tu cherches.
Tu en prends 3,  tu les compares et s'il y a correspondance tu imprimes la plus belle.
Inutile de reinventer la roue, avec le risque d'introduire de nouvelles erreurs.
Il n'y a pas besoin d'etre bilingue pour pouvoir lire une documentation technique. J'ai etudie l'anglais comme 3eme langue en 65/66/67. Depuis uniquement de la pratique, des exercices et consultation dictionnaires. Cela m'a permis de voyager aux 4 coins du monde et de me faire comprendre. De meme, cela me donne la possibilite de m'entretenir par mail aves des Allemands, Hollandais, Chinois, Vietnamiens etc etc.
Pour rappel l'anglais est l'unique langue utilisee dans l'aviation. Or tu construis un simulateur il me semble.
Jacques
Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 12, 2014, 10:58 am

Non, mais avec quel logiciel ils ont fait ça, je peux pas croire que c'est avec un logiciel de graphisme générique ???

Fait avec Illustrator voir là l'explication :http://forum.arduino.cc/index.php?topic=154549.msg1188887#msg1188887 (http://forum.arduino.cc/index.php?topic=154549.msg1188887#msg1188887)

Avec un logiciel de dessin vectoriel, c'est assez rapide une fois que l'on a dessiné les formes de base. C'est juste de la recopie des formes. J'avais commencé à faire des trucs avec Inkscape. Mais c'est quand même plus rapide avec le tableur si on se contente de choses simples.
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 13, 2014, 12:33 pm
Bonjour à tous,

Merci pour vos informations, hyperliens, conseils, trucs, astuces et suggestions.

Il est génial ce « pighixxx », il semble exceller en graphisme et en électronique ! Super ! Merci !

Je bloc avec l'intégration du Tiny85 dans le code source de mon cockpit, mais je persévère à trouver par moi-même, je ne veux pas trop vous sollicité sans avoir essayé toutes les options que je peux trouver seules avec le temps et la réflexion.

Merci pour tout !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 14, 2014, 08:54 am
Bonjour à toutes et tous,

Pour comprendre le fonctionnement et la communication i2c d'un Mega R3 avec un Tiny85, qui pour le moment ne répond pas au Mega, je me suis dit que de tester avant tout que mon code fonctionnait. Cela serait un bon test à faire.

Je teste donc le code avec la communication i2c d'un Mega R3 avec un Arduino Nano R3.

La désignation des broches du Nano est donnée, sur le site « http://arduino.cc/en/Main/ArduinoBoardNano » et je site :

Quote

I2C: 4 (SDA) and 5 (SCL). Support I2C (TWI) communication using the Wire library (documentation on the Wiring website).


Alors, broches Mega SDA = 20 et SCL = 21 et broches Nano SDA = 4 et SCL = 5.

Mais, là aussi, le Nano ne répond pas au Mega !

Et voilà que sur le Web, je tombe sur les deux images suivantes qui se contredisent :


http://hardware-analyst.com/wp-content/uploads/2014/04/arduino-nano-pinout.png (http://hardware-analyst.com/wp-content/uploads/2014/04/arduino-nano-pinout.png)


Broche 4 = SDA
Broche 5  = SCL

http://mlc-s2-p.mlstatic.com/arduino-nano-r3-oem-pic-avr-raspberry-obd-modem-uhf-vhf-7160-MLC5174904443_102013-F.jpg (http://mlc-s2-p.mlstatic.com/arduino-nano-r3-oem-pic-avr-raspberry-obd-modem-uhf-vhf-7160-MLC5174904443_102013-F.jpg)


Broche A4 = SDA
Broche A5  = SCL


Alors, je teste et il semble y avoir communication i2c si j'utilise les broche A4 et A5.

Mais cela fonctionne plus ou moins bien.

Il y a de quoi a devenir dingue, pour un débutant !

Est-ce que vous pourriez me confirmer par des tests faits par vous-même sur votre carte contrôleur Arduino Nano R3 qu'elles sont les broches SDA et SCL de cette carte ?

Merci d'avance du temps et de l'énergie que vous consacrerez à cela, pour moi !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: haifger on Sep 14, 2014, 10:04 am
Bonjour,
les broches SDA et SCL de la Nano sont bien A4 et A5 - comme sur la Uno (puisque c'est le même microcontrôleur).
Title: Re: Problèmes d'encodeur EC11
Post by: JMe87 on Sep 14, 2014, 10:06 am
Bonjour,
comme deja explique, tu charges la doc Atmel du ATmega328, pas besoin de lire tout, c'est sur la page 2 et tu as un dessin avec le brochage du circuit.
C'est la bible!!
Tu verras, sur le brochage correspondant au 32 pins TQFP, que :
pin 27 PC4 = SDA
pin 28 PC5 = SCL
Alors, soit tu verifies avec un ohmmetre que la pin 27 et/ou 28 sortent bien ou tu l'esperes sur les bornes de sortie, soit tu fais 2 "blink" avec ces 2 pins et tu verifies avec une led et une resistance en serie.
C'est vrai que les dessins que tu montres ne sont pas super clair mais cela demande seulement 5 minutes de recherches pour etre sur, tu notes l'info la ou tu es sur de la retrouver et tu passes a autre chose.
Jacques
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 14, 2014, 04:09 pm
Bonjour Jacques,

Merci pour votre aide !

Quand même la documentation officielle (le site Web arduino.cc), ne donne pas la bonne information, du moins pas toujours comme on le voie, il est difficile de se faire une bonne base et avoir confiance. Et sans l'anglais, ça double le problème.

Pour le moment, même les désignations des broches me restent nébuleuse, ex. : d4, 4, XCK, TO, PCINT20, PD4, 2 et le tout que pour une seule broche, et dans le code Arduino, qu'elle est le désignant (4, D4, 20, , 2) ? Pour ce cas, je sais que c'est « 4 » et la broche physique 7, mais encore aujourd'hui, dû au manque de données complètes et détaillé sur le site officiel d'Arduino, cela reste nébuleux et source d'erreur pour un débutant.

Pour l'argument « c'est dans la doc Atmel », notez que j'ai acheté un Arduino Nano R3, pas un « 32 TQFP ATMEGA328P » ! Comprenez par là que mon premier réflexe naturel est rarement d'aller dans la doc Atmel, etc ! Mais on finit par y être obligé du fait de la déficience de la doc Arduino.

Pour ceux qui me perçoivent comme un fardeau, je suis désolé d'en être un pour vous !

L'ami René (Très reconnaissant pour ceux qui l'aide !)

Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 14, 2014, 04:14 pm

Bonjour,
les broches SDA et SCL de la Nano sont bien A4 et A5 - comme sur la Uno (puisque c'est le même microcontrôleur).


Bonjour haifger,

Un grand merci pour la confirmation !

Je retourne plancher sur le problème, avec une parcelle de petite confiance de plus en moi pour débusquer le problème, c'est A4 et A5.

Encore merci !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 15, 2014, 05:55 am
Bonjour à toutes et à tous,

Je pense que j'ai un problème avec le format des données pour la transmission par i2c.

Le Nano (Slave) utilise deux octets au format « byte » pour stocker la valeur du nombre de pas fait par l'encodeur et l'utilisation (oui/non) de son bouton, depuis la dernière demande de l'Arduino maître (carte Mega) de la communication i2c. Mais que cela soit avec ou sans conversion par la fonction « char () » à l'envoi et/ou à la réception i2c, pour le Mega maître, les données sont incohérentes. Avec ou sans manipulation de l'encodeur, pour l'utilisation du bouton j'ai une valeur aléatoire et pour le nombre de pas, c'est toujours 255, que l'encodeur soit manipulé ou non. Le branchement et les autres composantes ont été testés et sont correctement branchés et fonctionnels.

Voici le code source pertinent (en pièce jointe, 100 % des codes sources) :

Mega (Master) :

Code: [Select]

...
#include "Wire.h"
...
// Adresse de la communication I2C de l'Arduino Mega avec Atmel Tiny.
const byte ADRESSE_MEGA_0 = 0;// Adresse optionnelle pour un maître i2c.
const byte ADRESSE_TINY_1 = 1;// Adresse requise pour l'esclave Tiny i2c.
...
// Variable pour les données de l'encodeur 5 :
// Recoit la valeur indiquant l'état pressé ou non d'un bouton.
byte Encodeur_5_BoutonEtat = 0;
// Recoit la valeur indiquant le nombre de pas fait  l'encodeur depuis la dernière
// demande de l'Arduino maître de la communication i2c.
byte Encodeur_5_NombreDePas = 0;
...
 // Lire l'encodeur 5.
 // Lecture de 2 octets (byte) depuis l'esclave Tiny #1.
 Wire.requestFrom (int (ADRESSE_TINY_1), 2);
 // L'esclave pourrait envoyer moins de données qu'attendu.
 if (Wire.available ())
 { // Réception de l'octet (byte) comme caractère.
   // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
   Encodeur_5_BoutonEtat = (Wire.read ());
//    Encodeur_5_BoutonEtat = (byte (Wire.read ()));
   // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
   // dernière demande de l'Arduino maître de la communication i2c.
   Encodeur_5_NombreDePas = (Wire.read ());
//    Encodeur_5_NombreDePas = (byte (Wire.read ()));
   // Vérifier l'état du bouton.

   LCD_2.setCursor (14, 3);
   LCD_2.print ("      ");
   LCD_2.setCursor (14, 3);
   LCD_2.print (Encodeur_5_BoutonEtat);
   LCD_2.setCursor (17, 3);
   LCD_2.print (Encodeur_5_NombreDePas);

   // Vérifier s'il le bouton de l'encodeur a été pressé.
   if (Encodeur_5_BoutonEtat != 0)
   { // Si enfoncé, émettre un son.
     Encodeur_5_BoutonEtat = 0;
     EnvoyerCommandeX_Plane ("sim/instruments/barometer_2992");
   }

   // Vérifier s'il y a des pas fait par l'encodeur.
   if (Encodeur_5_NombreDePas != 0)
   {
     if (Encodeur_5_NombreDePas > 0)
     { // Si le nombre est plu grand que zéro.
       for (byte i = 0; i < Encodeur_5_NombreDePas; i = i + 1)
       {
         EnvoyerCommandeX_Plane ("sim/instruments/barometer_up");
       }
     }
     else if (Encodeur_5_NombreDePas < 0)
     { // Si le nombre est plu grand que zéro.
       for (byte i = Encodeur_5_NombreDePas; i < 0; i = i + 1)
       {
         EnvoyerCommandeX_Plane ("sim/instruments/barometer_down");
       }
     }
     Encodeur_5_NombreDePas = 0;
   }
...
void setup ()
...
 Wire.begin (ADRESSE_MEGA_0);// Joindre le bus I2C.
...
 Serial.print ("Broche pour la communication I2C activer !");
...
void loop ()
...
 GererEncodeurs ();
...


Nano (Slave) :

Code: [Select]

...
#include "Wire.h"
...
//*****************************************************************************
// Constantes des connecteurs.
//*****************************************************************************
// Câblage pour Encodeur 1 avec interrupteur sur la planche d'expérimentation.
const byte ENCODEUR_1_SORTIE_A      = 2;
const byte ENCODEUR_1_SORTIE_B      = 3;
const byte ENCODEUR_1_BOUTON        = 4;
...
//*****************************************************************************
// Déclaration des autres constantes de travail.
//*****************************************************************************
// Adresse de la communication I2C de l'Arduino Nano.
const byte ADRESSE_NANO_1 = 1;// Adresse requise pour l'esclave.
...
// Délai pour  absorber les rebonds des encodeurs.
int           EncodeurTempsRebond      = 3;
// Recoit la valeur indiquant l'état pressé ou non d'un bouton.
byte          Encodeur_1_BoutonEtat    = 0;
boolean       Encodeur_1_Direction     = 0;
byte          Encodeur_1_EtatActuel    = 0;
byte          Encodeur_1_EtatPrecedent = 0;
// Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
// dernière demande de l'Arduino maître de la communication i2c.
byte          Encodeur_1_NombreDePas   = 0;
...
//*****************************************************************************
// FONCTION DEL_On_Off.
//*****************************************************************************
void DEL_On_Off ()
{
 // Activer la DEL de l'Arduino.
 digitalWrite (DEL_1_VIN, HAUT);
 delay (UneSeconde);
 // Déactiver la DEL de l'Arduino.
 digitalWrite (DEL_1_VIN, BAS);
}
//*****************************************************************************

//*****************************************************************************
// FONCTION ActionsEncodeurs.
//*****************************************************************************
void ActionsEncodeurs ()
// Fonction qui est exécutée lorsque des données sont demandées par le Maître.
// Cette fonction est enregistrée comme un événement ("event" en anglais),
// voir la fonction setup ().
{
 if ((Encodeur_1_BoutonEtat != 0) or (Encodeur_1_NombreDePas != 0))
 {
   Wire.write (Encodeur_1_BoutonEtat);
//    Wire.write (char (Encodeur_1_BoutonEtat));
   Encodeur_1_BoutonEtat = 0;
   Wire.write (byte (round (Encodeur_1_NombreDePas / 2)));
//    Wire.write (char (byte (round (Encodeur_1_NombreDePas / 2))));
   Encodeur_1_NombreDePas = 0;
   // Faire clignoter la DEL de la carte Nano une fois une seconde.
//    DEL_Off_On ();
 }
}
//*****************************************************************************

//*****************************************************************************
// FONCTION LireBouton.
//*****************************************************************************
void LireEncodeurs ()
{
 // Lire l'état du bouton de l'encodeur broche E.
 if (digitalRead (ENCODEUR_1_BOUTON) == OUI)
 { // Répondre avec un message de 1 octet (byte) comme attendu par le maître.
   Encodeur_1_BoutonEtat = 1;
 }

 // Lire l'encodeur 1 broche A et B.
 if (digitalRead (ENCODEUR_1_SORTIE_A) == digitalRead (ENCODEUR_1_SORTIE_B))
 {
   Encodeur_1_NombreDePas = Encodeur_1_NombreDePas + 1;
 }
 else
 {
   Encodeur_1_NombreDePas = Encodeur_1_NombreDePas - 1;
 }
}
//*****************************************************************************

//*****************************************************************************
// FONCTION SETUP = Code d'initialisation.
//*****************************************************************************
void setup ()
...
 // Joindre le bus I2C.
 Wire.begin (ADRESSE_NANO_1);
 // Enregistrer l'événement pour lorsqu'une demande arrive.
 Wire.onRequest (ActionsEncodeurs);
...
 // Configurer les ports Arduino en entrée pour l'encodeur 4 :
 pinMode (ENCODEUR_1_SORTIE_A, ENTREE_ET_RESISTENCE_INTERNE);
 pinMode (ENCODEUR_1_SORTIE_B, ENTREE_ET_RESISTENCE_INTERNE);
 pinMode (ENCODEUR_1_BOUTON, ENTREE_ET_RESISTENCE_INTERNE);
 digitalWrite (ENCODEUR_1_SORTIE_A, HAUT);
 digitalWrite (ENCODEUR_1_SORTIE_B, HAUT);
 digitalWrite (ENCODEUR_1_BOUTON, HAUT);
...
//*****************************************************************************
// FONCTION LOOP = Boucle sans fin = coeur du programme.
//*****************************************************************************
void loop()
{
 // Ici les instructions à exécuter par le programme principal.
 LireEncodeurs ();
}
//*****************************************************************************


Est-ce que vous identifiez une erreur de ma part dans le code ?

Merci d'avance !

L'ami René
Modif. : Correction du code (affichages et son) et des constats.
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 15, 2014, 08:06 am
Et même résultat en changeant le type « byte » pour « boolean » pour la variable « Encodeur_5_BoutonEtat ».

Mega (Master) :

Code: [Select]

...
// Variable pour les données de l'encodeur 5 :
// Recoit la valeur indiquant l'état pressé ou non d'un bouton.
boolean Encodeur_5_BoutonEtat = 0;
...
 // Lire l'encodeur 5.
 // Lecture de 2 octets (byte) depuis l'esclave Tiny #1.
 Wire.requestFrom (int (ADRESSE_TINY_1), 2);
 // L'esclave pourrait envoyer moins de données qu'attendu.
 if (Wire.available ())
 { // Réception de l'octet (byte) comme caractère.
   // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
    Encodeur_5_BoutonEtat = (boolean (Wire.read ()));
//    Encodeur_5_BoutonEtat = (byte (Wire.read ()));
   // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
   // dernière demande de l'Arduino maître de la communication i2c.
   Encodeur_5_NombreDePas = (Wire.read ());
//    Encodeur_5_NombreDePas = (byte (Wire.read ()));
   // Vérifier l'état du bouton.

   LCD_2.setCursor (14, 3);
   LCD_2.print ("      ");
   LCD_2.setCursor (14, 3);
   LCD_2.print (Encodeur_5_BoutonEtat);
   LCD_2.setCursor (17, 3);
   LCD_2.print (Encodeur_5_NombreDePas);

   // Vérifier s'il le bouton de l'encodeur a été pressé.
   if (Encodeur_5_BoutonEtat != 0)
   { // Si enfoncé, émettre un son.
     Encodeur_5_BoutonEtat = 0;
     EnvoyerCommandeX_Plane ("sim/instruments/barometer_2992");
   }

   // Vérifier s'il y a des pas fait par l'encodeur.
   if (Encodeur_5_NombreDePas != 0)
   {
     if (Encodeur_5_NombreDePas > 0)
     { // Si le nombre est plu grand que zéro.
       for (byte i = 0; i < Encodeur_5_NombreDePas; i = i + 1)
       {
         EnvoyerCommandeX_Plane ("sim/instruments/barometer_up");
       }
     }
     else if (Encodeur_5_NombreDePas < 0)
     { // Si le nombre est plu grand que zéro.
       for (byte i = Encodeur_5_NombreDePas; i < 0; i = i + 1)
       {
         EnvoyerCommandeX_Plane ("sim/instruments/barometer_down");
       }
     }
     Encodeur_5_NombreDePas = 0;
   }
...
void setup ()
...
 Wire.begin (ADRESSE_MEGA_0);// Joindre le bus I2C.
...
 Serial.print ("Broche pour la communication I2C activer !");
...
void loop ()
...
 GererEncodeurs ();
...


Nano (Slave) :

Code: [Select]

...
#include "Wire.h"
...
//*****************************************************************************
// Constantes des connecteurs.
//*****************************************************************************
// Câblage pour Encodeur 1 avec interrupteur sur la planche d'expérimentation.
const byte ENCODEUR_1_SORTIE_A      = 2;
const byte ENCODEUR_1_SORTIE_B      = 3;
const byte ENCODEUR_1_BOUTON        = 4;
...
//*****************************************************************************
// Déclaration des autres constantes de travail.
//*****************************************************************************
// Adresse de la communication I2C de l'Arduino Nano.
const byte ADRESSE_NANO_1 = 1;// Adresse requise pour l'esclave.
...
// Délai pour  absorber les rebonds des encodeurs.
int           EncodeurTempsRebond      = 3;
// Recoit la valeur indiquant l'état pressé ou non d'un bouton.
boolean       Encodeur_1_BoutonEtat    = 0;
boolean       Encodeur_1_Direction     = 0;
byte          Encodeur_1_EtatActuel    = 0;
byte          Encodeur_1_EtatPrecedent = 0;
// Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
// dernière demande de l'Arduino maître de la communication i2c.
byte          Encodeur_1_NombreDePas   = 0;
...
//*****************************************************************************
// FONCTION ActionsEncodeurs.
//*****************************************************************************
void ActionsEncodeurs ()
// Fonction qui est exécutée lorsque des données sont demandées par le Maître.
// Cette fonction est enregistrée comme un événement ("event" en anglais),
// voir la fonction setup ().
{
 if ((Encodeur_1_BoutonEtat != 0) or (Encodeur_1_NombreDePas != 0))
 {
   Wire.write (byte (Encodeur_1_BoutonEtat));
//    Wire.write (char (Encodeur_1_BoutonEtat));
   Encodeur_1_BoutonEtat = 0;
   Wire.write (byte (round (Encodeur_1_NombreDePas / 2)));
//    Wire.write (char (byte (round (Encodeur_1_NombreDePas / 2))));
   Encodeur_1_NombreDePas = 0;
   // Faire clignoter la DEL de la carte Nano une fois une seconde.
//    DEL_Off_On ();
 }
}
//*****************************************************************************

//*****************************************************************************
// FONCTION LireEncodeurs.
//*****************************************************************************
void LireEncodeurs ()
{
 // Lire l'état du bouton de l'encodeur broche E.
 if (digitalRead (ENCODEUR_1_BOUTON) == OUI)
 { // Répondre avec un message de 1 octet (byte) comme attendu par le maître.
   Encodeur_1_BoutonEtat = 1;
 }

 // Lire l'encodeur 1 broche A et B.
 if (digitalRead (ENCODEUR_1_SORTIE_A) == digitalRead (ENCODEUR_1_SORTIE_B))
 {
   Encodeur_1_NombreDePas = Encodeur_1_NombreDePas + 1;
 }
 else
 {
   Encodeur_1_NombreDePas = Encodeur_1_NombreDePas - 1;
 }
}
//*****************************************************************************

//*****************************************************************************
// FONCTION SETUP = Code d'initialisation.
//*****************************************************************************
void setup ()
...
 // Joindre le bus I2C.
 Wire.begin (ADRESSE_NANO_1);
 // Enregistrer l'événement pour lorsqu'une demande arrive.
 Wire.onRequest (ActionsEncodeurs);
...
 // Configurer les ports Arduino en entrée pour l'encodeur 4 :
 pinMode (ENCODEUR_1_SORTIE_A, ENTREE_ET_RESISTENCE_INTERNE);
 pinMode (ENCODEUR_1_SORTIE_B, ENTREE_ET_RESISTENCE_INTERNE);
 pinMode (ENCODEUR_1_BOUTON, ENTREE_ET_RESISTENCE_INTERNE);
 digitalWrite (ENCODEUR_1_SORTIE_A, HAUT);
 digitalWrite (ENCODEUR_1_SORTIE_B, HAUT);
 digitalWrite (ENCODEUR_1_BOUTON, HAUT);
...
//*****************************************************************************
// FONCTION LOOP = Boucle sans fin = coeur du programme.
//*****************************************************************************
void loop()
{
 // Ici les instructions à exécuter par le programme principal.
 LireEncodeurs ();
}
//*****************************************************************************


L'ami René
Modif. : Une erreur dans mon copier/coller.
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 15, 2014, 08:41 am
Dans le dernier exemple, je ne comprends pas que l'affichage par le Mega de la variable "boolean" « Encodeur_5_BoutonEtat » soit autre chose que « 0 » ou « 1 », mes un nombre entre 0 et 255.

L'affichage est fait par la ligne « LCD_2.print (Encodeur_5_BoutonEtat); ».

C'est comme si le format de la variable était modifié par la ligne « Encodeur_5_BoutonEtat = boolean (Wire.read ()); » au format "byte" !?!?!?

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: haifger on Sep 15, 2014, 09:29 am
Bonjour,
Juste pour être sûr (je n'ai pas regardé le code pour l'instant) les résistances sont bien présentes sur le bus I²C ?
Title: Re: Problèmes d'encodeur EC11
Post by: icare on Sep 15, 2014, 09:31 am
Bonjour,
Une variable booléenne prend les valeurs suivantes :
- 0 pour false,
- <> 0 pour true. (donc entre 1 et 255)
@+
Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 15, 2014, 09:42 am
C'est pas tout à fait ça. En toute rigueur il faudrait dire que:
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 15, 2014, 11:52 am

Bonjour,
Juste pour être sûr (je n'ai pas regardé le code pour l'instant) les résistances sont bien présentes sur le bus I²C ?


Bonjour haifger, icare et fdufnews,

Merci pour votre aide !

Des résistances sur le bus I²C ! Oh, OK voilà probablement la source des problèmes. Non,  je n'ai pas de résistances sur le bus I²C. J'ignorais qu'il en fallait. Je fais les recherches et les changements requis et je vous reviens avec les résultats.

Gros gros merci !

L'ami René

Title: Re: Problèmes d'encodeur EC11
Post by: icare on Sep 15, 2014, 12:05 pm
Bonjour,
Pas besoin de grande recherche, tu mets une résistances de 4.7k entre le +5V et le SDA et une autre de 4.7k entre le +5V et le SCL.
@+
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 15, 2014, 01:48 pm
Bonjour icare,

Merci pour votre aide !

Avant de vous lire, j'ai trouvé :

http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html (http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html)

Quote

The value of the resistors is not critical. I have seen anything from 1k8 (1800 ohms) to 47k (47000 ohms) used. 1k8, 4k7 and 10k are common values, but anything in this range should work OK. I recommend 1k8 as this gives you the best performance. If the resistors are missing, the SCL and SDA lines will always be low - nearly 0 volts - and the I2C bus will not work.


Traduction :

Quote

La valeur des résistances n'est pas critique. J'ai vu quelque chose de 1k 8 (1 800 ohms) à 47k (47000 ohms) utilisé. 1k 8, 4 k 7 et 10 k sont des valeurs communes, mais quelque chose dans cette gamme devrait fonctionner OK. Je recommande 1k 8 car cela vous donne les meilleures performances. Si les résistances sont manquants, les lignes SCL et SDA sera toujours faibles - presque 0 Volt - et le bus I2C ne fonctionneront pas.


Donc, j'utilise deux résistances 1K?, est-ce important selon vous, dois-je changer pour 4.7K? ?

En pièce jointe, montage Fritzing aux formats FZZ, PDF, et JPG, du circuit, est-il correct ?

Les résistances changent un peu les choses, mais le problème reste entier, les valeurs sont incohérentes que l'encodeur et son bouton soient manipulés ou non.

Encore merci !

L'ami René

Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 15, 2014, 02:06 pm


...
Les résistances changent un peu les choses, mais le problème reste entier, les valeurs sont incohérentes que l'encodeur et son bouton soient manipulés ou non.



Bonjour
l'exposé de ta constation n'est pas exploitable
il te faut faire une demarche "de scientifique  sur paillasse"  

le "changent un peu les choses" , ça se traduit exactement comment/par quoi ?  le "peu" consiste en quoi ?

tu utilise quoi comme codes basiques de validation d'echange entre tes 2 cartes/MCU  ?


Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 15, 2014, 02:35 pm
D'après la spécification I²C, pour un circuit en 5V, la résistance ne devrait pas être inférieure à 1,2k.
Toujours d'après la spécification sa valeur max ne devrait pas excéder 4,7k environ en mode Fast (SCL = 400kHz) si le bus est faiblement capacitif.
Une valeur trop haute augmente le temps de monté des signaux et peut rendre la communication instable.
Une valeur trop basse fait tirer trop de courant sur le collecteur ouvert de sortie et peut entraîner un niveau 0 hors spécification.

Idéalement une 2,2k serait la valeur passe partout. La valeur de 4,7k souvent préconisée est valable si le bus reste court.

Ce serait bien de nous mettre le code que tu utilises pour tes tests.
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 15, 2014, 02:51 pm

...

Idéalement une 2,2k serait la valeur passe partout. La valeur de 4,7k souvent préconisée est valable si le bus reste court.

Ce serait bien de nous mettre le code que tu utilises pour tes tests.

bonjour fdufnews
bien d'accord
je penche plus  pour un probleme  purement "soft"  plutot qu'un probleme de validation/levée de doute  de la comm I²C
et ce d'autant que plus haut Lamirené expose :   :smiley-mr-green:

Quote
Je viens de réussir une première communication I2C entre Arduino Mega et Nano en mode « Master Reader » pour la lecture de l'état d'un bouton pression. C'est d'une grande simplicité !


Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 15, 2014, 03:02 pm
Bonjour Artouste et fdufnews,

Les valeurs incohérentes sont plus petites, probablement que comme la communication et plus rapide, le nombre des boucles exécuté par le Nano est moindre entre les demandes du Mega. La valeur pour « Encodeur_1_BoutonEtat » est maintenant toujours proche de 12, ±1, et pour « Encodeur_1_NombreDePas », toujours fixe à 255 quand je ne touche pas à l'encodeur. Quand je le manipule, la valeur pour « Encodeur_1_BoutonEtat » est maintenant toujours proche de 4, ±3, et pour « Encodeur_1_NombreDePas », toujours fixe à 255.

Mais, « Encodeur_1_BoutonEtat » est un binaire (0/1), alors comme expliquer les « 12, ±1, » et « 4, ±3 » ?

Je ne suis pas sur de comprendre le sens de la question « tu utilise quoi comme codes basiques de validation d'echange entre tes 2 cartes/MCU  ?  », mais pour ce que j'en comprends, je valide par l'affichage sur écran LCD des deux valeurs immédiatement après réception de ces données et sans les modifier ou les convertir :

Pour le Nano :
Code: [Select]

...
    Wire.write (byte (Encodeur_1_BoutonEtat));
//    Wire.write (char (Encodeur_1_BoutonEtat));
    Encodeur_1_BoutonEtat = 0;
    Wire.write (byte (round (Encodeur_1_NombreDePas / 2)));
//    Wire.write (char (byte (round (Encodeur_1_NombreDePas / 2))));
    Encodeur_1_NombreDePas = 0;
...


Pour le Mega :
Code: [Select]

...
    Encodeur_5_BoutonEtat = (boolean (Wire.read ()));
    Encodeur_5_NombreDePas = (byte (Wire.read ()));
    LCD_2.setCursor (14, 3);
    LCD_2.print ("      ");
    LCD_2.setCursor (14, 3);
    LCD_2.print (Encodeur_5_BoutonEtat);
    LCD_2.setCursor (17, 3);
    LCD_2.print (Encodeur_5_NombreDePas);
...


Pour "validation d'echange entre tes 2 cartes/MCU", je n'utilise rein d'autre.

OK pour 2,2k qui serait la valeur passe-partout et 4,7k. Je teste et reviens avec les constats.

Un grand merci pour votre aide !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: haifger on Sep 15, 2014, 03:07 pm
Perso, pour déboguer, je commencerai pas faire envoyer à la Nano des valeurs "fixes" (ie connues à l'avance, par exemple 1 et 77). Si cette étape ne fonctionne pas, il n'est pas pertinent de passer à l'envoi de données dynamiques.
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 15, 2014, 03:09 pm

...
Je ne suis pas sur de comprendre le sens de la question « tu utilise quoi comme codes basiques de validation d'echange entre tes 2 cartes/MCU  ?  »,

ce ne sont pas des codes basiques
pour rester dans l'environnement de base
test simplement la comm I²C en utilisant seulement  le serial en debug (à vitesse elevée 115200)
pas en utilisant de l'afficheur LCD (lib conso en temps de calcul)

edit , et bien d'accord avec la proposition de haifger  8)
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 15, 2014, 03:11 pm

...
Ce serait bien de nous mettre le code que tu utilises pour tes tests.


En pièce jointe tout le code mis à jour il y a 2 minutes.

Merci pour votre aide !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 15, 2014, 03:28 pm

...
Idéalement une 2,2k serait la valeur passe partout. La valeur de 4,7k souvent préconisée est valable si le bus reste court.
...


Pour des 2.2K? ou des 4.7K?, la valeur pour « Encodeur_1_BoutonEtat » est toujours proche de 12, ±1, et pour « Encodeur_1_NombreDePas », toujours fixe à 255 quand je ne touche pas à l'encodeur. Quand je le manipule, la valeur pour « Encodeur_1_BoutonEtat » est maintenant 1 et 126, et pour « Encodeur_1_NombreDePas », toujours fixe à 255.

Je teste avec la sortie du terminal série de l'IDE Arduino et je vous recopierai ici les sorties.

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 15, 2014, 03:47 pm
Et voici la sortie du terminal (Pour des 4.7K?, autres test ?) :

Quote


********************************************************************************
*                               MegaNano01xEncoM                               *
********************************************************************************
*        Broche pour initialiser la broche RESET des CI Slave activer !        *
********************************************************************************
*    Broche des boutons pour selection des radios NAV, COM et ADF activer !    *
********************************************************************************
*                       Broche du (((Buzzer))) activer !                       *
********************************************************************************
*            Broche du capteur infrarouge de telecommande activer !            *
********************************************************************************
*          Broche de la DEL de la carte Arduino et Ethernet activer !          *
********************************************************************************
*                  Broche des encodeurs et poussoir activer !                  *
********************************************************************************
*            Broche du bouton pour Entrer/Sortir les roues activer !           *
********************************************************************************
*                      Broche des interrupteurs activer !                      *
********************************************************************************
*                     Communication Ethernet UDP activer !                     *
********************************************************************************
********************************************************************************
*                  Broche pour la communication I2C activer !                  *
*              Debut du programme principal boucle >>> loop () <<<             *
********************************************************************************
********************************************************************************
* TempsActuele = 3791, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 3863, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 3934, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 4004, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255

* TempsActuele = 6277, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6348, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6419, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6490, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6561, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6632, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6703, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 6774, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255

Note : Début des réponses du Nano :

* TempsActuele = 6845, Encodeur_5_BoutonEtat = 10, Encodeur_5_NombreDePas = 255
* TempsActuele = 6917, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 6987, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
...
* TempsActuele = 16094, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 16164, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 16236, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255

Note : Début de mes manipulations de l'encodeur et de son bouton :

* TempsActuele = 16307, Encodeur_5_BoutonEtat = 127, Encodeur_5_NombreDePas = 255
* TempsActuele = 16378, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 16449, Encodeur_5_BoutonEtat = 126, Encodeur_5_NombreDePas = 255
* TempsActuele = 16521, Encodeur_5_BoutonEtat = 126, Encodeur_5_NombreDePas = 255
* TempsActuele = 16591, Encodeur_5_BoutonEtat = 1, Encodeur_5_NombreDePas = 255
* TempsActuele = 16663, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 16734, Encodeur_5_BoutonEtat = 120, Encodeur_5_NombreDePas = 255
* TempsActuele = 16805, Encodeur_5_BoutonEtat = 120, Encodeur_5_NombreDePas = 255
* TempsActuele = 16876, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 16948, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 17018, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 17090, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 17161, Encodeur_5_BoutonEtat = 126, Encodeur_5_NombreDePas = 255
* TempsActuele = 17232, Encodeur_5_BoutonEtat = 124, Encodeur_5_NombreDePas = 255
* TempsActuele = 17303, Encodeur_5_BoutonEtat = 127, Encodeur_5_NombreDePas = 255
* TempsActuele = 17375, Encodeur_5_BoutonEtat = 2, Encodeur_5_NombreDePas = 255
* TempsActuele = 17445, Encodeur_5_BoutonEtat = 127, Encodeur_5_NombreDePas = 255
* TempsActuele = 17517, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 17588, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 17659, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 17730, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 17802, Encodeur_5_BoutonEtat = 4, Encodeur_5_NombreDePas = 255
* TempsActuele = 17872, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas = 255
* TempsActuele = 17944, Encodeur_5_BoutonEtat = 127, Encodeur_5_NombreDePas = 255
* TempsActuele = 18015, Encodeur_5_BoutonEtat = 125, Encodeur_5_NombreDePas = 255
* TempsActuele = 18086, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 18157, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 18229, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 18299, Encodeur_5_BoutonEtat = 12, Encodeur_5_NombreDePas = 255
* TempsActuele = 18371, Encodeur_5_BoutonEtat = 11, Encodeur_5_NombreDePas = 255
* TempsActuele = 18442, Encodeur_5_BoutonEtat = 127, Encodeur_5_NombreDePas = 255



L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 16, 2014, 12:46 pm
Bonjour,

Voici la sortie du terminal série du Nano :

Quote

********************************************************************************
*          En attente des demandes du maitre de la communication I2C !         *
********************************************************************************
* TempsActuele = 4071, Encodeur_1_BoutonEtat = 0, Encodeur_1_NombreDePas = 1
* TempsActuele = 4076, Encodeur_1_BoutonEtat = 0, Encodeur_1_NombreDePas = 2
* TempsActuele = 4082, Encodeur_1_BoutonEtat = 0, Encodeur_1_NombreDePas = 3
...
* TempsActuele = 6451, Encodeur_1_BoutonEtat = 0, Encodeur_1_NombreDePas = 98
* TempsActuele = 6458, Encodeur_1_BoutonEtat = 0, Encodeur_1_NombreDePas = 99
* TempsActuele = 6464, Encodeur_1_BoutonEtat = 0, Encodeur_1_NombreDePas = 100

Note : Début de mes manipulations du bouton de l'encodeur :

* TempsActuele = 6474, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 101
* TempsActuele = 6481, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 102
* TempsActuele = 6489, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 103
...
* TempsActuele = 8085, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 77
* TempsActuele = 8091, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 78
* TempsActuele = 8098, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 79
* TempsActuele = 8104, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8112, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81

Note : Début de mes manipulations de l'encodeur :

* TempsActuele = 8118, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8125, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8132, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8138, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8145, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8152, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 79
* TempsActuele = 8159, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 78
* TempsActuele = 8165, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 79
* TempsActuele = 8172, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8178, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 79
* TempsActuele = 8185, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 78
* TempsActuele = 8193, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 77
* TempsActuele = 8199, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 78
* TempsActuele = 8206, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 79
* TempsActuele = 8212, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8219, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8225, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 82
* TempsActuele = 8232, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8239, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8246, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8253, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 80
* TempsActuele = 8259, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8266, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 82
...
* TempsActuele = 8293, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 82
* TempsActuele = 8299, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 81
* TempsActuele = 8306, Encodeur_1_BoutonEtat = 1, Encodeur_1_NombreDePas = 82
...


Donc, il y a un problème ici, l'encodeur incrémente, sans qu'il soit manipulé. Je regarde le montage du circuit et revérifie le code source...

Merci pour les conseils et les méthodes !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 16, 2014, 12:47 pm

Encodeur_1_NombreDePas », toujours fixe à 255 quand je ne touche pas à l'encodeur. Quand je le manipule, la valeur pour « Encodeur_1_BoutonEtat » est maintenant 1 et 126, et pour « Encodeur_1_NombreDePas », toujours fixe à 255.



bonjour
j'ai regardé rapidement et testé ton code MegaNano01xEncoS avec un encodeur

ça ne lit pas du tout les encodeurs
voir ça
Code: [Select]
void LireEncodeurs ()
{
 // Lire l'état du bouton de l'encodeur broche E.
 if (digitalRead (ENCODEUR_1_BOUTON) == OUI)
 { // Répondre avec un message de 1 octet (byte) comme attendu par le maître.
   Encodeur_1_BoutonEtat = 1;
 }

 // Lire l'encodeur 1 broche A et B.
 if (digitalRead (ENCODEUR_1_SORTIE_A) == digitalRead (ENCODEUR_1_SORTIE_B))
 {
   Encodeur_1_NombreDePas = Encodeur_1_NombreDePas + 1;
 }
 else
 {
   Encodeur_1_NombreDePas = Encodeur_1_NombreDePas - 1;
 }
}

ça ne compte/decompte pas en fonction de l'action sur l'encodeur
ça fait juste en permanence du +1 ou -1  , mais ça ne lit pas l'encodeur
c'est facile à voir en mettant ça en loop

Code: [Select]
void loop()
// La fonction loop () s'exécute sans fin en boucle aussi longtemps que
// l'Arduino est sous tension.
{
 // Ici les instructions à exécuter par le programme principal.
 LireEncodeurs ();
 Serial.println (Encodeur_1_NombreDePas);
}


regle déjà ça , sinon tu n'avancera pas
pour faire simple une gestion d'encodeurs en quadrature necessite qq part une sauvegarde de l'etat des pin A/B pour comparaison , il n'y a rien de tout ça dans ton code

Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 16, 2014, 03:49 pm
Bonjour Artouste,

Merci pour votre aide !

Un de mes bogues est l'utilisation du type de variable « byte » qui est non signé, que je suis bête, pour un encodeur, c'est pas fort !?!

J'ai moi aussi trouvé ce bogue qui découle de la version Mega de lecture des encodeurs, mais avec broche interruption, et évidemment, il manque la partie « attachInterrupt... », etc.

J'ai déjà remplacé par :

Code: [Select]

...
//*****************************************************************************
// FONCTION ActionsEncodeurs.
//*****************************************************************************
void ActionsEncodeurs ()
// Fonction qui est exécutée lorsque des données sont demandées par le Maître.
// Cette fonction est enregistrée comme un événement ("event" en anglais),
// voir la fonction setup ().
{
  if ((Encodeur_1_BoutonEtat == 1) or (Encodeur_1_NombreDePas.EntierSigne != 0))
  {
    Wire.write (Encodeur_1_BoutonEtat);
    Encodeur_1_BoutonEtat = 0;
    Encodeur_1_NombreDePas.EntierSigne = Encodeur_1_NombreDePas.EntierSigne / 2;
    Wire.write (Encodeur_1_NombreDePas.Octet [0]);
    Wire.write (Encodeur_1_NombreDePas.Octet [1]);
    Encodeur_1_NombreDePas.EntierSigne = 0;
    // Faire clignoter la DEL de la carte Nano une fois une seconde.
  }
}
//*****************************************************************************

//*****************************************************************************
// FONCTION LireEncodeurs.
//*****************************************************************************
void LireEncodeurs ()
{
  // Lire l'état du bouton de l'encodeur broche E.
  if (digitalRead (ENCODEUR_1_BOUTON) >= 1)
  { // Répondre avec un message de 1 octet (byte) comme attendu par le maître.
    Encodeur_1_BoutonEtat = 1;
    delay (EncodeurTempsRebond);
  }

  // Lire l'encodeur 1 broche # A.
  bitWrite (Encodeur_1_EtatActuel, 0, !digitalRead (ENCODEUR_1_SORTIE_A));
  // Lire l'encodeur 1 broche # B.
  bitWrite (Encodeur_1_EtatActuel, 1, !digitalRead (ENCODEUR_1_SORTIE_B));
  if (Encodeur_1_EtatActuel != Encodeur_1_EtatPrecedent)
  {
    switch (Encodeur_1_EtatPrecedent)
    {
      case 0:
        if (Encodeur_1_EtatActuel == 1)
        {
          Encodeur_1_Direction = 1;
        }
        else
        {
          Encodeur_1_Direction = 0;
        }
        break;
      case 1:
      if (Encodeur_1_EtatActuel == 3)
        {
        Encodeur_1_Direction = 1;
        }
      else
        {
        Encodeur_1_Direction = 0;
        }
      break;
      case 2:
        if (Encodeur_1_EtatActuel == 0)
        {
          Encodeur_1_Direction = 1;
        }
        else
        {
          Encodeur_1_Direction = 0;
        }
        break;
      case 3:
        if (Encodeur_1_EtatActuel == 2)
        {
          Encodeur_1_Direction = 1;
        }
        else
        {
          Encodeur_1_Direction = 0;
        }
        break;
    }
    Encodeur_1_EtatPrecedent = Encodeur_1_EtatActuel;
    // Vérifier si l'encodeur est en position d'arrêt (01 et 10 pour les détentes),
    // pour exclure le changement de la valeur doublée.
    if (Encodeur_1_EtatActuel == 1 or Encodeur_1_EtatActuel == 2)
    {
      // Pour les autres encodeurs, il peut être 00 ou 11 états (0 à 3),
      // vérifiez votre codeur.
      if (Encodeur_1_Direction)
      {
        Encodeur_1_NombreDePas.EntierSigne = Encodeur_1_NombreDePas.EntierSigne + 1;
      }
      else
      {
        Encodeur_1_NombreDePas.EntierSigne = Encodeur_1_NombreDePas.EntierSigne - 1;
      }
    }
    delay (EncodeurTempsRebond);
  }
}
//*****************************************************************************
...


Et maintenant le Nano donne les bonnes sorties, tout est cohérent maintenant côté Nano pour la cueillette des données de l'encodeur et son bouton.

Le tout se gâte à la transmission et/ou réception côté Mega.

Dans les deux codes (Mega, Nano) les types de variables sont passés à :

Code: [Select]

// Variable pour les données de l'encodeur 5 :
// Recoit la valeur indiquant l'état pressé ou non d'un bouton.
byte         Encodeur_5_BoutonEtat    = 0;
// Recoit la valeur indiquant le nombre de pas fait  l'encodeur depuis la dernière
// demande de l'Arduino maître de la communication i2c.
// Unions permettent le même emplacement de mémoire auquel on doit accéder en
// tant que types de données différents.
union
{
  byte Octet [1];// Deux octets.
  int EntierSigne;
} Encodeur_5_NombreDePas;


Et j'ai les mêmes problèmes si je change pour :

Code: [Select]

union
{
  char Octet [1];// Deux octets.
  int EntierSigne;
} Encodeur_5_NombreDePas;


Je retour fouiller le code...

Encore merci pour votre aide !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 16, 2014, 10:39 pm

...


Et maintenant le Nano donne les bonnes sorties, tout est cohérent maintenant côté Nano pour la cueillette des données de l'encodeur et son bouton.
...
Le tout se gâte à la transmission et/ou réception côté Mega.

Dans les deux codes (Mega, Nano) les types de variables sont passés à :

...

Je retour fouiller le code...



Je ne comprend pas bien reellement  ton (nouveau)  probleme  :smiley-mr-green:

si tu lis des bytes en I²C , pourquoi ne pas simplement utiliser en portée selon les MSB/LSB reçus et leur ordre les instructions "<<"  ou ">>" ?
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 05:13 am
Bonjour Artouste,

Merci pour l'aide !

Je reviens avec un exemple de sortie terminal côté Mega...

Je ne connais pas : « utiliser en portée selon les MSB/LSB reçus et leur ordre les instructions "<<"  ou ">>" ?  » !

Mais est-ce qu'il y a un problème a utiliser ? :

Code: [Select]

union
{
  byte Octet [1];// Deux octets.
  int EntierSigne;
} Encodeur_5_NombreDePas;


Cela devrait fonctionner ou pas ?

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 05:43 am
Rebonjour,

Voici un exemple de sortie terminal côté Mega :

Quote

********************************************************************************
*                  Broche pour la communication I2C activer !                  *
*              Debut du programme principal boucle >>> loop () <<<             *
********************************************************************************
********************************************************************************
* TempsActuele = 3271, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 3336, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 3400, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...
* TempsActuele = 8460, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8524, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8589, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1


Note : Début de mes manipulations du bouton de l'encodeur (pas de réaction...) :

* TempsActuele = 8652, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8717, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8780, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...
* TempsActuele = 8845, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8908, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8973, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1

Note : Début de mes manipulations de l'encodeur, et c'est la valeur du bouton qui change, pas le nombre de pas :

* TempsActuele = 9036, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 9101, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 9164, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 9230, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 9294, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...
* TempsActuele = 10897, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 10960, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11025, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11089, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11153, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11217, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11283, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11348, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11412, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11478, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11543, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11609, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11674, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11738, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...


Vous y voyez quelque chose ?

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 05:46 am
La dernière version de tout le code en pièce jointe.

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 17, 2014, 11:25 am

Mais est-ce qu'il y a un problème a utiliser ? :
Code: [Select]

union
{
 byte Octet [1];// Deux octets.
 int EntierSigne;
} Encodeur_5_NombreDePas;


Cela devrait fonctionner ou pas ?

Cela ne fonctionne pas dans le principe.
byte Octet [1] ne fait la réservation que pour 1 octets.
Code: [Select]

union
{
 byte Octet [2];// Deux octets.
 int EntierSigne;
} Encodeur_5_NombreDePas;

Autrement utiliser une union pour gérer la conversion int vers 2 byte ne pose pas de problème pour autant que les byte soient écrits dans le bon ordre.
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 12:34 pm
Bonjour ,

Un très grand merci !

Je viens de corriger les deux codes sources (Mega et Nano), le « byte Octet [1];// Deux octets. » pour « byte Octet [2];// Deux octets. ».

L'ordre d'envoi est :

Code: [Select]

...
  if ((Encodeur_1_BoutonEtat != 0) or (Encodeur_1_NombreDePas.EntierSigne != 0))
  {
    Wire.write (Encodeur_1_BoutonEtat);
    Encodeur_1_BoutonEtat = 0;
    Encodeur_1_NombreDePas.EntierSigne = Encodeur_1_NombreDePas.EntierSigne / 2;
    Wire.write (Encodeur_1_NombreDePas.Octet [0]);
    Wire.write (Encodeur_1_NombreDePas.Octet [1]);
    Encodeur_1_NombreDePas.EntierSigne = 0;
  }
...


L'ordre de réception est :

Code: [Select]

...
  Wire.requestFrom (int (ADRESSE_TINY_1), 3);
  if (Wire.available ())
  { // Réception de l'octet (byte) comme caractère.
    // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
    Encodeur_5_BoutonEtat = byte (Wire.read ());
    // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
    // dernière demande de l'Arduino maître de la communication i2c.
    Encodeur_5_NombreDePas.Octet [0] = byte (Wire.read ());
    Encodeur_5_NombreDePas.Octet [1] = byte (Wire.read ());
...


Alors, cela serait correct ?

Mais, pour ce qui est de la sortie sur le terminal série de l'Arduino Mega, le résultat est le même :
Quote

...
********************************************************************************
* TempsActuele = 3271, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 3336, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 3400, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...
* TempsActuele = 8460, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8524, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8589, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1


Note : Début de mes manipulations du bouton de l'encodeur (pas de réaction...) :

* TempsActuele = 8652, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8717, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8780, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...
* TempsActuele = 8845, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8908, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8973, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1

Note : Début de mes manipulations de l'encodeur, et c'est la valeur du bouton qui change, pas le nombre de pas :

* TempsActuele = 9101, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 9164, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 9230, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...
* TempsActuele = 11153, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11217, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11283, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11348, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11412, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
...


Mais par curiosité, j'inverse l'ordre dans l'envoi et la réception :

L'ordre d'envoi est :

Code: [Select]

...
  if ((Encodeur_1_BoutonEtat != 0) or (Encodeur_1_NombreDePas.EntierSigne != 0))
  {
    Encodeur_1_NombreDePas.EntierSigne = Encodeur_1_NombreDePas.EntierSigne / 2;
    Wire.write (Encodeur_1_NombreDePas.Octet [0]);
    Wire.write (Encodeur_1_NombreDePas.Octet [1]);
    Encodeur_1_NombreDePas.EntierSigne = 0;
    Wire.write (Encodeur_1_BoutonEtat);
    Encodeur_1_BoutonEtat = 0;
  }
...


L'ordre de réception est :

Code: [Select]

...
  Wire.requestFrom (int (ADRESSE_TINY_1), 3);
  if (Wire.available ())
  {
    // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
    // dernière demande de l'Arduino maître de la communication i2c.
    Encodeur_5_NombreDePas.Octet [0] = Wire.read ();
    Encodeur_5_NombreDePas.Octet [1] = Wire.read ();
    // Réception de l'octet (byte) comme caractère.
    // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
    Encodeur_5_BoutonEtat = Wire.read ();
...


Mais, pour ce qui est de la sortie sur le terminal série de l'Arduino Mega, le résultat est :

Quote

********************************************************************************
*                               MegaNano01xEncoM                               *
...
********************************************************************************
* TempsActuele = 3271, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 3340, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 3408, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
...
* TempsActuele = 11180, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 11247, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 11316, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256

Note : Début de mes manipulations de l'encodeur (pas de réaction...) :

* TempsActuele = 11384, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 11452, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 11521, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256

Note : Début de mes manipulations du bouton de l'encodeur, et c'est la valeur du nombre de pas qui change de 256 à 255, mais la valeur du bouton reste à 255 :

* TempsActuele = 15137, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 15206, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* TempsActuele = 15275, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* TempsActuele = 15342, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* TempsActuele = 15411, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* TempsActuele = 15478, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 15547, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
...


C'est pour le moins surprenant !

Ce qui pour moi a tendance a démontrer qu'il y a un problème dans la communication i2c !

Actuellement j'utilise des 4.7K?, comme résistant pour l'i2c.

Qu'en pensez-vous !

J'ai aussi inversé dans la définition des variables (mais même résultat) :

Code: [Select]

union
{
  int EntierSigne = 0;
  byte Octet [2];// Deux octets.
} Encodeur_5_NombreDePas;


L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 17, 2014, 12:52 pm
Je pense que tu mélanges la mise au point de 2 choses en même temps et ce n'est jamais bon.
D'un coté tu as la lecture des encodeurs. De l'autre la transmission I²C.
Je pense qu'il serait plus productif de séparer les 2 problèmes.
Commence par coder un programme archi simple qui envoie quelques valeurs sur l'I²C et un autre qui les reçoit.
Lorsque cette partie fonctionnera il sera toujours temps d'y ajouter les encodeurs.

Ne pas oublier qu'à un instant donné le programme qui fait la réception ne sait pas ce qu'envoie l'émetteur (octet 0 ou octet 1). Il est impératif d'avoir un code (de préférence unique) qui marque le début du message ainsi le récepteur risque moins de se prendre les pieds dans le tapis en reconstruisant l'entier de son coté.
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 17, 2014, 12:56 pm


Code: [Select]
if (Wire.available ())
 { // Réception de l'octet (byte) comme caractère.
   // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
   Encodeur_5_BoutonEtat = byte (Wire.read ());
   // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
   // dernière demande de l'Arduino maître de la communication i2c.
   Encodeur_5_NombreDePas.Octet [0] = byte (Wire.read ());
   Encodeur_5_NombreDePas.Octet [1] = byte (Wire.read ());



...

Ce qui pour moi a tendance a démontrer qu'il y a un problème dans la communication i2c !

Actuellement j'utilise des 4.7K?, comme résistant pour l'i2c.

Qu'en pensez-vous !


bonjour
a tu oui ou non déjà testé seulement la liaison I²C
slave envoie 3 bytes sur demande du master et master affiche en serial les 3 bytes ?
là tu es parti déjà dans l'integration encodeurs i²C sans déjà etre formellement sur de la validité de la liaison hard I²C

regarde peut etre aussi avant de lire l'I²C si il y a au moins 3 bytes à lire
wire.available() >2 sinon tu risque juste de faire de l'ecrasement de byte

edit fdufnews plus rapide  :smiley-mr-green: , mais constat identique  8)
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 02:44 pm
Bonjour fdufnews et Artouste,

Oui, j'avais fait un prétest de l'i2c avec l'état d'un bouton (Nano) et le clignotement d'une DEL (Mega) et le tout fonctionnait. Et c'est de là que j'ai importé dans mon code de cockpit.

Je vérifie avec l'affichage du nombre d'octets à lire et ce genre de test et vous reviens avec les résultats.

Un très grand merci pour votre aide !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 17, 2014, 02:52 pm


Oui, j'avais fait un prétest de l'i2c avec l'état d'un bouton (Nano) et le clignotement d'une DEL (Mega) et le tout fonctionnait. Et c'est de là que j'ai importé dans mon code de cockpit.


Alors considere que la liaison physique entre MCU  I²C est validée ,  ne te fait plus de noeuds au cerveau sur  4.7K ou X.Y ?  concernant  les lignes I²C  :smiley-mr-green:    , passe simplement au "pourquoi" les valeurs attendues à priori envoyées "ne collent pas"

si déjà ça "bouge" entre slave et master sur action slave , c'est un pas trop mauvais "signe"  

et en complement :
reprend simplement tes "pretests" pour verfier que tu reçois bien des "motifs simples (3 bytes) " comme tu les attend
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 03:36 pm
Rebonjour,

Merci !

Voici le code modifié :

Code: [Select]

...
  // Lire l'encodeur 5.
  // Lecture de 3 octets (byte) depuis l'esclave Tiny #1.
  Wire.requestFrom (int (ADRESSE_TINY_1), 3);
  Serial.print ("* Wire.available () = ");
  Serial.print (Wire.available ());
  LCD_2.setCursor (19, 2);
  LCD_2.print (Wire.available ());
 
  if (Wire.available () > 2)
  {
    // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
    // dernière demande de l'Arduino maître de la communication i2c.
    Encodeur_5_NombreDePas.Octet [0] = Wire.read ();
    Encodeur_5_NombreDePas.Octet [1] = Wire.read ();
    // Réception de l'octet (byte) comme caractère.
    // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
    Encodeur_5_BoutonEtat = Wire.read ();

    // Écriture dans le moniteur série de l'IDE d'Arduino des valeurs lues.
    Serial.print (", TempsActuele = ");
    Serial.print (TempsActuele);
    Serial.print (", Encodeur_5_BoutonEtat = ");
    Serial.print (Encodeur_5_BoutonEtat);
    Serial.print (", Encodeur_5_NombreDePas.EntierSigne = ");
    Serial.print (Encodeur_5_NombreDePas.EntierSigne);
    Serial.println ();
...


Et la sortie sur Mega (avec manipulation de l'encodeur et son bouton, les résultats restent identiques) :

Quote

********************************************************************************
*                               MegaNano01xEncoM                               *
********************************************************************************
*        Broche pour initialiser la broche RESET des CI Slave activer !        *
********************************************************************************
*    Broche des boutons pour selection des radios NAV, COM et ADF activer !    *
********************************************************************************
*                       Broche du (((Buzzer))) activer !                       *
********************************************************************************
*            Broche du capteur infrarouge de telecommande activer !            *
********************************************************************************
*          Broche de la DEL de la carte Arduino et Ethernet activer !          *
********************************************************************************
*                  Broche des encodeurs et poussoir activer !                  *
********************************************************************************
*            Broche du bouton pour Entrer/Sortir les roues activer !           *
********************************************************************************
*                      Broche des interrupteurs activer !                      *
********************************************************************************
*                     Communication Ethernet UDP activer !                     *
********************************************************************************
********************************************************************************
*                  Broche pour la communication I2C activer !                  *
*              Debut du programme principal boucle >>> loop () <<<             *
********************************************************************************
********************************************************************************
* Wire.available () = 3, TempsActuele = 3271, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3340, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3408, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3477, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3546, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3614, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3683, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3751, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 3820, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 3889, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 3957, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4026, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4094, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 4163, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 4232, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 4300, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 4369, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4438, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4506, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4575, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4643, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4712, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4781, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
...


Donc, je reçois bien 3 octets !

Je vais dorénavant utiliser le 3e paramètre de la fonction « Wire.requestFrom », même si cela ne change pas les résultats :

Code: [Select]

...
  // Lecture de 3 octets (byte) depuis l'esclave Tiny #1.
  // L'adresse i2c = ADRESSE_TINY_1, le nombre d'octets = 3 et oui (true) pour
  // l'envoi d'un message arrêt à la fin de l'envoi des octets.
  Wire.requestFrom (int (ADRESSE_TINY_1), 3, true);
...


J'apprécie vraiment votre aide !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 17, 2014, 03:46 pm

...
Voici le code modifié :




tu es encore et toujours en train de modifier dans "ton truc"  intégré

fais déjà des tests simples I²C avec  programmes master et slave qui ne font que ça =
mettre à disposition 3 bytes X,Y,Z par slave et les lire par master

pas besoin de "verbiage à coté"  , une fois que ça sera validé tu passeras à la transformation bytes --> INT et une fois ça aussi validé tu passera à l'integration


et reflexion au passage je ne vois pas pourquoi passer par un INT pour le nombre de pas  , perso je calerais un byte à 128 pour aucune action (zero relatif)
parce que de toutes façons si tu recupere des valeurs de pas importantes ce sera un systme inexploitable, donc pas besoin de INT

et complement à la reflexion avec un seul byte par encodeur avec contact tu dois pouvoir t'en sortir
MSB LSB
bit 7 = contact ou pas
bit 6 = positif ou negatif
bit 5--0 deplacement

Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 03:49 pm
Bonjour Artouste,

OK, j'y vais, test xyz.

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 04:42 pm
Alors voilà :

Code Nano :

Code: [Select]

#include "Wire.h"

// Adresse de la communication I2C de l'Arduino Mega avec Nano.
const byte ADRESSE_NANO_1 = 1;// Adresse requise pour l'esclave Tiny i2c.

byte Variable_X = 0;
byte Variable_Y = 0;
byte Variable_Z = 0;

void EnvoyerDonnees ()
{
  Variable_X = Variable_X + 1;
  Variable_Y = Variable_Y + 2;
  Variable_Z = Variable_Z + 3;
  Wire.write (Variable_X);
  Wire.write (Variable_Y);
  Wire.write (Variable_Z);
  // Écriture dans le moniteur série de l'IDE d'Arduino des valeurs lues.
  Serial.print (", Variable_X = ");
  Serial.print (Variable_X);
  Serial.print (", Variable_Y = ");
  Serial.print (Variable_Y);
  Serial.print (", Variable_Z = ");
  Serial.print (Variable_Z);
  Serial.println ();
}

void setup ()
{
  Serial.begin (115200);
  Serial.print ("* Debut setup Nano *");
  Serial.println ();
  // Joindre le bus I2C.
  Wire.begin (ADRESSE_NANO_1);
  // Enregistrer l'événement pour lorsqu'une demande arrive.
  Wire.onRequest (EnvoyerDonnees);
  Serial.print ("* Fin setup Nano *");
  Serial.println ();
  Serial.print ("* Debut loop Nano *");
  Serial.println ();
  Serial.println ();
}

void loop ()
{
}


Sortie terminal série Nano :

Quote

* Debut setup Nano *
* Fin setup Nano *
* Debut loop Nano *

, Variable_X = 1, Variable_Y = 2, Variable_Z = 3
, Variable_X = 2, Variable_Y = 4, Variable_Z = 6
, Variable_X = 3, Variable_Y = 6, Variable_Z = 9
, Variable_X = 4, Variable_Y = 8, Variable_Z = 12
, Variable_X = 5, Variable_Y = 10, Variable_Z = 15
, Variable_X = 6, Variable_Y = 12, Variable_Z = 18
, Variable_X = 7, Variable_Y = 14, Variable_Z = 21
, Variable_X = 8, Variable_Y = 16, Variable_Z = 24
, Variable_X = 9, Variable_Y = 18, Variable_Z = 27
, Variable_X = 10, Variable_Y = 20, Variable_Z = 30
, Variable_X = 11, Variable_Y = 22, Variable_Z = 33
, Variable_X = 12, Variable_Y = 24, Variable_Z = 36
, Variable_X = 13, Variable_Y = 26, Variable_Z = 39
, Variable_X = 14, Variable_Y = 28, Variable_Z = 42
, Variable_X = 15, Variable_Y = 30, Variable_Z = 45
, Variable_X = 16, Variable_Y = 32, Variable_Z = 48
, Variable_X = 17, Variable_Y = 34, Variable_Z = 51


Code Mega :

Code: [Select]

#include "Wire.h"

// Adresse de la communication I2C de l'Arduino Mega avec Nano.
const byte ADRESSE_MEGA_0 = 0;// Adresse optionnelle pour un maître i2c.
const byte ADRESSE_NANO_1 = 1;// Adresse requise pour l'esclave Tiny i2c.

byte Variable_X = 0;
byte Variable_Y = 0;
byte Variable_Z = 0;

void setup ()
{
  Serial.begin (115200);
  Serial.print ("* Debut setup Mega *");
  Serial.println ();
  Wire.begin (ADRESSE_MEGA_0);// Joindre le bus I2C.
  Serial.print ("* Fin setup Mega *");
  Serial.println ();
  Serial.print ("* Debut loop Mega *");
  Serial.println ();
  Serial.println ();
}

void loop ()
{
  // Lecture de 3 octets (byte) depuis l'esclave #1.
  // L'adresse i2c = ADRESSE_NANO_1, le nombre d'octets = 3 et oui (true) pour
  // l'envoi d'un message arrêt à la fin de l'envoi des octets.
  Wire.requestFrom (int (ADRESSE_NANO_1), 3, true);
  Serial.print ("* Wire.available () = ");
  Serial.print (Wire.available ());
  // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
  // dernière demande de l'Arduino maître de la communication i2c.
  Variable_X = Wire.read ();
  Variable_Y = Wire.read ();
  Variable_Z = Wire.read ();

  // Écriture dans le moniteur série de l'IDE d'Arduino des valeurs lues.
  Serial.print (", Variable_X = ");
  Serial.print (Variable_X);
  Serial.print (", Variable_Y = ");
  Serial.print (Variable_Y);
  Serial.print (", Variable_Z = ");
  Serial.print (Variable_Z);
  Serial.println ();
  delay (1000);
}


Sortie terminale série Mega :

Quote

* Debut setup Mega *
* Fin setup Mega *
* Debut loop Mega *

* Wire.available () = 0, Variable_X = 255, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 0, Variable_X = 255, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 0, Variable_X = 255, Variable_Y = 255, Variable_Z = 255

NOTE : Lancement du Mega avec bouton RESET sur le Nano... de là, les 3 premiers « * Wire.available () = 0 », mais je ne comprends pas, déjà les « , Variable_X = 255, Variable_Y = 255, Variable_Z = 255 ».

* Wire.available () = 3, Variable_X = 3, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 6, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 9, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 12, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 15, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 18, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 21, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 24, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 27, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 30, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 33, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 36, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 39, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 42, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 45, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 48, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 51, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 54, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 57, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 60, Variable_Y = 255, Variable_Z = 255


Votre avis ?!?

En pièce jointe les deux fichiers.

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 17, 2014, 04:45 pm

Alors voilà :

...
Votre avis ?!?

En pièce jointe les deux fichiers.

L'ami René

Il semblerait que te ne  lise que Z(nano)
Je regarde ça plus tard
NB , j'ai edité ma reponse plus haut avec qq reflexions  :smiley-mr-green:


Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 17, 2014, 05:01 pm
L'I²C ne fonctionne pas comme ça.
C'est le maître qui rythme les transferts.
L'esclave attends une requête du maître pour parler. Il doit utiliser onRequest  (http://arduino.cc/en/Reference/WireOnRequest) pour retourner la donnée au bon moment.
Regardes les exemples dans l'IDE. Il y a un exemple qui s'appelle slave_sender
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 05:37 pm
Bonjour fdufnews,

C'est ce que je fais, il me semble !

Le Mega avec sa commande «   Wire.requestFrom (int (ADRESSE_NANO_1), 3, true);
» et le Nano répond avec «   Wire.onRequest (EnvoyerDonnees);
», non !?!?

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 17, 2014, 07:03 pm
sans aucune garantie
je n'ai pas de quoi essayer mais ça comile
essaye ça pour le sender
Code: [Select]
#include "Wire.h"

// Adresse de la communication I2C de l'Arduino Mega avec Nano.
const byte ADRESSE_NANO_1 = 1;// Adresse requise pour l'esclave Tiny i2c.

byte Variable_X = 0;
byte Variable_Y = 0;
byte Variable_Z = 0;
byte Varsend[3];
void EnvoyerDonnees ()
{
  Variable_X = Variable_X + 1;
  Variable_Y = Variable_Y + 2;
Variable_Z = Variable_Z + 3;

Varsend[0]=Variable_X;
Varsend[1]=Variable_Y;
Varsend[2]=Variable_Z;
  //Wire.write (Variable_X);
  //Wire.write (Variable_Y);
  //Wire.write (Variable_Z);
  Wire.write (Varsend,3);
  // Écriture dans le moniteur série de l'IDE d'Arduino des valeurs lues.
  Serial.print (", Variable_X = ");
  Serial.print (Variable_X);
  Serial.print (", Variable_Y = ");
  Serial.print (Variable_Y);
  Serial.print (", Variable_Z = ");
  Serial.print (Variable_Z);
  Serial.println ();
}

void setup ()
{
  Serial.begin (115200);
  Serial.print ("* Debut setup Nano *");
  Serial.println ();
  // Joindre le bus I2C.
  Wire.begin (ADRESSE_NANO_1);
  // Enregistrer l'événement pour lorsqu'une demande arrive.
  Wire.onRequest (EnvoyerDonnees);
  Serial.print ("* Fin setup Nano *");
  Serial.println ();
  Serial.print ("* Debut loop Nano *");
  Serial.println ();
  Serial.println ();
}

void loop ()
{
}

Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 07:24 pm
Bonjour Artouste,

Bon, les valeurs côté Mega semblent bonnes avec ton code !

Alors, là, faut donc comprendre qu'il y a une gestion interne plus ou moins invisible (transparente) du nombre d'octets a envoyer ?

Y-a une explication ?

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 17, 2014, 07:52 pm

Bonjour Artouste,

Bon, les valeurs côté Mega semblent bonnes avec ton code !

Alors, là, faut donc comprendre qu'il y a une gestion interne plus ou moins invisible (transparente) du nombre d'octets a envoyer ?

Y-a une explication ?

L'ami René


il y a evidemment une explication  :smiley-mr-green:
mais je n'ai pas le courage de chercher pour l'instant

juste pour test essaye ceci (sender) pour verifier qq points
Code: [Select]
#include "Wire.h"

// Adresse de la communication I2C de l'Arduino Mega avec Nano.
const byte ADRESSE_NANO_1 = 1;// Adresse requise pour l'esclave Tiny i2c.

byte Variable_X = 0;
byte Variable_Y = 0;
byte Variable_Z = 0;
byte Varsend[10] = {0, 0, 0, 30,40,50,60,70,80,100};
void EnvoyerDonnees ()
{
  Variable_X = Variable_X + 1;
  Variable_Y = Variable_Y + 2;
Variable_Z = Variable_Z + 3;

Varsend[0]=Variable_X;
Varsend[1]=Variable_Y;
Varsend[2]=Variable_Z;

  //Wire.write (Variable_X);
  //Wire.write (Variable_Y);
  //Wire.write (Variable_Z);
  Wire.write (Varsend,10);
  // Écriture dans le moniteur série de l'IDE d'Arduino des valeurs lues.
  Serial.print (", Variable_X = ");
  Serial.print (Variable_X);
  Serial.print (", Variable_Y = ");
  Serial.print (Variable_Y);
  Serial.print (", Variable_Z = ");
  Serial.print (Variable_Z);
  Serial.println ();
}

void setup ()
{
  Serial.begin (115200);
  Serial.print ("* Debut setup Nano *");
  Serial.println ();
  // Joindre le bus I2C.
  Wire.begin (ADRESSE_NANO_1);
  // Enregistrer l'événement pour lorsqu'une demande arrive.
  Wire.onRequest (EnvoyerDonnees);
  Serial.print ("* Fin setup Nano *");
  Serial.println ();
  Serial.print ("* Debut loop Nano *");
  Serial.println ();
  Serial.println ();
}

void loop ()
{
}


Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 10:20 pm
Bonjour Artouste et toutes et tous,

Il est clair pour moi que sans votre aide, je n'aurais pas trouvé ce type de problème et cette solution !

Alors, j'apprécie vraiment grandement votre aide ! Merci !

Voici comment le problème est réglé dans le code :

Côté Mega :

Code: [Select]

...
// Variables pour les données de l'encodeur 5 :
byte         Encodeur_5_BoutonEtat    = 0;
byte         Encodeur_5_PasFait       = 0;
byte         Encodeur_5_PasDirection  = 0;
...
  // Lire l'encodeur 5.
  // Lecture de 3 octets (byte) depuis l'esclave Tiny #1.
  // L'adresse i2c = ADRESSE_TINY_1, le nombre d'octets = 3 et oui (true) pour
  // l'envoi d'un message arrêt à la fin de l'envoi des octets.
  Wire.requestFrom (int (ADRESSE_TINY_1), 3, true);
  if (Wire.available () > 2)
  {
    // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
    Encodeur_5_BoutonEtat = Wire.read ();
    // Recoit la valeur indiquant si au moins un pas est fait sur  l'encodeur.
    Encodeur_5_PasFait = Wire.read ();
    // Recoit la valeur indiquant si au moins un pas est fait sur  l'encodeur.
    Encodeur_5_PasDirection = Wire.read ();

    // Vérifier s'il le bouton de l'encodeur a été pressé.
    if (Encodeur_5_BoutonEtat == 1)
    { // Si enfoncé, émettre un son.
      EnvoyerCommandeX_Plane ("sim/instruments/barometer_2992");
    }

    if (Encodeur_5_PasFait == 1)
    {// Pas fait = oui.
      if (Encodeur_5_PasDirection == 1)
      {// Pas positif.
        EnvoyerCommandeX_Plane ("sim/instruments/barometer_up");
      }
      else if (Encodeur_5_PasDirection == 2)
      {// Pas négatif.
        EnvoyerCommandeX_Plane ("sim/instruments/barometer_down");
      }
    }
  }
...


Côté Nano :

Code: [Select]

...
// Recoit la valeur indiquant l'état pressé ou non d'un bouton.
byte          Encodeur_1_BoutonEtat    = 0;
boolean       Encodeur_1_Direction     = 0;
byte          Encodeur_1_EtatActuel    = 0;
byte          Encodeur_1_EtatPrecedent = 0;
int           Encodeur_1_NombreDePas   = 0;
byte          Encodeur_1_Valeurs [3];
...
//*****************************************************************************
// FONCTION ActionsEncodeurs.
//*****************************************************************************
void ActionsEncodeurs ()
// Fonction qui est exécutée lorsque des données sont demandées par le Maître.
// Cette fonction est enregistrée comme un événement ("event" en anglais),
// voir la fonction setup ().
{
  if ((Encodeur_1_BoutonEtat != 0) or (Encodeur_1_NombreDePas != 0))
  {
    Encodeur_1_Valeurs [0] = Encodeur_1_BoutonEtat;
   
    if (Encodeur_1_NombreDePas >= 2)
    {
      Encodeur_1_Valeurs [1] = 1;
      Encodeur_1_Valeurs [2] = 1;
    }
    else if (Encodeur_1_NombreDePas <= -2)
    {
      Encodeur_1_Valeurs [1] = 1;
      Encodeur_1_Valeurs [2] = 2;
    }
    else
    {
      Encodeur_1_Valeurs [1] = 0;
      Encodeur_1_Valeurs [2] = 0;
    }

    Wire.write (Encodeur_1_Valeurs, 3);

    Encodeur_1_NombreDePas = 0;
    Encodeur_1_BoutonEtat = 0;
  }
}
//*****************************************************************************
...


Pour le cas ou... en pièce jointe tout le code source.

Et là, je retourne tester le dernier code de Artouste et reviens avec les constats.

Encore Merci !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: fdufnews on Sep 17, 2014, 10:29 pm

C'est ce que je fais, il me semble !

Décidément aujourd'hui je suis vraiment à coté de la plaque.
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 10:43 pm


Bonjour Artouste,

Bon, les valeurs côté Mega semblent bonnes avec ton code !

Alors, là, faut donc comprendre qu'il y a une gestion interne plus ou moins invisible (transparente) du nombre d'octets a envoyer ?

Y-a une explication ?

L'ami René


il y a evidemment une explication  :smiley-mr-green:
mais je n'ai pas le courage de chercher pour l'instant

juste pour test essaye ceci (sender) pour verifier qq points
Code: [Select]
#include "Wire.h"

// Adresse de la communication I2C de l'Arduino Mega avec Nano.
const byte ADRESSE_NANO_1 = 1;// Adresse requise pour l'esclave Tiny i2c.

byte Variable_X = 0;
byte Variable_Y = 0;
byte Variable_Z = 0;
byte Varsend[10] = {0, 0, 0, 30,40,50,60,70,80,100};
void EnvoyerDonnees ()
{
  Variable_X = Variable_X + 1;
  Variable_Y = Variable_Y + 2;
Variable_Z = Variable_Z + 3;

Varsend[0]=Variable_X;
Varsend[1]=Variable_Y;
Varsend[2]=Variable_Z;

  //Wire.write (Variable_X);
  //Wire.write (Variable_Y);
  //Wire.write (Variable_Z);
  Wire.write (Varsend,10);
  // Écriture dans le moniteur série de l'IDE d'Arduino des valeurs lues.
  Serial.print (", Variable_X = ");
  Serial.print (Variable_X);
  Serial.print (", Variable_Y = ");
  Serial.print (Variable_Y);
  Serial.print (", Variable_Z = ");
  Serial.print (Variable_Z);
  Serial.println ();
}

void setup ()
{
  Serial.begin (115200);
  Serial.print ("* Debut setup Nano *");
  Serial.println ();
  // Joindre le bus I2C.
  Wire.begin (ADRESSE_NANO_1);
  // Enregistrer l'événement pour lorsqu'une demande arrive.
  Wire.onRequest (EnvoyerDonnees);
  Serial.print ("* Fin setup Nano *");
  Serial.println ();
  Serial.print ("* Debut loop Nano *");
  Serial.println ();
  Serial.println ();
}

void loop ()
{
}



Rebonjour Artouste,

Il est clair pour moi que sans votre aide..., alors Merci !

Pour votre dernier code, pas de changement perceptible au niveau des sorties terminal série côté Mega ou Nano. L'alignement doit se faire sur la fonction « Wire.requestFrom (int (ADRESSE_NANO_1), 3, true); » du Mega "Master" et non pas sur la fonction « Wire.write (Varsend,10); » du Nano "Slave" ou la taille de la variable « Varsend[10] ».

Il y aurait un autre test que vous souhaiteriez que je faire ?

Encore Merci Artouste !

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 17, 2014, 10:48 pm


C'est ce que je fais, il me semble !

Décidément aujourd'hui je suis vraiment à coté de la plaque.

:smiley-mr-green:
[HUM]
Si elle est chauffante, brulante, etc  :  c'est aussi une excellente initiatitive de prise de position  :smiley-mr-green:

Le "cousin René"  est aussi quelquefois  difficile à decoder  :)
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 10:50 pm
:~
       
Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 10:54 pm
:P 8)

Le moment est propice à la détente !...

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 17, 2014, 10:59 pm

:~
         

:smiley-mr-green:
[HUM]
Bonne nuit pour ce soir  8)
si j'ai d'autres tests à faire ce soir,  ce sera avec "ma 100 watts"     :smiley-mr-green:

Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 17, 2014, 11:06 pm
C'est pas une "200 Watts", j'avais cru ! :smiley-mr-green:

Merci pour vos lumières !  ;)

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 18, 2014, 01:34 pm

...
Pour votre dernier code, pas de changement perceptible au niveau des sorties terminal série côté Mega ou Nano. L'alignement doit se faire sur la fonction « Wire.requestFrom (int (ADRESSE_NANO_1), 3, true); » du Mega "Master" et non pas sur la fonction « Wire.write (Varsend,10); » du Nano "Slave" ou la taille de la variable « Varsend[10] ».



bonjour
c'est ce qu'intuitivement je pensais
maintenant retour au serieux et à l'efficacité
je reviens à la concision de transmission
pourquoi ne pas passer à un byte "par encodeur" ?
ça devient simplement de la gestion de bit facilement gerable avec les bitwise
http://arduino.cc/en/Reference/BitwiseAnd
c'est assez trivial d'encoder/decoder sur un seul byte  :
-  etat bouton poussoir
-  sens de rotation encodeur
-  valeur encodeur sur 32 points (  c'est déjà enorme  :smiley-mr-green: et parfaitement inexploitable)

et pas besoin d'artifice de reconstruction  en reception , juste utiliser du masquage bit à bit

10 byte = 10 encodeurs et encore je suis à peu pres persuadé que fonctionnellement on peu faire "tenir" 2 encodeurs avec BP sur un seul byte (en passant la valeur max de variation sur 2 bits=4)





Title: Re: Problèmes d'encodeur EC11
Post by: LamiRene on Sep 18, 2014, 06:55 pm
Bonjour Artouste,

Je connais la théorie et les principes, mais je ne maîtrise pas du tout cette technique. J'appelle ça des techniques de tordeux de bits, des programmeurs en assembleur. Mois je suis plus du genre programmeur en Pascal, didactique avec beaucoup de commentaires dans le code. Je cherche plus a avoir un code source qui soit le plus littéral que possible.

Si j'étais à la limite des ressources mémoires des puces, je penserais peut-être a utiliser ces techniques, mais pour le moment, j'en suis très loin. Pour moi, ce serait faire compliqué quand je peux faire simple.

Merci pour l'idée ! Je garde tout de même, sous le coude, si un jour j'en ai besoin.

L'ami René
Title: Re: Problèmes d'encodeur EC11
Post by: Artouste on Sep 18, 2014, 09:22 pm

...

Si j'étais à la limite des ressources mémoires des puces, je penserais peut-être a utiliser ces techniques, mais pour le moment, j'en suis très loin. Pour moi, ce serait faire compliqué quand je peux faire simple.



je raisonnais plus en temps de transmission et concision de l'information
Si à terme tu gere comme tu le souhaite tout tes encodeurs "externes" , alors conserve ta methode actuelle