IMA3/IMA4 2021/2023 P8 : Différence entre versions

De Wiki de Projets IMA
(Les servomoteurs)
(Gestion de projet)
 
(201 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 +
[[Fichier:videolabyrinthe.mp4|right|thumb|800px|Vidéo de présentation de notre projet : Labyrinthe autonome]]
 +
 
='''Résumé''' =
 
='''Résumé''' =
Cette page est dédiée au groupe travaillant sur le labyrinthe automatique dans le cadre des projets IMA3/IMA4.
+
Cette page est dédiée au groupe travaillant sur le labyrinthe automatique dans le cadre des projets IMA3/IMA4. Dans cette page, vous trouverez une présentation globale de notre projet, les démarches que nous avons entreprises ainsi que les résultats obtenus.
  
 
='''Présentation générale'''=
 
='''Présentation générale'''=
 +
[[Fichier:presentation_groupe_labyrinthe_autonome.png|thumb|right|400px|Notre équipe en plein travail...]]
 +
==Groupe==
  
==Groupe==
+
Nous sommes quatre étudiants en Systèmes Embarqués (SE4) :
Nous sommes quatre étudiants en Systèmes Embarqués :
 
  
 
* Romain Pouillard
 
* Romain Pouillard
Ligne 21 : Ligne 24 :
  
 
==Objectif==
 
==Objectif==
Notre objectif est d'améliorer le fonctionnement de la maquette que nous avons récupéré. Il s'avère que le projet que nous avons récupéré n'est pas complètement opérationnel et qu'il ait besoin que nous retravaillons la partie mécanique et la partie informatique du projet. La finalité est d'avoir un labyrinthe plus complexe, capable d'amener la balle au point d'arrivé quelque soit le point de départ.
+
Notre objectif est de mettre au point un système de labyrinthe autonome, capable d'amener une balle d'un point A à un point B sans requérir d'intervention humaine. Peut importe sa position de départ, le système doit être capable d'amener la balle jusqu'à la sortie sans problème, quelque soit la complexité du labyrinthe. Nous devrons améliorer le modèle existant en retravaillant la structure du projet, voire créer une nouvelle maquette et repensant l'algorithme de contrôle de la balle. Le contrôle d'une balle sera minutieusement mené avec l'utilisation de nombreuses technologies mises à disposition comme la reconnaissance de couleurs ou des servomoteurs.
  
 +
[[Fichier:maze.gif|right|200px|thumb|Résolution d'un labyrinthe]]
 
==Description==
 
==Description==
 +
Notre labyrinthe doit être capable de déplacer la balle sur un plateau pivotant. Le labyrinthe est placé sur un plateau surélevé grâce à une tige métallique. Par le biais d'un système de deux bielles manivelles, ce plateau peut basculer sur deux axes, ce qui assure le déplacement de la balle sur l'entièreté du plateau. Les bielles sont chacune actionnées par des servomoteurs permettant au plateau de basculer. L'ensemble du projet repose un base sur laquelle est disposé une carte Arduino et la caméra avec son support.
  
[[Fichier:base_proojet_labyrinthe.jpg|300px]]
+
==Expression du besoin==
 +
Mener l'étude de l'expression du besoin est incontournable dans tout projet. Cette étude vise à analyser de manière approfondie les besoins et les attentes utilisateurs vis-à-vis de notre projet. Elle nous a permis de regrouper les informations sur les fonctionnalités, caractéristiques, contraintes attendues et de clarifier les objectifs de notre labyrinthe autonome.
  
===Fonctionnement attendu===
 
Une balle est placée dans le labyrinthe : peut importe sa position de départ, le système doit être capable d'amener la balle jusqu'à la sortie. Une fois la balle arrivée à la sortie, le système stabilise la balle à ce point. Pour faire rouler la balle, le plateau pivote sur deux axes différents.
 
  
===Le labyrinthe===
+
Bien que l'objectif principal était la résolution automatique du labyrinthe, nous avons revu, suite aux difficultés rencontrées, nos objectifs que nous avons simplifiés :
Le labyrinthe est représenté par une planche en bois, sur laquelle sont collés des murs en bois. C'est sur ce plateau que se déplace la balle.
 
  
===Les servomoteurs===
+
* Proposer une solution de résolution de labyrinthe à l’utilisateur
[[Fichier:servoAX12.png|caption|180px]]Le montage est composé de deux servomoteurs AX-12, développés par la société Robotis. Chaque moteur gère l'inclinaison du plateau mobile sur un axe en particulier. Ils sont reliés au labyrinthe via un système bielle-manivelle, permettant de transformer le mouvement de rotation du moteur en une translation, ce qui a comme effet de faire basculer le plateau vers le haut et vers le bas. C'est par le biais de ces moteurs que nous pouvons faire se déplacer la balle sur le plateau.
+
* Obtenir un produit facilement modulable et déplaçable pour différente représentation, donc démontable.
  
===La caméra===
 
Au dessus du plateau du labyrinthe, on retrouve une caméra Pixycam qui filme le labyrinthe. Elle est capable de détecter la balle et les murs, grâce à une sélection de couleur. Par exemple, la balle étant bleue, la caméra associe chaque pixel bleu à la balle.
 
  
===La carte===
+
[[Fichier:projet_labyrinthe_bete_a_corne.jpg|thumb|center|400px|Schéma bête à corne du projet]]
Les servomoteurs et la caméra sont reliés à la carte Arduino UNO, sur laquelle se trouve le programme qui contrôle notre système.
+
 
 +
 
 +
 
 +
Pour concrétiser notre projet, nous avons dressé la liste des différentes fonctions de service attendues, classées selon leur niveau d'exigence et leur priorité :
 +
 
 +
{| class="wikitable" | style="text-align:center;"
 +
! N° !! Intitulé !! Critère !! Niveau et limites !! Priorité
 +
|-
 +
| FP1 || Permettre au système de maintenir la balle sur le plateau || Position de la balle || Déplacer la balle jusqu'à son centre sans la faire tomber || 1
 +
|-
 +
|    ||  || Rapidité du système || Déplacer la balle avec une vitesse de référence sans la faire tomber || 2
 +
|-
 +
| F2 || Résoudre un labyrinthe || Chemin le plus simple ||  || 3
 +
|-
 +
| F3 || Être facilement démontable || Démontabilité de la maquette ||  || 3
 +
|-
 +
| F4 || Fournir une alimentation adéquate || Autonomie || 6h || 4
 +
|-
 +
| F5 || Avoir un coût raisonnable || Coût de fabrication || 100€ || 4
 +
|-
 +
| F6 || Être pilotable par l'utilisateur || Pilotable par l'utilisateur ||  || 5
 +
|}
  
 
='''Gestion de projet'''=
 
='''Gestion de projet'''=
 +
Une bonne gestion de projet est nécessaire pour une répartition optimale des tâches dans l'équipe afin de mener à bien notre projet. Dès que nous sommes passés du projet Vanne Piézoélectrique au labyrinthe autonome, nous avons immédiatement réparti les tâches parmi nous en formant des sous-groupes de deux personnes :
 +
 +
 +
* Nous considérons d'un côté la '''Partie mécanique''', qui regroupe les thématiques telles que la modélisation, le dimensionnement, l'étude cinématique et l'assemblage de la structure de la maquette du labyrinthe. Tout au long de ces deux semestres passés sur ce projet, Antoine et Romain ont travaillé ensemble sur la partie mécanique.
 +
 +
 +
* D'un autre côté, nous avons défini la '''Partie Informatique''', qui correspond à l'élaboration d'un algorithme pour le contrôle de la balle et pour la résolution automatique de labyrinthe. Cette partie vise également à coordonner tous nos composants entre eux pour former un système complet et sophistiqué. Pendant deux semestres, Dann et Hugo se sont occupés de la partie informatique.
 +
 +
 +
Bien que nous avons défini des sous-groupes de projet, nous avons été amenés à revoir notre planification suite aux obstacles et aux imprévus rencontrés. En raison du changement de projet, nous avons accumulé quelques séances de retard et par conséquent la partie informatique a été mise de côté quelques séances pour avancer le plus rapidement possible sur l'assemblage de notre maquette de labyrinthe.
 +
 +
Pour planifier et assigner les tâches, tout en prenant compte de leur durée, nous avons élaboré un diagramme Gantt prévisionnel pour le semestre 8 dès le changement de projet.
 +
 +
 +
 +
[[Fichier:Diagramme_Gantt_S8_Labyrinthe.png|thumb|center|1000px|Diagramme de Gantt prévisionnel du Semestre 8]]
 +
 +
='''Equipements'''=
 +
 +
Dans cette section, nous allons détailler les différents moyens que nous avons à disposition pour mener à bien notre projet.
 +
 +
==Liste des composants==
 +
 +
{| class="wikitable" | style="text-align:center;"
 +
! Composant !! Image
 +
|-
 +
| Carte Arduino Mega 2560 || [[Fichier:Arduino_atmega2560.png|170px]]
 +
|-
 +
| Servomoteurs Dynamixel AX-12+ || [[Fichier:servoAX12.png|150px]]
 +
|-
 +
| Caméra Pixy Cam || [[Fichier:pixycam.png|150px]]
 +
|-
 +
| Alimentation réglable 0-9V || [[Fichier:Alim_reglable_0-9V.png|150px]]
 +
|-
 +
| Câbles X3P || [[Fichier:Cable_3P_200mm.png|150px]]
 +
|-
 +
| Câble de liaison 6 broches || [[Fichier:Cable_6_broches.png|150px]]
 +
|-
 +
| Rotules Mâles M16 || [[Fichier:rotule_male_labyrinthe.png|150px]]
 +
|}
 +
 +
Cette liste de composant est complétée par des matériaux que nous avons récupérés tels que des plaques de plexiglas et des chutes de bois.
 +
 +
===Carte Arduino===
 +
[[Fichier:servo_bielle_manivelle.jpg|thumb|right|300px|Montage d'un système bielle manivelle]]
 +
La carte Arduino Mega 2560 est la pièce centrale de notre maquette : Les servomoteurs, leur alimentation et la caméra sont reliés à la carte. Basée sur le microcontrôleur ATmega2560, elle offre une grande quantité de broches d'entrées/sorties et supporte de nombreuses interfaces de communication, ce qui lui permet d'être adaptable à la réalisation de notre projet. C'est sur cette carte que se trouve le programme qui contrôle notre système, que l'on peut téléverser depuis un ordinateur.
 +
 +
===Servomoteurs===
 +
Le montage est composé de deux servomoteurs AX-12+, développés par la société Robotis. Chaque moteur gère l'inclinaison du plateau mobile sur un axe en particulier. Ils sont reliés au labyrinthe via un système bielle manivelle, permettant de transformer le mouvement de rotation du moteur en une translation, ce qui a comme effet de faire basculer le plateau vers le haut et vers le bas. C'est par le biais de ces moteurs que nous pouvons faire se déplacer la balle sur le plateau. Les moteurs sont reliés en cascade à la carte Arduino.
 +
 +
Nous avons en réserve un servomoteur AX-12A, qui est une version améliorée du AX-12+. Comme nous n'en possédons qu'un seul exemplaire, nous avons choisi d'utiliser les AX-12+.
 +
 +
===Caméra Pixy===
 +
Placée au dessus du plateau du labyrinthe, on retrouve la caméra Pixy Cam qui filme le labyrinthe. La caméra est dotée d'un capteur d'image lui permettant d'effectuer une reconnaissance d'objet en temps réel. Elle est capable de détecter et de suivre la balle et les murs, grâce à une sélection de couleurs, appelée "signature". Par exemple, la balle étant jaune, la caméra associe chaque pixel jaune à la balle. Compatible avec Arduino, il est possible de récupérer dans le code, la position de la balle, le nombre de groupe de couleurs détecté... De plus, il est envisageable de télécharger le logiciel PixyMon pour visualiser sur ordinateur le retour de la caméra et de paramétrer les signatures. Sa petite taille et sa facilité d'utilisation font que la Pixy Cam est un outil indispensable à la réalisation de notre projet.
 +
 +
===Câbles XP3===
 +
Les câbles XP3 sont conçus spécifiquement pour se brancher à certains servomoteurs Dynamixel. Les servomoteurs étant reliés en cascade avec la carte Arduino, ce sont ces câbles qui assurent les liaisons entre ces derniers.
 +
 +
===Câble de liaison 6 broches===
 +
Il s'agit du câble qui relie la caméra Pixy Cam et la carte Arduino. Ce câble permet d'alimenter la carte et l'échange de données.
 +
 +
===Rotules Mâles M16===
 +
Il s'agit du composant qui lie le système bielle-manivelle au support du plateau du labyrinthe. Ce composant a été choisi car il permet de créer une liaison rotule, ce qui a comme avantage de donner un peu de jeu à notre système étant donné qu'avec un pivot simple, le plateau ne s'inclinerait pas.
 +
 +
==Liste des achats==
 +
 +
{| class="wikitable" | style="text-align:center;"
 +
! Composant !! Image
 +
|-
 +
| Joint de cardan de volet roulant || [[Fichier:joint_cardan_volet.png|170px]]
 +
|-
 +
| Roulements à bille || [[Fichier:roulements_billes.png|150px]]
 +
|}
 +
 +
Pour remplacer la liaison tige/plateau mobile, nous avons fait l'achat d'un joint de cardan d'une manivelle de volet roulant. Nous avons également acheté deux roulements à billes pour l'assemblage des bielles manivelles.
 +
 +
='''Réalisations et résultats'''=
 +
 +
==Partie Mécanique==
 +
[[Fichier:premier_concept_labyrinthe.png|thumb|right|300px|Premier concept de labyrinthe autonome]]
 +
===Formations===
 +
 +
Pour mener à bien la partie mécanique du projet, nous avons suivi la formation pour utiliser la découpeuse laser et également la formation pour
 +
utiliser les imprimantes 3D du Fabricarium.
 +
Nous nous sommes pareillement auto-formés à l’utilisation d’Onshape, afin de pouvoir modéliser notre projet et de pouvoir imprimer certaines pièces en 3D.
 +
 +
===Modélisation===
 +
 +
Dans un premier temps, nous avons réfléchi à comment réaliser la partie mécanique en faisant différentes modélisations. L’une de nos premières idées était de réaliser une maquette avec quatre moteurs comme ici à droite, pouvant exercer un mouvement de translation pour élever ou abaisser le plateau du labyrinthe et faire rouler la balle. Pour transformer la rotation d'un moteur en un mouvement de translation, plusieurs possibilités sont réalisables comme un système pignon-crémaillère, vis-écrou ou bien bielle-manivelle. Nous avons rapidement laissé cette idée de côté, car il aurait été trop difficile de contrôler les 4 moteurs en même temps.
 +
[[Fichier:concept_final_labyrinthe.png|thumb|right|300px|Concept final de labyrinthe autonome]]
 +
Finalement, nous avons repensé la modélisation et modélisé une nouvelle maquette. Ce nouveau modèle partage beaucoup de similitudes avec le premier ; le labyrinthe est surélevé par une tige, la caméra est placé au dessus du plateau du labyrinthe grâce à un support. Les changements majeurs sont que cette fois, ce sont deux moteurs au lieu de quatre qui actionnent un système de bielle-manivelle pour faire basculer le plateau du labyrinthe dans un sens ou dans un autre.
 +
 +
===Réalisation de la maquette===
 +
 +
Une fois les matériaux en notre possession et le schéma 3D de la maquette réalisée, nous avons pu commencer l’assemblage. Nous avons découpé dans un premier temps deux carrés de plexiglas, un de 40cm de côté qui fait office de base et un autre de 30cm de côté qui fait office de plateau rotatif pour le labyrinthe. Nous avons ensuite découpé deux bielles-manivelles, composées chacune de deux bielles en bois. La première relie le moteur à la deuxième bielle et contient des trous pour fixer la bielle au moteur et à la seconde bielle, tandis que la deuxième bielle relie la première au support du plateau. Nous avons percé un trou pour mettre un roulement à billes entre les deux bielles et limiter les frottements, et un second à l’autre extrémité de la bielle pour la fixer à la rotule du support du plateau. De plus, comme on peut le voir ci-dessus, nous avons conçu un support en forme de croix qui vient se placer sous la plaque de plexiglas du labyrinthe. Son objectif est le maintien de ce carré de plexiglas, tout en pouvant rassembler l’ensemble des liaisons avec le reste de la structure (bielles, joint de cardan), sans pour autant que celle-ci ne crée d’obstacle sur le plateau. Enfin, pour relier le plateau à la base et également faire en sorte qu’il soit stable, nous avons utilisé un cylindre métallique que nous avons récupéré sur l’ancien projet, ainsi qu'un joint de cardan qui permet la rotation du plateau sur les 2 axes horizontaux uniquement, empêchant le plateau de tourner autour de l’axe vertical. Pour finir, nous avons rajouté une tige de bois de 70cm pour venir y fixer la caméra au-dessus du plateau.
 +
 +
Après quelques tests, il a été nécessaire de revoir certaines cotations comme la longueur des bielles. En effet, nous avons rencontré plusieurs problèmes lors de la réalisation de notre maquette et la conception de celle-ci, retardant d'ailleurs la mise en place de la partie informatique. Le principal problème rencontré était le manque de formation aux outils de conception mécanique lors du commencement de notre projet, ce qui à entraîné un temps de modélisation plus important. Par la suite, nous avons dû effectuer des ajustements car la rotation autour de l’axe vertical avait été rendue possible par notre choix de fixation entre le joint de cardan et le cylindre métallique, donc pour remédier à ce problème, nous avons taraudé le cylindre métallique afin de visser le joint de cardan et de neutraliser cette rotation. D'un autre côté, les bielles que nous avions conçu dans un premier temps ont dû être ajustées. Afin que le roulement soit immobilisé, le trou étant légèrement plus petit que la pièce, nous avons effectué une entaille au niveau de ce dernier, dans le but de pouvoir l’agrandir au moment où on insère le roulement à bille. Le trou vient ensuite naturellement se refermer autour de la pièce, l’empêchant de bouger. Par ailleurs, nous avons dû diminuer la taille des bielles afin d’augmenter la liberté de rotation du plateau vers le bas, sachant que certaines pièces ont dû être refabriquées à plusieurs reprises du fait que des erreurs sur les premières commandes des moteurs ont engendré des mouvements que nous n'avions pas anticipé. C'est pour cette raison que nous avons décidé de fixer une valeur de couple maximal pour éviter la destruction d'autres bielles.
 +
 +
==Partie Informatique==
 +
En parallèle de la partie mécanique, nous avons avancé sur la partie informatique. Celle-ci concerne l’étude de l’utilisation des servomoteurs, de la caméra et de la carte Arduino. C’est dans cette partie que nous avons développé un système de contrôle de la balle, en implémentant du code sur la carte Arduino qui lie servomoteurs, caméra et asservissement.
 +
[[Fichier:RoboPlus_Manager_screenshot.jpg|thumb|right|400px|Capture d'écran du logiciel RoboPlus]]
 +
 +
===Utilisation des moteurs===
 +
Pour notre projet, il est primordial que le contrôle de la balle soit effectué correctement. Pour ce faire, nous utilisons deux servomoteurs AX-12+ de la gamme Dynamixel. Chaque moteur possède un identifiant, ici les identifiants sont 1 et 2. Ces moteurs sont connectés entre eux en cascade, le moteur d’identifiant 1 est
 +
directement relié à la carte Arduino. Le contrôle des moteurs est réalisé grâce à la librairie Dynamixel, créée spécialement pour l’utilisation des moteurs de cette gamme. Cette librairie nous offre de nombreuses éventuelles interactions avec chacun des moteurs : Il est par exemple possible de faire tourner les moteurs, soit en renseignant simplement la position ciblée, soit une position à une certaine vitesse. On peut aussi définir un couple maximal ou même préciser si on utilise les moteurs en mode endless, c’est-à-dire sans limite de rotation. Lors des premiers tests que nous avons réalisés pour contrôler les moteurs, nous n’étions pas en mesure de contrôler l’un des moteurs. Notre encadrant M.Conrard nous a donné accès au logiciel RoboPlus, qui nous permet de commander manuellement les moteurs. De plus, ce logiciel nous permet de paramétrer les moteurs et de coder des petits programmes que nous pouvons téléverser directement sur les moteurs grâce à un contrôleur. Nous avons alors pu nous rendre compte que le premier problème que nous avons rencontré était dû à la saisie d’un mauvais identifiant.
 +
 +
Le deuxième souci que nous avons rencontré était de contrôler les moteurs simultanément. Cette fois-ci, nous avons été confronté à plusieurs défauts : d’un côté, il fallait brancher les moteurs en cascade au lieu de brancher chaque moteur directement à la carte Arduino. D’un autre côté, il est nécessaire de mettre un délai entre deux instructions pour chaque moteur. En effet, si le premier moteur n’a pas fini d'exécuter la rotation qu’on lui a imposé, le deuxième moteur ne recevra pas d’autre instruction. Par sécurité et pour assurer que notre projet ne soit pas abîmé pendant son utilisation, nous avons décidé de limiter l’amplitude des moteurs pour que les contraintes mécaniques soient respectées et d’abaisser la valeur du couple maximum des moteurs, car il est arrivé que nous cassions une bielle suite à un mauvais mouvement.
 +
 +
===Reconnaissance des couleurs===
 +
[[Fichier:Pixymon_screenshot.jpg|thumb|right|400px|Capture d'écran du logiciel Pixymon]]
 +
Pendant le fonctionnement du labyrinthe autonome, la caméra sera constamment en fonctionnement pour suivre la position de la balle sur le plateau rotatif en temps réel. Pour cela, nous possédons une caméra Pixy, capable d’effectuer une reconnaissance des couleurs qu’elle récupère. Dans un premier temps, nous nous sommes concentrés sur le paramétrage de la caméra. Pour ce faire, nous avons utilisé le logiciel Pixymon, spécialement conçu pour avoir le retour image de la caméra et configurer les couleurs à distinguer. Dans notre cas, nous avons une signature pour plusieurs couleurs : du jaune pour la balle, du rose pour le centre du plateau du labyrinthe. Il est important de choisir des couleurs qui se démarquent des autres, afin qu’il n’y ait pas de confusion au niveau de la reconnaissance de couleurs.
 +
 +
Chaque signature est représentée par un paquet de pixel correspondant à un regroupement de pixels de la couleur demandée. A partir de ces paquets, la caméra peut renvoyer la position de chaque regroupement de pixels. C’est de cette manière que nous sommes en mesure de récupérer la position de la balle sur le plateau rotatif.
 +
 +
===Asservissement===
 +
Ensuite, il fallait réfléchir à comment asservir la position que l’on donne aux moteurs afin que la balle reste au centre du plateau. Pour cela, on a mis en place un PID pour que la balle reste au centre du plateau.
 +
 +
Pour l'implémentation de notre asservissement, nous avons réalisé deux boucles de régulation, une pour chaque axe, pour que la balle soit contrôlée sur la totalité du plateau. Chaque boucle possède un PID avec un retour unitaire, la consigne étant la position de la balle sur l'axe correspondant.
 +
 +
Par manque de temps suite au retard que nous avons accumulé avec le changement de projet, nous n'avons pas eu suffisamment de temps pour étudier la dynamique du système. Nous avions envisagé de faire une étude sur Matlab pour trouver avec précision les paramètres du régulateur. Pour aller plus vite et gagner du temps, nous avons ajusté manuellement les paramètres du régulateur. Nous sommes parvenus à obtenir des résultats, mais ceux-ci ne sont pas à la hauteur de nos attentes. On peut citer le manque de réactivité du système. L'implémentation du PID a également été rendue difficile du fait de notre structure qui a tendance à se dévisser, notamment au niveau du support du plateau du labyrinthe.
 +
[[Fichier:Algorithme_labyrinthe.png|thumb|right|200px|Algorithme du labyrinthe autonome]]
 +
 +
===Algorithme===
 +
Dès le semestre 7, nous avons imaginé un prototype d'algorithme qui comporte d'abord une partie consacrée à l''''initialisation''' du système puis une '''boucle principale''' dans laquelle nous allons gérer les moteurs, les informations transmises par la caméra et la résolution du labyrinthe. Nous avons gardé la même structure d'algorithme pour le code final.
 +
 +
A noter que dans notre code, nous faisons appels à des bibliothèques telles que :
 +
*<Dynamixel.h> pour commander les servomoteurs
 +
*<Pixy.h> pour utiliser la caméra
 +
*<SPI.h> pour paramétrer les communications série
 +
*<ppid.h> notre propre bibliothèque incluant un PID
 +
 +
 +
'''Initialisation'''
 +
 +
L'initialisation concerne le premier bloc d'instructions à exécuter au démarrage du système, juste après les déclarations des variables. On défini d'abord le port qui servira à commander les moteurs avec pinMode(). Puis on démarre la communication série entre la carte et les servomoteurs grâce à Dynamixel.begin(). Ensuite, on initialise le PID Pid_control.PID_init() et on place les moteurs à leur position angulaire initiale avec Dynamixel.moveSpeed(). Enfin, on initialise la caméra Pixy.init() et on étalonne la position du centre du plateau avec notre fonction determine_center().
 +
 +
'''Boucle principale'''
 +
 +
A chaque tour de boucle, la fonction loop() est exécutée, c'est la boucle principale de notre code. D'abord, on récupère la position de la balle sur le plateau avec notre fonction get_ball_info(). Pour récupérer la position de la balle, on utilise le retour caméra de la Pixy Cam grâce à pixy.GetBlocks() et on teste les signatures relevées si celle de la balle correspond. Une fois la position récupérée, on applique l'asservissement sur les deux axes du plateau avec Pid_control.corriger_X() et Pid_control.corriger_Y(), qui renvoient la correction à apporter à la position. Puis on calcule la vitesse à laquelle doivent tourner les moteurs, plus la balle est éloignée de la consigne, plus les moteurs tourneront vite. Après cela, étant donné que nous sommes contraints de délai entre l'utilisation des deux moteurs, nous avons défini un ordre de priorité pour les moteurs afin de rendre notre système plus efficace. On applique par la suite Dynamixel.moveSpeed() avec la position cible et la vitesse désirée pour régler la position de la balle sur le plateau.
 +
 +
='''Bilan'''=
 +
==Bilan du Semestre 7==
 +
Ayant commencé à travailler sur la Vanne Piézoélectrique pendant plusieurs séances, nous avons principalement consacré ce semestre à la prise en main de notre projet actuel, le labyrinthe autonome, un sujet qui nous paraît plus aisément réalisable et qui nous permet de travailler avec du matériel déjà disponible à l'école.
 +
 +
Une analyse de la maquette existante que nous avons récupéré a été nécessaire pour comprendre le fonctionnement du projet et définir les futurs axes d'améliorations à apporter au projet. C'est pendant ce semestre qu'a été planifié notre organisation pour le semestre 8, à savoir la prévision des tâches à réaliser au prochain semestre et la répartition des rôles au sein du groupe. Malgré le retard accumulé suite au changement du sujet de projet, nous étions prêt à commencer la conception de la nouvelle maquette à la fin du semestre 7.
 +
 +
==Bilan du Semestre 8==
 +
Pendant ce semestre, nous avons revu nos objectifs, car nous nous sommes rendus compte que nous allons manquer de temps pour réaliser un labyrinthe autonome purement fonctionnel. C'est pour cette raison que nous nous sommes fixés l'objectif du maintien de la balle sur le plateau dans l'optique de mettre en avant les capacités de contrôle de la balle de notre projet.
 +
 +
Après plusieurs mois de travail, notre équipe est fière du résultat de notre projet. Le résultat final est à la hauteur de nos attentes, avec une partie mécanique soigneusement conçue et réalisée pour avoir une allure élégante. Le plateau est équilibré, ce qui nous permet une bonne utilisation de notre projet. Bien que la partie informatique du projet ne soit pas encore totalement fonctionnelle, nous avons réussi à établir une communication entre les moteurs et le système informatique. Cependant, nous avons rencontré des difficultés pour mettre en place un algorithme efficace de maintien de la balle sur le plateau, du fait des contraintes mécanique auxquelles notre projet est confronté. Malgré ces obstacles, nous sommes convaincus que notre projet est une réussite. Nous avons toutefois réussi à concevoir et fabriquer une solution innovante au problème que nous nous étions fixé, à savoir le maintien d’une balle sur le plateau.
 +
 +
Même si les séances dédiées au projet sont terminées, il est tout à fait possible d'apporter des améliorations à notre projet, tel que l'ajout d'un joystick pour contrôler manuellement la balle, l'ajout de leds et de boutons pour suivre l'état du système, l'ajout d'une batterie ou bien l'implémentation d'un système de résolution de labyrinthe comme initialement prévu.
 +
 +
 +
 +
<div style="display: flex; align-items: center;">
 +
<li style="display: inline-block;"> [[File:base_proojet_labyrinthe.jpg|thumb|none|300px|La maquette que nous avons récupéré]] </li>
 +
<li style="display: inline-block; width: 50px;"> </li>
 +
<li style="display: inline-block; vertical-align: middle; margin-top: auto; margin-bottom: auto;"> [[File:maze_arrow.png|350px]] </li>
 +
<li style="display: inline-block; width: 50px;"> </li>
 +
<li style="display: inline-block;"> [[File:maquette_finale_labyrinthe_autonome.jpg|thumb|none|300px|Notre maquette finale à la fin du semestre 8]] </li>
 +
</div>
  
==Contenu des séances==
+
='''Contenu des séances'''=
Les séances dédiées au projet ont repris le 10 Octobre 2022. Lors des deux premières séances, nous avons travaillés sur la Vanne Piézoélectrique.
+
 
 +
Les séances dédiées au projet ont repris le 10 Octobre 2022. Lors des deux premières séances, nous avons travaillé sur la Vanne Piézoélectrique.
 +
 
 +
==Résumé des séances==
  
 
===Séance du 10 Octobre (Vanne piézoélectrique)===
 
===Séance du 10 Octobre (Vanne piézoélectrique)===
Ligne 78 : Ligne 265 :
  
 
===Séance du 18 Janvier===
 
===Séance du 18 Janvier===
Nous avons poursuivi l'étude cinématique du projet, dont le dimensionnement de la bielle qui lie le moteur au plateau du labyrinthe. Grâce à la formation au découpage laser au Fabricarium qu'Antoine et Romain ont pu bénéficier , nous avons découpé des plaques de plexiglas pour former la nouvelle base et le nouveau plateau. Enfin, nous avons commencé la simulation d'un PID pour pouvoir ensuite l'implémenter dans notre code.
+
Nous avons poursuivi l'étude cinématique du projet, dont le dimensionnement de la bielle qui lie le moteur au plateau du labyrinthe. Grâce à la formation au découpage laser au Fabricarium qu'Antoine et Romain ont pu bénéficier, nous avons découpé des plaques de plexiglass pour former la nouvelle base et le nouveau plateau. Enfin, nous avons commencé la simulation d'un PID pour pouvoir ensuite l'implémenter dans notre code.
  
 
===Séance du 25 Janvier===
 
===Séance du 25 Janvier===
 +
Après les résultats de notre étude cinématique, nous avons décidé de réaliser un système de bielle-manivelle pour lier les servomoteurs au plateau mobile. Cette solution nous permet de transformer la rotation des moteurs en un mouvement de translation, il sera alors plus facile d'incliner le plateau de cette manière. Côté programmation, nous avons fini l'implémentation du PID en C++. A présent, il faudra que nous trouvons les bons coefficients pour un asservissement optimal.
  
 
===Séance du 1er Février===
 
===Séance du 1er Février===
 +
Pendant cette séance, nous nous sommes focalisés à quatre sur la partie mécanique du projet, étant donné que nous ne pouvons pas tester notre code sans que la partie mécanique soit terminée. Grâce à l'étude cinématique que nous avons mené, nous connaissons les cotations des bielles et du support du plateau. Nous nous sommes rendus compte qu'il fallait garder un peu de jeu entre le plateau et les bielles qui sont reliées à celle-ci. Une solution que nous avons trouvé est de placer un embout à rotule mâle.
  
 
===Séance du 8 Février===
 
===Séance du 8 Février===
 +
A présent, ayant une idée des dimensions du projet, nous avons dressé une liste des différents composants que nous utiliserons pour l'assemblage de notre projet. Nous aurons besoin de vis, écrous, roulements à bille, embouts à rotule mâle et un joint de cardan. Les roulements à billes serviront à assurer la liaison pivot entre deux bielles. Le joint de cardan servira de liaison entre la tige et le plateau. Pour ce faire, nous pensons à utiliser une manivelle de volet. Avec la découpeuse laser, nous avons découpé dans une chute de bois une première bielle que nous avons fixé à l'un des moteurs pour avoir un premier aperçu.
  
 
===Séance du 15 Février===
 
===Séance du 15 Février===
 
+
Pour pouvoir découper à la découpeuse laser le support du plateau, les supports des moteurs et les autres bielles, nous les avons modélisés sur ordinateur. Les moteurs seront donc surélevés grâce aux supports, qui seront formés de pièces en bois reliées par des jointures imprimées en 3D grâce aux imprimantes du Fabricarium. Nous avons également continué de découper les bielles à la découpeuse. Compte tenu des modifications que nous avons apporté au projet, nous avons modifié la liste de composants que nous avons dressé précédemment. A la fin de la séance, nous avons pu assembler un système bielle-manivelle entier.
===Séance du 15 Février===
 
  
 
===Séance du 1er Mars===
 
===Séance du 1er Mars===
 +
Les deux systèmes bielle-manivelle sont prêts à être attachés au projet. Nous avons également découpé le support du plateau. En vue de la prochaine séance, on a modélisé en 3D les pièces qui lieront le support du plateau au plateau pour pouvoir les imprimer et faire l'assemblage.
  
 
===Séance du 8 Mars===
 
===Séance du 8 Mars===
 +
Le dimensionnement des pièces étant terminé, nous sommes passé à l'assemblage du projet avec les pièces déjà prêtes. Le support du plateau est assemblé, ainsi qu'une partie des supports des moteurs, en attendant l'impression des jointures. Nous avons dû découper de nouvelles bielles pour pouvoir encastrer les roulements à bille. Pour cela, il a fallu faire une petite entaille dans la bielle à l'endroit où est encastré le roulement. De cette manière on évite d'ajouter de la colle et notre projet reste facilement démontable.
  
 
===Séance du 15 Mars===
 
===Séance du 15 Mars===
 +
Pendant cette dernière séance de projet, nous nous sommes avisés de terminer le montage de la maquette. Les pièces à imprimer au Fabricarium étant terminées, l'assemblage a pu être terminé cette séance. Nous avons alors lancé quelques tests, mais nous avons remarqué que le plateau mobile ne s'inclinait pas assez et qu'il tournait sur lui même au lieu de basculer sur un axe comme souhaité. Pour remédier à cela, nous avons placé l'orientation des bielles vers l'extérieur et réduit la longueur des bielles.
 +
 +
==Séances supplémentaires==
 +
Aux séances de projet s'ajoutent des heures de travail réalisées en dehors de l'école. Ce fut par exemple le cas pour imprimer les jointures avec les imprimantes 3D du Fabricarium, mais aussi pour implémenter l'algorithme de contrôle de la balle, car on devait attendre que l'assemblage soit terminé avant de pouvoir réaliser les premiers tests.
 +
 +
='''Annexe''' =
 +
==Modélisation==
 +
La modélisation de nos pièces est téléchargeable ici : [[Média:Pieces_modelisees_labyrinthe.zip]]
 +
 +
===Plateau du labyrinthe===
 +
 +
<div><ul>
 +
<li style="display: inline-block;"> [[File:Jonction_Support_Plateau.png|thumb|none|350px|Jonction du support du plateau]] </li>
 +
<li style="display: inline-block; width: 50px;"> </li>
 +
<li style="display: inline-block;"> [[File:Plateau_labyrinthe.png|thumb|none|310px|Plateau du labyrinthe]] </li>
 +
<li style="display: inline-block; width: 50px;"> </li>
 +
<li style="display: inline-block;"> [[File:Support_Plateau_labyrinthe.png|thumb|none|320px|Support du plateau du labyrinthe]] </li>
 +
</ul></div>
 +
 +
===Support de moteur===
 +
 +
 +
<div><ul>
 +
<li style="display: inline-block;"> [[File:Base_support_moteur.png|thumb|none|300px|Base du support moteur]] </li>
 +
<li style="display: inline-block; width: 50px;"> </li>
 +
<li style="display: inline-block;"> [[File:Cote_support_moteur_labyrinthe.png|thumb|none|350px|Pied de la base du support]] </li>
 +
<li style="display: inline-block; width: 50px;"> </li>
 +
<li style="display: inline-block;"> [[File:Jointure_support_moteur.png|thumb|none|300px|Jointure du support moteur]] </li>
 +
</ul></div>
 +
 +
 +
[[File:Support_moteur_labyrinthe.png|thumb|none|400px|Aperçu du support moteur]]
 +
 +
===Bielle manivelle===
 +
 +
 +
<div><ul>
 +
<li style="display: inline-block;"> [[File:Bielle_Haut.png|thumb|none|350px|Bielle du haut]] </li>
 +
<li style="display: inline-block; width: 50px;"> </li>
 +
<li style="display: inline-block;"> [[File:Bielle_Bas.png|thumb|none|300px|Bielle du bas]] </li>
 +
</ul></div>
 +
 +
===Base===
 +
 +
 +
<div><ul>
 +
<li style="display: inline-block;"> [[File:Base_projet.png|thumb|none|450px|Base du projet]] </li>
 +
<li style="display: inline-block; width: 50px;"> </li>
 +
<li style="display: inline-block;"> [[File:Tige_centrale.png|thumb|none|190px|Tige centrale]] </li>
 +
</ul></div>
 +
 +
==Code source==
 +
Notre code source est téléchargeable ici : [[Média:Code_source_labyrinthe.zip]]
 +
 +
===Déclaration des variables et des bibliothèques===
 +
 +
[[Fichier:Declaration_labyrinthe.jpg|350px]]
 +
 +
 +
===Initialisation setup()===
 +
 +
[[Fichier:Setup_labyrinthe.jpg|1000px]]
 +
 +
 +
===Boucle principale loop()===
 +
 +
[[Fichier:Loop_labyrinthe.jpg|1000px]]
 +
 +
 +
===Position de la balle get_ball_info()===
 +
 +
[[Fichier:Get_ball_info_labyrinthe.jpg|500px]]
  
='''Réalisations et résultats'''=
 
  
='''Bilan'''=
+
===Obtention du centre du plateau determine_center()===
==Bilan du Semestre 7==
 
  
==Bilan du Semestre 8==
+
[[Fichier:Determine_centre_labyrinthe.jpg|625px]]

Version actuelle datée du 23 mai 2023 à 18:07

Vidéo de présentation de notre projet : Labyrinthe autonome

Sommaire

Résumé

Cette page est dédiée au groupe travaillant sur le labyrinthe automatique dans le cadre des projets IMA3/IMA4. Dans cette page, vous trouverez une présentation globale de notre projet, les démarches que nous avons entreprises ainsi que les résultats obtenus.

Présentation générale

Notre équipe en plein travail...

Groupe

Nous sommes quatre étudiants en Systèmes Embarqués (SE4) :

  • Romain Pouillard
  • Hugo Legendre
  • Antoine Vion
  • Dann Rodenburg (a rejoint le projet au début du Semestre 7)

Contexte

Initialement, nous travaillions sur une autre thématique de projet, qui était la Vanne Piézoélectrique. C'est après avoir rencontré plusieurs problèmes pendant l'avancement de notre projet, que nous nous sommes résolus à changer de sujet pour le labyrinthe automatique. Pour réaliser notre projet, nous avons récupéré la base d'un ancien projet IMA traitant un sujet similaire à celui-ci.

Il est intéressant de chercher à résoudre un labyrinthe. En effet, il est courant de rencontrer des situations qui se rapprochent d'un labyrinthe, telles que ne pas se retrouver sur le plan d'une ville ou d'un bâtiment. Or, la résolution d'un labyrinthe est un cas complexe qui peut vite devenir un casse-tête.

Objectif

Notre objectif est de mettre au point un système de labyrinthe autonome, capable d'amener une balle d'un point A à un point B sans requérir d'intervention humaine. Peut importe sa position de départ, le système doit être capable d'amener la balle jusqu'à la sortie sans problème, quelque soit la complexité du labyrinthe. Nous devrons améliorer le modèle existant en retravaillant la structure du projet, voire créer une nouvelle maquette et repensant l'algorithme de contrôle de la balle. Le contrôle d'une balle sera minutieusement mené avec l'utilisation de nombreuses technologies mises à disposition comme la reconnaissance de couleurs ou des servomoteurs.

Résolution d'un labyrinthe

Description

Notre labyrinthe doit être capable de déplacer la balle sur un plateau pivotant. Le labyrinthe est placé sur un plateau surélevé grâce à une tige métallique. Par le biais d'un système de deux bielles manivelles, ce plateau peut basculer sur deux axes, ce qui assure le déplacement de la balle sur l'entièreté du plateau. Les bielles sont chacune actionnées par des servomoteurs permettant au plateau de basculer. L'ensemble du projet repose un base sur laquelle est disposé une carte Arduino et la caméra avec son support.

Expression du besoin

Mener l'étude de l'expression du besoin est incontournable dans tout projet. Cette étude vise à analyser de manière approfondie les besoins et les attentes utilisateurs vis-à-vis de notre projet. Elle nous a permis de regrouper les informations sur les fonctionnalités, caractéristiques, contraintes attendues et de clarifier les objectifs de notre labyrinthe autonome.


Bien que l'objectif principal était la résolution automatique du labyrinthe, nous avons revu, suite aux difficultés rencontrées, nos objectifs que nous avons simplifiés :

  • Proposer une solution de résolution de labyrinthe à l’utilisateur
  • Obtenir un produit facilement modulable et déplaçable pour différente représentation, donc démontable.


Schéma bête à corne du projet


Pour concrétiser notre projet, nous avons dressé la liste des différentes fonctions de service attendues, classées selon leur niveau d'exigence et leur priorité :

Intitulé Critère Niveau et limites Priorité
FP1 Permettre au système de maintenir la balle sur le plateau Position de la balle Déplacer la balle jusqu'à son centre sans la faire tomber 1
Rapidité du système Déplacer la balle avec une vitesse de référence sans la faire tomber 2
F2 Résoudre un labyrinthe Chemin le plus simple 3
F3 Être facilement démontable Démontabilité de la maquette 3
F4 Fournir une alimentation adéquate Autonomie 6h 4
F5 Avoir un coût raisonnable Coût de fabrication 100€ 4
F6 Être pilotable par l'utilisateur Pilotable par l'utilisateur 5

Gestion de projet

Une bonne gestion de projet est nécessaire pour une répartition optimale des tâches dans l'équipe afin de mener à bien notre projet. Dès que nous sommes passés du projet Vanne Piézoélectrique au labyrinthe autonome, nous avons immédiatement réparti les tâches parmi nous en formant des sous-groupes de deux personnes :


  • Nous considérons d'un côté la Partie mécanique, qui regroupe les thématiques telles que la modélisation, le dimensionnement, l'étude cinématique et l'assemblage de la structure de la maquette du labyrinthe. Tout au long de ces deux semestres passés sur ce projet, Antoine et Romain ont travaillé ensemble sur la partie mécanique.


  • D'un autre côté, nous avons défini la Partie Informatique, qui correspond à l'élaboration d'un algorithme pour le contrôle de la balle et pour la résolution automatique de labyrinthe. Cette partie vise également à coordonner tous nos composants entre eux pour former un système complet et sophistiqué. Pendant deux semestres, Dann et Hugo se sont occupés de la partie informatique.


Bien que nous avons défini des sous-groupes de projet, nous avons été amenés à revoir notre planification suite aux obstacles et aux imprévus rencontrés. En raison du changement de projet, nous avons accumulé quelques séances de retard et par conséquent la partie informatique a été mise de côté quelques séances pour avancer le plus rapidement possible sur l'assemblage de notre maquette de labyrinthe.

Pour planifier et assigner les tâches, tout en prenant compte de leur durée, nous avons élaboré un diagramme Gantt prévisionnel pour le semestre 8 dès le changement de projet.


Diagramme de Gantt prévisionnel du Semestre 8

Equipements

Dans cette section, nous allons détailler les différents moyens que nous avons à disposition pour mener à bien notre projet.

Liste des composants

Composant Image
Carte Arduino Mega 2560 Arduino atmega2560.png
Servomoteurs Dynamixel AX-12+ ServoAX12.png
Caméra Pixy Cam Pixycam.png
Alimentation réglable 0-9V Alim reglable 0-9V.png
Câbles X3P Cable 3P 200mm.png
Câble de liaison 6 broches Cable 6 broches.png
Rotules Mâles M16 Rotule male labyrinthe.png

Cette liste de composant est complétée par des matériaux que nous avons récupérés tels que des plaques de plexiglas et des chutes de bois.

Carte Arduino

Montage d'un système bielle manivelle

La carte Arduino Mega 2560 est la pièce centrale de notre maquette : Les servomoteurs, leur alimentation et la caméra sont reliés à la carte. Basée sur le microcontrôleur ATmega2560, elle offre une grande quantité de broches d'entrées/sorties et supporte de nombreuses interfaces de communication, ce qui lui permet d'être adaptable à la réalisation de notre projet. C'est sur cette carte que se trouve le programme qui contrôle notre système, que l'on peut téléverser depuis un ordinateur.

Servomoteurs

Le montage est composé de deux servomoteurs AX-12+, développés par la société Robotis. Chaque moteur gère l'inclinaison du plateau mobile sur un axe en particulier. Ils sont reliés au labyrinthe via un système bielle manivelle, permettant de transformer le mouvement de rotation du moteur en une translation, ce qui a comme effet de faire basculer le plateau vers le haut et vers le bas. C'est par le biais de ces moteurs que nous pouvons faire se déplacer la balle sur le plateau. Les moteurs sont reliés en cascade à la carte Arduino.

Nous avons en réserve un servomoteur AX-12A, qui est une version améliorée du AX-12+. Comme nous n'en possédons qu'un seul exemplaire, nous avons choisi d'utiliser les AX-12+.

Caméra Pixy

Placée au dessus du plateau du labyrinthe, on retrouve la caméra Pixy Cam qui filme le labyrinthe. La caméra est dotée d'un capteur d'image lui permettant d'effectuer une reconnaissance d'objet en temps réel. Elle est capable de détecter et de suivre la balle et les murs, grâce à une sélection de couleurs, appelée "signature". Par exemple, la balle étant jaune, la caméra associe chaque pixel jaune à la balle. Compatible avec Arduino, il est possible de récupérer dans le code, la position de la balle, le nombre de groupe de couleurs détecté... De plus, il est envisageable de télécharger le logiciel PixyMon pour visualiser sur ordinateur le retour de la caméra et de paramétrer les signatures. Sa petite taille et sa facilité d'utilisation font que la Pixy Cam est un outil indispensable à la réalisation de notre projet.

Câbles XP3

Les câbles XP3 sont conçus spécifiquement pour se brancher à certains servomoteurs Dynamixel. Les servomoteurs étant reliés en cascade avec la carte Arduino, ce sont ces câbles qui assurent les liaisons entre ces derniers.

Câble de liaison 6 broches

Il s'agit du câble qui relie la caméra Pixy Cam et la carte Arduino. Ce câble permet d'alimenter la carte et l'échange de données.

Rotules Mâles M16

Il s'agit du composant qui lie le système bielle-manivelle au support du plateau du labyrinthe. Ce composant a été choisi car il permet de créer une liaison rotule, ce qui a comme avantage de donner un peu de jeu à notre système étant donné qu'avec un pivot simple, le plateau ne s'inclinerait pas.

Liste des achats

Composant Image
Joint de cardan de volet roulant Joint cardan volet.png
Roulements à bille Roulements billes.png

Pour remplacer la liaison tige/plateau mobile, nous avons fait l'achat d'un joint de cardan d'une manivelle de volet roulant. Nous avons également acheté deux roulements à billes pour l'assemblage des bielles manivelles.

Réalisations et résultats

Partie Mécanique

Premier concept de labyrinthe autonome

Formations

Pour mener à bien la partie mécanique du projet, nous avons suivi la formation pour utiliser la découpeuse laser et également la formation pour utiliser les imprimantes 3D du Fabricarium. Nous nous sommes pareillement auto-formés à l’utilisation d’Onshape, afin de pouvoir modéliser notre projet et de pouvoir imprimer certaines pièces en 3D.

Modélisation

Dans un premier temps, nous avons réfléchi à comment réaliser la partie mécanique en faisant différentes modélisations. L’une de nos premières idées était de réaliser une maquette avec quatre moteurs comme ici à droite, pouvant exercer un mouvement de translation pour élever ou abaisser le plateau du labyrinthe et faire rouler la balle. Pour transformer la rotation d'un moteur en un mouvement de translation, plusieurs possibilités sont réalisables comme un système pignon-crémaillère, vis-écrou ou bien bielle-manivelle. Nous avons rapidement laissé cette idée de côté, car il aurait été trop difficile de contrôler les 4 moteurs en même temps.

Concept final de labyrinthe autonome

Finalement, nous avons repensé la modélisation et modélisé une nouvelle maquette. Ce nouveau modèle partage beaucoup de similitudes avec le premier ; le labyrinthe est surélevé par une tige, la caméra est placé au dessus du plateau du labyrinthe grâce à un support. Les changements majeurs sont que cette fois, ce sont deux moteurs au lieu de quatre qui actionnent un système de bielle-manivelle pour faire basculer le plateau du labyrinthe dans un sens ou dans un autre.

Réalisation de la maquette

Une fois les matériaux en notre possession et le schéma 3D de la maquette réalisée, nous avons pu commencer l’assemblage. Nous avons découpé dans un premier temps deux carrés de plexiglas, un de 40cm de côté qui fait office de base et un autre de 30cm de côté qui fait office de plateau rotatif pour le labyrinthe. Nous avons ensuite découpé deux bielles-manivelles, composées chacune de deux bielles en bois. La première relie le moteur à la deuxième bielle et contient des trous pour fixer la bielle au moteur et à la seconde bielle, tandis que la deuxième bielle relie la première au support du plateau. Nous avons percé un trou pour mettre un roulement à billes entre les deux bielles et limiter les frottements, et un second à l’autre extrémité de la bielle pour la fixer à la rotule du support du plateau. De plus, comme on peut le voir ci-dessus, nous avons conçu un support en forme de croix qui vient se placer sous la plaque de plexiglas du labyrinthe. Son objectif est le maintien de ce carré de plexiglas, tout en pouvant rassembler l’ensemble des liaisons avec le reste de la structure (bielles, joint de cardan), sans pour autant que celle-ci ne crée d’obstacle sur le plateau. Enfin, pour relier le plateau à la base et également faire en sorte qu’il soit stable, nous avons utilisé un cylindre métallique que nous avons récupéré sur l’ancien projet, ainsi qu'un joint de cardan qui permet la rotation du plateau sur les 2 axes horizontaux uniquement, empêchant le plateau de tourner autour de l’axe vertical. Pour finir, nous avons rajouté une tige de bois de 70cm pour venir y fixer la caméra au-dessus du plateau.

Après quelques tests, il a été nécessaire de revoir certaines cotations comme la longueur des bielles. En effet, nous avons rencontré plusieurs problèmes lors de la réalisation de notre maquette et la conception de celle-ci, retardant d'ailleurs la mise en place de la partie informatique. Le principal problème rencontré était le manque de formation aux outils de conception mécanique lors du commencement de notre projet, ce qui à entraîné un temps de modélisation plus important. Par la suite, nous avons dû effectuer des ajustements car la rotation autour de l’axe vertical avait été rendue possible par notre choix de fixation entre le joint de cardan et le cylindre métallique, donc pour remédier à ce problème, nous avons taraudé le cylindre métallique afin de visser le joint de cardan et de neutraliser cette rotation. D'un autre côté, les bielles que nous avions conçu dans un premier temps ont dû être ajustées. Afin que le roulement soit immobilisé, le trou étant légèrement plus petit que la pièce, nous avons effectué une entaille au niveau de ce dernier, dans le but de pouvoir l’agrandir au moment où on insère le roulement à bille. Le trou vient ensuite naturellement se refermer autour de la pièce, l’empêchant de bouger. Par ailleurs, nous avons dû diminuer la taille des bielles afin d’augmenter la liberté de rotation du plateau vers le bas, sachant que certaines pièces ont dû être refabriquées à plusieurs reprises du fait que des erreurs sur les premières commandes des moteurs ont engendré des mouvements que nous n'avions pas anticipé. C'est pour cette raison que nous avons décidé de fixer une valeur de couple maximal pour éviter la destruction d'autres bielles.

Partie Informatique

En parallèle de la partie mécanique, nous avons avancé sur la partie informatique. Celle-ci concerne l’étude de l’utilisation des servomoteurs, de la caméra et de la carte Arduino. C’est dans cette partie que nous avons développé un système de contrôle de la balle, en implémentant du code sur la carte Arduino qui lie servomoteurs, caméra et asservissement.

Capture d'écran du logiciel RoboPlus

Utilisation des moteurs

Pour notre projet, il est primordial que le contrôle de la balle soit effectué correctement. Pour ce faire, nous utilisons deux servomoteurs AX-12+ de la gamme Dynamixel. Chaque moteur possède un identifiant, ici les identifiants sont 1 et 2. Ces moteurs sont connectés entre eux en cascade, le moteur d’identifiant 1 est directement relié à la carte Arduino. Le contrôle des moteurs est réalisé grâce à la librairie Dynamixel, créée spécialement pour l’utilisation des moteurs de cette gamme. Cette librairie nous offre de nombreuses éventuelles interactions avec chacun des moteurs : Il est par exemple possible de faire tourner les moteurs, soit en renseignant simplement la position ciblée, soit une position à une certaine vitesse. On peut aussi définir un couple maximal ou même préciser si on utilise les moteurs en mode endless, c’est-à-dire sans limite de rotation. Lors des premiers tests que nous avons réalisés pour contrôler les moteurs, nous n’étions pas en mesure de contrôler l’un des moteurs. Notre encadrant M.Conrard nous a donné accès au logiciel RoboPlus, qui nous permet de commander manuellement les moteurs. De plus, ce logiciel nous permet de paramétrer les moteurs et de coder des petits programmes que nous pouvons téléverser directement sur les moteurs grâce à un contrôleur. Nous avons alors pu nous rendre compte que le premier problème que nous avons rencontré était dû à la saisie d’un mauvais identifiant.

Le deuxième souci que nous avons rencontré était de contrôler les moteurs simultanément. Cette fois-ci, nous avons été confronté à plusieurs défauts : d’un côté, il fallait brancher les moteurs en cascade au lieu de brancher chaque moteur directement à la carte Arduino. D’un autre côté, il est nécessaire de mettre un délai entre deux instructions pour chaque moteur. En effet, si le premier moteur n’a pas fini d'exécuter la rotation qu’on lui a imposé, le deuxième moteur ne recevra pas d’autre instruction. Par sécurité et pour assurer que notre projet ne soit pas abîmé pendant son utilisation, nous avons décidé de limiter l’amplitude des moteurs pour que les contraintes mécaniques soient respectées et d’abaisser la valeur du couple maximum des moteurs, car il est arrivé que nous cassions une bielle suite à un mauvais mouvement.

Reconnaissance des couleurs

Capture d'écran du logiciel Pixymon

Pendant le fonctionnement du labyrinthe autonome, la caméra sera constamment en fonctionnement pour suivre la position de la balle sur le plateau rotatif en temps réel. Pour cela, nous possédons une caméra Pixy, capable d’effectuer une reconnaissance des couleurs qu’elle récupère. Dans un premier temps, nous nous sommes concentrés sur le paramétrage de la caméra. Pour ce faire, nous avons utilisé le logiciel Pixymon, spécialement conçu pour avoir le retour image de la caméra et configurer les couleurs à distinguer. Dans notre cas, nous avons une signature pour plusieurs couleurs : du jaune pour la balle, du rose pour le centre du plateau du labyrinthe. Il est important de choisir des couleurs qui se démarquent des autres, afin qu’il n’y ait pas de confusion au niveau de la reconnaissance de couleurs.

Chaque signature est représentée par un paquet de pixel correspondant à un regroupement de pixels de la couleur demandée. A partir de ces paquets, la caméra peut renvoyer la position de chaque regroupement de pixels. C’est de cette manière que nous sommes en mesure de récupérer la position de la balle sur le plateau rotatif.

Asservissement

Ensuite, il fallait réfléchir à comment asservir la position que l’on donne aux moteurs afin que la balle reste au centre du plateau. Pour cela, on a mis en place un PID pour que la balle reste au centre du plateau.

Pour l'implémentation de notre asservissement, nous avons réalisé deux boucles de régulation, une pour chaque axe, pour que la balle soit contrôlée sur la totalité du plateau. Chaque boucle possède un PID avec un retour unitaire, la consigne étant la position de la balle sur l'axe correspondant.

Par manque de temps suite au retard que nous avons accumulé avec le changement de projet, nous n'avons pas eu suffisamment de temps pour étudier la dynamique du système. Nous avions envisagé de faire une étude sur Matlab pour trouver avec précision les paramètres du régulateur. Pour aller plus vite et gagner du temps, nous avons ajusté manuellement les paramètres du régulateur. Nous sommes parvenus à obtenir des résultats, mais ceux-ci ne sont pas à la hauteur de nos attentes. On peut citer le manque de réactivité du système. L'implémentation du PID a également été rendue difficile du fait de notre structure qui a tendance à se dévisser, notamment au niveau du support du plateau du labyrinthe.

Algorithme du labyrinthe autonome

Algorithme

Dès le semestre 7, nous avons imaginé un prototype d'algorithme qui comporte d'abord une partie consacrée à l'initialisation du système puis une boucle principale dans laquelle nous allons gérer les moteurs, les informations transmises par la caméra et la résolution du labyrinthe. Nous avons gardé la même structure d'algorithme pour le code final.

A noter que dans notre code, nous faisons appels à des bibliothèques telles que :

  • <Dynamixel.h> pour commander les servomoteurs
  • <Pixy.h> pour utiliser la caméra
  • <SPI.h> pour paramétrer les communications série
  • <ppid.h> notre propre bibliothèque incluant un PID


Initialisation

L'initialisation concerne le premier bloc d'instructions à exécuter au démarrage du système, juste après les déclarations des variables. On défini d'abord le port qui servira à commander les moteurs avec pinMode(). Puis on démarre la communication série entre la carte et les servomoteurs grâce à Dynamixel.begin(). Ensuite, on initialise le PID Pid_control.PID_init() et on place les moteurs à leur position angulaire initiale avec Dynamixel.moveSpeed(). Enfin, on initialise la caméra Pixy.init() et on étalonne la position du centre du plateau avec notre fonction determine_center().

Boucle principale

A chaque tour de boucle, la fonction loop() est exécutée, c'est la boucle principale de notre code. D'abord, on récupère la position de la balle sur le plateau avec notre fonction get_ball_info(). Pour récupérer la position de la balle, on utilise le retour caméra de la Pixy Cam grâce à pixy.GetBlocks() et on teste les signatures relevées si celle de la balle correspond. Une fois la position récupérée, on applique l'asservissement sur les deux axes du plateau avec Pid_control.corriger_X() et Pid_control.corriger_Y(), qui renvoient la correction à apporter à la position. Puis on calcule la vitesse à laquelle doivent tourner les moteurs, plus la balle est éloignée de la consigne, plus les moteurs tourneront vite. Après cela, étant donné que nous sommes contraints de délai entre l'utilisation des deux moteurs, nous avons défini un ordre de priorité pour les moteurs afin de rendre notre système plus efficace. On applique par la suite Dynamixel.moveSpeed() avec la position cible et la vitesse désirée pour régler la position de la balle sur le plateau.

Bilan

Bilan du Semestre 7

Ayant commencé à travailler sur la Vanne Piézoélectrique pendant plusieurs séances, nous avons principalement consacré ce semestre à la prise en main de notre projet actuel, le labyrinthe autonome, un sujet qui nous paraît plus aisément réalisable et qui nous permet de travailler avec du matériel déjà disponible à l'école.

Une analyse de la maquette existante que nous avons récupéré a été nécessaire pour comprendre le fonctionnement du projet et définir les futurs axes d'améliorations à apporter au projet. C'est pendant ce semestre qu'a été planifié notre organisation pour le semestre 8, à savoir la prévision des tâches à réaliser au prochain semestre et la répartition des rôles au sein du groupe. Malgré le retard accumulé suite au changement du sujet de projet, nous étions prêt à commencer la conception de la nouvelle maquette à la fin du semestre 7.

Bilan du Semestre 8

Pendant ce semestre, nous avons revu nos objectifs, car nous nous sommes rendus compte que nous allons manquer de temps pour réaliser un labyrinthe autonome purement fonctionnel. C'est pour cette raison que nous nous sommes fixés l'objectif du maintien de la balle sur le plateau dans l'optique de mettre en avant les capacités de contrôle de la balle de notre projet.

Après plusieurs mois de travail, notre équipe est fière du résultat de notre projet. Le résultat final est à la hauteur de nos attentes, avec une partie mécanique soigneusement conçue et réalisée pour avoir une allure élégante. Le plateau est équilibré, ce qui nous permet une bonne utilisation de notre projet. Bien que la partie informatique du projet ne soit pas encore totalement fonctionnelle, nous avons réussi à établir une communication entre les moteurs et le système informatique. Cependant, nous avons rencontré des difficultés pour mettre en place un algorithme efficace de maintien de la balle sur le plateau, du fait des contraintes mécanique auxquelles notre projet est confronté. Malgré ces obstacles, nous sommes convaincus que notre projet est une réussite. Nous avons toutefois réussi à concevoir et fabriquer une solution innovante au problème que nous nous étions fixé, à savoir le maintien d’une balle sur le plateau.

Même si les séances dédiées au projet sont terminées, il est tout à fait possible d'apporter des améliorations à notre projet, tel que l'ajout d'un joystick pour contrôler manuellement la balle, l'ajout de leds et de boutons pour suivre l'état du système, l'ajout d'une batterie ou bien l'implémentation d'un système de résolution de labyrinthe comme initialement prévu.


  • La maquette que nous avons récupéré
  • Maze arrow.png
  • Notre maquette finale à la fin du semestre 8
  • Contenu des séances

    Les séances dédiées au projet ont repris le 10 Octobre 2022. Lors des deux premières séances, nous avons travaillé sur la Vanne Piézoélectrique.

    Résumé des séances

    Séance du 10 Octobre (Vanne piézoélectrique)

    Nous avons dressé la liste des composants que nous aurions besoin pour notre projet : Un capteur de pression, deux capteurs de débit et deux capteurs de tension. De plus, nous avons commencé à faire des recherches sur les muscles pneumatiques et à regarder quelle carte électronique nous pourrions utiliser.

    Séance du 21 Octobre (Vanne piézoélectrique)

    Nous avons tenté de faire fonctionner un système de 8 vannes avec un module Dspace que M. Lakhal nous a fourni en vue du projet. Cependant, nous avons manqué de données sur les vannes et la simulation sur Matlab était corrompue. De ce fait, nous n'avons pas été en mesure de contrôler les vannes.

    Séance du 28 Octobre

    Après avoir passé la majorité de la séance à essayer de faire fonctionner le module Dspace, nous avons cherché une autre alternative pour notre projet : Par manque de temps et de moyens, notre encadrant nous a proposé de changer de projet pour travailler sur le labyrinthe autonome. Nous avons utilisé le reste du temps de la séance à prendre en main notre nouveau projet. Pour répartir au mieux les tâches pour le projet, on a formé deux binômes : l'un formé de Romain et Antoine qui vont s'occuper de la partie mécanique, de l'amélioration du labyrinthe et l'autre formé de Dann et Hugo qui vont écrire le programme du labyrinthe.

    Séance du 18 Novembre

    Nous nous sommes intéressés au fonctionnement de la caméra Pixycam. Pour avoir accès à la vidéo et aux paramètres de la caméra, nous avons utilisé le logiciel Piximon. Grâce à ce logiciel, nous avons défini plusieurs groupes de couleurs : tous les pixels bleus sont associés à la caméra, et en tant que simple test, du rose pour détecter un mur. On a pris conscience qu'il faudra prendre des couleurs bien distinctes pour bien différencier les différentes parties du labyrinthe. Ensuite, on a lancé le programme présent sur la carte du projet. Pendant l'exécution du programme, la caméra détecte la position de la balle et l'envoie à la carte via une liaison série. En parallèle, nous avons commencé à réfléchir à d'autres moyens pour remplacer la colle qui fixe tous les éléments du montage, dans le but de le rendre plus esthétique et plus robuste.

    Séance du 21 Novembre

    Pendant cette séance, nous avons étudié le code déjà existant dans la carte. On a remarqué que l'un des servomoteurs ne répondait pas, il s'agissait en fait d'une erreur de port. Puis, on a défini la direction et le sens des axes sur lesquels la balle se déplace. Après cela, on a souligné la nécessité d'initialiser le système de coordonnées du labyrinthe. En effet, si le plateau n'est pas initialement droit ou si la caméra a bougé (ce cas est assez fréquent car la fixation de la caméra n'est pas solide).

    Séance du 25 Novembre

    L'objectif de cette séance est de comprendre comment commander les servomoteurs avec la librairie DynamixelSerial. Avec la commande moveSpeed(), on peut commander les moteurs en renseignant la position angulaire cible et la vitesse à laquelle le moteur va tourner. Cette commande est intéressante car elle permet de commander un moteur en sélectionnant son identifiant. Cependant, nous n'avons pas réussi à faire fonctionner les deux moteurs en même temps. Lorsque l'on disait aux deux moteurs, d'identifiant 1 et 2, de tourner, seul le moteur 2 répondait. D'un autre côté, on a pensé à remplacer le plateau en bois du labyrinthe par du plexiglas.

    Séance du 28 Novembre

    Nous avons élaboré les plans d'un nouveau labyrinthe, pour pouvoir ensuite le couper à la découpeuse laser. Cette version du labyrinthe sera plus compliquée que celle que l'on a récupérée. Puis on a résolu le problème avec les servomoteurs de la séance précédente : il s'agissait d'un câble liant l'un des moteurs à la carte qui était défectueux. Contrairement à ce que nous pensions, cela n'était pas dû à un problème provenant du servomoteur, car nous avons emprunté un autre servomoteur et nous étions confronté au même problème. Nous avons donc récupéré un autre câble pour régler le problème.

    Séance du 8 Décembre

    Ayant encadré le projet que nous avons récupéré, M. Conrard nous a proposé de nous apporter son aide pour le projet. Il nous a montré le logiciel RoboPlus, qui permet de tester en commandant manuellement les moteurs et de changer les variables comme par exemple son identifiant. On est à présent sûr que les problèmes rencontrés précédemment avec les moteurs n'étaient pas dus aux identifiants. Etant donné du retard que nous avons pris, nous nous sommes fixés un objectif intermédiaire, inspiré de la vidéo que M. Lakhal nous a envoyé qui est de garder la balle stable sur un seul axe. Le but est de réussir à manipuler la balle sur un axe, et quand cela sera terminé, il ne restera plus qu'à faire pareil avec l'autre axe pour pouvoir contrôler la balle sur deux axes. RoboPlus permet également d'écrire un programme et de directement l'envoyer vers moteur grâce à un contrôleur. Les exemples de code nous ont permis de comprendre qu'il faut paramétrer les moteurs en mode "joint", c'est-à-dire que la position angulaire des moteurs sera limitée afin de ne pas endommager le plateau du labyrinthe.

    Séance du 15 Décembre

    On a commencé à écrire un programme permettant de garder une balle en équilibre sur un axe, en utilisant un des servomoteurs.

    Séance du 18 Janvier

    Nous avons poursuivi l'étude cinématique du projet, dont le dimensionnement de la bielle qui lie le moteur au plateau du labyrinthe. Grâce à la formation au découpage laser au Fabricarium qu'Antoine et Romain ont pu bénéficier, nous avons découpé des plaques de plexiglass pour former la nouvelle base et le nouveau plateau. Enfin, nous avons commencé la simulation d'un PID pour pouvoir ensuite l'implémenter dans notre code.

    Séance du 25 Janvier

    Après les résultats de notre étude cinématique, nous avons décidé de réaliser un système de bielle-manivelle pour lier les servomoteurs au plateau mobile. Cette solution nous permet de transformer la rotation des moteurs en un mouvement de translation, il sera alors plus facile d'incliner le plateau de cette manière. Côté programmation, nous avons fini l'implémentation du PID en C++. A présent, il faudra que nous trouvons les bons coefficients pour un asservissement optimal.

    Séance du 1er Février

    Pendant cette séance, nous nous sommes focalisés à quatre sur la partie mécanique du projet, étant donné que nous ne pouvons pas tester notre code sans que la partie mécanique soit terminée. Grâce à l'étude cinématique que nous avons mené, nous connaissons les cotations des bielles et du support du plateau. Nous nous sommes rendus compte qu'il fallait garder un peu de jeu entre le plateau et les bielles qui sont reliées à celle-ci. Une solution que nous avons trouvé est de placer un embout à rotule mâle.

    Séance du 8 Février

    A présent, ayant une idée des dimensions du projet, nous avons dressé une liste des différents composants que nous utiliserons pour l'assemblage de notre projet. Nous aurons besoin de vis, écrous, roulements à bille, embouts à rotule mâle et un joint de cardan. Les roulements à billes serviront à assurer la liaison pivot entre deux bielles. Le joint de cardan servira de liaison entre la tige et le plateau. Pour ce faire, nous pensons à utiliser une manivelle de volet. Avec la découpeuse laser, nous avons découpé dans une chute de bois une première bielle que nous avons fixé à l'un des moteurs pour avoir un premier aperçu.

    Séance du 15 Février

    Pour pouvoir découper à la découpeuse laser le support du plateau, les supports des moteurs et les autres bielles, nous les avons modélisés sur ordinateur. Les moteurs seront donc surélevés grâce aux supports, qui seront formés de pièces en bois reliées par des jointures imprimées en 3D grâce aux imprimantes du Fabricarium. Nous avons également continué de découper les bielles à la découpeuse. Compte tenu des modifications que nous avons apporté au projet, nous avons modifié la liste de composants que nous avons dressé précédemment. A la fin de la séance, nous avons pu assembler un système bielle-manivelle entier.

    Séance du 1er Mars

    Les deux systèmes bielle-manivelle sont prêts à être attachés au projet. Nous avons également découpé le support du plateau. En vue de la prochaine séance, on a modélisé en 3D les pièces qui lieront le support du plateau au plateau pour pouvoir les imprimer et faire l'assemblage.

    Séance du 8 Mars

    Le dimensionnement des pièces étant terminé, nous sommes passé à l'assemblage du projet avec les pièces déjà prêtes. Le support du plateau est assemblé, ainsi qu'une partie des supports des moteurs, en attendant l'impression des jointures. Nous avons dû découper de nouvelles bielles pour pouvoir encastrer les roulements à bille. Pour cela, il a fallu faire une petite entaille dans la bielle à l'endroit où est encastré le roulement. De cette manière on évite d'ajouter de la colle et notre projet reste facilement démontable.

    Séance du 15 Mars

    Pendant cette dernière séance de projet, nous nous sommes avisés de terminer le montage de la maquette. Les pièces à imprimer au Fabricarium étant terminées, l'assemblage a pu être terminé cette séance. Nous avons alors lancé quelques tests, mais nous avons remarqué que le plateau mobile ne s'inclinait pas assez et qu'il tournait sur lui même au lieu de basculer sur un axe comme souhaité. Pour remédier à cela, nous avons placé l'orientation des bielles vers l'extérieur et réduit la longueur des bielles.

    Séances supplémentaires

    Aux séances de projet s'ajoutent des heures de travail réalisées en dehors de l'école. Ce fut par exemple le cas pour imprimer les jointures avec les imprimantes 3D du Fabricarium, mais aussi pour implémenter l'algorithme de contrôle de la balle, car on devait attendre que l'assemblage soit terminé avant de pouvoir réaliser les premiers tests.

    Annexe

    Modélisation

    La modélisation de nos pièces est téléchargeable ici : Média:Pieces_modelisees_labyrinthe.zip

    Plateau du labyrinthe

    • Jonction du support du plateau
    • Plateau du labyrinthe
    • Support du plateau du labyrinthe

    Support de moteur

    • Base du support moteur
    • Pied de la base du support
    • Jointure du support moteur


    Aperçu du support moteur

    Bielle manivelle

    • Bielle du haut
    • Bielle du bas

    Base

    • Base du projet
    • Tige centrale

    Code source

    Notre code source est téléchargeable ici : Média:Code_source_labyrinthe.zip

    Déclaration des variables et des bibliothèques

    Declaration labyrinthe.jpg


    Initialisation setup()

    Setup labyrinthe.jpg


    Boucle principale loop()

    Loop labyrinthe.jpg


    Position de la balle get_ball_info()

    Get ball info labyrinthe.jpg


    Obtention du centre du plateau determine_center()

    Determine centre labyrinthe.jpg