DUT informatique - Systèmes Informatiques, TP temps-réel n° 10-11 2009-2010
P. Kauffmann
MODULE INFORMATIQUE EMBARQUEE
Contrôle
d’impulsions :
le sonar |
TP à mettre à jour en fonction du
corrigé
Placer affichage-clavier dans une
tâche
Placer gestion sonar et servomoteur
dans un handler à 50 Hz
Placer comptage du temps dans un handler I Hz
De nombreux capteurs fournissent en guise d’information des impulsions répétitives dont la longueur est proportionnelle à la grandeur mesurée, car le temps (durée d’une impulsion) et moins sujet aux bruits électroniques qu'un signal analogique sous forme de tension.
Certains actionneurs sont commandés directement par un signal analogique en provenance d’un convertisseur N/A, mais d’autres sont contrôlés en leur appliquant des impulsions répétitives dont la longueur est proportionnelle à la grandeur contrôlée. C’est un signal périodique de fréquence fixe mais de rapport cyclique variable appelé PWM en anglais (Pulse Width Modulation) et MLI (Modulation de Largeur d’Impulsion) en français.
Dans ce TP nous allons réaliser un système à sonar ultrasonique capable d’indiquer la distance des obstacles sur un arc de cercle autour de lui. Le dispositif est composé de deux parties :
· le sonar proprement dit qui retourne des impulsions dont la longueur correspond au temps mis par des impulsions ultrasoniques pour aller et revenir au capteur, indiquant ainsi la distance entre le sonar et l’obstacle le plus proche,
· un servomoteur, dispositif d’automatisme commandant la position angulaire d’un palonnier sur environ 80° en fonction du signal PWM qu’on lui fournit. Le sonar est fixé sur le palonnier, ce qui lui permet ainsi de balayer un arc de cercle devant lui.
Chaque TP sera réalisé par un groupe de deux étudiants. Les divers fichiers utiles au TP sont disponibles sur le serveur « kirov ».
Chaque groupe de deux étudiants rendra un rapport de travaux pratiques en fin de TP. Les réponses aux questions encadrées dans le texte du sujet seront portées dans le rapport. Le code écrit strictement spécifique au TP (excluant tout code générique venant de bibliothèques ou TP précédents) devra être joint au rapport.
Les documentations nécessaires pour la réalisation de ce TP sont :
Le matériel nécessaire pour la réalisation de ce TP est :
Le sonar SRF04 est un dispositif ultrasonique simple. On lui transmet une impulsion de 10 µs minimum sur sa broche TI (trigger input) pour le déclencher, ce qui lui fait émettre un « ping » ultrasonique. Il retourne sur une autre broche PO (Pulse Output) après un délai d'environ 300 µs une impulsion positive (1 logique) de 115 µs à 18,5 ms de longueur correspondant au temps mis par le « ping » ultrasonique généré pour effectuer le parcours allez/retour entre le capteur et l’obstacle. Pour une distance de 2 m la durée de l’impulsion est de 12 ms pour une vitesse du son de 333 m/s. La vitesse du son est fonction de la température de l’air ; il faut donc calibrer les sonars en fonction de la température pour que leur mesure soit juste.
Les six temporisateurs du groupe B sont optimisés pour la mesure de largeur d’impulsion. Nous utiliserons le temporisateur TB0, la broche PO du sonar étant reliée à l’entrée TB0IN du temporisateur pour mesurer la longueur des impulsions générées par le sonar. Le temporisateur devra être configuré en mode « mesure de largeur d’impulsion » avec comme horloge d’entrée f2n (Fquartz/30). Dans ces conditions, une distance de 2 m donnera un comptage de 12800.
Un servomoteur se pilote par un signal PWM d’une période d’environ 20 ms (fréquence d’environ 50 Hz) comportant une impulsion (niveau logique 1) d’une durée variable entre 1 ms et 2 ms. La position médiane du palonnier du servomoteur est obtenue pour une largeur d’impulsion de 1,5 ms et elle est appelée position neutre. Lorsque l’impulsion est de 1 ms, le palonnier est en position de rotation maximum gauche (environ – 40°) ; lorsque l’impulsion est de 2 ms, le palonnier est en position rotation maximale droite (environ +40°). La position angulaire du palonnier peut ainsi être réglée progressivement de -40° à +40°. La période du signal doit être d’environ 20 ms, mais n’influe pas sur la position du palonnier.
Pour générer l’impulsion PWM, la solution à retenir sera de déclencher le temporisateur TA2 en mode monostable une fois sur deux dans la boucle périodique à 100 Hz de la tâche affich(). Il faudra donc relier la sortie TA2OUT du temporisateur à la broche de commande du servomoteur et configurer celui-ci en mode monostable avec comme horloge d’entrée f8 (Fquarz/8). Il faudra faire attention que la valeur de décomptage du temporisateur soit toujours comprise 1 ms et 2 ms (prendre les mesures de codage adaptées) pour éviter d’endommager le servomoteur.
La structure générale de l’application sera la même que celle du TP précédant, c'est-à-dire un programme utilisant le noyau temps réel MR308 avec une tâche de démarrage affich() et une tâche de contrôle controle(). On reprendra donc le code du TP précédant que l’on adaptera au nouveau contexte.
Pour faire fonctionner le sonar on va générer un « ping » périodique avec une périodicité de 200 ms en activant l’impulsion une fois sur 20 dans la boucle de la tâche affich(). Ceci pourra être obtenu en mettant la commande d’émission du « ping » dans le code de la fonction d’affichage (par exemple au niveau du code de la première ligne d’afficheur). L’information temporelle sera lue dans le temporisateur TB0 sous interruption et transmise au code d’affichage via un message de donnée (fonctions isnd_dtq()et prcv_dtq()). Le code d’affichage traduira le temps en mètres en utilisant des nombres en virgule flottante, puis affichera la valeur avec deux chiffres après la virgule sur l’afficheur à cristaux liquides.
Réalisez le travail suivant :
|
Nous allons maintenant utiliser le servomoteur pour explorer l’espace de façon circulaire sur un arc de 80° devant le sonar et afficher les distances mesurées dans un canevas sur une IHM déportée en Visual-Tcl.
Mise en œuvre du servomoteur
On va ajouter dans la tâche affich() le code qui permet de faire balayer l’espace au servomoteur. Ce code se présentera sous la forme d’une fonction appelée controle_servo() appelée une fois sur deux (donc à la fréquence de 50 Hz) au niveau du code d’incrémentation du temps. Cette fonction fera tourner le palonnier du servomoteur à la vitesse constante de 10 °/s dans le sens des aiguilles d’une montre entre -40° et +40°. Cette même fonction fera revenir le palonnier au point de départ à la vitesse de 100 °/s à chaque fois que le palonnier arrivera à l’extrémité de sa course.
Tous les 10°, sans arrêter le servomoteur, la fonction controle_servo() activera en plus une
mesure du sonar. La distance mesurée sera d’une part affichée sur l’afficheur
LCD embarqué et d’autre part transmise à l’IHM graphique déportée via la fonction
d’interruption uart0_transmit() selon
le protocole défini ci-après.
IHM graphique déportée
L’IHM déportée réalisée en Visual-Tcl aura l’aspect habituel, à savoir une barre de menus en haut avec les menus Fichier, Affichage, Options et Aide, une ligne d’état en bas affichant les informations de connexion et les dernières données reçues et entre les deux un canevas de taille fixe 700 x 500 dans lequel sera représenté un écran radar symbolique.
Les mesures arriveront via le port série COM2 configuré comme toujours en mode ASCII, asynchrone, 115200 Bauds, 8 bits de données, 1 bit de stop, sans parité et sans contrôle de flux. Les données seront transmises sous forme de deux nombres ASCII entiers au format suivant : 20 753\r\n . Le nombre de gauche représentant l’angle du servomoteur en degrés (0, 10, 20, 30, 40, 50, 60, 70, 80) et le second la valeur brute lue dans le temporisateur TB0.
L’image radar sera constituée de 9 traits bleus très épais partant tous du point de coordonnées 300, 450 (centre bas du canevas) et inclinés respectivement de -40, -30, -20, -10, 0, 10, 20, 30 et 40 degrés par rapport à la verticale. Leur longueur sera variable et représentative de la distance mesurée (4 m = 400 pixels). A chaque réception du port série on dessinera le nouveau trait en effaçant l’ancien trait correspondant. Cette opération sera facilitée en affectant un Tag à chaque trait en fonction de son inclinaison (on suggère d’utiliser les tags suivants : a00, a10, a20, a30, a40, a50, a60, a70 et a80).
Réalisez le travail suivant :
|