Aller au contenu

Main robotique

Introduction

Le but de notre projet était d’adapter un projet connu : Amazing Hand de Pollen robotics en y ajoutant un doigt afin qu’il puisse réaliser l’alphabet en langue des signes, ou mimer tout autre signe comme ceux de plongée par exemple.

La liste des matériaux requis n’est pas la même que celle de Pollen Robotics avec simplement un doigt en plus, puisque nous avons du nous adapter à des servosmoteurs et des balljoints différents que ceux initialement utilisés.

Liste de matériel

  • ESP32
  • 10 servomoteurs MF90
  • 10 balljoints M3
  • Tige M3 filetée
  • Tige M3 non filetée
  • PLA
  • Résine SLA (optionnelle)

Machines utilisées

  • Imprimante 3D FDM
  • Imprimante 3D Résine
  • Découpeuse laser
  • Poste à souder

Partie mécanique

Pour la partie mécanique nous avons choisi de reprendre le projet Onshape de Pollen Robotics et de l’adapter. Cela s’est déroulé en plusieurs parties : adaptation des doigts, de l’armature de la main puis modifications suites à des tests.

Structure intiale de la main

Au niveau des doigts, nous avions décidé dans un premier temps de garder la structure de Pollen Robotics, en adaptant seulement les deux petites pièces tenant les servomoteurs au fait que nous en utilisions des différents. Le fonctionnement de ces doigts était constitué d’une structure à trois pièces interconnectées dont l’une était reliée aux servomoteurs par des balljoints. Ce méchanisme permettait de non seulement plier les doigts, mais aussi de leur faire effectuer un petit mouvement de droite à gauche. Mouvement que nous avons tenté d’exploiter mais que nous n’avons pas réussi à maitriser.

Structure d’un doigt après changement des servomoteurs et remodélisation

Après la première remodélisation, nous arrivons à une paume de la main adaptée à quatre doigts.

Première modélisation de la paume à quatre doigts

Mais après avoir imprimé cette pièce, nous nous sommes rendu compte d’un gros problème. Les doigts étants reliés par des balljoints à des servomoteurs, et l’approvisionnement nous forçant d’utiliser des balljoints M3 ( contrairement aux M2 utilisés par Pollen Robotics ), ces mêmes balljoints s’entrechoquaient lors de la fermeture totale de la main. Il a donc fallut modeliser une nouvelle fois lfonctionnant à l’aide de servomoteurs reliés par des balljointsa paume de la main ainsi que le poignet, pour atteindre un résultat final sans contrainte méchanique.

Structure finale de la main

Nous avons donc finalement une paume de la main quasiment deux fois plus grande que celle proposée initialement par Pollen Robotics. La dernière contrainte méchanique restait au niveau des doigts ou, lors de la fermeture complète, ne pouvaient pas dépasser un certain angle à cause, encore une fois, des balljoints, mais cette fois-ci du côté des doigts. Malheureusement, par manque de temps, nous n’avons pas pu les modéliser de nouveau, que ce soit pour gérer cette contrainte méchanique, ou encore pour les adapter au fait que la main finale était bien plus grande que l’initiale.

Boitier

Pour le boitier nous réalisons une boite en 3D que nous allons découper à la laser en MDF 3mm. Nous plaçons un trou sur le dessus afin d’y faire passer les cables des servos. Cette boite va permettre de stocker l’électronique et de faire contrepoids afin que la main soit posé droite dessus.

Boite servant de support à la main

Nous fixons les dimensions après quelques testes sur des modèles plus petits, elles sont les suivantes : 200x150x40 mm. Le cercle sur la face supérieur à un rayon de 25mm et il est centré en longueur et en largeur.

Nous avons peur qu’avec l’inertie des mouvements le boiter soit trop petit, ainsi nous ajoutons des contrepoids à l’intérieur. Dans notre cas ce sera des manivelles de vélo que nous avions à disposition.

Partie électronique

Pour la partie électronique nous réalisons le montage suivant en ajoutant une capacité de 220 µF en derivation sur le rail d’alimentation:

Afin de pouvoir fournir assez d’alimentation à la carte nous ajoutons une alimentation externe 5V, 3A que nous connectons au rail d’alimentation et au Vin de la carte. Une alimentation plus faible peut empêcher la carte de fonctionner correctement, en effet si l’ESP32 ne reçoit pas assez de courant ou que la tension chute alors les sorties de la cartes entre dans un fonctionnement aléatoire ce qui peut endommager le montage. Pour notre part nous ajoutons un connecteur usb-c afin de rendre le projet facilement utilisable avec d’autre alimentation 5V, 3A. Lors de nos premiers tests nous utilisions une alimentation 5V, 1~2A et lorsque les servo-moteurs changeaient brusquement de position la carte se mettait en défaut et redémarrait.

Partie Numérique.

Pour programmer nous utilisons l’ide d’arduino et nous aurons besoin des librairies suivantes : wifi.h, WebServer.h, ESP32Servo.h.

#include <WiFi.h>
#include <WebServer.h>
#include <ESP32Servo.h>

// ─── Pins ──────────────────────────────────────────────────────────────────
#define SERVO0 23
#define SERVO1 22
#define SERVO2 4
#define SERVO3 15
#define SERVO4 21
#define SERVO5 19
#define SERVO6 18
#define SERVO7 5
#define SERVO8 17
#define SERVO9 16
#define LED 2

// ─── Servos ────────────────────────────────────────────────────────────────
Servo mf[10];
int pins[10] = {SERVO0, SERVO1, SERVO2, SERVO3, SERVO4,
               SERVO5, SERVO6, SERVO7, SERVO8, SERVO9};

// ─── Calibration ───────────────────────────────────────────────────────────
int tab_angle_max[10] = {180, 173, 175, 179, 171, 170, 175, 172, 179, 171};
int tab_angle_min[10] = { 70,  63,  65,  69,  61,  60,  65,  62,  69,  61};

Nous réalisons ensuite une fonction afin d’ouvrir et de fermer toute la main. Cette fonction permet de facilement fixer les doigts.

// ─── État courant ──────────────────────────────────────────────────────────
int positions[10];

// ─── Helpers ───────────────────────────────────────────────────────────────
int pos_s1(int angle) { return 180 - angle; }
int pos_s2(int angle) { return angle; }

void writeServo(int i, int angle) {
 angle = constrain(angle, tab_angle_min[i], tab_angle_max[i]);
 positions[i] = angle;
 if (i % 2 == 0) mf[i].write(pos_s2(angle));
 else            mf[i].write(pos_s1(angle));
}

// Commande les deux servos d'un doigt (paire = index du premier servo)
void doigt(int paire, int angle) {
 writeServo(paire,     angle);
 writeServo(paire + 1, angle);
}

void envoyerPositions() {
 String rep = "POS:";
 for (int i = 0; i < 10; i++) {
   rep += String(positions[i]);
   if (i < 9) rep += ",";
 }
 Serial.println(rep);
}

// ─── Positions prédéfinies ─────────────────────────────────────────────────
void main_ouverte() {
 for (int i = 0; i < 10; i++) writeServo(i, tab_angle_max[i]);
}

void main_fermee() {
 for (int i = 0; i < 10; i++) writeServo(i, tab_angle_min[i]);
}

Il suffit ensuite de mettre main_ouverte(); dans la boucle loop de l’arduino pour que la main reste ouverte correctement. Cela permet de fixer les doigts en étant sur de la position des servo moteurs.