Contrôle de bras robotique, 2014/2015, TD2
Sommaire
Introduction
Le projet est divisé en deux parties :
- La partie électronique sera réalisée par Quentin Gruson et Michel Mikhael
- La partie informatique sera réalisée par Julien Joignaux et Loïc Delecroix
Pour la partie informatique, nous allons réaliser une application web qui va nous permettre de contrôler un bras robotique depuis une page Internet. Nous allons coder afin de faire la liaison entre cette page et le bras robotique. Une fois que les programmes seront réalisés et fonctionneront, nous pourrons les implanter dans la FoxBoard afin d'effectuer le contrôle à distance.
En ce qui concerne la partie électronique, l'objectif est de mettre en place un convertisseur analogique numérique (CAN) qui va mesurer la pression exercée sur les capteurs. Pour la réalisation de ce convertisseur, nous allons nous servir de l'électronique numérique via la Nanoboard pour générer les signaux, puis de l'électronique analogique (résistances, condensateurs ...) pour traiter ces signaux.
Première séance
Partie informatique
Au cours de la première séance, nous avons pris connaissance des différentes commandes du robot en mode manuel depuis le terminal. Ensuite, nous avons crée un début de page HTML dite de 'test' qui est fournie dans les annexes afin de tester les fonctions de Websockets. Afin de réaliser le système des Websocket, nous avons ajouté, au code déjà existant, les différentes commandes présentes dans la source du démon. Ceci va donc nous permettre, depuis la page HTML de test, d'envoyer des commandes du type 'M1+ on' ou 'M4- off' et de les send (envoyer) directement au bras robotisé sans repasser par le terminal.
Nous avons également décidé d'intégrer une photo du bras à la page HTML en l'annotant comme ceci:
- M1
- M2
- M3
- M4
- M5
- LED
Puis, en ajoutant une légende, avec pour chacune de ces annotations un bouton '+' et un bouton '-', sur lesquels l'utilisateur cliquera afin d'effectuer les opérations voulues. En ce qui concerne la LED, elle ne peut être éteinte ou allumée si et seulement si une commande est envoyée: les boutons '+' et '-' de la LED n'existeront donc pas car ils doivent être alliés à une autre commande moteur.
Comme solution à ce problème de LED, nous avons proposé les boutons '+' et '-' pour la LED et de programmer par exemple un mouvement de moteur en plus -> M5+ on M5+ off.
Nous allons essayer toutes ces idées lors de la prochaine séance.
Partie électronique
Lors de cette première séance, nous avons étudié la partie électronique du sujet et nous nous sommes intéressés à la configuration des capteurs de pression. Ces derniers délivrent une tension qui est proportionnelle à la pression calculée. Or, un signal numérique (sous forme de bits de données) est indispensable pour la transmission série qui va être communiquée à l'ordinateur. Nous avons donc conclu qu'il serait indispensable de passer par un convertisseur analogique numérique (CAN) pour convertir la tension analogique des capteurs sous forme numérique.
Pour mettre en place ce convertisseur, nous avons eu comme idée de créer un signal de tension, issu d’une valeur numérique en passant par une PWM (Pulse Width Modulation). L’idée est, ici, de modifier le rapport cyclique du signal grâce à une commande codée sur 8 bits. Afin de nous familiariser avec le matériel et le logiciel Altium, nous avons fait en sorte de visualiser un signal PWM, ce qui nous a donné l’oscillographe ci-dessous. Nous avons également visualisé l’évolution du signal en fonction de la commande sous 8 bits et remarqué que la fréquence n’était pas modifiée. Nous avons conclu que la PWM pouvait nous permettre de créer un signal de fréquence constante mais de rapport cyclique variable.
Principe du CAN :
L'idée est désormais de modifier le rapport cyclique de la PWM via un compteur. Cela nous permettra d'avoir un signal avec un rapport cyclique croissant. Ensuite, on créera un signal de rampe en filtrant le signal de la PWM. La valeur moyenne de ce signal de rampe sera directement liée à la commande numérique correspondante. Il nous suffira de comparer cette tension avec celle de capteur : dès lors que les deux tensions sont égales, cela veut dire que le signal numérique de la PWM correspond à celui du capteur. Enfin, on récupérera ce signal numérique via le composant mémoire qui enregistrera la valeur du compteur dès que le signal de comparaison sera activé.
Deuxième séance
Partie informatique
Lors de cette 2e séance, nous avons continué à tester le bras robotique à l'aide des commandes que nous lui envoyons manuellement. Ensuite, nous avons continué à construire la page web qui permettra de contrôler le bras via le réseau. Nous avons donc complété le code Javascript de la page HTML, afin de faire apparaître différents boutons qui permettent de bouger les différents moteurs.
Une fois ce travail fini, nous nous sommes attaqués à une autre partie du problème, que nous avons trouvés assez difficile : le port série. En effet, nous devons récupérer les valeurs du potentiomètre et des 3 accéléromètres présent sur le bras robotique, et les afficher sur la page web. Nous avons donc travaillé sur le fichier donné en exemple, qui permet d'envoyer un octet sur le port série, et d'en récupérer 8. Cependant, le code qui était présent sur la carte ARDUINO n'était pas le même que celui auquel nous nous attendions. Nous avons donc du modifier le code de façon à ce qu'il nous renvoie bien 8 octets après que l'on en ait envoyer un. Cette partie nous a occupé pendant une bonne partie de la séance. Nous avons également commencé à rechercher comment modifier le fond d'une page Internet, bien que cette partie soit purement esthétique, et, donc, facultative.
A la fin de la séance, nous avons également modifié le programme Arduino déjà présent et nous l'avons téléversé afin de récupérer les valeurs des capteurs par la suite. Enfin, nous avons réalisé une petite vidéo, qui montre le bras robot bouger, en étant contrôle via le PC.
Partie électronique
Lors de cette séance, nous avons mis en place la partie numérique sous Altium puis l'avons testé à l'aide de la Nanoboard.
Le schéma de la partie numérique est le suivant :
Descriptif du schéma :
Un compteur 8 bits va modifier le rapport cyclique de la PWM. Les fréquences d'horloges ont été fixées à U4 = 125 KHz et U2 = 5MHz afin que le signal de PWM soit le plus net possible. Nous avons enfin placé les leds, l'afficheur digital et les ports de sortie afin de visionner le résultat de la conversion.
Nous allons désormais filtrer le signal PWM (port HB2) afin d'obtenir un signal de rampe. Pour cela, nous utiliserons un simple filtre RC passe bas. Ensuite, nous comparerons la valeur moyenne de ce signal avec la tension du capteur de pression pour obtenir le résultat de la comparaison sur le port HA2 (nous avons songé à utiliser un AOP en comparateur). Cela nous permettra de récupérer la valeur numérique directement visible sur les ports de sortie via le FD8B qui va enregistrer les 8 bits correspondant au signal analogique dès que la tension PWM filtrée sera égale à la tension du capteur.
Nous pouvons observer le signal PWM ainsi réalisé sur le port HB2 :
Troisième séance
Partie informatique
Durant cette séance, nous avons réussi à finir (ou presque) le projet. Tout d'abord, nous avons réinitialisé la FoxBoard en supprimant les programmes du groupe précédent qui ne nous étaient pas utiles. Ensuite, nous avons copié sur cette FoxBoard tous nos fichiers utiles au bon fonctionnement de notre projet grâce à la commande: "scp "nomdufichier" cheminFoxBoard"
Tous les fichiers .c ont été copié dans /root/server: webscoket.c port_serie.c demon.c serial.h puis nous avons compilé tous les .c
Tous les fichiers en rapport avec la page HTML ont été copié dans /var/www : index.html envoi.js jquery-2.1.3.min.js robot-372938.jpg jquery.js
Une fois la FoxBoard bien initialisée, nous sommes passés à l'étape qui nous posait le dernier problème : la récupération des valeurs de capteurs. Nous avons du modifier notre websocket.c, en créant un tableau de 12 cellules car il y a le potentiomètre et 3 accéléromètres. Chacun d'entre eux sont référencés par un entier (61,62,63,64) puis par 2 mots de 16 bits. Nous ignorons donc les cases 0,3,6,9 qui correspondent aux références et la case 1 qui correspond au mot de poids fort du potentiomètre qui vaut toujours 0xFF. Ensuite, le but était de multiplier le mot de poids fort par 256 puis de lui ajouter celui de poids faible. Une fois ceci fait, nous devions afficher les 4 valeurs sur la page HTML comme un 'retour des valeurs', ce que l'on a réussi à faire. Il faut cependant rafraîchir la page à chaque mouvement du robot afin de recevoir les nouvelles valeurs.
Lors de l'initialisation de la FoxBoard, nous n'avons pas eu à installer les bibliothèques car ceci était déjà fait.
Partie électronique
Lors de cette séance, nous avons mis en place la partie analogique.
Le filtre : Comme nous l'avons vu précédemment, il est nécessaire de filtrer le signal PWM pour obtenir un signal de rampe. Pour cela, nous allons utiliser un filtre RC passe bas. Nous avions calculé une fréquence de PWM égale à 4 Khz. Pour que notre comparaison soit correcte, il est nécessaire que la fréquence de coupure soit très petite devant cette fréquence. Or, pour un filtre RC, la pulsation de résonance vaut w0 = 1/RC.
Si on prend w0 = w/10, cela revient à faire w0 = (2*pi*4000)/10 = 2513 rad/s
Nous avons choisi des valeurs de résistances et de capacités égales à R = 47KOhm et C = 8.2nF Cela nous donne une valeur de w0 égale à :
w0 = 1/RC = 1/ (47*10^3 * 8.2*10^-9) = 2595 rad/s, ce qui est très proche du résultat souhaité.
Le comparateur : Nous avons simplement utiliser un AOP en mode comparateur. Dès que la tension PWM filtrée est égale à celle du capteur de tension, l'AOP renvoie un 1 logique. Ceci va permettre de récupérer la valeur numérique correspondante sur les ports de sortie.
Schéma de la partie analogique :
Les ports HA2 et HB2 font référence à la partie numérique (tension PWM et signal de comparaison).
Le circuit ainsi réalisé est visible ci-dessous :
Test : Afin de tester notre système, nous avons tout d'abord observer le signal de la PWM filtré.
Puis, nous avons envoyé une tension de 2.1V sur la sortie inverseuse de l'AOP en regardant la sortie de comparaison (visible sur le port D2 de l'analyseur numérique). On vérifie que la sortie passe bien à 1, ce qui se fait dès lors que la valeur moyenne de tension PWM filtrée passe à 2.1V
Enfin, nous avons branché chaque port de sortie à une broche de l'analyseur numérique afin de récupérer le signal numérique correspondant.
Les broches D0 et D1 correspondent aux signaux de comparaison et PWM. Les broches D2 à D9 correspondent au signal numérique équivalent à la tension comparée (ici 2.1V)
Pour cet exemple, on a réussi à convertir une tension de 2.1V en un signal égal à : 11010000
Ce signal équivaut à D0, comme nous pouvons le voir sur l'afficheur digital ci-dessous, soit 208. En effet, D0 = 2^7 + 2^6 + 2^4 = 128 + 64 + 16 = 208
Voici une vidéo illustrant le fonctionnement de notre CAN :
Afin de tester les limites de notre convertisseur, nous avons converti différentes tensions et nous nous sommes aperçus que la valeur maximale convertible était de 3.00V, ce signal est associé à 256, soit les 8 bits activés (2^8 = 256).
Séance supplémentaire
Partie informatique
Nous sommes venus finaliser notre projet le lundi 30 mars, durant l'après-midi. Au cours de cette séance, nous avons résolu le problème de rafraîchissement de la page, qui était nécessaire pour mettre à jour les valeurs des différents capteurs. Avec l'aide du professeur, nous avons modifié le code du serveur websocket afin que les informations soient envoyées en continue. De ce fait, les valeurs des capteurs sont maintenant affichées continuellement. Ensuite, nous avons mis à jour notre page internet. Désormais, l'interface est beaucoup plus esthétique, et les valeurs des capteurs sont rangés dans un tableau, ce qui n'était pas le cas précédemment. Voici à quoi ressemble notre interface internet pour contrôler le bras :
Enfin, le seul problème que comporte notre application concerne la valeur du potentiomètre.
Celui-ci a été débranché par le groupe précédent.Or, nous n'avons pas réussi à trouver de créneaux communs pour voir où et comment brancher ce capteur.
Ainsi, la page internet affiche toujours "3" comme valeur de potentiomètre, bien que celle-ci soit fausse.
Partie électronique
Lors de la séance 3, nous avions réussi à convertir différentes valeurs de tensions sous forme numérique. Nous allons désormais convertir directement la tension issue du capteur. Nous n'avons pas pu utiliser directement le capteur de pression, celui-ci étant endommagé. Pour contourner ce problème, nous avons constaté que le capteur de pression n'était rien d'autre qu'une résistance variable, nous avons donc conclu que l'on pouvait simuler son comportement à partir d'un potentiomètre. Nous avons donc utilisé un potentiomètre de résistance maximale égale à 10KOhms.
Afin de mettre en place ce potentiomètre, nous avons donc pris en compte le fait que le CAN pouvait convertir des valeurs jusque 3.0V maximum. Il a donc fallu réfléchir à la mise en place d'un diviseur de tension dont voici le shéma :
Nous avons choisi de prendre une tension VCC = 5V. Ainsi, sachant que la résistance maximum Rpot = 10KOhms (ce qui correspond à une tension max VR1 = 3.0V). On en déduit :
VR1 = Vcc * (R1 / R1+R2)
D'où : R1 = R2 (Vcc/VR1 - 1) ; R1 = 10000*(5/3 - 1) ; R1 = 15KOhms
Et enfin, voici notre circuit final, avec le potentiomètre simulant le comportement du capteur :
Comment tester notre application?
Afin de tester le bras robotique commandé à partir de la page HTML, rendez-vous à cette adresse: http://172.26.79.3/
Les boutons vous serviront à commander le bras à distance.
Le tableau réfère les différentes valeurs des accéléromètres et du potentiomètre. (Appuyez sur F5 pour rafraîchir) Afin d'accéder à la FoxBoard et à son contenu, il faut ouvrir un terminal, puis su, glopglop, ssh 172.26.79.3, glopglop. Nous avons placé dans le dossier /var/www/archive_TD2 l'ensemble des programmes utilisés pour l'application.
Conclusion
Pour conclure, nous pouvons dire que ce projet nous a permis de découvrir les systèmes communicants. Nous avons par exemple découvert le principe de Websocket. De plus, nous avons pu voir plus en détail la programmation d'une page HTML, ce qui est (bien que le sujet du projet n'était pas là) une chose utile, qui nous servira probablement plus tard dans nos études. En ce qui concerne la partie électronique, ce projet nous aura permis de mettre en pratique les différentes notions acquises en cours de logique et d'électronique. Nous avons également découvert de nouveaux concepts comme la PWM ou l'utilisation de potentiomètres.