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 devoir réaliser une application web qui nous permet de contrôler un bras robotique depuis une page internet. Nous allons devoir coder afin de pouvoir faire la liaison entre cette page et le bras robotique. Une fois que les programmes seront réalisés et fonctionneront nous pourront 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 pu créer un début de page HTML dite de 'test' qui est fourni dans les annexes afin de pouvoir 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 nous permet donc maintenant, depuis la page HTML de test, d'envoyer des commandes du type M1+ 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 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 a ce problème de LED nous avons: - Proposer les boutons + et - pour la LED et 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 capteurs de pression 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 communiquer à l'ordinateur. Nous avons donc conclue 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 remarquer que la fréquence n’était pas modifié. Nous avons conclue 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, il nous faudra créer 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. Enfin, 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. Il nous suffira de récupérer ce signal numérique pour obtenir le signal analogique converti.
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é 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 est 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 pouvoir 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. Nous avons fixé les fréquences d'horloge ... A COMPLETER
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 devrons comparer 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ée à l'étape qui nous posait le dernier problème, la récupération des valeurs de capteurs: Nous avons du modifié 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 calculer 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. Cela 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)
On remarque que les valeurs des bits de poids fort ne sont pas fixes, cela est dû à l'échelle utilisé et à la forme du signal PWM. Nous avons fait en sorte de voir clairement le signal PWM mais cela a pour effet de faire un signal filtré en dent de scie, ainsi les bits de poids fort valent successivement 1 puis 0 lorsque le rapport cyclique varie.
Pour cet exemple, on a réussi à convertir une tension de 2.1V en un signal égal à : 11010001
Voici une vidéo illustrant le fonctionnement de notre CAN (le signal n'est pas très précis en raison de quelques câbles défectueux, de ce fait, nous avons donc dû faire un "run/stop" pour acquérir les données, le problème a par la suite été résolu en changeant simplement les câbles en question)
Afin de tester les limites de notre convertisseur, nous avons convertit différentes tension et nous nous sommes aperçu que la valeur maximale convertible était de 3V, 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 commun 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 conclue 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 du prendre en compte le fait que le CAN pouvait convertir des valeurs jusque 3V 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 = 3V) 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 avons placé dans le dossier /var/www/archive_TD2 l'ensemble des programmes utilisés pour l'application.