Skip to main content

Projet Rob3 : Fatah,Oualid,Dounia (FOD : Fonctional Omnidirectional Drawing Robot )

I ) PréPréaumbule : 

1) Membres de l'ééquipe :

IdentitéIdentité Contacte Formation
Mohamed El Oualid BOUDEMAGH mohamed_el_oualid.boudemagh@etu.sorbonne-universite.fr Polytech-Sorbonne ( ROB3 )
Fatah MSAID fatah.msaid@etu.sorbonne-universite.fr Polytech-Sorbonne ( ROB3 )
Dounia BAKALEM dounia.bakalem@etu.sorbonne-universite.fr Polytech-Sorbonne ( ROB3 )

qPériode du projet : 14/02/2024 au 23/05/202

2) Indroduction, cadre et objectifs de la alisation :

Etant actuellement des éétudiants en vue de devenir des ingéingénieurs roboticiens, nous sommes amenéamenés àà concevoir un robot en passant par toutes les éétapes de modémodélisation et alisation. Dans le cadre de ce projet, il s'agit d'un robot qui dessine sur une face 2D de dimension 25*25 mm.

De ce fait, vous trouverez dans la suite de ce rapport notre cheminement pour mener àà bien ce projet, cela comportera la conception de la partie canique, le systèsystème de commande, la motorisation, l'interface de pilotage et les diffédifférents codes informatiques pilotants.

Ainsi, nous mettrons en pratique les connaissance acquises en programmation (langage C), en modémodélisation (SolidWorks), en calculs cinécinématiques (ModèModèles géomégéométriques direct/indirecte). Par ailleurs, nous aspirons àà consolider notre inventaire de Roboticien en apprenant le codage en Arduino, les impressions 3D et le coupage laser.

Enfin, nous nous engageons àà prendre soin du matématériel mis àà notre disposition au sein du FablabSU, nous tenons éégalement àà remercier nos enseignants et le personnel qui nous encadront tout au long de notre projet.

3 ) Diagramme de Gantt (au 21/02/2024) et distribustion des les :

image.png

II ) Cahier des charges :

( https://wiki.fablab.sorbonne-universite.fr/BookStack/books/projets-due-2023-2024/page/le-sujet-du-projet )

Le but génégénéral est de faire un robot capable de dessiner avec un crayon sur un support plan horizontal.

2.1 Fonctions àà aliser

Le robot doit êêtre fixéfixé ou poséposé sur une plaque horizontale carrécarrée de 250mm par 250mm. Il doit êêtre capable de aliser deux exercices :

1) Tracer, avec l’l’aide d’d’un crayon fixéfixé sur l’l’organe terminal du robot, dans le plan de la plaque support diffédifférentes figures imposéimposées de difficultédifficulté croissante :

a. Une ligne de 5cm de long,

b. Une ligne pointillépointillée de 5cm de long,

c. Un cercle de 2.5cm de rayon,

d. Un cercle pointillépointillé de 2.5cm de rayon.

Le tracétracé de chacune des figures doit êêtre réaliséréalisé en 10 secondes +/- 0.2 secondes.

2) Tracer, avec l’l’aide d’d’un crayon fixéfixé sur l’l’organe terminal du robot, dans le plan de la plaque support, un dessin imposéimposé dans un carrécarré de 5cm par 5cm. Le placement de l’l’organe terminal du robot devra êêtre pilotépiloté par un joystick. Il est possible que la figure soit discontinue, et donc il faut préprévoir de pouvoir relever le crayon du support horizontal sur lequel on éécrit.

Une fonction supplésupplémentaire, optionnelle , peut êêtre réaliséréalisée :

ÊÊtre capable de modifier la vitesse de placement du robot via l’l’interface.

2.2 Fonctions contraintes

Les contraintes imposéimposées sont :

  • Respect des gles d’d’utilisation du FABLAB de Sorbonne UniversitéUniversité au sein duquel vous travaillerez, en particulier la charte des FabLab du MIT. Cela implique que vous travaillerez sur le WIKI du FABLAB pour documenter votre projet. Il y a une bonne documentation ici pour savoir comment utiliser le WIKI.
  • Utilisation de composants (moteurs, contrôcontrôleurs, boutons, élééléments de guidage, alimentation stabiliséstabilisée, boutons, etc.) parmi un ensemble imposéimposé. Une liste de composants utilisables est disponible au paragraphe 4. 
  • Fabrication des pièpièces grâgrâce àà :
    • Machine àà coupe LASER.
    • Imprimantes RAISE 3D PRO2.

Ces machines du FABLAB de sont pas toutes accessibles tout le temps ni en me temps. C’C’est une contrainte qu’qu’il vous faut intéintégrer dans la gestion de votre projet (par exemple, priviléprivilégier la coupe LASER qui est trètrès rapide, lorsque c’c’est possible).

Un objectif est de minimiser la quantitéquantité de matièmatière utiliséutilisée pour aliser le projet.

  • Programmation en C utilisant la chaîchaîne de veloppement Arduino IDE

CE NE SONT PAS LES FONCTIONS CONTRAINTE DE L'OBJET, MAIS VOS CONTRAINTES DE REALISATION DU PROJET

4.    Liste des composants et matématériels disponibles

 
  • Un crayon
  • Interface de commande :
    • Une carte arduino UNO avec ble USB-B;
    • Un joystick:
    • Une platine de protoypage;
    • Alimentation régulérégulée 5V ;
    • bles, LEDs, boutons poussoirs, sistances.
  • Motorisation :
    • Deux servomoteurs HS422 180°180°;
    • Un servomoteur Emax ES08A 180°180°.
  • canique :
    • Matiè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èdiamètre 4mm.

III ) Solutions ProposéProposées : 

1 ) Solution 1 : La voiture qui dessine

  • L'une des idéidées exploréexplorées éétait de concevoir un robot sous forme de voiture capable d'éécrire avec un stylo. Cependant, aprèaprès avoir examinéexaminé les servomoteurs disponibles et les contraintes du projet, nous avons constatéconstaté que ces servomoteurs ne conviendraient pas pour tourner les roues de manièmanière efficace en raison de leur limitation de rotation maximale àà 180 degrédegrés. De plus, les restrictions imposéimposées, comme l'interdiction d'utiliser des outils externes tels qu'un hacheur pour la motorisation, et l'incapacitéincapacité d'incorporer un systèsystème Bluetooth pour contrôcontrôler la voiture avec un joystick, ont étéété des obstacles significatifs.

    En raison de ces contraintes techniques et de conception, nous avons étéété contraints d'abandonner l'idéidée de la voiture robotique. Nous nous sommes plutôplutôt concentréconcentrés sur des alternatives qui seraient alisables dans le cadre des ressources et des contraintes du projet, tout en restant conformes au cahier des charges initial.

2 ) Solution 2 : Robot àà deux rails :

schema_sol_2.jpg

 

 

photo_sol_2.jpg

         SchéSchéma non-contractuel du robot àà deux rails                                       Source de la photo : (19) Technical Tushar - YouTube

  • Fonctionnement : Le servomoteur 1 est collécollé sur le pignon 1 qui est lui me fixéfixé sur la plateforme fixe. Ce premir systèsystème entraine la translation de la crémalliècrémallière 1 selon x. Au bout de cette dernièdernière, la plateforme mobile est fixéfixé, cette plateforme se deplace donc selon x suivant la crémalliècrémallière 1. Par ailleurs, le me canisme (servomoteur 2, pignon 2, crémalliècrémallière 2) fixéfixé sur la plateforme mobile entraine la traslation du stylo selon y. Enfin, le servomoteur 3 actionne la manivel permettant au stylo d'êêtre ou non au contacte avec la feuille.
  • Noter que les servomoteurs ne pouvant effectuer une rotation de 90°90° dans un sens et 90°90° dans l'autre, les pignons sont dimensionnédimensionnés en conséconséquence (ici r = 2.5cm) permettant au stylo d'agir sur une surface de 7cm * 7cm.
  • Avantages :                                                                                                                                                                               - SimplicitéSimplicité de conception, de alisation et de calcul.                                                                                                     - RigiditéRigidité et soliditésolidité du systèsystème.                                                                                                                                           - PréPrécision permettant au stylo de dessiner toute forme.                                                                                                 - Absence de singularitésingularité dans le cadre des 7 * 7 cm.                                                                                                         - Consommation assez raisonnable de ressources
  • Limites :                                                                                                                                                                                 
  • Une lubrification peut êêtre envisageable.                                                                                                                     
  • Frottements.                                                                                                                                                                     
  • La plateforme tenant le stylo peut se pencher vers le sol àà cause de son poids.

3 ) Solution 3: Robot àà 3 rails :

image.png

Nous avons pris cette photo afin d'illustrer nos explications dans "Fonctionnement".

Cela dit, elle ne relèrelète pas notre solution, puisque ici on voit des translations réaiséréaisées àà l'aide de courroie alors que notre idéidée repose sur un canisme Servomoteur, pignon et crémalliècrémallière comme crit ci-contre.

Source de la photo : Laser Engraver TT-5.5S Laser Wood Engraver - Two Trees (twotrees3d.com)

  • Fonctionnement :Le fonctionnement demeure fondamentalement inchangéinchangé par rapport àà la solution précéprécédente. Simplement, ici le canisme servomoteur-pignon-crécrémalliere (sur le rail 1) entraine la translation du stylo selon y, et en face (sur le rail 2) on retrouve un roulement qui alise le guidage permettant  au rail 3 de toujours êêtre perpendiculaire aux rails 1 et 2. De plus, un autre mecanisme servomoteur-pignon-crécrémalliere permet au style de se deplacer selon x ( sur le rail 3). Enfin, le dernier servomoteur actionne la manivel permettant au stylo d'êêtre ou non au contacte avec la feuille.
  • Avantages :                                                                                                                                                                             - Absence de singularitésingularité dans le cadre des 7 * 7 cm.                                                                                                         - Calculs théthéoriques assez simples.
  • Limites :                                                                                                                                                                                 
  • Le guidage n'est pas optimal ce qui peut engendrer la diagonalisation du rail 3.   
  • Trop de ressources utiliséutilisées.                                                                                                                                         
  • Conception, alisation et montage assez fastidieux .                                                                                                 
  • NécéssitéNécéssité absolue de lubrification (notamment le roulement).

4 ) Solution 4 : (Solution retenue ) : Robot a articulations :

Pour la me idéidée nous avons optéopté pour un robot qui utilise le principe du FANUC pour fonctionner ,

Le principe : le but de cette solution est d'atteindre le maximum de points dans un carrécarrée , pour cela on va relier 2 bras sous forme de "L" avec 3 servos-moteurs , un pour le bras droit, un pour le bras gauche , un pour remonter les bras selon z , donc on aura au totale 3 mouvements selon  les 3 axes , chaque bout de bras sera relier a l'aide d'une articulation pivot et donc pour chaque mouvement du bras relier au moteur , l'autre bras suivra .

Pour aliser cela , nous reliant un repaire pour chaque bout de bras et àà l'aide des matrices de DH on pourra donner directement les coordonnécoordonnées articulaires pour la taches voulue et le microcontroleur calculera les angles cessaire a faire pour le aliser , cette solution est plus préprécise par rapport au 2 autres car on pourra atteindre n'importe quel point àà l'aide de calcules

ProblèProblèmes : 

MalgréMalgré l'efficacitéefficacité de cette solution , elle pose un problèproblème extrêextrêmement contraignant qui est : les points de singularitésingularités, effectivement , contrairement, aux 2 autres solutions , les singularitésingularités sont atteintes trètrès facilement ce qui donc nous limitera  dans le nombre de mouvement possibles , ces points de singularitésingularités sont atteint pour : les angles des 2 bras est de 180°180° et quand l'un des deux bras est totalement tendu , quand l'angles des bras atteins au meme temps 90°90°  AH BON ? VOUS l'AVEZ CALCULE ? 

                                                                          Croquis àà main levélevée de la solution

IMG_0332.JPG

                                                                                       Exemple de la solution

Capture d’écran 2024-02-21 à 10.51.33 PM.pngCapture d’écran 2024-02-21 à 10.51.33 PM.png

                                                             source de la photo : https://youtu.be/s5AP7tbfueg

Pourquoi avons-nous gardégardé cette idéidée ?

Cette idéidée est restérestée pour nous la plus aliste et la plus efficace , effectivement , la alisation de ce type de robot n'est pas trètrès compliquécompliquée vue que pour le guidage on aura besoin que 2articulations pivot , et donc facile a aliser , de plus , cette solution nous permet d'avoir plus de libertéliberté car on pour pratiquement atteindre n'importe quelle point dans un carrécarré si on envoie les bonne coordonnécoordonnées articulaires , bien-sur tout en éévitant les cas de singularitésingularités , donc au final, le vrai gros problèproblème de cette solution serait la singularitésingularité qui est un problèproblème qui théthéoriquement ne devrait pas êêtre trètrès dur a soudre  si on le compare avec les solutions abandonnéabandonnées .

IV. conception détaillédétaillée :

1)SchéSchéma éélectrique et modèmodèle géomégéométrique : 

1 .1).modèmodèle géomégéométrique (1er modèmodèle)  : 

Les coordonnécoordonnées articulaires sont nécénécéssaire pour qu'on puissent attendre les positions voulue par notre robot , et pour les trouver on a du calculer le modèmodèle géomégéométrique inverse de notre robot et nous avons ainsi trouver les ééquations qui relie les coordonnécoordonnées articulaires aux paramèparamètres de notre robot et aux paramèparamètres de la position voulue . Cela a pu éétre effectuer selon les éétapes suivantes : 

  • Relier chaque corps du robot a un repaire
  • Trouver les ééquations de contraintes qui relient les repaires 
  • Trouver les coordonnécoordonnées voulue en fonction des angles articulaires 
  • Regrouper tout en ééquations 
  • Enfin aprèaprès avoir dérivédérivés les ééquations et  les avoir solue nous obtenons les relations suivantes pour chaque coordonnécoordonnées articulaire :

Capture d’écran 2024-02-29 à 11.56.30 PM.pngCapture d’écran 2024-02-29 à 11.56.30 PM.png

Capture d’écran 2024-03-10 à 12.33.40 PM.pngCapture d’écran 2024-03-10 à 12.33.40 PM.pngCapture d’écran 2024-03-10 à 12.32.02 PM.pngCapture d’écran 2024-03-10 à 12.32.02 PM.png

Source : Cours de Mr.Morel de canique génégénéral 

Remarque : ici l3=0

Capture d’écran 2024-03-10 à 1.08.25 PM.pngCapture d’écran 2024-03-10 à 1.08.25 PM.png
SchéSchéma cinécinématique du robot 

Remarque : 

S1 : Biele 1

S2 : Biele 2

S3 : Biele 3

S4 : Biele 4

O1 : Centre du 1er servo-moteur 

O2 : Centre du me servo-moteur 

Ensuite nous avons impléimplémenter le sultat sur MATLAB pour effectuer le calcule des coordonnécoordonnées articulaires 


Capture d’écran 2024-02-29 à 11.37.18 PM.pngCapture d’écran 2024-02-29 à 11.37.18 PM.png
Code de la fonction utiliséutilisée pour le calcule du modèmodèle géomégéométrique inverse 

1.2).ModèModèle géomégéométrique final : 

AprèAprès avoir réaliséréalisé le premier modèmodèle géomégéométrique, nous avons constatéconstaté rapidement qu'il comportait quelques erreurs, notamment parce qu'il éétait éétabli àà partir d'un seul bras, ne prenant pas en considéconsidération le fait que les deux bras fonctionnent ensemble.

Par conséconséquent, nous avons optéopté pour un nouveau modèmodèle, plus complet. Ce nouveau modèmodèle prend en compte les mouvements des deux bras en parallèparallèle. La fonction MATLAB ci-dessous illustre ce nouveau modèmodèle géomégéométrique amélioréamélioré, qui calcule les angles cessaires pour les deux bras en fonction des coordonnécoordonnées (x, y) et des longueurs des bras (l1, l2, l3, l4).

Capture d’écran 2024-03-10 à 12.37.00 PM.pngCapture d’écran 2024-03-10 à 12.37.00 PM.png


SchéSchéma du modèmodèle utiliséutilisé

tails du calcule 

on travaille sur le triangle O1BP : 


On a : 


avec :  

 

 

et

 

 

 

Sur le triangle O2AC :


 



Capture d’écran 2024-03-09 à 11.14.11 PM.pngCapture d’écran 2024-03-09 à 11.14.11 PM.png

Code MATLAB utiliséutilisé

2 . SchéSchéma éélectrique :


Capture d’écran 2024-05-19 à 10.39.02 AM.pngCapture d’écran 2024-05-19 à 10.39.02 AM.png
Grand Krunk_page-0001.jpgSchéSchéma éélectrique du FOD 

Composant  Pin
Bouton grisbleu 2
Bouton bleuvert 3
Bouton noirrouge 4
Bouton vertgris  5
Joystick  X: A0 , Y : A1 , SW : 10
Servo droit  7
Servo gauche  8
Servo haut  9

3. Code : 

Dans cette éétape, nous avons exploréexploré deux thodes distinctes. Pour la premièpremière thode, nous avons utiliséutilisé MATLAB pour calculer les angles àà donner aux servomoteurs, puis nous les avons intégréintégrés directement dans notre code Arduino. 

Descriptif du code : 

Nous avons utiliséutilisé l'éétat de nos quatre boutons-poussoirs comme entréentrée pour pouvoir utiliser leurs éétats comme conditions pour nos diffédifférents modes de fonctionnement. En attribuant des actions spéspécifiques àà chaque combinaison d'éétats des boutons, nous avons pu crécréer un systèsystème polyvalent capable de basculer entre diffédifférents modes de fonctionnement en fonction des préfépréférences de l'utilisateur. Par exemple, un appui sur un seul bouton pourrait activer ou sactiver un mode spéspécifique. Cette approche nous a permis d'ajouter une dimension interactive àà notre projet, offrant ainsi une expéexpérience utilisateur plus riche et plus adaptéadaptée àà divers scéscénarios d'utilisation.

Capture d’écran 2024-03-09 à 11.46.17 PM.pngCapture d’écran 2024-03-09 à 11.46.17 PM.png


Bouton mode 
Gris  Tracer une ligne continue 
Bleu Tracer une ligne en discontinue 
Noir  Tracer un cercle en continue 
Vert  Tracer un cercle discontinue 
Rien  contrôcontrôle avec joystick

 

Tableau capitulatif des modes disponible 

 

Pour les diffédifférents modes, nous avons calculécalculé àà chaque fois les angles cessaires àà donner àà nos servomoteurs pour que les bras puissent atteindre un certain point. Pour ce faire, nous avons itéitérer notre calcul dans la fonction MATLAB et directement implémentéimplémenté les angles dans notre code.

En utilisant cette approche, nous avons pu terminer les positions optimales des bras en fonction des diffédifférents modes de fonctionnement, en prenant en compte des variables telles que les coordonnécoordonnées de destination et les longueurs des bras. Ces angles calculécalculés ont ensuite étéété incorporéincorporés dans notre code Arduino, ce qui a permis au systèsystème de positionner les bras de manièmanière préprécise et efficace en fonction du mode sélectionnésélectionné par l'utilisateur. Cette thode nous a offert une grande flexibilitéflexibilité pour adapter le comportement du systèsystème en fonction des besoins spéspécifiques de chaque mode.

 Capture d’écran 2024-03-10 à 10.30.03 AM.pngCapture d’écran 2024-03-10 à 10.30.03 AM.png

Code pour le tracétracé de la ligne continue 

Cependant, lorsque nous avons introduit le joystick dans notre systèsystème, nous avons réaliséréalisé que cette thode limitait notre flexibilitéflexibilité et rendait impossible l'utilisation du joystick.

C'est pourquoi nous avons optéopté pour la deuxièdeuxième thode, nous effectuons les calculs directement dans le code Arduino. Cette approche nous permet d'obtenir les angles directement àà partir du programme, ce qui simplifie l'intéintégration du joystick et offre une plus grande flexibilitéflexibilité dans le contrôcontrôle du systèsystème.

Pour aliser cela, nous avons implémentéimplémenté dans notre code une fonction qui effectue le me calcul que celui que nous avions réaliséréalisé avec MATLAB. Cette fonction prend en compte les coordonnécoordonnées de destination et les longueurs des bras, puis calcule les angles cessaires pour positionner les bras de manièmanière appropriéappropriée.

Capture d’écran 2024-05-22 à 7.11.02 PM.pngCapture d’écran 2024-05-22 à 7.11.02 PM.png

Code de la fonction de calcule du modèmodèle géomégéométrique 

En incorporant cette fonction dans notre code Arduino, nous avons pu obtenir les angles requis directement àà partir du microcontrômicrocontrôleur, sans avoir besoin de faire des calculs prépréalables dans MATLAB. Cela simplifie le processus et permet une exéexécution plus efficace des opéopérations, ce qui est particulièparticulièrement important dans un environnement en temps el comme celui des systèsystèmes embarquéembarqués. De plus, cela nous permet d'avoir un contrôcontrôle total sur le fonctionnement du systèsystème directement àà partir du code Arduino, offrant ainsi une solution plus intégréintégrée et autonome.

Remarque : Pour la partie Joystick , elle est en cours de veloppement et doit êêtre testétestée

diagramme_programme (4).jpegdiagramme_programme (5).jpeg

         Organigrame du programme 

A partir de cette organigramme nous avons commencer la creation du code .

Le code comporte 5 partie :

1)- dessin de la ligne continue de 5 cm : 

Capture d’écran 2024-05-22 à 10.22.04 PM.pngCapture d’écran 2024-05-22 à 10.22.04 PM.png

2)-Dessin de la ligne discontinue  de 5cm : 

Capture d’écran 2024-05-22 à 10.23.13 PM.pngCapture d’écran 2024-05-22 à 10.23.13 PM.png

3) Dessin du cercle de rayon 2.5 cm: 

Capture d’écran 2024-05-22 à 10.24.04 PM.pngCapture d’écran 2024-05-22 à 10.24.04 PM.png

4) Dessin du cercle discontinue de rayon 2.5 cm :

Capture d’écran 2024-05-22 à 10.26.38 PM.pngCapture d’écran 2024-05-22 à 10.26.38 PM.png

Capture d’écran 2024-05-22 à 10.27.55 PM.pngCapture d’écran 2024-05-22 à 10.27.55 PM.png

5) Mode manuel (joystick) : 

Capture d’écran 2024-05-22 à 10.28.50 PM.pngCapture d’écran 2024-05-22 à 10.28.50 PM.pngCapture d’écran 2024-05-22 à 10.28.58 PM.pngCapture d’écran 2024-05-22 à 10.28.58 PM.png

Pour le mode manuel, le travail a étéété réaliséréalisé en collaboration avec les membres du projet robot "Majin". Ensemble, nous avons réfléréfléchi àà la manièmanière de concevoir et de coder ce mode manuel. Et donc, nous avons pu commander notre robot en position et en vitesse.

L'afficheur LCD :

AprèAprès avoir finaliséfinalisé le code, nous avons constatéconstaté qu'il manquait encore un éléélément essentiel àà notre robot : une interface permettant de connaîconnaître en temps el le mode de fonctionnement. Initialement, nous avions pensépensé utiliser des LED, mais cela encombrait notre montage et n'éétait pas intuitif pour une personne extéextérieure sans explications. C'est alors que nous avons eu l'idéidée d'ajouter un afficheur LCD.

Comment çça marche ?

Nous avons utiliséutilisé un afficheur LCD LiquidCrystal I2C. C'est un module pratique et facile àà utiliser pour afficher des informations sur deux lignes de 16 caractècaractères chacune. Il se connecte àà une Arduino via le bus I2C et ne cessite que 4 broches : Vcc, GND, SDA et SCL.

  • SDA : se connecte àà la broche A4 de l'Arduino pour recevoir les donnédonnées.
  • SCL : se connecte àà la broche A5 de l'Arduino pour recevoir l'horloge.
  • Vcc : se connecte àà une source de 5V.
  • GND : se connecte àà la masse.
le code : 

#include <Servo.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16,2);
#define X_pin A0 
#define Y_pin A1 
#define sw 10 
#define Bb 2 //Bouton Bleu 
#define Bv 3 //Bouton Vert 
#define Br 4 //Bouton Rouge 
#define Bg 7 //Bouton Gris 
//Etat des boutons 
int bouttonb_stat = 0;
int bouttonv_stat = 0;
int bouttonr_stat = 0;
int bouttong_stat = 0;
float Rx;//CordonnéCordonnée Actuel selon x
float Ry;//CordonnéCordonnée Actuel selon y
float Rxx;//CordonnéCordonnée a atteindre selon x
float Ryy;//CordonnéCordonnée a atteindre selon y
int angle_effecteur=0;
//Definition des servos 
Servo droit;
Servo gauche;
Servo haut;
//Valeur de sauvgarde d'éétats 
int haut_s=50;
int bas_s=43;
int etat=bas_s;
float cpt=0;
//Parametres du modele geometrique inverse 
float l1=7;
float l4=8;
float l2=7;
float l3=8;
float l5=3.5;
float a=5;
int cpts=0;
int x_val; 
int y_val;
int sw_val;


//Modele geometrique inverse 
float theta1(float xp,float yp){
  float O1P=sqrt((-a+xp)*(-a+xp)+(yp)*(yp));
  float b=(((l1*l1)-(l5*l5 +l4*l4 -2*l4*l5*cos((180-angle_effecteur)*M_PI/180.0) )+(O1P*O1P))/(2*l1*O1P));
  float alpha=acos(b)*180/M_PI;
  float beta=atan(((yp)/(a-xp)))*180/M_PI;
  float theta=180-(beta+alpha);
  return theta;

}
float theta2(float xp,float yp){
  float O1P=sqrt((-a+xp)*(-a+xp)+(yp)*(yp));
  float omega=(acos(((O1P*O1P)-(l5*l5 +l4*l4 -2*l4*l5*cos((180-angle_effecteur)*M_PI/180.0))-(l1*l1))/(-2*(sqrt(l5*l5 +l4*l4 -2*l4*l5*cos((180-angle_effecteur)*M_PI/180.0)))*l1))*180.0/M_PI)+acos((-(l5*l5 +l4*l4 -2*l4*l5*cos((180-angle_effecteur)*M_PI/180.0))+(l5*l5)-(l4*l4))/(-2*l4*(sqrt(l5*l5 +l4*l4 -2*l4*l5*cos((180-angle_effecteur)*M_PI/180.0)))))*180.0/M_PI;
  float omega_bis=omega-theta1(xp,yp)-angle_effecteur;
  float O2C=sqrt((a+(xp+l5*(cos(omega_bis*M_PI/180.0))))*(a+(xp+l5*cos(-omega_bis*M_PI/180.0)))+(yp+l5*sin(-omega_bis*M_PI/180.0))*(yp+l5*sin(-omega_bis*M_PI/180.0)));
  float alpha2=acos((((l2*l2)-(l3*l3)+(O2C*O2C))/(2*l2*O2C)))*180/M_PI;
  float beta2=atan(((yp+l5*sin(-omega_bis*M_PI/180.0))/(a+xp+l5*cos(-omega_bis*M_PI/180.0))))*180.0/M_PI;
  float theta2=beta2+alpha2;
  return theta2;
  

}

//DEbut du programme 
void setup() {
  Serial.begin(9600);
  droit.attach(5);
  gauche.attach(6);
  haut.attach(9);
  pinMode(X_pin,INPUT);
  pinMode(Y_pin,INPUT);
  pinMode(sw,INPUT_PULLUP);
  pinMode (Bb,INPUT_PULLUP);
  pinMode (Bv,INPUT_PULLUP);
  pinMode (Br,INPUT_PULLUP);
  pinMode (Bg,INPUT_PULLUP);
  droit.write(90);
  gauche.write(120);
  haut.write(60);
  lcd.init();//initialisation de l'afficheur Lcd
  lcd.backlight();//Allumer le retro eclairage 
}

void loop() {

 //initialisation des bouttons 
  bouttong_stat = digitalRead(Bg);
  bouttonb_stat = digitalRead(Bb);
  bouttonr_stat = digitalRead(Br);
  bouttonv_stat = digitalRead(Bv);

//Ligne continue 
if(bouttonb_stat==LOW){
  haut.write(60);
  lcd.setCursor(1,0);//Position d'éécriture dans l'afficheur 
  lcd.print("Mode : Ligne ");//Ecriture dans l'afficheur 
  haut.write(45);
  //Dessin d'une ligne de 5cm
    for(float i=-2.5;i<=2.5;i=i+0.0015){
       droit.write(180-theta1(i,12));
       gauche.write(180-theta2(i,12));
       }
  delay(50);
  haut.write(60);
  droit.write(180-theta1(-2.5,12));
  gauche.write(180-theta2(-2.5,12));
  delay(1000);
  lcd.clear();//Effacer
}

//Ligne discontinue 
if(bouttonv_stat==LOW){
  lcd.setCursor(1,0);//Position d'éécriture dans l'afficheur 
  lcd.print("Mode : Ligne ");//Ecriture dans l'afficheur 
  lcd.setCursor(1,1);//Position d'éécriture dans l'afficheur 
  lcd.print("Discontinue ");//Ecriture dans l'afficheur
   
//Dessin d'une ligne de 5cm 
   for(float i=-2.5;i<=2.5;i=i+0.1){
      droit.write(180-theta1(i,12));
      gauche.write(180-theta2(i,12));
      cpt=cpt+0.1;
//Sauvegarde de l'éétat 
      if(cpt>=0.1 && etat==bas_s ){
        etat=haut_s;
        haut.write(haut_s);
        delay(700);
     
          }
      else if(cpt>=0.1 && etat==haut_s)  {
        etat=bas_s;
        haut.write(bas_s);
        delay(700);
        
      }
     
    }
    
  delay(50);
  droit.write(180-theta1(-2.5,12));
  gauche.write(180-theta2(-2.5,12));
  delay(1000);
  lcd.clear();//Effacer
}

//Cercle
if(bouttonr_stat==LOW){
  lcd.setCursor(1,0);//Position d'éécriture dans l'afficheur 
  lcd.print("Mode : Cercle ");//Ecriture dans l'afficheur
  haut.write(40);
//Dessin du demi cercle superieur  
for(float x=-2;x<=2;x=x+0.009){
  gauche.write(180-theta2(x,12+sqrt((2*2)-(x*x))));
 droit.write(180-theta1(x,12+sqrt((2*2)-(x*x))));
  delay(10);
}
//Dessin du demi cercle inferieur 
for(float x=2;x>=-2;x=x-0.009){
 gauche.write(180-theta2(x,12-sqrt((2*2)-(x*x))));
  droit.write(180-theta1(x,12-sqrt((2*2)-(x*x))));
  delay(10);
}

delay(2000);
lcd.clear();//Effacer
 }

//Cercle discontinue 
if(bouttong_stat==LOW){
 lcd.setCursor(1,0);//Position d'éécriture dans l'afficheur 
  lcd.print("Mode : Cercle ");//Ecriture dans l'afficheur 
  lcd.setCursor(1,1);//Position d'éécriture dans l'afficheur 
  lcd.print("Discontinue ");//Ecriture dans l'afficheur 
  cpt=0;
  etat=haut_s;
 //Dessin du demi cercle superieur 
for(float x=-2.5;x<=2.5;x=x+0.2){
 gauche.write(180-theta2(x,12+sqrt((2.5*2.5)-(x*x))));
 droit.write(180-theta1(x,12+sqrt((2.5*2.5)-(x*x))));
  delay(10);
    cpt=cpt+0.1;
      //Sauvgarde de l'etat actuel
      if(cpt>=0.1 && etat==bas_s ){
        etat=haut_s;
        cpt=0;
        haut.write(haut_s);
        delay(700);
     
          }
      else if(cpt>=0.1 && etat==haut_s)  {
        etat=bas_s;
        cpt=0;
        haut.write(bas_s);
        delay(700);
        
      }
}



 //Dessin du demi cercle inferieur  
for(float x=2.5;x>=-2.5;x=x-0.2){
 gauche.write(180-theta2(x,12-sqrt((2.5*2.5)-(x*x))));
  droit.write(180-theta1(x,12-sqrt((2.5*2.5)-(x*x))));
  delay(10);
    cpt=cpt+0.1;
    //Sauvgarde de l'etat actuele 
      if(cpt>=0.1 && etat==bas_s ){
        etat=haut_s;
        cpt=0;
        haut.write(haut_s);
        delay(700);
     
          }
      else if(cpt>=0.1 && etat==haut_s)  {
        etat=bas_s;
        haut.write(bas_s);
        delay(700);
        
      }
}

delay(2000);
lcd.clear();//Effacer
  }
 //Mode manuel
  if (bouttonr_stat == HIGH && bouttonb_stat == HIGH && bouttonv_stat == HIGH && bouttong_stat == HIGH) {
 lcd.setCursor(1,0);//Position d'éécriture dans l'afficheur 
  lcd.print("Mode : Manuel  ");//Ecriture dans l'afficheur 

   // Lecture des valeurs du joystick
  sw_val=digitalRead(sw);
  Serial.println(sw_val);
  x_val = analogRead(X_pin);
  y_val = analogRead(Y_pin);
  //conversion
  Rx=map(x_val,0,1023,3,-3);
  Ry=map(y_val,0,1023,13.8,7);
  //Commande en vitesse 
  if (Rxx < Rx) {
    Rxx += 0.01;
    if (Rxx > Rx) {
      Rxx = Rx;
    }
  } else if (Rxx > Rx) {
    Rxx -= 0.01;
    if (Rxx < Rx) {
      Rxx = Rx;
    }
  }
  if (Ryy < Ry) {
    Ryy += 0.01;
    if (Ryy > Ry) {
      Ryy = Ry;
    }
  } else if (Ryy > Ry) {
    Ryy -= 0.01;
    if (Ryy < Ry) {
      Ryy = Ry;
    }
  }
 droit.write(180-theta1(Rxx,Ryy));
 gauche.write(180-theta2(Rxx,Ryy));
 
 //Lever le stylo 
 if(!digitalRead(sw) && etat==haut_s){
    haut.write(45);
    etat=bas_s;
    delay(300);
  }
  else if (!digitalRead(sw) && etat==bas_s){
    haut.write(60);
    etat=haut_s;
    delay(300);
  }

  
  /*if(cpts==1 &&  sw_val==0 ){
    haut.write(haut_s);
  }
  else{
    haut.write(bas_s);
  }*/
  delay(10);

}
}


2) Conception CAO :

Nous avons procédéprocédé àà la modémodélisation de notre robot àà l'aide du logiciel SolidWorks.

Cette conception peut êêtre segmentésegmentée en deux principaux sous-ensembles :

Le ti : Cet ensemble abrite les deux servo-moteurs qui dirigent les deux bras, chacun composécomposé de deux bielles.
La table : DestinéDestinée àà recevoir la feuille sur laquelle éécrire, cette composante intèintègre un servo-moteur situésitué en dessous. Ce dernier est connectéconnecté àà la table et permet de gler la hauteur du stylo pour l'éécriture en basculant l'ensemble du ti. Les tails de ce canisme sont explicitéexplicités ci-dessous

image.png

image du robot final

Le ti: du robot a étéété conçconçu en priviléprivilégiant la coupe laser comme thode de fabrication principale. Il se compose de trois pièpièces qui s'emboîemboîtent de manièmanière adéadéquate, toutes adaptéadaptées àà la coupe laser. La pièpièce centrale préprésente deux ouvertures destinédestinées àà recevoir les deux servomoteurs. Les bielles sont fixéfixées aux servomoteurs au moyen d'une vis au centre, avec un trou additionnel permettant le vissage àà l'lice du moteur pour assurer le guidage.

image.png  image.pngqQaimage.png

le tis

Les liaisons entres les bielles :

Comme évoquéévoqué précéprécédemment dans notre documentation, le robot est constituéconstitué de quatre bielles. Pour les articulations entre ces bielles, nous avons optéopté pour l'utilisation de roulements associéassociés àà des vis pour assurer la fixation. Comme illustréillustré dans l'image ci-dessous, l'une des bielles préprésente un trou de diamèdiamètre correspondant àà celui du roulement externe, tandis que l'autre bielle possèpossède un diamèdiamètre légèlégèrement inféinférieur (correspondant au diamèdiamètre interne du roulement). Ces élééléments sont ensuite solidement fixéfixés àà l'aide d'une vis et d'un éécrou, soigneusement serréserrés. Nous avons éégalement intercaléintercalé une plaque tallique entre le roulement et la vis afin de garantir la fluiditéfluidité du mouvement.

image.png                                              image.png

Images qui illustrent les liaisons entres les bielles

Emplacement et glage du Stylo dans le canisme du Robot :
  • Comme visible, l'une des bielles est prépréalablement équipééquipée d'une extension et d'un orifice destinédestiné àà recevoir le stylo. ÉÉtant donnédonné que cette pièpièce sera fabriquéfabriquée en bois, nous aurons la possibilitépossibilité d'ajouter ultéultérieurement un trou sur le côtécôté pour inséinsérer une vis permettant de gler la hauteur du stylo.

image.png

bielle du stylo

  • Le canisme pour lever le stylo consiste àà fixer la bielle au moyen d'une vis sur l'lice du servomoteur. Cette bielle est ensuite fixéfixée sur une pièpièce éémergeant du ti. Les tis et la table sont ainsi reliéreliés par deux liaisons pivot sur les côtécôtés, comme illustréillustré dans l'image. Pour duire les frottements et faciliter le mouvement, nous préprévoyons d'utiliser un morceau de cylindre inséréinséré dans le trou de la table, lequel sera fixéfixé àà l'aide d'une vis et d'un éécrou traversant le trou du ti.

     

    image.png

    image.png         image.png

     

    canisme de Levage du Stylo : Illustration et Fonctionnement

     

  • vous trouverez ci-joint l'ensembles des fichiers SolidWorks:    assemblage_FOD.zip.