Projet IMA3 P3, 2015/2016, TD2 : Différence entre versions
Ligne 51 : | Ligne 51 : | ||
* Le reste de la séance à dédié à la mise en place du prototype Arduino (cf image ci-dessus) ainsi qu'a sa programmation. Notre programme Arduino est donc le suivant après avoir subit quelques modifications au cours des séances : | * Le reste de la séance à dédié à la mise en place du prototype Arduino (cf image ci-dessus) ainsi qu'a sa programmation. Notre programme Arduino est donc le suivant après avoir subit quelques modifications au cours des séances : | ||
+ | |||
+ | Utilisation de la librairie servo.h pour le contrôle su servo-moteur | ||
+ | |||
+ | #include <Servo.h> | ||
+ | |||
+ | Définitions des pins | ||
+ | |||
+ | #define trigger 9 | ||
+ | #define echo 7 | ||
+ | #define servo 11 | ||
+ | |||
+ | Définitions des variables globales utilisées | ||
+ | |||
+ | long lecture_echo; //durée entre l'émission et la réception d'un signal pour le capteur de distance | ||
+ | long cm; //distance en centimètre | ||
+ | bool sens=1; //sens de rotation du servo-moteur utilisé pour un balayage gauche-droite | ||
+ | bool active=false; //variable état du système permettant sont activation et sa désactivation | ||
+ | Servo servo1; //definition su servo-moteur | ||
+ | int pos = 1; //variable indiquant la position du servi de 0 à 180 degrés | ||
+ | |||
+ | Initialisation setup() | ||
+ | |||
+ | pinMode(trigger,OUTPUT); //définition du pin trigger en sortie | ||
+ | pinMode(echo,INPUT); //définition du pin echo en entrée | ||
+ | digitalWrite(trigger, LOW); // mettre le pin trigger à 0 | ||
+ | servo1.attach(servo); //init servo | ||
+ | |||
+ | Serial.begin(9600); //initialisation de la liaison série à 96600 bauds | ||
+ | |||
+ | Boucle principale loop() : | ||
+ | |||
+ | Partie réception liaison série | ||
+ | |||
+ | if(Serial.available() > 0) //si le buffer n'est pas vide | ||
+ | { | ||
+ | char buffer =Serial.read(); //lecture | ||
+ | if (buffer=='1') //on active le système si on reçoit '1' | ||
+ | active =true; | ||
+ | else if (buffer='0') //on désactive le système si on reçoit '0' | ||
+ | active = false; | ||
+ | } | ||
+ | |||
+ | Partie émission, lecture du sonar et contrôle du servo-moteur | ||
+ | |||
+ | if (active) //Si le système est actif | ||
+ | { | ||
+ | |||
+ | if(pos==0) sens =true; //Si on atteint une "butée" (0 ou 180) du servo on change de sens de rotation | ||
+ | else if(pos==180) sens=false; | ||
+ | |||
+ | if (sens) pos++; //Incrémentaion ou décrémentation de la position en fonction du sens de rotation | ||
+ | else pos--; | ||
+ | |||
+ | servo1.write(pos); //on indique la position au servo-moteur | ||
+ | |||
+ | |||
+ | digitalWrite(trigger, HIGH); //Emission d'une onde ultrason sur le sonar | ||
+ | delayMicroseconds(10); //Délai minimum entre émission et lecture (cf datasheet du capteur) | ||
+ | digitalWrite(trigger, LOW); //Fin d'émission | ||
+ | lecture_echo = pulseIn(echo, HIGH,100000); //Utilisation d'une interruption afin de récupérer la durée entre l’émission et la réception avec une durée max pour éviter de rendre la fonction bloquante | ||
+ | cm = lecture_echo/58; //Conversion en centimètre | ||
+ | Serial.write(cm); //émission de la distance via la liason série | ||
+ | |||
+ | Serial.write(pos); //émission de la position du servo via la liason série | ||
+ | Serial.print('\n'); | ||
+ | |||
+ | } | ||
+ | |||
+ | delay(100); //temporisation | ||
+ | |||
Version du 14 juin 2016 à 08:51
Sommaire
Projet IMA3-SC 2015/2016 : Cartographie
Cahier des charges
Pour notre sujet de projet Systèmes Communicants, nous avons décidé de nous orienter vers un système permettant de cartographier une salle à l'aide d'un capteur de distance tournant sur lui-même par un servomoteur. Pour cela, nous avons pensé à utiliser un sonar ultra-sons pour la détection des "murs" de la salle. De cette façon, nous pourrions récupérer les positions de chaque obstacle et ainsi les tracer.
Matériel nécessaire
Par conséquent, pour pouvoir mener à bien notre projet, nous aurions besoin des choses suivantes :
- Une nanoboard
- Une Raspberry Pi
- Un sonar ultra-sons
- Un servomoteur
Séance 1
Pour débuter, nous avons d'abord réalisé un schéma représentant les différentes parties du projet, ce qui nous permettra de mieux nous répartir les tâches et comprendre ce qu'on attend de nous lors de ce projet.
Schéma global du travail à réaliser
Simulation du fonctionnement
Vidéo simulant le fonctionnement de notre montage : ici
Le résultat escompté de cette simulation :
Partie électronique
- Concernant la partie électronique, nous avons commencé la séance par créer un prototype Arduino pour pouvoir tester le bon fonctionnement du sonar ultra-sons et du servomoteur, et de voir comment s'utiliser ces 2 composants. Nous avons donc réussi à faire tourner le servomoteur en continu pour un angle de 0 à 180° tout en récupérant la distance de l'obstacle le plus proche avec le sonar.
(mettre photo programme Arduino)
Test des différents composants
- Nous avons ensuite été travailler sur Altium pour pouvoir commencer la conception de notre circuit électronique qui est pour le moment remplacé pour un prototype Arduino. Comme nous ne savions pas par où commencer ce travail, nous avons décidé de nous initier avec le tutoriel décrit dans les ressources mises à disposition pour ce projet. Cela nous a permis de nous familiariser avec les composants logiques disponibles sur Altium et de voir les différentes étapes pour intégrer un schéma sur la FPGA.
Initiation aux composants logiques sur Altium
Partie informatique
- Cette première séance a été dédiée à installer une partie des outils nécessaires pour la partie informatique. Nous avons donc commencé par nous connecter via une liaison série au raspberry pi afin de modifier la configuration réseau nous permettant ainsi de nous connecter au raspberry pi en SSH (secure shell). Nous avons ensuite installé les outils tels que Apache2 un serveur web et libwebsocket une librairie C pour la manipulation des sockets. Quelques problèmes sont survenus notamment au niveau des mises a jour des dépôts raspian mais ont été rapidement corrigés.
- Le reste de la séance à dédié à la mise en place du prototype Arduino (cf image ci-dessus) ainsi qu'a sa programmation. Notre programme Arduino est donc le suivant après avoir subit quelques modifications au cours des séances :
Utilisation de la librairie servo.h pour le contrôle su servo-moteur
#include <Servo.h>
Définitions des pins
#define trigger 9 #define echo 7 #define servo 11
Définitions des variables globales utilisées
long lecture_echo; //durée entre l'émission et la réception d'un signal pour le capteur de distance long cm; //distance en centimètre bool sens=1; //sens de rotation du servo-moteur utilisé pour un balayage gauche-droite bool active=false; //variable état du système permettant sont activation et sa désactivation Servo servo1; //definition su servo-moteur int pos = 1; //variable indiquant la position du servi de 0 à 180 degrés
Initialisation setup()
pinMode(trigger,OUTPUT); //définition du pin trigger en sortie pinMode(echo,INPUT); //définition du pin echo en entrée digitalWrite(trigger, LOW); // mettre le pin trigger à 0 servo1.attach(servo); //init servo
Serial.begin(9600); //initialisation de la liaison série à 96600 bauds
Boucle principale loop() :
Partie réception liaison série
if(Serial.available() > 0) //si le buffer n'est pas vide { char buffer =Serial.read(); //lecture if (buffer=='1') //on active le système si on reçoit '1' active =true; else if (buffer='0') //on désactive le système si on reçoit '0' active = false; }
Partie émission, lecture du sonar et contrôle du servo-moteur
if (active) //Si le système est actif { if(pos==0) sens =true; //Si on atteint une "butée" (0 ou 180) du servo on change de sens de rotation else if(pos==180) sens=false;
if (sens) pos++; //Incrémentaion ou décrémentation de la position en fonction du sens de rotation else pos--;
servo1.write(pos); //on indique la position au servo-moteur digitalWrite(trigger, HIGH); //Emission d'une onde ultrason sur le sonar delayMicroseconds(10); //Délai minimum entre émission et lecture (cf datasheet du capteur) digitalWrite(trigger, LOW); //Fin d'émission lecture_echo = pulseIn(echo, HIGH,100000); //Utilisation d'une interruption afin de récupérer la durée entre l’émission et la réception avec une durée max pour éviter de rendre la fonction bloquante cm = lecture_echo/58; //Conversion en centimètre Serial.write(cm); //émission de la distance via la liason série Serial.write(pos); //émission de la position du servo via la liason série Serial.print('\n'); }
delay(100); //temporisation
Séance 2
Partie électronique
- Après s'être entraînés avec le tutoriel sur Altium, dès le début de la seconde séance nous nous sommes attaqués à la conception du circuit électronique que nous devons réaliser pour remplacer le fonctionnement du programme Arduino. Nous avons donc à assurer la commande du servomoteur ainsi que du sonar parallèlement. Nous nous sommes premièrement intéressé au servomoteur, qui fonctionne avec un signal PWM, généré par la FPGA. Nous avons alors fait des recherches sur le modèle du servomoteur utilisé pour obtenir ses caractéristiques et nous avons trouvé la datasheet suivante :
Datasheet du servomoteur HS-422
- En lisant ce document, nous avons pu remarquer que la rotation du servomoteur s'effectuait en indiquant une certaine période au signal PWM (400 microsecs pour un angle de 45°). Du coup, nous avons réalisé un circuit permettant seulement d'émettre un signal PWM en faisant varier la fréquence de ce signal afin de retrouver la période indiquée. En utilisant l'analyseur logique branché sur une des broches externes de la FPGA, nous avons relevé une fréquence d'environ 50 kHz pour une période proche de 400 microsecs. A la fin nous n'avons pas eu le temps de tester et d'envoyer ce signal sur le servomoteur pour vérifier nos observations. Après avoir discuté avec un professeur, nous nous sommes rendus compte que nous n'avions pas encore réfléchi à l'alimentation du servomoteur, et que celle-ci poserait problème si on l'alimentait seulement avec la FPGA. En effet, le courant délivré par la NanoBoard ne dépasse pas les 10 mA, alors que selon la datasheet, le servomoteur a besoin d'un courant de 150 mA pour fonctionner convenablement. A la prochaine nous devrons donc réfléchir à un éventuel montage à transistors afin de booster le courant délivré par la FPGA.
Schéma Altium pour l'émission d'un signal PWM
Partie informatique
Séance 3
Partie électronique
- Lors de cette dernière séance, nous avons finalisé les tests que nous voulions faire sur le fonctionnement du servomoteur. Nous avons donc finalement réaliser un montage suiveur composé d'un AOP plutôt que du montage à transistors que l'on avait prévu de faire. Nous avions mal compris la datasheet puisqu'en fait lorsqu'on parlait de 150 mA à délivrer, c'était en réalité le courant consommé par le servomoteur lorsqu'il tournait à plein régime. Nous avions en réalité seulement besoin de lui fournir une tension continue de 4,8V (ou 6V selon le modèle de moteur). D'où le montage suiveur avec l'AOP, qui permet quand même de protéger le servomoteur et d'éviter les perturbations du signal PWM.
Datasheet de l'amplificateur opérationnel TL082
- Le montage consiste donc à faire passer le signal PWM de la Nanoboard par un AOP avant d'être connecté au moteur. Nous avons utilisé deux générateurs de tension pour alimenter l'AOP en +Vcc et -Vcc, puis une troisième pour simuler l'alimentation de la Nanoboard et s'assurer du bon fonctionnement du moteur avant de l'alimenter directement avec la Nanoboard, puisque nous n'étions pas sûr du bon fonctionnement de la broche d'alimentation de la FPGA. Pour faire ceci, on réutilisera le même schematic Altium que précédemment pour l'émission d'un signal PWM où l'on fait varier le rapport cyclique de ce signal. On utilisera cependant une fréquence de 20 kHz plutôt que 50 kHz pour le signal. Après avoir regardé de nouveau le signal sur un oscilloscope, nous avons pensé que cette fréquence serait plus adaptée à nos besoins.
Le montage réalisé est le suivant :
Réalisation des tests pour le moteur
Avec ce montage nous avons alors réussi à faire tourner le servomoteur pas à pas en augmentant le rapport cyclique progressivement. Puisque l'on passe par Altium pour le modifier, ce rapport cyclique est écrit sur 8 bits. Cela nous a permis, en allant jusqu'aux angles limites du servomoteur, de connaître la valeur min et max du rapport cyclique en 8 bits pour aller de 0° à 180°(rotation maximale que peut effectuer le moteur). Nous avons donc fini notre travail sur le test du moteur.
Après avoir compris son fonctionnement, nous en sommes revenus au but de notre projet, c'est-à-dire faire tourner un sonar sur le servomoteur pivotera continuellement pour réaliser une cartographie de l'espace. Nous devons donc trouver un moyen via Altium pour que le servomoteur puisse réaliser cette tâche. Puisque le servomoteur tourne en faisant varier le servomoteur, nous avons alors pensé à faire un compteur puis décompteur une fois que l'angle maximum est atteint, pour que le moteur puisse tourner en continu. Voici le shematic Altium construit pour essayer de répondre à ce besoin:
Schéma Altium pour le fonctionnement du servo-moteur
Nous avons aussi par la suite fait un autre schematic, celui-ci pour le fonctionnement du sonar, qui n'a besoin que de récupérer la distance entre chaque obstacle le plus souvent possible.
Voici un fichier qui pourrait être utilisé :
Pour le moment, nous n'avons pas encore pu tester si nos schémas Altium fonctionnaient correctement. Nous essayerons de le faire prochainement.