Projet IMA3 P2, 2015/2016, TD1
Sommaire
Projet IMA3-SC 2015/2016 : Commande d'un servomoteur via une plateforme Internet
Cahier des charges
L'objectif à atteindre est de piloter un servomoteur à distance via une liaison série. Pour cela, nous utiliserons une application Web codée en HTML5 et CSS. Pour la partie dynamique du projet, à savoir la commande, nous préférerons le Javascript et le PHP.
Afin de réaliser ce projet, nous aurons besoin de :
- un servomoteur connecté à une carte
- une carte Nanoboard qui assurera la génération des signaux PWM pour la commande du moteur ;
- un PC portable connecté à un réseau Wi-Fi qui permettra de transmettre les commandes au moteur ;
- une Raspberry Pi qui assurera le transfert de la commande à la Nanoboard via son serveur Web intégré.
Nous souhaitons pouvoir régler l'angle (commande à partir de l'application Web) de rotation du servomoteur ainsi que sa vitesse. A l'aide du logiciel Altium Designer, nous pourrons réaliser une commande nous permettant d'envoyer un signal PWM au servomoteur afin de le contrôler.
Nous avons réalisé un schéma synthétisant les différentes liaisons imaginées entre les composants utilisés dans ce projet :
La figure ci-après montre comment on génère un signal PWM pour le contrôle d’un servomoteur.
La position provient du CPU à partir du site web sur une carte embarquée (Raspberry Pi) et cette valeur est enregistre dans un registre que on appelle registre de position. L’horloge du système (Nanobord) va incrémenter un compteur de taille N bits, afin de faire N cycle pour ensuite revenir à 0.
Le comparateur sert à comparer le N cycle d’horloge reçue à la position désirée du servomoteur. Cette position est réellement une impulsion de largeur du signal PWM (exprimée en cycle d’horloge). Tant que les N cycles comptés sont inférieurs à la largeur d’impulsion (position) le signal de sortie du comparateur restera à 1, et quand ils sont supérieurs la sortie du comparateur reste à ‘0’.
La période T du signal PWM ainsi que la largeur d’impulsion (Ton) sont exprimés en cycle d’horloge de la Nanoboard, quand la fréquence d’horloge est grande, le nombre de cycle d’horloge sera grand aussi, donc on va avoir besoin d’un numéro élevé de bits pour le compteur (bonne précision), et quand la fréquence est petite, l’erreur pour le calcul des impulsions sera grande. Le but de cette manœuvre est de créer un signal tout ou rien du type PWM :
Afin de réaliser notre projet, nous allons tout d'abord nous familiariser les différents composants en réalisant des tests avec une carte Arduino. Ensuite, nous réaliserons une carte (FPGA) permettant de générer les signaux. Pour finir, nous nous intéresserons à la partie informatique avec le création de l'application Web puis à sa liaison avec l'électronique via la Raspberry Pi.
Séance 1
Partie électronique
Dans cette séance, nous avons étudié le fonctionnement d'un servomoteur, l'étude a été fait sur une carte Arduino. Nous nous sommes servi de la librairie Servo.h d'Arduino pour pouvoir générer des signaux PWM (commande du servomoteur), nous avons aussi étudié la possibilité de pouvoir générer ceux signaux (PWM) avec la Nanoboard (à faire prochainement) sur Altium Designer.
Pour réaliser la commande du servomoteur, à savoir le faire tourner avec un angle allant de 0 à 180°, nous avons saisi le code suivant :
Une carte Arduino est connectée via USB à l'unité centrale de l'ordinateur.Afin de commander le moteur,nous réalisons les branchements suivants :
Le potentiomètre nous permet de régler l'angle voulu. Il est branché en série avec le moteur.
Une fois ces tests terminé, nous allons sur Altium Designer afin de nous intéresser de plus près à la génération des signaux PWM via la Nanoboard.
Commentaire post-séance :
Initialement, nous souhaitions renvoyer la position du moteur via un capteur laser. Cependant, aux vues du temps imparti, nous avons choisi de nous concentrer uniquement sur la commande du servomoteur.
Partie informatique
Au cours de cette séance, nous avons implémenté l'interface web en y insérant des boutons capables d'envoyer un signal au moteur afin qu'il puisse tourner dans le sens désiré. Pour cela, nous nous sommes servi de l'association entre l'HTML5 et le JavaScript. Nous avons donc dû apprendre à utiliser les bases de JavaScript afin de connecter nos boutons aux LED correspondantes. Il nous a fallu réaliser une première page HTML. Cette page est la façade de commande de notre servomoteur. Elle devra renvoyer par redirection les valeur de l'angle choisies par l'utilisateur.
Cette partie sera approfondie lors de la dernière séance de projet.
Séance 2
Partie électronique
Cette séance est dédiée à l'étude des paramètres de l’équation d’un signal PWM afin d’optimiser le contrôle du servomoteur ainsi que déterminer la relation entre l’optimisation et la précision sur le positionnement du servomoteur et la réalisation d’un programme optimisé en FPGA, capable de générer un signal PWM pour la commande du positionnement du servomoteur (avec précision déterminée).
Pour débuter, nous effectuons des recherches concernant les manières de générer ce type de signal. Nous avons abouti à l'idée suivante :
Légende :
- CLK_BRD : horloge de la carte
- CLKGEN : générateur de fréquence
- SW_USER1 : Bouton poussoir qui remet à 0 le compteur
- SW[0..7] : valeur à comparer avec le compteur, permet de faire varier les rapports cycliques et donc finalement l'angle
- CB8CEB : compteur binaire 8 bits
- COMPM8B : comparateur 8 bits
- AF4 : sortie du FPGA
Nous regardons ensuite le signal de sortie via un oscilloscope afin d'observer les variations du rapport cyclique et donc voir si nous réussissons à faire varier ou non la position du servomoteur (pour le moment ce ne sont que des simulations). Nous obtenons l'oscillogramme suivant :
Nous réussissons à faire varier le rapport cyclique. Cependant, la fréquence du signal obtenu n'est pas la fréquence souhaitée à savoir 50 Hz (20ms).
Nous devons alors modifier le schéma afin d'obtenir un signal PWM avec une fréquence de 50 Hz à partir de la fréquence d'horloge de la Nanoboard (50MHz).
- Dimensionnement des éléments constituant le schéma d'un générateur PWM
Le contrôle de la position du servomoteur se fait en appliquant un signal de contrôle comme montre la figure 2 du cahier des charges. En effet c’est un signal périodique de période T = 20 ms, qui se trouve actif seulement durant un court intervalle de temps, ce petit intervalle de temps est la hauteur d’une impulsion qui détermine la position du servomoteur. Les positions sont obtenues linéairement quand la hauteur de l’impulsion varie entre 1 et 2 ms. Pour obtenir une position centrale par exemple il suffit d’appliquer une largeur d’impulsion de 1.5 ms (Ton = 1.5 ms).
Paramètres du signal d’horloge principal
Tclk = période du signal d’horloge (à calculer). Fclk = 1/Tclk : fréquence du signal d’horloge.
Paramètres PWM
En continue : T, Ton, M, Ton (min), Ton (max) Avec: T : période du signal Ton (min) : Largeur minimale du signal PWM Ton (max) : Largeur maximale du signal PWM Ton : Temps pendant lequel le signal est actif : Ton (min) ≤ Ton ≤ Ton (max) M : La marge dynamique (en largeur d’impulsion), du signal PWM.
En discret (en cycle) Ct : Période Cton: largeur du signal PWM
Relation avec la période d’horloge principal
T = Ct*Tclk et Ton = Cton*Tclk
Paramètre de précision
P : précision du positionnement du servomoteur (en degré/cycle).
Paramètres du hardware (compteur et registre) :
Nc = numéro de bits du compteur(à calculer) Nr = numéro de bits du registre(à calculer)
Nous avons choisi une précision P1 = 1°/cycle ,les résultats obtenus sont les suivants:
P'1 correspond à la précision finale du montage, Fclk est la fréquence d'horloge à appliquer afin d'obtenir un signal PWM à 50Hz, Nton (max) et Nton(min) correspondent à la position maximale et minimale du servomoteur. La valeur de l'angle est obtenue en multipliant la précision P'1 par une valeur comprise entre Nton(max) et Nton(min).
On peut obtenir aussi la valeur à envoyer (position) par la formule suivante:
Veleur = (AngleDesire/180 + 1) * 102,4
Partie informatique
Au cours de cette séance, nous avons travaillé principalement sur le Websocket. Son rôle est de faire la communication entre l'application web présente sur le PC et le serveur présent sur la Raspberry. Nous sommes donc parti du code source fourni par les tuteurs et nous l'avons modifié afin de pouvoir répondre à notre cahier des charges. Nous avons ainsi retiré les parties de code concernant les échanges depuis la Raspberry vers l'applilcation Web.
Sur le code présent ci-dessus, nous pouvons voir les quelques lignes que nous avons ajouté afin de récupérer la valeur de l'angle envoyée par l'application Web. Cette valeur est envoyé sous la forme d'un entier non-signé car notre valeur d'angle ne peut pas être négative, nous avons ensuite récupéré la valeur grâce à un sscanf. La fonction sscanf permet de lire une chaîne de caractères et d’en extraire les différentes valeurs grâce à une chaîne de formatage similaire à celle de printf.
Enfin sur la fin du programme, nous insérons nos lignes de code concernant l'initialistation de la liaison série et nous laissons le websocket actif grâce à un while afin de pouvoir récupérer toute information provenant de la page Web:
Séance 3
Partie électronique
Lors de la mise en place du schéma étudié pendant la séance 2, nous avons rencontré un problème avec la fréquence d'horloge de la carte FPGA. Le signal d'horloge appliqué à la FPGA est programmable et peut varier dans une large gamme de fréquence. Cependant avec le schéma réalisé on travaille avec une fréquence de 102.4 KHz, nous avons appliqué cette fréquence et lors de l'observation à l'oscilloscope, les signaux n'avaient pas la fréquence désirée (50 Hz), en effet ces problèmes arrivent quand la fréquence choisie est inférieure à 400 KHz, Pour résoudre ce problème nous utilisons une fréquence de 409.6 KHz et diviser cette fréquence par 4, ce qui donne le schéma suivant:
Schéma compteur 11 bits
Pour réaliser un compteur 11 nous avons utilisé 11 bascules D synchrones, réalisant un comptage binaire de 0 à 2048. Le compteur revient à 0 une fois la valeur maximale atteinte. Le schéma est le suivant:
Modulo PWM
Nous avons ressemblé toutes les parties permettant de réaliser les signaux pouvant piloter le servomoteur, à savoir: le compteur, le comparateur, le registre de position et la bascule d'état, et nous avons obtenus les modulo suivant:
Résultats obtenus lors des essais
Lors des essais de cette séance, nous avons pu obtenir les résultats attendus (PWM avec 50 Hz et rapport cyclique variable), alors il nous manquera à faire la communication série pouvant relier les 2 parties(informatique et électronique):
Signal correspondant à un angle de 45°.
Signal correspondant à un angle de 180°.
Partie informatique
L'objectif de cette séance est de configurer la Raspberry pi qui ici, fait office de serveur. Pour réaliser nos manipulations, nous utilisons un des ordinateurs de l'école pour nous connecter à la Raspberry via le réseau.
Première commande permettant la connexion à la Raspberry : ssh pi@172.26.79.11
Une fois connectés à celle-ci, nous sommes libres de modifier ses paramètres. Mais avant de pouvoir la configurer sous Debian, il nous faut configurer la carte Ethernet :
et indiquer le serveur DNS sur lequel nous travaillons :
Au cours de ces manipulations, nous avons rencontrés des difficultés avec les différentes librairies que nous avons du installer.
La dernière étape de configuration consiste à exécuter le programme C du Websockets au démarrage de la Raspberry pi. Pour réaliser cela, nous copions le fichier du Websockets dans la Raspberry grâce aux commandes Linux. Une fois le fichier sur la R.pi il faut le compiler (GCC) avec de générer son exécutable. L'exécutable doit ensuite être lancé au démarrage. Nous inscrivons donc une ligne de code dans le fichier rc.local permettant de lancer le programme à l'allumage.
Séances supplémentaires
Lors des créneaux libres, nous avons travaillé sur la liaison série ainsi que sur l'application Web.
Application Web
La partie application est composée de plusieurs éléments capables de modifier l'angle du servomoteur. En effet, nous avons opté pour une saisie de l'angle puis pour deux boutons capables de faire varier l'angle de plus ou moins 10°. Le bouton permettant l'entrée d'un angle est une barre de saisie accompagnée d'un bouton envoyant l'élément de type "nombre" choisi par l'utilisateur.
Le code de ce morceau est le suivant :
Ce bouton renvoie un message de type nombre au Websocket grâce à une fonction sendMessage() créée au préalable dans le code source fourni. Nous avons également créer deux autres boutons, qui via une première fonction "incrementation" et un seconde "decrementation", permettent de faire varier l'angle du moteur.
Un clique sur ces boutons renvoie soit une incrémentation soit une décrémentation via deux fonctions créées. Ces deux fonction modifient la valeur entrée dans la zone de saisie en faisant appel à la fonction sendMessage().
Le dossier contenant l'application devra ensuite être déposé dans la Raspberry Pi afin de permettre la connexion à distance. Le fichier "Pageweb.html" qui comporte l'application doit être relié à la Raspberry. Pour cela, nous installons un serveur Apache2 sur la Raspberry Pi. selon le tutoriel présent à l'adresse suivante :
Raspbian France [1]
Liaison série RS232
Afin d'envoyer les données provenant du serveur web, intégré sur la carte Raspberry Pi, vers la NanoBoard, nous avons choisi la liaison série du type RS232. Cette liaison va nous permettre de recevoir le 8 bits de position pour la commande du servomoteur, ces bits sont reçus un par un et ensuite sont stockés dans le registre que se trouve dans le module PWM. Une fois tous les bits reçus, on active la commande du servomoteur avec le signal data_ok (état logique '1') qui est relié à l'entréé "enable" du registre. Le schéma est le suivant:
Pour le fonctionnement du module réception de données on a besoin d'une fréquence d'horloge de 50MHz, alors nous avons du changer le diviseur de fréquence placé sur le modulo PWM. La fréquence en entrée du Module est 102.4KHz et la Nanoboard fonctionne à 50MHz, donc on a placé 4 diviseurs de fréquence: (50e6 /(7x7x5x2)) = 102.04KHz.