Contrôle de bras robotique, 2013/2014, TD2
Introduction
Le projet de contrôle du bras robotique a été le projet confié à quatre élèves IMA du groupe de TD n°2, durant l'année 2014: Jean Wasilewski, Pierre Letousey, Mehdi Zeggai et Timothée Teneur.
Le projet vise à contrôler un bras robotique, ainsi qu'à en récupérer la valeur des capteurs en temps réel.
Il se découpe donc en deux parties. Une première partie informatique, ayant pour objectif de créer une interface Web permettant de gérer les mouvements du robot.
Et une deuxième partie, quant à elle électronique, visant à assurer la communication entre les capteurs et l'interface Web.
Matériel utilisé
Pour parvenir à cet objectif, il a été nécessaire d'utiliser le matériel suivant:
- Un bras robotique contrôlable par USB
- Une FoxBoard
- Un Arduino Mega (temporaire)
- Une carte électronique de liaison entre l'Arduino et les capteurs
- Une NanoBoard
Principe de fonctionnement
Dans un premier temps, pour la partie informatique, la NanoBoard a été remplacée par un Arduino Mega.
L'Arduino a servi a effectuer les fonctions que la NanoBoard sera amenée à faire dans la partie électronique.
Le code source de l'Arduino est disponible ici.
Le principe de fonctionnement est le suivant : l'utilisateur donne des ordres au bras, celui-ci les effectue, et retourne toutes les informations d'état.
Et cela, en cliquant sur des boutons générés par un code HTML hébergé sur la FoxBoard, affichés par un serveur Web lighthttpd.
Ces pages Web vont ordonner au bras de bouger, à travers l'interface USB-Série du bras robotique.
Elles vont aussi, en même temps, récupérer les valeurs des capteurs, à l'aide de l'Arduino Mega et de la carte de liaison.
Pour la seconde partie du projet, la carte Arduino a été abandonnée au profit de la NanoBoard.
L'objectif recherché est le suivant : pouvoir réaliser un circuit capable de remplacer l'ensemble Arduino Mega et Carte de liaison.
La partie informatique
L'objectif de cette partie est de créer une interface homme-machine permettant de contrôler le bras robotique, tout en récupérant les données des différents capteurs.
Frameworks
Afin de réaliser l'interface utilisateur, ce projet utilise le framework [Bootstrap], qui permet en peu de lignes de créer un environnement simple et clair.
Ce framework utilise, pour son fonctionnement interne, le framework [jQuery].
Quant aux requêtes pour récupérer les capteurs, le site Web utilise une fonction permettant de lire le contenu d'un fichier mis en paramètre, dont le code source est disponible ici.
Une fois ces frameworks installés, le système suit le schéma suivant.
Interface
Pour l'interface, il a été décidé que l'utilisateur ne pourrait se déplacer que sur cinq pages :
- La page d'accueil
- La page "A propos de" (qui ne sera pas détaillée après puisque qu'elle ne contient pas de contenu apportant quelque chose au projet)
- La page du mode manuel
- La page du mode séquentiel
- La page du mode automatique
La page d'accueil
Dans cette page, l'utilisateur a le choix entre les différents modes de fonctionnement du robot, accessibles à l'aide de boutons.
La page contient une barre de navigation, qui sera commune à toute les pages, permettant de revenir à la page d'accueil, ou d'accéder à la page "à propos de".
La page du mode manuel
Le mode manuel à été le premier mode à être créé, puisqu'il a permis de vérifier que tous les autres modes fonctionnaient correctement (autant la partie électronique que les modes automatique et séquentiel).
Il se compose de 12 boutons ordonnés dans un tableau, chaque bouton permettant de tourner un moteur dans un sens ou l'autre, ou de serrer ou dé-serrer la pince, ou encore d'allumer ou d’éteindre la LED.
Chaque bouton contient la propriété javascript [onClick], qui effectue une action javascript lors d'un clique sur le bouton.
Plus précisément, chaque bouton a dans sa propriété [onClick] la fonction cmd, avec comme paramètre, la commande à envoyer au serveur UDP contrôlant le robot.
La page du mode séquentiel
Le mode séquentiel permet à l'utilisateur d'effectuer des déplacements prédéfinis.
Ce mode offre 6 options à l'utilisateur:
- Aller au point A
- Aller au point B
- Aller au point C
- Aller à la position de repos
- Serrer la pince
- Dé-serrer la pince
Il a été choisi de ne pas re-proposer à l'utilisateur de contrôler la DEL.
La position de repos est définie par les paramètres suivants:
- Le moteur de la base est tel que la base et le bras forment un angle de 180°
- Le premier moteur est réglé pour que le bras et la base forment un angle de 90° (sens des aiguilles d'une montre)
- Le deuxième moteur est réglé pour que l'avant-bras et le bras forment un angle de 90° (sens trigonométrique)
- Le troisième moteur est réglé pour que la pince et l'avant-bras forment un angle de 0°
- La pince n'est ni dé-serrée ni re-serrée, elle reste dans son état précédent
Lorsqu'un utilisateur clique sur une de ces options (une des 4 positions), le bouton appelle la fonction goToPoint.
Cette fonction effectue 4 étapes, une pour chaque moteur, et chaque étape réalise les mêmes actions.
- Lecture des valeurs de l'accéléromètre associées au moteur concerné (à l'aide de serial.php)
- Rotation du moteur pour que la valeur lue se rapproche de la valeur de consigne
- Si on passe au moteur suivant, sinon on repart à la première action
La valeur est une constante, valant 10 pour tous les moteurs, sauf pour la base, où elle vaut 5.
Cette valeur correspond à l’imprécision maximale autorisée pour un moteur donné.
Cette imprécision est due à la fois à l'imprécision de l'accéléromètre, mais aussi à celle du moteur, dont le déplacement s'effectue pas à pas.
La valeur maximale recevable étant 1023, au maximum, nous avons une imprécision de 0,98%, ce qui est acceptable.
On notera que pour "Aller à la position de repos", le robot effectuera une opération supplémentaire avant toutes les autres étapes.
Le robot relèvera le bras avant d'effectuer les autres étapes, pour éviter de traîner sur la maquette une éventuelle pièce.
La page du mode automatique
Le mode automatique repose essentiellement sur les fonctions du mode séquentiel, et du mode manuel.
Sur cette page, l'utilisateur choisit un point de départ, et un point d'arrivée, puis clique sur le bouton "GO".
Ce bouton appelle la fonction goToYFromX, qui effectuera les opérations suivantes:
- Appel de la fonction goToPoint, avec comme paramètre le paramètre source de goToYFromX
- Appel de la fonction cmd, pour serrer la pince
- Appel de la fonction goToPoint, avec comme consigne "Aller à la position de repos"
- Appel de la fonction goToPoint, avec comme paramètre le paramètre destination de goToYFromX
- Appel de la fonction cmd, pour dé-serrer la pince
La troisième étape permet d'éviter de traîner les pièces sur la maquette.
Ici, l'utilisateur n'a plus accès aux valeurs des capteurs, cette page est destinée à l'utilisateur lambda, désirant juste déplacer une pièce d'un point X à un point Y.
Conclusion
Cette partie informatique nous a permis de mettre en place une application Web mettant en oeuvre plusieurs langages (HTML, PHP et Javascript).
Au terme du quota horaire alloué pour le projet, cette partie fonctionnait parfaitement, et remplissait l'intégralité des objectifs visés:
- Contrôler le bras robotique
- Récupérer les valeurs des capteurs (capteurs de pression, accéléromètres et potentiomètre)
- Fournir une interface simple d'utilisation pour l'utilisateur
- Permettre l'utilisation d'un mode automatique
La partie électronique
Cette partie se découpe en deux subdivisions :
D'un premier coté, il y a la partie "Carte de liaison", qui est la carte qui permet la réception correcte des capteurs de pression, des accéléromètres et du potentiomètre.
Ensuite, il y a la partie "Convertisseur analogique/numérique", qui met en jeu la plateforme NanoBoard, qui permettra de remplacer l'Arduino Uno dans son rôle de transmetteur vers la FoxBoard.
Carte de liaison
La carte de liaison permet de faire l'interface entre l'Arduino et les différents capteurs.
Elle permet de relier directement les accéléromètres et le potentiomètre aux entrées analogiques de l'Arduino.
Quant aux capteurs de présences, nous avons effectué un montage avec une deuxième résistance (une pour chaque capteur) pour effectuer un montage diviseur de tension. Ainsi lorsqu'un objet est déposé sur le capteur, la valeur envoyée à l'Arduino est inférieure à 5 Volts (de l'ordre de 2,3 Volts pour une pièce en bois). Cependant, lorsque l'on ne pose pas d'objet sur le capteur, nous avons une tension constante de 5 V.
L’intérêt majeur de cette carte était la prise en compte sur l'Arduino de la dernière composante (valeur du potentiomètre), qui ne pouvait pas être lue avant.
Pour lire cette composante, nous avons usiné la base du robot, afin d'y ajouter un potentiomètre capable de tourner en même temps que le robot.
Le potentiomètre a été relié au 5 Volts de l'Arduino, et à la masse, donnant ainsi sur sa troisième broche une information analogique proportionnelle à l'angle de la base du robot.
Convertisseur Analogique/Numérique
Nous avons utilisé le logiciel Altium et la Carte Nanoboard pour réaliser ce convertisseur. Nous avons crée un projet FPGA transférable sur la Nanoboard, qui nous permettra de tester si notre schéma est fonctionnel.
Principe du CAN réalisé
Nous nous sommes d'abord orienté sur un CAN Flash, cependant, le FPGA est incapable de traiter des signaux analogiques directement.
Nous avons donc du nous réorienter sur une convertisseur analogique/numérique utilisant la technologie Modulation à Largeur d'Impulsions.
Le principe est simple , nous créons une tension MLI qui va créer une rampe, et que nous allons comparer à la tension que l'on veut mesurer.
Connaissant la valeur digitale de la tension MLI, on récupère alors la valeur digitale à mesurer lors du changement d'état du comparateur.
Schéma de principe du FPGA Altium
Le schéma sur Altium Designer est le suivant :
Pour réaliser notre MLI, qui servira à réaliser des rampes à comparer notre signal analogique, nous avons utiliser deux compteurs, dont un qui compte 256 fois plus rapidement que l'autre.
La comparaison de ces deux compteurs donnera notre MLI.
Lorsque notre rampe est supérieur à notre signal, nous récupérons l'information sur l'entrée HA13, ce qui nous permet de d'afficher sur la sortie l'équivalent digital de notre signal.
Réalisation de la carte sur table d'essai
Pour récupérer la valeur du comparateur, nous avons utilisé un amplificateur opérationnel, qui nous délivre une tension égale à 0 si la rampe est en dessous de notre signal analogique.
Une fois que la rampe a légèrement dépassé notre signal analogique, et à l'aide d'un diviseur de tension, notre amplificateur renvoie 5 Volts à notre NanoBoard.
Sur la capture d'écran suivante, on voit qu'après avoir dépassé le signal (avec la MLI, voie D0), notre Amplificateur Opérationnel renvoie un 1 logique (Voie D1)
Alors, les voies D15 à D8, qui correspondent aux voies HB14 à HB7, renvoient le signal digital correspondant à notre signal analogique, sur 8 bits.
Dans ce graphe, nous avons converti une tension de 4,2 Volts (qui correspond à la tension en sortie d'un capteur de pression avec une faible charge).
Conclusion
Le CAN ainsi réalisé avec la Nanoboard n'a finalement pas été utilisé (manque de temps, déplacement du banc robot pas pratique).
Cette application aura toutefois été enrichissante dans le sens où elle nous a familiarisée avec le logiciel Altium et avec le principe de la conversion analogique-numérique.
En terme de valeur ajoutée au projet sur le plan électronique, nous avons proposé une façon de mesurer l'angle de la base du bras grâce à un potentiomètre.
L'idée initiale de la boussole était, certes, facile à mettre en place, mais donnait des résultats inutilisables à cause des phénomènes de perturbation électromagnétique dus aux moteurs.
Nous avons donc modifié le système afin d'implémenter cette solution, qui fonctionne et qui donne des résultats satisfaisants.
Conclusion Finale
En conclusion, ce projet a été pour nous très captivant, car il nous a permis de mettre en oeuvre différentes technologies (Web, C, Réseau et port série) à travers une application ludique.
A la fin du projet, la partie informatique, tant qu'électronique fonctionnait parfaitement, et permettait de déplacer des pièces entre deux points, lire la composante d'axe manquante de la maquette, et convertir un signal analogique en un signal numérique.
Nous notons aussi que l’interaction entre les différents systèmes (FoxBoard, Arduino, NanoBoard, Carte de liaison) a été très intéressante, notamment au niveau de la répartition des taches.