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.
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.
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".
Ensuite on fixe les disques sur les roues, en imprimant, découpant et collant les deux parties sur les jantes en aluminium.
É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 :
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)
Une prise de vue à l’appareil photo permet de voir que la led est bien allumée :
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
On test avec une résistance de 1,8 kOhms : c’est déjà mieux, les différences blanc/noir sont plus tranchées.
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".
Voici le code pour la carte Arduino afin de tester le capteur :
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.
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 :
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 :)
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 :
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 :
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 :
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 :
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 !
Voici le schéma électrique complet de l’étage "odométrie" :
Et un exemple d’implantation :
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.
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.
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