[Arduino] Traitement signal codeur incrémentiel
Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

[Arduino] Traitement signal codeur incrémentiel



  1. #1
    invite13962411

    Lightbulb [Arduino] Traitement signal codeur incrémentiel


    ------

    Bonsoir à toutes et à tous,

    Je viens quérir votre aide concernant une difficulté -ou plutôt une insuffisance en connaissances- concernant le traitement du signal d'un codeur incrémentiel qui m'est utile pour un projet d'école (TIPE d'école préparatoire).

    Pour asservir un élément de mon système en position, afin de connaitre la position d'une tête qui se déplace en translation sur une glissière (en l'occurrence une tête d'imprimante reconvertie), j'ai opté pour un petit codeur incrémentiel (récupéré sur la même imprimante).

    Rapidement pour ceux qui ne connaissent pas (ou pour ceux qui connaissent et qui corrigeront si je me trompe) : le codeur contient deux capteurs à cheval sur une bandelette transparente régulièrement striée : lorsque l'un des capteurs est face à une strie noire, il indique un niveau haut, et réciproquement, un niveau bas lorsque il détecte du vide. Il y a deux capteurs plutôt qu'un d'une part pour connaitre le sens de déplacement de la tête, et d'autre part pour doubler la résolution (mais ce n'est pas ce qui nous intéresse ici).

    J'ai isolé ledit composant et suis venu me brancher sur les voies correspondantes aux deux capteurs, après les avoir alimentés bien entendu. Voici ce que j'ai obtenu :

    Nom : Zoom créneau imprimante 2.png
Affichages : 567
Taille : 29,7 Ko

    On voit bien les niveaux logiques, les deux voies en quadrature de phase... Bref c'est tout ce que je souhaitais.

    A présent je voudrais exploiter ce signal pour un traitement plus tard, c'est à dire transformer les signaux tels que présentés plus haut en deux variables binaires.

    Quelles pistes me proposez-vous ?

    Il va de soit que toutes vos questions sont les bienvenues et que vos remarques ne me feront que progresser, alors n'hésitez pas !


    Par avance merci pour vos (nombreuses ? ^^) réponses et @bientôt,

    NeO'

    -----

  2. #2
    vincent66

    Re : [Arduino] Traitement signal codeur incrémentiel

    Bonsoir
    Il existe des uC ayant en option en entrée d'un compteur/décompteur un étage de décodage de signaux en quadrature, mais ce n'est hélas pas le cas sur arduino ( qui d'ailleurs ne devrait pas vous être proposé par vos profs...)...
    Il vous reste deux solutions :
    - Réaliser un petit circuit hard externe de décodage...
    - Réaliser le décodage en soft si la vitesse de rotation n'est pas trop élevée...

    Bonne bourre !
    Vincent
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  3. #3
    invite13962411

    Re : [Arduino] Traitement signal codeur incrémentiel

    Le choix de l'Arduino m'est personnel, j'en ai besoin pour piloter divers effecteurs (les profs ne sont là que pour nous rappeler le cadre et les critères de l'épreuve).

    Je ne doute pas que l'Arduino puisse acquérir ces données "brutes", c'est bien un soft de comptage que je souhaite réaliser. La partie purement informatique ne me fait pas froid au yeux, mais je bloque sur la transformation de ces signaux en variables, qui seront alors facilement exploitables dans le microprogramme...

    Des idées ?

    Quoi qu'il en soit merci pour votre réponse rapide !

  4. #4
    MiGaNuTs

    Re : [Arduino] Traitement signal codeur incrémentiel

    Bonjour.

    A chaque front montant sur EA1 et en fonction de l’état de EA0 tu incrémente ou décrémente ta variable position, et hop.

    Comme l'a dit Vincent, tant que le fréquence des impulsions n'est pas trop rapide ça fonctionne assez bien.
    Sinon il vaux mieux utiliser un décodeur de position hardware.

    A voir s'il en existe qui causent en i2c, ce qui te faciliterait la vie au cas ou le codeur tourne trop vite pour ton programme.

  5. A voir en vidéo sur Futura
  6. #5
    grosmatou75001

    Re : [Arduino] Traitement signal codeur incrémentiel

    Pour un projet je m'étais basé sur une AN de Xilinx: http://www.cs.york.ac.uk/rts/docs/Xi...es/xapp012.pdf C'est pour du FPGA mais une machine d'état (avec un petit timer en base de temps) se code très bien en C...

  7. #6
    grosmatou75001

    Re : [Arduino] Traitement signal codeur incrémentiel

    A chaque front montant sur EA1 et en fonction de l’état de EA0 tu incrémente ou décrémente ta variable position, et hop.
    Je sais plus très bien, mais il me semble que cette méthode (avec une interruption au niveau du µC) présente quelque désavantages, notamment au niveau résolution, fiabilité avec de vieux codeurs aux signaux "pas propres" et charge du µC si l'axe du codeur bouge autour d'une position (vibrations/...).

  8. #7
    vincent66

    Re : [Arduino] Traitement signal codeur incrémentiel

    En soft assez rapide :
    Si A passe à 1 puis B passe à 1 puis A passe à 0 puis B passe à 0 alors validation d'une incrémentation, substituer B à A pour une décrémentation, prévoir les cas de stop et/ou changement de sens de rotation...
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  9. #8
    indri

    Re : [Arduino] Traitement signal codeur incrémentiel

    Citation Envoyé par NeOtuX Voir le message
    mais je bloque sur la transformation de ces signaux en variables
    Je crois que ta question est encore plus basique que les réponses qu'on te donne (qui sont plus sur le traitement).

    Ben t'as un signal 0-5V donc à priori tu peux les brancher sur n'importe quel input de ton adruino! Dans ton soft, tu dois lire la valeur simplement quand tu veux et la stocké dans un int ou autre (mais là elle ne sera pas "actualisé") ou simplement utiliser la valeur en lecture du port ( en C pour atmega c'est souvent PINB, je sais pas si c'est le même avec l'adruino)

    Bref ca donnerai qqch comme ca (si branché sur PD0 et PD1)

    if (PIND==1) blabla; //PD0 à 1
    if(PIND==3) blalbal; //PD1 et PD0 à 1

    ou

    int a;
    a=PIND;

    Note: là y'aurai rien d'autre sur le port D, sinon faut tester seulement le bit du port avec masque et compagnie (cfr cours de C)

    Sinon, comme on te l'as déjà suggerré, en général on préfère branché ce type de signaux sur une pin qui permet de lancer une interruption sur flanc (montant ou descendant) qui permet de ne pas louper le flan et de ne pas lire l'état du port en permanence (bref cours de programmation d'uc section interruption)
    Là où va le vent...

  10. #9
    invite13962411

    Re : [Arduino] Traitement signal codeur incrémentiel

    Citation Envoyé par MiGaNuTs Voir le message
    Bonjour.

    A chaque front montant sur EA1 et en fonction de l’état de EA0 tu incrémente ou décrémente ta variable position, et hop.
    Oui c'est bien ce que j'ai en tête, et justement j'aimerais simplement savoir comment détecter ce front montant depuis l'Arduino.

    Citation Envoyé par MiGaNuTs Voir le message
    Comme l'a dit Vincent, tant que le fréquence des impulsions n'est pas trop rapide ça fonctionne assez bien.
    En vue de l'échelle de temps des courbes, pas de soucis de ce côté là.

    Citation Envoyé par MiGaNuTs Voir le message
    Sinon il vaux mieux utiliser un décodeur de position hardware.
    Je souhaite réaliser ce comptage uniquement via l'Arduino (je n'ai pas pour projet de réinvestir dans tel ou tel composant), raison pour laquelle je cherche à compter via un soft.

    Citation Envoyé par grosmatou75001 Voir le message
    Je sais plus très bien, mais il me semble que cette méthode (avec une interruption au niveau du µC) présente quelque désavantages, notamment au niveau résolution, fiabilité avec de vieux codeurs aux signaux "pas propres" et charge du µC si l'axe du codeur bouge autour d'une position (vibrations/...).
    C'est très juste. Ceci dit on voit bien sur la courbe que ces perturbations sont minimes (dues aux vibrations, cf la courbe verte).

    Citation Envoyé par vincent66 Voir le message
    En soft assez rapide :
    Si A passe à 1 puis B passe à 1 puis A passe à 0 puis B passe à 0 alors validation d'une incrémentation, substituer B à A pour une décrémentation, prévoir les cas de stop et/ou changement de sens de rotation...
    C'est bien là ce que je cherche à faire ! Ce qui me bloque, c'est de coder la partie "si A passe à 1 etc"... Je ne sais pas transcrire ça en langage machine, et c'est bien pour ça que je fait appel à la communauté !

    Citation Envoyé par indri Voir le message
    Je crois que ta question est encore plus basique que les réponses qu'on te donne (qui sont plus sur le traitement).

    Ben t'as un signal 0-5V donc à priori tu peux les brancher sur n'importe quel input de ton adruino!
    Ce qui signifie que je peux brancher la voie une et la voie deux directement sur un pin de l'Arduino ? Aucun risque ?

    Citation Envoyé par indri Voir le message
    Dans ton soft, tu dois lire la valeur simplement quand tu veux et la stocké dans un int ou autre (mais là elle ne sera pas "actualisé") ou simplement utiliser la valeur en lecture du port ( en C pour atmega c'est souvent PINB, je sais pas si c'est le même avec l'adruino)

    Bref ca donnerai qqch comme ca (si branché sur PD0 et PD1)

    if (PIND==1) blabla; //PD0 à 1
    if(PIND==3) blalbal; //PD1 et PD0 à 1

    ou

    int a;
    a=PIND;
    Voilà ce que je cherche à faire. Par contre je ne suis pas sûr que cela fonctionne : comment expliquer à l'Arduino que c'est une tension que je souhaite acquérir ? Comment lui indiquer la précision souhaitée de l'acquisition ? Pour détecter un front montant est-ce qu'une condition sur une égalité est suffisante ou n'y a-til pas quelquechose de plus fiable comme une inégalité, un encadrement ?

    Citation Envoyé par indri Voir le message
    Note: là y'aurai rien d'autre sur le port D, sinon faut tester seulement le bit du port avec masque et compagnie (cfr cours de C)
    Toutes mes excuses mais je ne saisi pas... :/

    Citation Envoyé par indri Voir le message
    Sinon, comme on te l'as déjà suggerré, en général on préfère branché ce type de signaux sur une pin qui permet de lancer une interruption sur flanc (montant ou descendant) qui permet de ne pas louper le flan et de ne pas lire l'état du port en permanence (bref cours de programmation d'uc section interruption)
    Pourrais-tu m'en dire plus sur ce cours s'il te plait ?


    Quoi qu'il en soit vos réponses me font très plaisir et j'espère que votre intérêt pour ce topic ne faiblira pas.

    Merci à tous et bonne soirée,

    NeO'
    Dernière modification par NeOtuX ; 17/09/2013 à 19h13.

  11. #10
    MiGaNuTs

    Re : [Arduino] Traitement signal codeur incrémentiel

    Le plus simple pour détecter un front montant avec l'arduino, c'est de lui faire confiance et de le laisser faire. il gérè ça tout seul comme un grand en hard.
    http://arduino.cc/fr/Main/AttachInterrupt
    le tout c'est que la fonction appelée sous interruption soit la plus rapide possible car elle bloque le reste du programme chaque fois qu'elle s'execute


    La méthode de vincent66 te permets de travailler a "demi résolution", mais je pense qu'elle est plus gourmande en temps machine, du coup ça limite encore plus ta vitesse avant de perdre des top.

  12. #11
    polo974

    Re : [Arduino] Traitement signal codeur incrémentiel

    il faut détecter les fronts montants et descendants sur les 2 signaux (disons A et B)

    on a donc 4 événements (irq) et dans chaque cas l'autre signal sera haut ou bas:

    A montant et B haut => +1
    A montant et B bas => -1

    A descendant et B bas => +1
    A descendant et B haut => -1

    B montant et A haut => -1
    B montant et A bas => +1

    B descendant et A haut => +1
    B descendant et A bas => -1

    (notation pour la suite: m montant, d descendant, h aut, b bas)
    le cycle complet dans un sens est donc AmBh, BdAh, AdBb, BmAb.
    le cycle complet dans l'autre sens est donc BdAb, AmBb, BmAh, AdBh.

    donc 4 irq par trait sur le ruban.
    donc le compteur fait +/- 4 pour un trait sur le ruban. précision d'un quart de trait.

    plus simple, c'est ne regarder qu'une seule entrée mais sur les 2 fronts.
    et le compteur fait +/- 2 pour un trait sur le ruban. précision d'un demi trait.

    regarder les 2 entrées sur un seul front, c'est un peu comme faire +1,+3, bref précision d'un trait, pas plus...

    il faut juste espérer disposer d'irq sur les 2 fronts... (je ne tutoie pas l'arduino)
    (on peut toujours bidouiller en entrant le signal sur 2 io (avec inversion si vraiment besoin))
    Jusqu'ici tout va bien...

  13. #12
    indri

    Re : [Arduino] Traitement signal codeur incrémentiel

    Citation Envoyé par NeOtuX Voir le message



    Ce qui signifie que je peux brancher la voie une et la voie deux directement sur un pin de l'Arduino ? Aucun risque ?
    A priori non


    Voilà ce que je cherche à faire. Par contre je ne suis pas sûr que cela fonctionne : comment expliquer à l'Arduino que c'est une tension que je souhaite acquérir ? Comment lui indiquer la précision souhaitée de l'acquisition ?
    Precision de l'acquisition? pour un signal digital? Pas comprendre^^
    Pour détecter un front montant est-ce qu'une condition sur une égalité est suffisante ou n'y a-til pas quelquechose de plus fiable comme une inégalité, un encadrement ?
    Mouais...non! C'est bcp mieux de passer par interruption!(encore une fois) Je sais pas comment on fais ca sur les adruino, donc regarder les tutos et compagnie (pour un atmega en "direct" ca je peux expli


    Toutes mes excuses mais je ne saisi pas... :/
    Ben je vais pas faire un cours de C...si tu as un octet disons 01001011 et que tu veux voir si seuelment le premier bit est à 0 ou 1, faut appliquer un masque à cet octet...bref jte laisse chercher comment on fait ca!


    Pourrais-tu m'en dire plus sur ce cours s'il te plait ?
    Reponse foireuse:google, tuto adruino , cours c et compagnie

    Sinon tu trouvera surement des exemples de code gérant un codeur incrémentale sur la toile
    Dernière modification par indri ; 18/09/2013 à 09h11.
    Là où va le vent...

  14. #13
    bobflux

    Re : [Arduino] Traitement signal codeur incrémentiel

    C'est arduino, donc il y a une librarie pré-mâchée qui fait tout le boulot.

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

    1er lien sur google avec "arduino rotary encoder", il faut pas chercher très loin...

  15. #14
    invite13962411

    Re : [Arduino] Traitement signal codeur incrémentiel

    Citation Envoyé par MiGaNuTs Voir le message
    Le plus simple pour détecter un front montant avec l'arduino, c'est de lui faire confiance et de le laisser faire. il gérè ça tout seul comme un grand en hard.
    http://arduino.cc/fr/Main/AttachInterrupt
    le tout c'est que la fonction appelée sous interruption soit la plus rapide possible car elle bloque le reste du programme chaque fois qu'elle s'execute


    La méthode de vincent66 te permets de travailler a "demi résolution", mais je pense qu'elle est plus gourmande en temps machine, du coup ça limite encore plus ta vitesse avant de perdre des top.
    Merci beaucoup en regardant sur le lien et avec ce que tu m'en dis, il semblerait que ça soit la fonction que je cherchais. Je vais donc me pencher sur sa syntaxe et son utilisation. Je reviens vous voir si je bute dessus.

    Citation Envoyé par polo974 Voir le message
    il faut détecter les fronts montants et descendants sur les 2 signaux (disons A et B)

    on a donc 4 événements (irq) et dans chaque cas l'autre signal sera haut ou bas:

    A montant et B haut => +1
    A montant et B bas => -1

    A descendant et B bas => +1
    A descendant et B haut => -1

    B montant et A haut => -1
    B montant et A bas => +1

    B descendant et A haut => +1
    B descendant et A bas => -1

    (notation pour la suite: m montant, d descendant, h aut, b bas)
    le cycle complet dans un sens est donc AmBh, BdAh, AdBb, BmAb.
    le cycle complet dans l'autre sens est donc BdAb, AmBb, BmAh, AdBh.

    donc 4 irq par trait sur le ruban.
    donc le compteur fait +/- 4 pour un trait sur le ruban. précision d'un quart de trait.

    plus simple, c'est ne regarder qu'une seule entrée mais sur les 2 fronts.
    et le compteur fait +/- 2 pour un trait sur le ruban. précision d'un demi trait.

    regarder les 2 entrées sur un seul front, c'est un peu comme faire +1,+3, bref précision d'un trait, pas plus...

    il faut juste espérer disposer d'irq sur les 2 fronts... (je ne tutoie pas l'arduino)
    (on peut toujours bidouiller en entrant le signal sur 2 io (avec inversion si vraiment besoin))
    Avec le post précédent et cette marche à suivre, je pense que je tiens là le gros du programme (détection des front montants puis exploitation de ces derniers pour le comptage). Il faut formaliser tout ça, l'écrire en langage machine et ça devrait aller.

    Simple curiosité, qu'est-ce que l'irq dont tu parles à la fin ?

    Citation Envoyé par indri Voir le message
    Precision de l'acquisition? pour un signal digital? Pas comprendre^^
    J'entends par précision le nombre de décimales de l'acquisition faite par l'Arduino. Je ne sais pas comment cela fonctionne alors l'Arduino pourrait très bien détecter une entrée de 3V ou bien une de 3,1459V ou que sais-je ! De l'un à l'autre il y a une grosse différence, nottament sur la variable qui contiendra la mesure. Mais peut-être ai-je une mauvais vision des choses, encore une fois j'avoue manquer de connaissances.

    Citation Envoyé par indri Voir le message
    C'est bcp mieux de passer par interruption
    Visiblement, nous sommes à présent tous d'accord là-dessus, je m'y attèle.

    Citation Envoyé par bobfuck Voir le message
    C'est arduino, donc il y a une librarie pré-mâchée qui fait tout le boulot.

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

    1er lien sur google avec "arduino rotary encoder", il faut pas chercher très loin...
    J'ignorais l'existence d'une telle librairy avant vos posts, comment pouvais-je alors penser à la chercher ? Quoi qu'il en soit le fait que vous soyez plusieurs à me proposer cette librairie tend à me rassurer quand à son utilisation.


    Merci à tous pour vos réponses, j'essaie d'utiliser tout ça, de bien mettre en place le programme, et si je bute je ferais appel à vos précieux conseils.

    Bonne soirée et @bientôt,

    NeO'
    Dernière modification par NeOtuX ; 18/09/2013 à 22h28.

  16. #15
    polo974

    Re : [Arduino] Traitement signal codeur incrémentiel

    j'ai regardé le lien de bobfuck,
    une des lib monte à 127kHz, c'est pas mal (et c'est tout fait)...

    j'ai aussi regardé la doc du atmega, on peut avoir une interruption pour chaque front sur chaque input, que demander mieux...

    (irq = Interrupt ReQuest, bref, demande d'interruption de l'extérieur (les io, timer ou autre super gadget) vers le microprocesseur (le petit chef d'orchestre au milieu)...)
    Jusqu'ici tout va bien...

  17. #16
    invite13962411

    Re : [Arduino] Traitement signal codeur incrémentiel

    Bonjour à tous.

    Poursuivant mon projet, je m'intéresse à l'alimentation de l'Arduino et du codeur. Actuellement, j'alimente l'Arduino en USB via un chargeur nomade (une batterie de 15000mA/h avec 2 ports USB).

    Je me demandais si je ne pouvais pas également alimenter le codeur, tout simplement, en bidouillant une connexion USB.

    Je suis un peu la fleur au fusil car je n'ai pas de données à vous donner (justement) concernant les disponibilités de la batterie et les besoins du codeur.

    Pourriez-vous dans un premier temps m'indiquer comment estimer les "besoins" du codeur (comment puis-je faire pour savoir quelle tension/intensité a besoin le codeur pour fonctionner de manière optimale ? Y a-t-il un autre paramètre à prendre en compte ?).
    De même, comment vérifier les capacités de la batterie afin de savoir si elle peut répondre à mes attentes ?

    Par avance merci pour vos conseils et @très bientôt ici ou là,

    NeO'

  18. #17
    DAUDET78

    Re : [Arduino] Traitement signal codeur incrémentiel

    J'aime pas le Grec

  19. #18
    invite13962411

    Re : [Arduino] Traitement signal codeur incrémentiel

    Merci pour ce lien, que j'ai déjà eu la chance d'exploiter auparavant, mais aucune trace de la partie "alimentation" du codeur en son sein.

  20. #19
    DAUDET78

    Re : [Arduino] Traitement signal codeur incrémentiel

    Citation Envoyé par NeOtuX Voir le message
    mais aucune trace de la partie "alimentation" du codeur en son sein.
    C'est fonction de l'encodeur ! 24V , 12V ou 5V
    De même les sorties A , B et Z . C'est du TTL, du CO ou du RS422 .

    C'est a toi d'adapter .
    J'aime pas le Grec

  21. #20
    invite13962411

    Re : [Arduino] Traitement signal codeur incrémentiel

    C'est du 5V pour l'encodeur, maintenant j'en suis sûr.

    Comment savoir l'intensité qui lui est nécessaire ?

    Je me suis renseigné et visiblement une alimentation par port USB est envisageable. Le soucis c'est que je ne connais pas du tout le fonctionnement d'une interface USB. Sauriez-vous à quelles pattes je dois me brancher pour obtenir une masse et du 5V (si une telle tension est bien délivrée pour un câble USB) ?

  22. #21
    invite13962411

    Re : [Arduino] Traitement signal codeur incrémentiel

    En espérant que ça serve à d'autres, je joins le schéma tout simple que je viens de trouver qui me fait croire que je pourrais effectivement alimenter le codeur via un port USB :



    A présent il faut que j'en saches plus au sujet de l'intensité : je m'en remets à votre savoir.

  23. #22
    invite13962411

    Re : [Arduino] Traitement signal codeur incrémentiel

    De ce que j'ai compris le port USB délivre une intensité de 500mA. Comment savoir si c'est suffisant pour le codeur ?

  24. #23
    DAUDET78

    Re : [Arduino] Traitement signal codeur incrémentiel

    Non, un port USB ne peut délivrer que 100mA (sans énumération)
    Citation Envoyé par NeOtuX Voir le message
    De ce que j'ai compris le port USB délivre une intensité de 500mA. Comment savoir si c'est suffisant pour le codeur ?
    En regardant sa datasheet ! C'est marqué dessus ....
    J'aime pas le Grec

  25. #24
    invite13962411

    Re : [Arduino] Traitement signal codeur incrémentiel

    Heureusement qu'il y a encore des gens assez patients pour rappeler les réflexes de bases !

    Merci beaucoup, j'ai trouvé du coup : 40mA max.

    A nouveau une question : l'intensité du port USB s'adapte à la demande ou en branchant je vais carrément griller le codeur ?

Discussions similaires

  1. Réponses: 9
    Dernier message: 11/08/2012, 08h57
  2. Codeur/Decodeur ir Arduino
    Par sani300 dans le forum Électronique
    Réponses: 3
    Dernier message: 26/10/2011, 15h37
  3. traitement de l'information d'un codeur
    Par invited38c12db dans le forum Technologies
    Réponses: 1
    Dernier message: 02/08/2011, 16h17
  4. Traitement des signaux d'un codeur
    Par TONYGTI16 dans le forum Électronique
    Réponses: 9
    Dernier message: 20/12/2010, 20h07
  5. transformation d'un signal codeur en signal analogique
    Par invite6adeeae4 dans le forum Électronique
    Réponses: 1
    Dernier message: 19/06/2007, 13h46
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...