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

Diagramme de GANTT du projet: 

Capture d’écran 2026-05-28 à 00.58.00.png

Codes du projets:

Ktech_motor.cpp

Ktech_motor.h

robot_ROB3_complet.ino

Pôle mécanique :

       Différentes solutions ont été envisagées mais on opte, dans un premier temps, pour la solution suivante:

                                              image.png          

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

       On modélise un châssis 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 une solution plus simple qui est la suivante :                             

Le châssis 

       Un châssis rectangulaire (figure 2) a été dimensionné de sorte à ce que tous les composants puissent être placés dessus sans encombrer la maquette. La roue libre a été placée à l'arrière du robot et les deux roues motrices à l'avant, afin que le centre de rotation, lorsque le robot tourne sur lui-même, soit le plus proche possible de la pince. Cela permet d'avoir des mouvements plus précis lors des rotations. 

       Quatre trous ont été prévus afin de pouvoir fixer les supports de la carte Arduino et ceux de la batterie sur le châssis.

       Une ouverture rectangulaire verticale a également été ajoutée afin de permettre le passage du câblage de la maquette et d’éviter que les fils gênent les différents éléments mécaniques.

       À l’avant du robot, deux fentes horizontales identiques servent à fixer les supports des roues motrices. Une autre fente horizontale, plus fine cette fois, permet la fixation du capteur à ultrasons utilisé pour détecter le mur situé à droite du robot.

       Enfin, huit petits trous ont été prévus afin de fixer le support du moteur contrôlant la pince et ainsi assurer un maintien stable de celle-ci sur le robot.

                            

                                          Capture d’écran 2026-05-28 à 01.19.50.png

                                                                     Figure 2: Esquisse du châssis

       Concernant les fixations des roues motrices (figure 3), celles-ci viennent s’encastrer dans le châssis par le dessus grâce aux encoches prévues sur leur partie supérieure. Ces encoches ont été dimensionnées légèrement plus larges que les ouvertures du châssis afin d’obtenir un assemblage serré et d’assurer une bonne tenue de l’ensemble.

       Un trou rectangulaire vertical central a également été prévu afin d’accueillir le support du capteur utilisé pour détecter les obstacles situés à l’avant de la maquette, notamment les murs et le totem. En plus de maintenir le capteur, cette pièce permet aussi de garder un bon écartement entre les deux supports de roues, ce qui limite les déformations du châssis et le rend plus rigide.

       Enfin, quatre trous ont été ajoutés afin de permettre la fixation des moteurs des roues motrices. Ces fixations permettent de maintenir correctement les moteurs et d’assurer un bon alignement du système moteur.

                                            

                                                           image.png

                                                                     Figure 3: Fixation des roues motrices

La pince 

       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  

                                                                      Figure 4: Mécanisme de la pince

       

Les 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 son 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 maintenir ces capteurs en place, deux supports sont conçus (figure 4). 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, deux encoches sont crées 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. Enfin, pour le support du capteur latéral, une seule encoche a été ajoutée à sa base afin qu’il puisse s’encastrer directement dans le châssis.

             image.png           image.png

                                                                      Figure 5: Modélisation des supports de capteur

       Finalement, lors du montage sur leurs supports, on constate que les capteurs ne sont pas totalement plats et présentent un relief entre les deux capteurs optiques. Ne disposant pas de vis suffisamment longues et adaptées au diamètre des trous de fixation pour compenser cette surépaisseur, on décide de modifier légèrement les supports en ponçant la zone située entre les deux capteurs optiques afin de laisser passer ce relief (figure 6).

image.png         image.png

                                                                      Figure 6: Design final des supports de capteur

Pôle électronique :

        Pour le pôle électronique, le début du projet n'était pas très actif. Lors de la première séance on a juste vérifier que tout le matériel étaient fonctionnel et marchait correctement. En réalisant ces testes, on remarque qu'il manque un fil pour relier le servomoteur dynamixel à l'arduino MEGA. 

       Lors de la deuxième séance on décide donc de nous même assemblé ce fil en soudant deux fils qui sont liés à différents embout compatible à l'Arduino d'un coté et au dynamixel de l'autre. Pour cela on utilise, un fer à souder pour faire chauffer de l'éteint entre les câbles que l'on souhaite souder.  Une fois que l'éteint c'est faufilé entre les fils qu'on souhaite souder, on laisse refroidir pendant un instant, on aplatit la zone soudé avec une pince à tête plate et on couvre la zone par de la gaine thermo rétractable que l'on vient chauffer avec un pistolet à air chaud.

       Le produit final donnera quelque chose comme cela:

DA2EB33F-376D-4B1F-818D-EFA031EF259A.JPG

 Figure 7: Cable reliant le Shield Dynamixel et le servomoteur Dynamixel

       Plus tard dans le projet, après que la modélisation du châssis soit terminé, on assemble donc tout les câbles et réalisons toutes les connections sur les différent port. (Voir les instructions de câblage un peu plus bas.) Nous avons essayé de câbler le montage d'une manière propre.

Câblage du Robot:

Elément

Pin

Capteurs US droit (latéral)

VCC : 5V, GND : GND, TRIG : PIN 22, ECHO : PIN 23

Capteur US avant

VCC : 5V, GND : GND , TRIG : PIN 42 , ECHO : PIN 43

Servomoteur Dynamixel

Brancher d'un côté sur le dynamixel et de l'autre sur le Shield dynamixel (Voir figure ??)

Moteur Ktech

Fils rouges : 12V de la batterie, Fils noirs : Masse de la batterie, Fils bleus: Sur le bornier du Shield CAN (côté gauche), Fils jaunes : Sur le bornier du Shield CAN (côté droit).

Pince

Fil Rouge : 5V, Fil Noir : GND, Fil Blanc : PIN 6, Fil Vert : PIN ANALOG A15

Cable UART-USB pour recevoir des informations sur le système en temps réel

Fil Noir : GND , Fil Orange : PIN 7, Fil Jaune : PIN 8, BAUD RATE : 115200 (Dans le terminal Arduino*)

       On a aussi décidé de rajouté un interrupteur sur la batterie afin de sécuriser le montage et de faciliter le téléversement des programme lorsque le système est totalement monté. Pour installer cet interrupteur, on a juste branché sur le fil rouge du distributeur au différent bornier connecté sur la batterie l'interrupteur. 

*: Pour observer les information dans le terminal Arduino, il faut ouvrir un moniteur serial sur un nouveau programme Arduino, le connecté au port du câble USB-UART et réglé la vitesse de transmission à 115200 bauds.

Pôle informatique :

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

                         image.png

                                                                  Figure 8: 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. 

 

       Ainsi, on réussit à obtenir un robot fonctionnel, conforme aux attentes, comme en témoigne cette vidéo : vidéo robot fonctionnel