Encore un week-end métro-robot-dodo. C’est l’avant dernier. Le bilan est bon, on progresse, mais on se heurte à une grande quantité de bug …

Le vrai bilan, c’est que l’on est homologuable1 !

Une petite vidéo le prouve (sur une demi table …)

Le dernier week-end n’a pas fait l’objet d’un article. Pourtant, il a compté 3 jours de travail, grâce au RTT du vendredi. Et 2 jours ont été consacrés à faire fonctionner l’encodeur du carrousel. Voici un petit résumé:

L’encodeur Logitech

Dans ses souris « bas de gamme » genre pilot-mouse ou first-mouse, Logitech utilise des encodeurs intégrés. Il y a une LED et un récepteur à 3 pattes. Un encodeur plus classique utilise souvent 2 leds et 2 phototransistors. Un comparateur nous délivre alors 2 signaux en quadrature. Facile, simple, et c’est ce que l’on utilise depuis le début pour les encodeurs de déplacement du robot. Nous nous sommes alors dit que Logitech avait intégré les 2 photos transistors dans le même boîtier, avec une broche commune. Et bien non ! Une de ces broches est à la masse, l’autre est au +5V ?!

Découpage souris logitech

L’oscilloscope indique un signal numérique avec des impulsions régulières, plus ou moins larges en fonction de la rotation du capteur. En quelques soirées, l’AVR lisait les impulsions comme il faut2. Mais lorsque l’on a fait les tests du carrousel, on a remarqué qu’il se décalait de plusieurs degrés après quelques rotations. Impossible de continuer comme ça, les balles ne pouvaient plus rentrer3 … L’oscillo nous a alors montré que les impulsions n’étaient pas strictement les mêmes lorsque l’ex-souris pilotait l’encodeur, ou lorsque c’était l’AVR. On a alors passé quelques heures à faire un mini analyseur logique avec un autre AVR qui affichait une courbe grâce au tableur de OpenOffice, (l’impulsion la plus fine mesure 1.5µs, soit juste 30 instructions…), une autre heure pour peaufiner le code de lecture, et encore une pour conclure que l’on y arrivera jamais … D’après notre analyseur logique, les 2 courbes sont identiques, mais l’AVR perd des pas. En cherchant bien dans le fond des cartons, Luca nous a trouvé une vieille souris « classique ».

L’électronique analogique

La vieille souris a 2 bons gros vieux phototransitors ! Parfait, il nous faut juste faire un circuit comparateur. Facile : un pont diviseur de tension sur l’entrée (-) de l’ampli op, le phototransistor avec une résistance de polarisation sur le (+). Ca ne marche pas … Une lecture un peu rapide du datasheet du LM339 n’a pas montré que la sortie du comparateur était à collecteur ouvert ! Ok, on rajoute une résistance de pull-up, et ça bagotte4. On rebranche, on remonte le carrousel … et …. non. Le carrousel se décale toujours. Mais sauf que la, c’est pire qu’avant ! Quelques bugs dans le soft en moins, et l’on fini par se rendre compte qu’il faut faire un trigger de schmitt pour éviter que les sorties n’oscillent lors des changements d’état.

Encore une heure de perdue à faire des calculs de tensions de ponts diviseur, un peu d’ajustage au pifomètre et au fer à souder, et le comparateur fonctionne parfaitement comme prévu. Beaux signaux en quadrature, le soft ne reporte aucune erreur, mais le carrousel se décale toujours !!! Arggg !

Paf le fusible

C’est l’histoire d’un tour à métaux, pour faire une poulie, et paf le fusible. On le change. C’est l »histoire d’un tour à métaux, et paf le tour :-( Oups !

Le maillon faible dans cette histoire de carrousel, c’est finalement cette petite poulie en bois, qui fait la liaison entre l’axe du carrousel et l’encodeur :

Poulie

Découpée à la scie cloche, l’état de surface n’était pas parfait, et la circonférence sur laquelle l’encodeur roulait était … variable ! Ce qui explique le décalage du carrousel.

Nico est alors parti nous faire une belle poulie en alu, avec un serrage sur l’axe, … du luxe ;-) Le sort en a décidé autrement, et au milieu du travail, le moteur du tour à grillé. Oui, grillé, mort, HS, naze, donc pas de poulie en alu.

La solution qui nous donne entièrement satisfaction aujourd’hui, c’est une tranche de chambre à air de vélo autour. La surface est devenue homogène, et le carrousel fonctionne comme un charme.

2 jours de travail pour finalement passer 5 minutes à découper un bout de caoutchouc, c’est décourageant … Mais le résultat est la.

La porte d’entrée

Elle permet de bien séparer l’intérieur du carrousel (bien rangé) et le monde extérieur (l’anarchie). Elle se ferme quand une balle vient d’être poussée dans le rouleau et entre dans le carrousel. Murphy n’étant pas parti loin, il s’arrange pour que la balle reste pile coincée sous la porte, et l’empêche donc de se fermer …

La solution : un deuxième mini-rouleau sous la porte (toujours en bois), que l’on voit ici, fait avec de la gaine thermo rouge, et du câble de frein de vélo pour transmettre la rotation (qui dépasse un peu sur la gauche):

Porte d’entrée

Ainsi, la balle est entraînée vers l’intérieur du carrousel par la porte ! Low cost, mais très efficace! ;-)

Ainsi s’est achevé le week end moins 3, sur un carrousel efficace !

Ce week end (l’avant dernier avant Eurobot …)

Il fut occupé à faire rouler sérieusement le robot. Pour ma part, je me suis concentré à finaliser l’implémentation des filtres PID et l’asservissement en vitesse au dessus de celui de position. Pour Luca, ce sera du gros travail de débug général, puisque c’est la première fois que son soft a vraiment pu s’exprimer.

On ne compte pas le temps perdu avec les variables qui débordent, les non signés qui divisent des signés et qui donnent des résultats proche de l’aléatoire, des divergences de compilos qui donnent des résultats différents entre ARM et x86… Un petit condensé des joies du debug:

  • Les conversions entre des float, des int et des unsigned int sont … aléatoires …
  • Quand on copie octet par octet une variable 16bit dans une 32bit, il faut penser à mettre à zero les octets de poids fort.
  • Quand on a bien pensé à la règle précédente, et que ca ne fonctionne toujours pas, il faut se rappeler des nombres négatifs doivent avoir les octets de poids fort à FF.
  • Quand on change les adresses des registres entre 2 parties qui communiquent, il faut le changer dans les DEUX parties.

Ceci étant dit, le bilan est que:

  • Le N800 exécute proprement son code et ne plante plus quand on branche l’USB
  • L’électronique recoit bien les ordres sur l’USB et communique sans faute avec les cartes filles en I2C.
  • L’asservissement de vitesse et de position donnent satisfaction.
  • La méca du carrousel et du rouleau est au point
  • Le capteur de couleur, et la gestion des balles dans le carrousel est au top.
  • L’évitement du robot adverse fonctionne dans la plupart des cas.

Tout ceci en video :

On y voit que le robot va chercher les balles fixes, va les déposer dans le conteneur standard, va activer le distributeur horizontal, fait un parcours de la table à la recherche des balles qui s’y trouvent, puis va de nouveau les déposer. Fièrement, à la fin, le robot retourne à son point de départ ;-)Ca y est, nous sommes homologuable !

  1. Firefox me propose « j’homologasse » … Faudra que je le ressorte celui la ;-) []
  2. ca, c’est ce que je croyais … avant … []
  3. ni même sortir []
  4. Les collègues comprendrons, pour les autres, on peut remplacer par « marchouille » []