Skip to main content

Groupe 1 : Melia, Maxime, Raul, Lucas, Mathieu, Arianne, Hind

                           PROJET ROB 3 

Informations : 

Contexte et objectifs :

       Dans le cadre de notre projet de Robotique de troisième année, nous avons du concevoir un robot capable de saisir un objet appelé totem et le déplacer de manière autonome au sein d'une arène de jeu.

       L'enjeu majeur de ce projet est l'intégration de plusieurs domaines de l'ingénierie:

                      Conception Mécanique :  L'architecture du robot repose sur un châssis simple conçu à l'aide de croquis à la main ainsi que de SolidWorks. 

                      Électronique: afin de gérer la distribution d'énergie par une batterie 12V, la communication par bus CAN entre les composants, ainsi que l'utilisation des capteurs à ultrason à l'aide de ARDUINO MEGA.                

                      Informatique: L'intelligence du robot est pilotée par un programme ARDUINO. Ce code, en langage C++,permet de gérer la navigation autonome, la détection du totem et l'exécution des trajectoires. Il assure également le traitement des données capteurs et la commande précise des moteurs KTECH et Dynamixel.

Matériel à disposition :

  • une pince 3551
  • deux moteurs KTECH MS4015-V3
  • un moteur Dynamixel
  • deux petites roues et une roue pivotante ( de caddie) 
  • une carte Arduino MEGA, un shield SEED et un shield Dynamixel
  • deux capteurs à distance ultrasons HC-SR04
  • une batterie RS PRO 12V 1,2Ah

Répartition des tâches :

       Après s'être familiarisés avec le sujet, on se répartit les taches de la manière suivante :

  • Chef de projet: Maxime CARLIER
  • Responsable du pôle électronique: Raul ABI KHALIL
  • Responsables du pôle informatique: Hind BENRADJA et Melia TAFAT
  • Responsable du pôle mécanique: Lucas BRUGNONE
  • Responsables du Wiki: Hind BENRADJA et Melia TAFAT

Pôle mécanique :

       Nous avons réfléchi à différentes solutions possibles et avons opté, dans un premier temps, pour la solution suivante:

                                              image.png          

                                                                     Figure 1: Modélisation de la première solution

       On modélise un chassis avec des emplacements définis pour chaque composant, et on décide d'adopter pour une structure en escalier afin de fixer la roue pilotante à l'extrémité la plus haute, étant donné le fait qu'elle soit plus volumineuse que les autres roue, et de placer la pince sur une cale située à l'autre extrémité. Le mouvement de celle-ci sera piloté par un système de pont levis qui consiste à lever la cale à l'aide d'une corde qui s'enroulera. 

       Cependant, après réflexion, on se rend compte que cette première solution était inutilement complexe et présentait quelques inconvénients, comme le fait que la pince soit trop haute. On décide alors d'opter pour un chassis plus simple (figure 2), supprimant l'escalier et on résout le soucis de différence de taille des roues en plaçant simplement les petites roues à un niveau plus bas que la roue de pilotante. Pour la pince, on garde l'idée du mouvement du pont levis, que l'on modernise, en mettant en place une liaison pivot entre le chassis et une plaque en bois où l'on fixera la pince. Le principe reste donc le même que précédemment mais l'exécution est plus simple désormais.                 

                             

                                                                      Figure 2: Modélisation du chassis final

Fixation de la pince sur le robot : 

       Pour pouvoir attraper le totem, la pince qui nous a été fournie va être utilisée. Afin de lui permettre de se lever verticalement et d’atteindre la partie la plus fine du totem, le couple délivré par le moteur sera exploité. À ce moteur est fixée une pièce réalisée en impression 3D (1), qui sera utilisée comme bras de levage. Cette pièce est ensuite reliée à une petite planche, appelée “planche à pivot” (2), capable d’effectuer une rotation verticale afin d’orienter correctement la pince vers la zone fine du totem. Enfin, une encoche dans la planche à pivot est prévue, afin d’y encastrer un support qui permettra par la suite d'y visser solidement la pince grâce à deux trous de fixation.

image.png  

       

Maintien des capteurs :

       Les deux capteurs sont disposés de la manière suivante : le premier capteur est placé sur le côté du robot afin de mesurer la distance par rapport au mur et ainsi permettre au robot de se repérer dans l’environnement, tandis que le second capteur est situé sous le châssis afin de détecter le totem, mais également les obstacles ou murs présents devant le robot. Afin de les maintenir en place, deux supports sont conçus. Chacun d'entre eux possède un emplacement adapté aux deux capteurs optiques ainsi que des trous de vissage permettant de les fixer solidement. Concernant le support du capteur situé sous le châssis, nous avons créé deux encoches afin qu’il puisse s’encastrer entre les deux planches maintenant les moteurs des roues. Cela permet d’assurer une fixation plus stable du support sur le robot. Pour le support du capteur latéral, nous avons simplement ajouté une encoche à sa base afin qu’il puisse s’encastrer directement dans le châssis.

       Après avoir validé ce modèle, il est possible pour chaque membre de traiter les différents aspects du projet. Dans un premier temps, le responsable électronique vérifie le bon fonctionnement des composants en les câblant comme l'indique la documentation et en lançant le code Arduino donné (example.ino).

Pôle électronique :

Pôle informatique :

       On réalise tout d'abord un organigramme afin de structurer la logique de l'algorithme avant de passer à la programmation.

                           66D65800-45B8-48D7-99CA-644CABCF95C4.jpeg

                                                                  Figure 3: Organigramme du fonctionnement du robot

       Pour réaliser la boucle correspondante, on code dans un premier temps les fonctions suivantes : 

Initialisation

verifierEtatInitial() Séquence de vérification au démarrage : lève le bras, ouvre la pince, puis lit la position analogique de la pince (pin A15) pour confirmer que les actionneurs répondent correctement.

setup() Fonction Arduino standard exécutée une seule fois au démarrage. initialise le port série, les capteurs ultrason, le servomoteur de la pince, le bus CAN, le servomoteur Dynamixel en mode position, et les moteurs KTech. Effectue un reset des encodeurs en fin d'initialisation.

 

Conversion

deg_to_m(float deg): Convertit un angle en degrés (rotation d'un moteur) en distance linéaire en mètres, en utilisant le rayon de la roue.

 

Cinématique

MotorSpeed(float v_translation, float v_rotation): Calcule et envoie les commandes de vitesse aux deux moteurs KTech via le bus CAN. Prend en entré une vitesse de translation (m/s) et une vitesse de rotation (rad/s), et applique le modèle cinématique d'un robot pour convertir ces consignes en RPM pour chaque roue.

stopMotors(): Envoie une commande de vitesse nulle aux deux moteurs pour arrêter immédiatement le robot.

 

Capteurs Ultrasons

fonction lire_distance (int pinTrig, int pinEcho) : qui reçoit en entrée les numéros des broches du capteur. Elle sert à mesurer la distance séparant le robot d’un obstacle en calculant le temps de vol d'une onde sonore. Le code commande d'abord au capteur d'émettre un son (via la broche Trigger), puis met le programme brièvement en pause pour mesurer le temps de propagation de l'écho reçu (via la broche Echo). Enfin, elle réalise un calcul mathématique simple pour convertir cette durée en centimètres (en utilisant la vitesse du son) et envoie le résultat final sous forme de nombre décimal au programme principal, permettant au robot de décider s'il doit s'arrêter ou continuer sa route.

distanceValide(float d) : Vérifie qu'une mesure de distance est dans une plage physiquement cohérente (entre 2 et 900cm). Retourne 'True' si la valeur est dans l'intervalle, 'False' sinon.

 

Actionneurs

controlePince(bool ouvrir) : qui, comme son nom l'indique, sert à ouvrir ou fermer la pince du robot afin d'attraper et relâcher le totem. La fonction reçoit en entrée un choix logique (true pour ouvrir, false pour fermer): si la condition est vraie, elle envoie un signal électrique spécifique (PWM de 500) sur la broche de la pince pour l'ouvrir au maximum ; si elle est fausse, elle envoie un signal différent (PWM de 950) pour la fermer. Enfin, on intègre une courte pause (delay), qui laisse le temps mécanique au servomoteur de finaliser son mouvement afin d'éviter de perturber les autres commandes électriques du robot.

baisserBras(): Envoie au servomoteur Dynamixel la consigne de postion basse (DXL_POS_BAS) pour abaisser le bras du robot. On attend 1500ms pour la fin du mouvement.

leverBras(): Envoie au servomoteur Dynamixel la consigne de position haute (DXL_POS_HAUT) pour lever le bras. Attend 1500ms pour la fin du mouvement.

 

Odométrie

reset_encodeurs(): Lit l'état actuel des deux moteurs et sauvegarde leurs positions angulaires comme référence zéro. Toutes les mesures de déplacement ultérieures seront calculées relativement à ce point de départ.

lire_d0_d1(float &d0, float &d1) : Lit les positions courantes des deux moteurs et calcule les distances parcourues en mètres par chaque roue depuis le dernier reset, en tenant compte du sens de rotation.

mesurer_distance_parcourue(): Retourne la distance linéaire moyenne parcourue par le robot (moyenne des deux roues) depuis le dernier reset des encodeurs, en mètres. Affiche également les valeurs individuelles sur le port série.

 

Suivi de Mur

avancerSuiviMur(): Fait avancer le robot en corrigeant sa trajectoire pour maintenir une distance par rapport au mur droit (DIST_MUR_CIBLE), à l'aide d'un correcteur proportionnel (gain KP_MUR). La vitesse d'avance est réduite si l'erreur latérale est trop grande. Doit être appelée en boucle.

 

Déplacements par odométrie

avancerDistancePrecise(float distCible_m) Fait avancer le robot en ligne droite sur une distance précise en mètres, mesurée par odométrie. S'arrête dès que la distance cible est atteinte.

reculerDistancePrecise(float distCible_m) Fait reculer le robot sur une distance précise en mètres, mesurée par odométrie. S'arrêete dès que la distance cible est atteinte.

avancerDistanceSuiviMur(float distCible_m) Fait avancer le robot sur une distance précise en mètre tout en maintenant me suivi du mur droit.

 

Rotations par odométrie

tournerDroite90() Effectueune rotation de 90° vers la droite sur place, en contrôlant l'angle par odométrie. Pour compenser le glissement des roues on a rajouté un coefficient empirique de 0.83. 

tournerGauche90() Effectueune rotation de 90° vers la gauche sur place, en contrôlant l'angle par odométrie. Pour compenser le glissement des roues on a rajouté un coefficient empirique de 0.83.