Monorailcat

Eurobot 2016

icon 13/06/2016 - Comments are closed

Cette année, l'équipe Galiléo a été sélectionnée pour participer à la coupe d'Europe de Robotique (Eurobot) qui s'est déroulée le weekend du 10 au 12 juin 2016 au Kremelin-Bicêtre (sud de Paris).

Le robot a été légèrement amélioré après la coupe de France de robotique (mai 2016) pour le fiabiliser.

Mécanique
Bloc de propulsion :
Déplacements à 1m/s, accélérations à >1.5m/s²
  • palliers en aluminium, flancs en PVC,
  • moteurs Maxon RE35 (90W), réducteurs Dunker PLG52 (~1:20),
  • poulies/courroies XL5 9.5mm,
  • roulements 608Z (rollerblade), tiges rectifiées en inox (8mm),
  • roues alu/joints toriques SES Lynxmotion
bloc moteurs

Odométrie :
Précision à 0.25% (1cm de décalage sur un carré de 1m de côté)
  • tige rectifiée en inox (8 ou 12mm),
  • roulements de têtes de lecture de disques durs,
  • supports de codeurs en aluminium usiné,
  • encodeurs en quadrature Nemicon OEZ-1024 (4096 PPR en quadrature),
base roulante

Base :
Assemblage de plaques de PVC/Polycarbonate de 10mm usinées à la main (scie sauteuse, meuleuse et perceuse à colonne, précision ~2mm) et plaques d'aluminium de 5mm découpées/fraisées (précision 0.15mm), profilés d'aluminium de 25mm, 4 caster-balls suspendus

Actionneurs :
  • Lame ramasse-cubes actionnée par deux servomoteurs (TowerPro MG995 à pignons métalliques, 1.1Nm),
  • Pousse-cubes actionné par un motoréducteur ~15W + endstops (ouverture en <1s),
  • Ramasse-poissons (aimants de disque-durs + plaques de mylar/polycarbonate) actionné par un servo sans butée (multitours) + endstop,
  • Parasol actionné par un servomoteur,
326

Évitement :
Détection d'une balise cylindrique (ø 80mm * 80mm) retro-réflechissante à une distance réglable entre 150 et 1200mm.
  • Tourelle à arbre creux actionnée par un moteur DC + réducteur à poulie (~100rpm)
  • Fourche optique (1 PPR),
  • Volant d'inertie en PVC,
  • Capteur IR industriel (Dinel BA 9xx) alimenté par des piles 9V (alim + contrepoids)
  • Transmission optique (LED, phototransistor à travers un arbre creux),
tourelle d'évitement


Électronique

Software :

Stratégie :
Comme depuis au moins 2011, le programme gérant la stratégie est une machine d'états avec une liste de positions à atteindre (position, angle, vitesse, état des actionneurs, timeout).
La différence cette année vient d'une visualisation codée avec processing, qui permet d'enregistrer les positions en déplaçant le robot sur la table.

Asservissement :
Pour la première fois, l'asservissement en PID et la génération de trajectoires ont été remplacés par une gestion en logique floue en angle et position qui s'est montrée très fiable.

Résultats :
Les robots ont été homologués après 4h de travail (réglages de l'évitement), mais beaucoup de travail a été nécessaire sur la stratégie, tout au long de la coupe.
  • Match 1 : 49 points, 25ème place, défaite contre reSET (Russie)
  • Match 2 : 81 points, 20ème place, victoire contre UXSC1 (Espagne)
  • Match 3 : 0 points, 28ème place, match nul contre Green Birds (Allemagne)
  • Match 4 : 37 points, 28ème place, défaite contre Team 007 (Roumanie)
  • Match 5 : 56 points, 29ème place, défaite contre A-Robot (Russie)

Participation de Galiléo à Eurobot 2016

Le 3ème match a montré une erreur sur la stratégie (un point a été défini légèrement en dehors du terrain), qui a fait déraper le robot, et déjanter une roue. Une fois le timeout dépassé, le robot s'est dirigé vers une autre position (à 1m/s), en déviant contre un obstacle du terrain (l'asservissement n'est pas capable de compenser lorsqu'une roue codeuse a dérapé). Il a été nécessaire d'actionner le bouton d'arrêt d'urgence pour protéger le robot et le terrain, d'où une annulation de tous nos points (le robot adverse n'avait pas démarré à cause d'un Schrödingbug).

Le côté du terrain où les robots jouent est déterminé aléatoirement, et est tombé du côté violet pour nos 5 matchs (homologuation côté vert), ce qui a ralenti notre action (l'actionneur utilisé pour les pêcher les poissons est du côté gauche du robot, ce qui oblige à rouler en marche arrière pour pêcher du côté violet).

Une chose est assez évidente, l'équipe Galiléo a un robot performant, mais qui a été prêt beaucoup trop tard. Il n'a pas été possible de faire assez de tests pour fiabiliser les actionneurs et la stratégie.

icon Tags de l'article : ,

Cartes Moteur DC

icon 23/12/2015 - Comments are closed

Depuis que je suis à Galiléo, on utilise couramment des moteurs à courant-continu.

Comme les besoins sont toujours à peu près les mêmes :
  • Tension : 12V à 36V
  • Courant : <3A max
  • Commande : PWM et Direction
  • Puce résistante (limite de courant, protection thermique, boitier large)

Les ponts en H LMD18200 et LMD18201 de National Semiconductors/Texas Instruments supportent tous ces points et le LMD18200 rajoute une mesure de courant.

Ce chip a été utilisé par Galiléo depuis au moins 2005 avec diverses cartes.

La dernière version avait été conçue par la Oufff'Team. Plutôt que de commander les mêmes, j'ai refait le routage en utilisant des composants en boitiers SMD 1206 ou traversants (empreintes communes). Il a aussi été possible d'avoir un routage simple face (seulement les composants facultatifs sont sur la face top).

Schéma
DC motor driver
La carte a un filtre CEM assez surdimensionné, un buffer pour le retour de courant et le schéma du LMD18200 issu de sa datasheet.
Il est possible de sous-dimensionner le filtre CEM si la carte ne risque pas de polluer les cartes environnantes et de shunter le buffer de retour de courant par R21 (voir de le supprimer si on utilise un LMD18201).

Routage
Top :
DC motor driver PCB top
Si le buffer de courant n'est pas utilisé, il est possible de se passer de la couche top en n'oubliant pas le strap entre les pattes du LMD18200.
Le plan de masse de la couche top est isolé de la masse de l'alimentation (relié par des capacités) et est à relier à la masse mécanique du montage dans lequel est utilisée cette carte.

Bottom :
DC motor driver PCB bottom
Le plan de masse est relié à l'alimentation par un filtre LC, pour éviter de transmettre le bruit du hachage à l'alimentation.

PCB assemblé :
DC motor driver PCB full
Le schéma a tous les composants possibles, mais il est possible d'adapter certains composants à l'utilisation de la carte.

Utilisation
Le connecteur Molex a le brochage suivant :
  1. GND
  2. PWM (Activation)
  3. DIR (Direction)
  4. Sense (Retour de courant)

Le signal + de l'alimentation est à câbler sur le connecteur "24V" du côté extérieur à la carte.

DC motor driver assembled

DC motor driver assembled
Sur cette carte, le polyswitch/fusible et le retour de courant ne sont pas câblés, et le filtrage de l'alimentation est réduit (~500µF, pas d'inductances ni de résistances d'ammortissement).

Références

icon Tags de l'article : , ,

Carte odométrie

icon 17/02/2014 - Comments are closed

Caractéristiques
  • Alim : 5v ( ~100mA avec les codeurs)
  • Entrées : Codeurs optiques, Arduino Mega (1280/2560), Série
  • Sorties : cartes moteur LMD18200, Arduino Mega, Série
  • Dimensions : 60mm * 120mm

Principe
Asservissement en angle et en position d'un robot à deux roues motrices, pour la coupe de France de robotique.
Les coefficients P, I, D de l'asservissement linéaire et angulaire, sont réglables.
Le HCTL2032 sert à compter les pas de chaque codeur optique (deux canaux en quadrature) sur 32 bits
L'Arduino s'occupe de faire des calculs de trigonométrie et de commander les moteurs.

Schéma
HCTL2032 + Arduino : le HCTL2032 compte les pas des deux roues codeuses, l'Arduino l'interroge régulièrement (pas besoin de reset en comptant sur 32 bits) et asservit en position et en angle (P, I, D codés en dur), Position en X,Y,Vitesse,Angle à donner via l'interface série Voir le schéma dans la doc.

Typon
PCB HCTL2032 Arduino

Doc
hctl2032

Photos
TODO

Composants
  • HCTL2032 (difficile à trouver)
  • Arduino Mega
  • Oscillateur à 1~10MHz
  • capas de découplage
  • résistances de pullup (1206 à souder sur le connecteur)

Auteurs
  • Schéma : Agilent/Avago/HP, Damien Favre, Camille Bouvard, Xavier Bourgeois
  • PCB : Damien Favre, Camille Bouvard, Xavier Bourgeois
  • Code : Yohan Bearzi, Damien Favre, Camille Bouvard, Xavier Bourgeois

Corrections
Tout est dans le code…
Il faut rajouter des résistances de pullup pour des codeurs à sortie en collecteur ouvert.
Il reste deux gros bugs:
  • Un des timer doit foirer ou une variable doit overflow, après 30s ou 8 à 12m, impossible de s'arrêter
  • Il arrive que la carte ne réponde pas après avoir attendu trop longtemps sans recevoir de commande

Utilisations
Carte assez robuste, honteusement pompée sur la carte d'Asservissement Polaire PE de 2008, (mais en mieux)
Le développement à commencé en Septembre 2012 et les corrections de bugs ont duré jusqu'à la coupe 2013.
Cette carte a été réutilisée en 2014 et 2015.

Cette page est disponible sur le site de l'association Galiléo.

icon Tags de l'article : , , ,

Asservissement polaire d'un robot

icon 25/05/2013 - Comments are closed

But
En sachant notre position actuelle, on veut atteindre une autre position, et l'atteindre à tous les coups, quel que soient l'état du terrain, des pneus (dérapage), des contraintes internes (jeu mécanique) ou des contraintes extérieures (choc non prévu).

On est donc obligés d'utiliser d'avoir un retour et de contrôler le robot en position.

Asservissement en Position
Pour atteindre une position, on calcule la différence entre la position actuelle et la position à atteindre, la dériver et l'intégrer.
Ensuite on somme toutes ces variables, chacune avec son propre facteur, ainsi on a :

S = P*ε + I*∫ε dt + D*dε/dt

Asservissement en Vitesse
De la même façon, on dérive le ε (l'erreur entre l'entrée et la sortie), et on asservit en vitesse.
Ça peut-être utile si la chaîne de traction de chaque roue est légèrement différente, avec un robot qui dérive un peu en ligne droite (avec les roues parfaitement parallèles).

C'est forcément à utiliser en plus d'un asservissement en position, souvent le système est cloisonné en deux parties :
  • Un bloc moteur, avec un codeur optique fixé sur l'axe, directement asservi et commandé en vitesse.
  • Une roue codeuse, indépendante, qui va être utilisée pour l'asservissement en position, en commandant le bloc en vitesse.

Contrôle(s)
Pour détecter les instabilités, les chocs et protéger les moteurs, il est utile d'avoir un retour sur le couple développé par les moteurs, que l'on peut obtenir avec le courant qu'ils consomment.

Ça permet aussi, en limitant le courant, d'avoir de "jolis" trapèzes de vitesse, avec une accélération constante.
Sans contrôle du courant, on a $V = V_{max} (1-e^{\frac{t}{\tau}})$, qui impose un couple et un courant énormes à faible vitesse, risquant de faire déraper le robot, et d'abîmer le moteur si le robot se met a osciller.

Les cartes moteur LMD18200 de Galiléo ont une sortie en tension, proportionnelle au courant consommé par le moteur. Mais les moteurs MFA ont un courant très bruité par le collecteur et le PWM, et les moteurs Maxon ont tellement de couple que les roues dérapent avant que le courant n'ait le temps d'augmenter...

Principe de l'asservissement polaire
On contrôle les erreurs de position (et aussi de vitesse et d'intégrale avec les coefficients D et I), roue par roue, et l'erreur d'angle.

Ça permet de rouler droit, sans dévier, même si le robot prend du lacet et oscille, il garde le cap et la position finale voulus.

asser polaire schema bloc

Coefficients
  • P est déterminant pour la vitesse et l'erreur statique de la correction.
  • I ralentit le système et corrige l'erreur statique, mais risque de le rendre instable
  • D accélère la réponse du système, notament face aux grosses variations rapides, y compris celles générées par l'asservissement lui-même (oscillations).

Ici, l'écart statique est difficile à accepter, mais les instabilités liées à l'intégrateur sont "dangereuses", du coup il faut être subtil dans le choix des coefficients.
On peut avoir un écart statique négligeable sans intégrateur, et accepter jusqu'à quelques mm d'erreur statique.

Au final, ce qui fonctionne le mieux, c'est un coefficient P obtenu (par calcul/simulation/dichotomie à l'arrache) pour ne pas avoir trop d'erreur statique et un seul dépassement maximum, et ensuite, rajouter un D pour corriger le dépassement et augmenter la vitesse.

Le I est remplacé par le temps de lecture des codeurs optiques, en quelques ms, l'écart est déjà intégré (de quelques pas à quelques dizaines de pas).

Astuces
Pour qu'un asservissement soit fiable, il faut deux choses : Que le système fonctionne déjà pas trop mal sans asservissement, et que les conditions soient assez proches à chaque utilisation.

  • Un robot qui roule droit (ou en déviant peu) sans asservissement, avec les moteurs à fond, c'est assez bon signe
  • Roues codeuses montées sur des roues non motrices, suspendues, pour avoir une mesure de position fiable quel que soit l'état du terrain, et aussi en cas de choc (dérapage des roues motrices).
  • Nettoyage des roues motrices et codeuses, pour avoir toujours la même adhérence.
  • Ne pas oublier de prendre en compte le jeu et l'élasticité de la transmission.
  • Réguler la tension d'alim des moteurs, ça permet d'avoir une tension constante, quel que soit le courant tiré sur les batteries et leur niveau de charge, pas vraiment indispensable avec un bon asser.
  • Éviter l'intégrateur, déjà inclus de manière parasite dans la lecture du codeur optique.
  • Borner la sortie du moteur peut permettre de commencer à alimenter le moteur seulement quand on a atteint sa FCEM nominale, du coup on évite les petites oscillations à l'arrêt, liées au jeu mécanique. La borne supérieure permet de superposer plusieurs corrections : linéaire et angulaire, sans dépasser la valeur de sortie maximale.


Composants utilisés pour l'asservissement
  • LM629 : Utilisé par Galiléo en 2005 et en 2006, ASIC ancien et n'asservit qu'une seule roue en position
  • PE12316 : Carte développée par Galiléo pendant l'année 2007 et utilisée à la coupe 2008.
  • CPLD : Utilisé à la coupe 2009, les sources ont plus ou moins disparu...
  • Arduino : Codé en un jour (et une nuit), utilisé pour une démo en fin d'année 2012, mais brancher les codeurs sur les interruptions rend l'asservissement lent et peu stable (la durée d'échantillonage s'allonge avec la vitesse de déplacement...)
  • HCTL2032 : Developpé pendant l'année 2013, et utilisé aux coupes 2013, 2014 et 2015

icon Tags de l'article : ,

Galiléo

icon 19/01/2013 - Comments are closed

Galiléo est une association de l'école d'ingénieurs CPE qui participe à la coupe de France de robotique.

La construction et le développement d'un robot permet d'apprendre et de mettre en pratique des connaissances, vues en cours ou pas, dans les domaines suivants :
  • Mécatronique
  • Électronique
  • Informatique embarquée
  • Gestion d'équipe

La construction d'un robot ne peut pas se passer de personnes maîtrisant au moins un des domaines précédents.

Pour l'année 2012-2013, l'équipe est formée de trois membres de troisième année, trois membres de quatrième année, et un membre de cinquième année.

Je suis un membre actif de l'association Galiléo que j'ai rejoint pour l'année 2011-2012, et j'en suis président pour l'année 2012-2013. Je suis impliqué dans l'électronique, l'informatique embarquée, l'intégration et le fonctionnement de l'équipe.

Différentes cartes que j'ai faites pendant l'année 2011-2012 :
  • Cartes de contrôle de moteur pas à pas
  • Carte d'alimentation à découpage
  • Carte d'évitement

Alimentation 2012
driver pas a pas 2012
stepper motor driver 2012
stepper motor driver 2012

Après l'année 2012, nous avons décidé de rendre public une partie des idées de l'association, en les intégrant dans un wiki, en espérant que les équipes suivantes de Galiléo continuent.

icon Tags de l'article :