Skip to main content

Projet ROB3 : Joshua , Grigor , Dilhan

Présentation du projet


Informations

Contexte

Dans le cadre de l’UE projet robotique

Objectifs

  1. Concevoir un système robotique :
    • Sa partie mécanique
    • Son actionnement
    • Sa commande
    • Son interface de pilotage
    2. Savoir s’organiser en mode projet :
    • Répartir et synchroniser les tâches
    • Suivre l’avancement avec des objectifs intermédiaires
    • Fournir la documentation technique
    • Respecter un calendrier préétabli
    3. Maîtriser le fonctionnement du FabLab

Cahier des charges :

  • Tracer différentes figures prédéfinies dans un carré de 5cm x 5cm, en 10 secondes. 

  • Une ligne droite de 5 cm 

  • Une ligne pointillée de 5 cm

  • Un cercle de 2,5cm de rayon 

  • Un cercle pointillé de 2,5cm de rayon

  • Reproduire un dessin imposé (mais inconnu à l’avance) à l’aide d’un joystick dans un carré de 5cm x 5cm

  • Contrôle au moyen d’un joystick 

Matériel :

Voici la liste du matériel donné (imposé) par nos responsables de projet :

 
  • Un crayon
  • Interface de commande :
    • Une carte arduino UNO avec câble USB-B;
    • Un joystick:
    • Une platine de protoypage;
    • Alimentation régulée 5V ;
    • Câbles, LEDs, boutons poussoirs, résistances.
  • Motorisation :
    • Deux servomoteurs HS422 180°;
    • Un servomoteur Emax ES08A 180°.
  • Mécanique :
    • Matière PLA pour impression 3D;
    • Feuilles medium : 3mm et 6mm d'épaisseur;
    • Vis et écrous : M2, M2.5, M3, M4.
    • Roulements et axes de diamètre 4mm.
  • Ressources CAO.zip contient les fichiers Solidworks pour les deux modèles de servomoteurs téléchargeable via le lien suivant : https://wiki.fablab.sorbonne-universite.fr/BookStack/link/1279#bkmrk-ressources-cao.zip-c
  • datashetts.zip contient les documentations de quelques-uns des composants fourni téléchargeable via le lien suivant : https://wiki.fablab.sorbonne-universite.fr/BookStack/link/1279#bkmrk-ressources-cao.zip-c

Présentation des différentes solutions envisagées :

Première solution : 

Notre première solution consistait en un robot constitué d'un servomoteur à la base en rotation autour de Z et de 2 servomoteurs sur le bras en rotation autour de Y

2.jpg

Cette solution est la première auquel nous avons pensé. Elle s'inspire très fortement du FANUC que nous avons pu manipuler lors de notre TP en Robotique expérimentale au 1er semestre. 

Cependant, nous l'avons très vite abandonné car le robot n'était pas capable d'effectuer les mouvements nécessaires à la création d'un dessin (en plus d'être éventuellement trop lourd au bout du bras).

Deuxième Solution : 

Comme deuxième solution, nous avons pensé à un robot à 2 degré de liberté constitué de 2 servomoteurs en rotation selon Z dont un à la base et l'autre au centre du bras, et d'un servomoteur en rotation selon Y pour contrôler la pose du feutre sur la feuille de dessin.


Schéma solution.jpg

Cette solution possède de nombreux avantages, tels que la facilité de conception, de production et de calcul de position (le problème à résoudre n'est que plan dans ce cas).

Cependant, la précision de ce bras articulé est inférieure comparé notamment à la solution suivante.

Troisième solution :

La troisième solution consiste à créer un pignon crémaillère afin d'effectuer des déplacements directement selon les axes x, y et z.

SmartSelect_20240221_103953_Samsung Notes.jpg

Cette solution possède plusieurs avantages tels qu'une précision accru par rapport à la solution précédente, ainsi qu'un paramétrage des mouvements simplifié.

Cette solution possède cependant d'autres inconvénients par rapport à la deuxième solution, tels que des frottements élevés risquant d'abimer les composants ou encore un calcul du modèle géométrique inverse plus compliqué (les rotations sont convertis en translation).

 
Solution retenue :

Pour mener à bien ce projet, nous avons opté pour la seconde solution. Nous prévoyons ainsi l'utilisation de trois servomoteurs, dont deux seront dédiés à la manipulation du stylo, tandis que le troisième sera chargé de soulever le stylo. Notre approche implique l'assemblage d'une base, sur laquelle nous fixerons un servomoteur équipé d'un palonnier. Ce dispositif dirigera la première partie de notre robot. Nous fixerons ensuite le palonnier sur le premier bras pour assurer son orientation. Ce bras, conçu de manière extrudée, permettra la fixation d'un second servomoteur, assurant la direction du deuxième bras du robot. Nous avons également besoin d'une extrémité qui servira à porter notre stylo.

GANTT:

https://docs.google.com/spreadsheets/d/1rBMSOXjBwbDXSA9WxZV4CNlc4wGikqxUgBZ74uLwpI0/edit?usp=sharing

Calcul mécanique :

Modèle géométrique inverse :

D'après le cours, le modèle géométrique inverse vaut :

image.png

Atan2 est une fonction mathématique très utilisé et comprise par le code Arduino.

Calcul des vitesses angulaires en fonction des vitesses Vx et Vy :

WhatsApp Image 2024-02-29 à 20.30.29_b30002a0.jpg

Schéma électronique :

Pour garantir un positionnement précis des servomoteurs, l'intégration d'une carte Arduino est nécessaire. Voici la représentation du circuit électrique :

Circuit 2.png

Ce schéma intègre trois servomoteurs et un bouton-poussoir, destiné à basculer entre les modes automatique et manuel. Pour le mode manuel, l'utilisation d'un joystick est requise. En raison de contraintes de représentation, le joystick a été simulé par deux potentiomètres et un bouton-poussoir :

Circuit final.png

Nous avons décidé de rajouter aussi 2 LEDs afin de montrer le mode de fonctionnement dans lequel le robot est (manuel ou automatique) :

image.png

Modélisation 3D des pièces :

Afin de réaliser la solution choisi, nous aurons besoin de plusieurs composants. 

Nous avions pensé à 4 composants, une base ainsi que 3 bras articulé. Les deux bras intermédiaires vont être fait par découpage laser tandis que la base et le support de l'effecteur seront en impression 3D. Nous pensions faire un contrepoids afin de maintenir l'équilibre du robot, ou encore créer des pieds à la base afin d'annuler le moment créé par le poids des moteurs et du stylo, cependant, la solution consistant à remplir la base avec des matériaux lourds à été privilégié car plus facile à mettre en place.

Nous avons préconisé la création d'une base circulaire car plus stable que des bases carrés ou triangulaires.

Le premier moteur est placé au niveau de la base et supportera le poids du reste de la structure (mise à part la base). Le deuxième moteur sera placé au bout du premier et du deuxième bras.

Nous avons aussi dû modéliser un nouveau palonnier afin de convenir au besoin de notre robot car celui présent n'est pas adapté.

En ce qui concerne le support du stylo, au lieu de placer le moteur au bout du deuxième bras intermédiaire, nous avons décidé de le placer au centre et ce dans une logique de réduction du moment. Pour ce faire, nous avons dû allonger la longueur du dernier bras. De plus, le stylo sera retenu tout simplement par une vis inséré dans un écrou au bout du dernier bras.

image.png

Code Arduino :

Algorithme grossier : 

#include <Servo.h>
Initialisation des variables globales :
Servo myservo1;
Servo myservo2;
Servo myservoZ;

int potx = A0;  //potentiomètre en x
int poty = A1; //potentiomètre en y
int servo1 = 9; //Servo moteur de la base
int servo2 = 10; //Servo moteur de du bras 
int servoZ = 11;//servo moteur du stylo
int mode = 8; //bouton permettant de changer de mode de fonctionnement
Initialisation de toutes les entrées et sorties :

void setup() {
  pinMode(potx, INPUT);
  pinMode(poty, INPUT);
  pinMode(mode, INPUT);
  Serial.begin(9600);
  myservo1.attach(servo1);
  myservo2.attach(servo2);
  myservoZ.attach(servoz);
}

void loop() {
  int valy = 0;
  int valx = 0;
  int mode = 0;
  int theta1 = 0;
  int theta2 = 0;
  myservoZ.write(10);
CAS DU SWITCH A 1(mode automatique):
  if (mode == 1) {
    ON FAIT LE DESSIN DU SUJET DEFINI DANS LA FONCTION DESSIN
    EN CALCULANT X ET Y GRACE AU MODELE GEOMETRIQUE INVERSE.
    dessin();
    mode = 0;
  }
CAS DU SWITCH A 0(mode manuel):
else {

   ON CONTROLE MANUELEMENT LE BRAS AVEC LE MODELE GEOMETRIQUE INVERSE DERIVE
   ON CREE 3 PALIERS DE VITESSE EN FONCTION DU POTENTIOMETRE
}
ENSUITE ON CHANGE LA VALEUR DU SWITCH SI LE BOUTON EST PRESSE
  }
  if (mode == 1 && digitalRead(mode)) {
    mode == 0;
  }
  if (mode == 0 && digitalRead(mode)) {
    mode == 1;
  }
  delay(10);
}
LA FONCTION DESSIN N'EST PAS FINIE.
void dessin() {

  for (int x = 0; x < 5; x += 0, 1) {
    theta2 = arcos((x ^ 2 - a1 ^ 2 - a2 ^ 2) / 2 * a1 * a2);
    theta1 = arctan2(x, 0) - arctan2(a2 * sin(theta2), a1 + a2cos(theta2));
    myservo1.write(theta1);
    myservo2.write(theta2);
    if(digitalRead(mode)){
      return;
    }
  }
  for (int y = 0; y < 5; y += 0, 1) {
    theta2 = arcos((5 ^ 2 + y ^ 2 - a1 ^ 2 - a2 ^ 2) / 2 * a1 * a2);
    theta1 = arctan2(5, y) - arctan2(a2 * sin(theta2), a1 + a2cos(theta2));
    myservo1.write(theta1);
    myservo2.write(theta2);
    if(digitalRead(mode)){
      return;
    }
  }
  for (int x = 5; x > 0; x = x - 0, 1) {
    theta2 = arcos((x ^ 2 + 5 ^ 2 - a1 ^ 2 - a2 ^ 2) / 2 * a1 * a2);
    theta1 = arctan2(x, 5) - arctan2(a2 * sin(theta2), a1 + a2cos(theta2));
    myservo1.write(theta1);
    myservo2.write(theta2);
    if(digitalRead(mode)){
      return;
    }
  }
  for (int y = 5; x > 0; y = y - 0, 1) {
    theta2 = arcos((y ^ 2 - a1 ^ 2 - a2 ^ 2) / 2 * a1 * a2);
    theta1 = arctan2(0, y) - arctan2(a2 * sin(theta2), a1 + a2cos(theta2));
    myservo1.write(theta1);
    myservo2.write(theta2);
    if(digitalRead(mode)){
      return;
    }
  }
}