Contrôle de bras robotique, 2014/2015, TD2 : Différence entre versions

De Wiki de Projets IMA
(Partie électronique)
(Partie informatique)
 
(25 révisions intermédiaires par 4 utilisateurs non affichées)
Ligne 7 : Ligne 7 :
 
*La partie informatique sera réalisée par Julien Joignaux et Loïc Delecroix
 
*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.
+
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.
+
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 =
 
= Première séance =
 
== Partie informatique ==
 
== 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.  
+
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.  
+
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 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.  
+
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:
 
Nous avons également décidé d'intégrer une photo du bras à la page HTML en l'annotant comme ceci:
 +
 
- M1
 
- M1
 +
 
- M2
 
- M2
 +
 
- M3
 
- M3
 +
 
- M4
 
- M4
 +
 
- M5
 
- M5
 +
 
- LED
 
- 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:
+
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.
- Proposer les boutons + et - pour la LED et programmer par exemple un mouvement de moteur en plus -> M5+ on M5+ off
+
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.  
 
Nous allons essayer toutes ces idées lors de la prochaine séance.  
  
Ligne 37 : Ligne 44 :
 
== Partie électronique ==
 
== 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.
+
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.  
+
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é.  
+
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 conclue que la PWM pouvait nous permettre de créer un signal de fréquence constante mais de rapport cyclique variable.
+
Nous avons conclu que la PWM pouvait nous permettre de créer un signal de fréquence constante mais de rapport cyclique variable.
  
  
Ligne 49 : Ligne 56 :
 
'''Principe du CAN :'''
 
'''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.
+
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.
+
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, il nous faudra récupérer ce signal numérique via le composant mémoire qui enregistrera la valeur du compteur dès que le signal de comparaison sera activé.  
+
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é.  
  
  
Ligne 62 : Ligne 69 :
 
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.
 
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.
+
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.
 
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.
 
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.
 
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.
+
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 pouvoir récupérer les valeurs des capteurs par la suite.  
+
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.
+
Enfin, nous avons réalisé une petite vidéo, qui montre le bras robot bouger, en étant contrôlé via le PC.
  
 
[[Média:video-test.mp4]]
 
[[Média:video-test.mp4]]
 
  
 
== Partie électronique ==
 
== Partie électronique ==
Ligne 84 : Ligne 90 :
 
'''Descriptif du schéma :'''
 
'''Descriptif du schéma :'''
  
Un compteur 8 bits va modifier le rapport cyclique de la PWM. Les fréquences d'horloges ont été fixés à 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 pouvoir visionner le résultat de la conversion.
+
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 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 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 :
 
Nous pouvons observer le signal PWM ainsi réalisé sur le port HB2 :
Ligne 96 : Ligne 102 :
 
== Partie informatique ==
 
== Partie informatique ==
  
Durant cette séance nous avons réussi à finir (ou presque) le projet.  
+
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:
+
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"''
 
''"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 .c''' ont été copié dans '''/root/server''': websocket.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    
 
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:  
+
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 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.
+
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.  
+
Lors de l'initialisation de la FoxBoard, nous n'avons pas eu à installer les bibliothèques car ceci était déjà fait.
  
 
== Partie électronique ==
 
== Partie électronique ==
Ligne 114 : Ligne 120 :
  
 
'''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.  
 
'''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.  
+
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.
 
Or, pour un filtre RC, la pulsation de résonance vaut w0 = 1/RC.
  
Ligne 124 : Ligne 130 :
 
w0 = 1/RC = 1/ (47*10^3 * 8.2*10^-9) = 2595 rad/s, ce qui est très proche du résultat souhaité.
 
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.
+
'''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 :  
 
Schéma de la partie analogique :  
Ligne 159 : Ligne 165 :
  
 
Voici une vidéo illustrant le fonctionnement de notre CAN :
 
Voici une vidéo illustrant le fonctionnement de notre CAN :
 
[[Fichier: video_conversion.mp4|300px|center|]]
 
  
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).
+
[https://projets-ima.polytech-lille.net:40079/mediawiki/images/5/56/Video_conversion.mp4 Vidéo]
 +
 
 +
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).
  
  
Ligne 180 : Ligne 186 :
  
 
Enfin, le seul problème que comporte notre application concerne la valeur du potentiomètre.
 
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.
+
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.
 
Ainsi, la page internet affiche toujours "3" comme valeur de potentiomètre, bien que celle-ci soit fausse.
  
Ligne 186 : Ligne 192 :
  
 
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.
 
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.
+
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 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 :
+
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 :
  
 
[[Fichier:diviseur.png|400px]]
 
[[Fichier:diviseur.png|400px]]
  
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 :
+
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)
 
VR1 = Vcc * (R1 / R1+R2)
Ligne 214 : Ligne 220 :
 
Le tableau réfère les différentes valeurs des accéléromètres et du potentiomètre. (Appuyez sur F5 pour rafraîchir)
 
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.
 
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.
+
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, notamment sur l'utilisation du logiciel Altium. Nous avons également découvert de nouveaux concepts comme la génération de signaux via une PWM.

Version actuelle datée du 19 juin 2015 à 16:30

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.

Pagehtml.png

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.


Signal PWM


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é.


Schéma explicatif

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ôlé via le PC.

Média:video-test.mp4

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 :

Partie Numérique

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 :


Signal PWM avec rapport cyclique croissant

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: websocket.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 :

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 :

Circuit


Test : Afin de tester notre système, nous avons tout d'abord observer le signal de la PWM filtré.

Filtre

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

Comparaison

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.

Conversion

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

Equivalence num.jpg

Voici une vidéo illustrant le fonctionnement de notre CAN :

Vidéo

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).


Mesures

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 :

Contrôle du 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 :

Diviseur.png

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 :

Circuit fin.jpg

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, notamment sur l'utilisation du logiciel Altium. Nous avons également découvert de nouveaux concepts comme la génération de signaux via une PWM.