Club robotique de Sophia-Antipolis

Accueil > Projets, études > Nos robots > Robots du club > Robots à roues > Base "Pobot Easy" (2009) > Odométrie du Pobot Easy

Odométrie du Pobot Easy

un codeur incrémental simple

samedi 28 février 2009, par Julien H.

Voici une odométrie simple, avec une seule détection. Une meilleure odométrie nécessiterait plus de points et surtout des encodeurs en quadrature, permettant de connaitre le sens de rotation.

Premier test d’implantation
Roues codeuses

Nicolas, de Easy Robotics, nous a fait parvenir une paire de capteurs et les bras d’aluminium qui vont avec pour les fixer au chassis. On va donc commencer par trouver le meilleur emplacement.

Mécanique

Comme les capteurs vont suivre les secteurs noir et blanc d’un disque collé sur la roue, il est préférable qu’ils soient placés à 90° des rayons, et de préférence dans un endroit isolé de la lumière.

Le support du capteur
premier test pour accéder facilement aux pattes
Essai de fixation dessous

Les codeurs sont conçus pour être fixés directement sur la cage des servomoteurs, grâce aux trous filetés de la "brique Easy".

Fixation définitive (applont)
Fixation définitive (côté)

Ensuite on fixe les disques sur les roues, en imprimant, découpant et collant les deux parties sur les jantes en aluminium.

Disques codeurs pour les roues


Électronique

Ces capteurs sont des émetteurs/récepteurs. Les deux composants ont des entrées/sorties distinctes et on peut donc les considérer comme une Led et comme un phototransistor NPN dans un boitier commun.

La documentation du capteur Honeywell HOA709 :

Datasheet HOA709
Modèle HOA709-1 "Mexico"

Il y a 2 versions, avec phototransistor ou avec photodarlington. La différence entre les deux se fait sur les temps de réponse :
 HOA0708 : Saturation=0.4V
 HOA0709 : Saturation=1.1V

Le parametre Rise & Fall Time nous indique que le photo-darlington est 5 fois plus lent que le photo-transistor :
 HOA0708 : Rise & Fall Time=15us
 HOA0709 : Rise & Fall Time=75us

On peut donc calculer une fréquence théorique maximum de fonctionenment de 1/(75+75)=6,66 kHz avec une résistance de sortie de 100R. (Plus cette résistance sera grande et plus la vitesse max sera petite).

Led infra-rouge

Les caractéristiques de la DEL infrarouge qui nous intéressent sont :
 la tension directe (forward voltage, Vf) : 1,6 volts
 le courant d’utilisation (If) : 30 mA

Comme on utilise une tension Vcc de 5 volts, il faut prévoir une résistance de 120 ohms car :

R = U / I = (Vcc - Vf) / If = (5 - 1.6) / 0.03 = 113 Ohms (pouvant être arrondi à 110 mais dans la gamme disponible, E12, c'est 120 qui est le plus proche)
Résistance de 120 ohms

Une prise de vue à l’appareil photo permet de voir que la led est bien allumée :

Emetteur allumé

Photodarlington

Comment fonctionne un phototransistor ? la base est sensible à la lumière : quand il y a de la lumière, le transistor est passant. On a donc une valeur plus ou moins importante sur l’émetteur. Un retour d’expérience intéressant nous est transmis par Patrick :

Différence entre darlington et transistor : Le darlington va avoir un gain plus important qu’un transistor simple. Le photodarlington va commuter en saturé avec moins de lumière. Du coup le transistor de sortie devrait fonctionner plus tôt en bloqué/saturé. En gros c’est ce que tu recherches.

En 2002 j’avais fais un codeur avec ce capteur, avec plus ou moins la même configuration et un ampli OP monté en seuilleur pour avoir des transitions 0/1 franches. Il y avait plein de phénomènes de rebonds qui faisaient qu’au lieu d’avoir un front il y avait des séries d’oscillations très rapides à la place du front. C’était invisible à l’oscillo réglé sur une fréquence propre à voir les crénaux car les rébonds très rapides se confondaient avec le front. Il a fallu passer à quelques ns pour voir le phénomène.

Ces rebonds étaient bien comptés par le micro-contrôleur ce qui donnait un comportement ératique au robot.

Bref mauvais souvenir avec ces trucs. Je dirai qu’il faut prévoir un bon filtrage avec un passe-bas efficace pour se prémunir de nuits blanches.

Donc on est prévenu. On va donc commencer par regarder ce qui se passe sur l’émetteur du darlington (rappel : base, collecteur, émetteur).

Le premier test avec une résistance de pull-down de 10k montre une variation trop faible pour être significative

Premier test (10kOhms)

On test avec une résistance de 1,8 kOhms : c’est déjà mieux, les différences blanc/noir sont plus tranchées.

Second test (1,8kOhms)

Pour que les oscillogrammes montrés soient plus convaincants, on fait tourner la roue régulièrement (en pilotant le servomoteur). Sinon on pourrait se demander à quoi est due la dispersion des valeurs de créneaux car les diagrammes précédents sont faits par une manip "à la main".

Sortie du darlington avec servo lent
Sortie du darlington avec servo rapide

Voici le code pour la carte Arduino afin de tester le capteur :

Acquisition du signal analogique
avec rotation du servomoteur (code Arduino 0012)

Maintenant on va convertir la sortie analogique du capteur en valeur tout ou rien.

Pour obtenir un signal TTL en entrée numérique, on peut utiliser un amplificateur opérationnel ou ampli-op. On va partir du schéma réalisé par Fribotte : capteur de ligne, mais ce schéma est un peu illisible et surtout il n’inspire pas confiance (led connectée à l’envers...) donc on va faire appel à des spécialistes. Voici ce que nous dit Nicolas :

N’importe quel AOP fait l’affaire dans le montage de Fribotte. Chez Selectronic, on avait trouvé des CMOS quadruples, pas chers du tout. La différence entre les AOP sont les bandes passantes (en Mhz voire Ghz), les offsets (µV dans le cas du CMOS), slaw rate (vitesse max de modification des sorties), etc. Des paramètres qui seront toujours bien au-dessus de ce que tu veux pour ton montage.

Le coeur du circuit de fribotte est un montage à un comparateur à deux seuils non-inverseur (montage à hysteresis), cf l’article wikipedia sur les ampli-op

Si tu veux un meilleur slaw rate (meilleur que 10µS rail-to-rail), tu peux utiliser un comparateur comme le LM311.

Si tu veux faire du pas cher, j’aurais mis un simple montage AOP en filtre passe bas (genre 1khz ou 10khz de fréquence de coupure) et j’aurais lu la valeur avec un convertisseurs ADC, le seuillage étant fait numériquement.

On en retient deux approches :
 avec un AOP comparateur pour avoir une sortie tout ou rien
 avec un filtre passe bas à base d’AOP

Les deux pourraient être testés, on va utiliser la première solution.

Test avec comparateur LM311 ou LM393

On trouve ce circuit intégré en référence LM311N sur le site Gotronic pour 40 centimes d’euros en package DIL8.

Datasheet AOP LM311

William, un étudiant d’Aix-en-Provence, m’a envoyé ce schéma utilisant un LM311 et un phototransistor, qui servira donc parfaitement de base à notre montage de test :

Montage à base d’AOP comparateur

Eric avait sous la main un LM393 qui est un double comparateur (deux AOP dans un boitier 8 pattes). C’est avec lui qu’on fera nos tests. S’il fonctionne, on pourra faire les deux acquisitions avec un seul circuit puisque le robot a 2 roues codeuses :)

Datasheet AOP LM393
Brochage du LM393

On adapte le schéma initial qui utilisait un LM311 et on choisit les bonnes
valeurs de résistances :

 sur la sortie de l’AOP, une pull-up de 47 kOhms
 sur l’entrée de tension V+ à comparer, deux résistances de 1kOhms en pull-up et pull-down donc on va comparer avec la moitié de 5 volts
 sur l’entrée de tension V-, l’émetteur du photodarlington et la résistance de pull-down de 1,8 kOhms qui permet au signal de franchir nettement la ligne médiane des 2,5 volts lors de nos tests ci-dessus

Le résultat est bien visible : des valeurs tout ou rien bien tranchées, prêtes à être détectées par une interruption externe de notre carte à microcontrôleur :

Test OK avec le LM 393

Le montage choisi est juste un seuil, pas un montage à hystérésis qui est censé être moins perturbable.

Avec un peu d’astuce, on arrive à faire tenir les connecteurs des servomoteurs, le connecteur d’un capteur, le LM393 et toutes les résistances sur la petite breadboard d’un protoshield pour Arduino :

Circuit des capteurs et servomoteurs

Et voilà pour l’électronique, c’est dense et intense mais on a beaucoup appris. On va passer à l’utilisation des valeurs du capteur par programmation de l’Arduino, mais avant de continuer un mot de Georges :

Datasheet SG-2BC

J’attire ton attention sur le SG-2BC de Kodenshi. Il est très interessent pour un petit robot car il est beaucoup plus compact (format TO92) que les HOA07.
 SG-2BC : Rise & Fall Time=30us.
 HOA709 : Rise & Fall Time = 75 µs (voir ci-dessus).
Donc le SG-2BC est 2 fois plus rapide que le HOA0709. Et environ 3 fois moins cher que le HOA0709 (chez Farnell).

Nouveau montage : comparateur à hysterésis

Le montage ci-dessus était intéressant mais à vitesse basse, il y avait des incréments fantomes dûs au passage d’une zone à l’autre : entre les deux, le circuit détectait plusieurs passages donc plusieurs incréments.

Pour éviter ce problème, il faut utiliser une comparaison à hysterésis. Voici des explications très claires sur les formules à appliquer : discussion sur le forum Futura-Sciences.

Reprenons le schéma :

Montage comparateur hystérésis
Exemple de montage réutilisant l’AOP LM393.

Il y a donc trois résistances :
 R1 et R2 forment un pont diviseur de tension comme dans le premier montage
 R3 ou Rs apporte l’hysteresis, c’est une résistance de contre-réaction positive

Comme explique Pa5cal sur le forum, il y a une formule à appliquer pour choisir les valeurs des résistances R1 et R2 en fonction des tensions de seuil de l’hystérésis. En regardant la tension à la sortie du capteur (donc en entrée de notre montage), on va considérer les seuils d’entrée haut et bas à :
 VIH = 3,6 volts
 VIL = 2,2 volts

On utilisera Rs = 10 kOhms.

On utilisera V1 = 0 volts et V2 = 5 volts (les tensions d’alimentation de l’AOP. Si on regarde la sortie de l’ampli-op, les valeurs max et min ne sont pas 0 et 5v mais :
 VOH = 4,39 volts
 VOL = 0,46 volts

Donc on peut calculer A et B (voir explications du forum FS) :
 A = (4,39 - 0,46) / (3,6 - 2,2) - 1 = 1,53
 B = (2,2*4,39 - 0,46*3,6) / (3,6 - 2,2) = 5,71

D’où :
 R1 = 10k * (5 - 0) / (5,71 - 1,53*0) = 8,75 kOhms
 R2 = 10k * (5 - 0) / (1,53*5 - 5,71) = 25,77 kOhms

On utilisera une résistance de 8,2 kOhms et de 27 kOhms.
Le montage sur breadboard est assez facile. Voici le résultat en bloquant la roue : on voit bien des paliers plats, et plus d’incréments fantomes !

Résultat avec hysteresis

Voici le schéma électrique complet de l’étage "odométrie" :

Schéma complet odométrie

Et un exemple d’implantation :

Positionnement Arduino

Programmation

De la doc à lire : http://manubatbat.free.fr/doc/posit...

Et encore : http://www.planete-sciences.org/for...

Procédure de test : http://apbteam.org/browser/trunk/di...

Il y a deux solutions pour utiliser ce type d’odomètre. Mesurer la vitesse de la roue ou bien compter le nombre d’impulsions.

Compteur d’impulsions

Voici le résultat : on change le sens de rotation quand on atteint un seuil. On peut d’ailleurs vérifier que les servomoteurs sont réguliers.

Odomètre en compteur
Code Arduino avec incrémentation

Comparaison gauche/droite

Un des premiers travaux à faire quand on a l’odométrie est de vérifier si les moteurs gauche et droite ont les mêmes valeurs pour la même commande. Pour cela on compte le nombre d’incréments pour chacune des consignes et on superpose.

Comptes pour chaque vitesse - moteur gauche
Comptes pour chaque vitesse - moteur droit
Comparaison des deux courbes

Portfolio

Vos commentaires

  • Le 10 février 2021 à 09:55, par Roméo En réponse à : Odométrie du Pobot Easy

    Bonjour, je suis un étudiant ayant un projet autour d’un robot d’exploration d’égouts.
    Ce robot fonctionne avec quatre roues et j’aimerais essayer de repérer sa position sans Gps (dans un premier temps par odométrie).
    Cependant, je me posais une question à propos de cette méthode. Je cherche à savoir s’il était possible, et si oui comment, de récupérer la position angulaire de chaque roue en installant un codeur incrémental sur chaque roue.
    Ayant vu votre article je me demande s’il est possible d’imiter votre démarche sur le Pobot. Dois-je démonter les roues ? Comment dois-je installer la carte arduino ? Les codeurs que vous proposez sont ils adaptés à tout type de robot ?

    • Le 27 octobre 2023 à 00:02, par Eric P. En réponse à : Odométrie du Pobot Easy

      Ajouter des encodeurs sur les roues donnera effectivement l’information de position... pour autant qu’elles ne patinent pas. On monte en général les encodeurs sur des roues suiveuses qui ne risquent pas ce genre de problème.

      Quant à la question concernant le montage de la carte Arduino, impossible d’y répondre n’ayant aucune information sur le robot, sa configuration,...

    Répondre à ce message

  • Le 22 avril 2011 à 16:41, par Jérémy En réponse à : Odométrie du Pobot Easy

    Bonjour,

    Votre système m’interesse beaucoup car je souhaiterais créer une roue codeuse afin de determiner, par comptage du nombre d’impulsions, la vitesse d’une roue.

    J’ai déjà programmé sous "FLOWCODE" la conversion du nombre d’impulsions en la vitesse de la roue.
    Il faudrait donc que je puisse recevoir ce nombre d’impulsions sur mon microcontroleur PIC16F88.

    Si je comprend bien, je dois dans un premier temps créer la roue codeuse avec son disque, l’implanter sur mon système, acheter le capteur HAO709, le placer en face de la roue codeuse puis créer sur un circuit le "schéma complet odométrie" comme vous l’appellez.

    Cela suffira-t-il à donner à mon microcontroleur un nombre d’impulsions ?

    Merci beaucoup.

    • Le 24 avril 2011 à 10:51, par Julien H. En réponse à : Odométrie du Pobot Easy

      Bonjour,

      Oui Jérémy, c’est tout à fait ça.

    • Le 6 octobre 2011 à 09:25, par valrobotik En réponse à : Odométrie du Pobot Easy

      bonjour j ai une question con, est ce que votre servomoteur et modifié en moteur continue ? car nous utilisons des servomoteurs modifiés pour notre propulsion

      merci

    • Le 6 octobre 2011 à 22:39, par Julien H. En réponse à : Odométrie du Pobot Easy

      Bonjour Valrobotik. C’est une très bonne question. Oui les servomoteurs du Pobot Easy sont modifiés mais pas en moteur à courant continu, seulement en rotation continue, c’est à dire qu’on conserve l’électronique de contrôle du servomoteur mais pilotée en consigne de vitesse et non plus en consigne de position.

    Répondre à ce message

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.