# Projet ROB3 2024

Chapitre pour le projet Polytech Sorbonne / ROB3, de février à mai 2024.
Enseignants : Lilian Carillet, Guillaume Morel.

# New Page



# Le sujet du projet

### ROBOT ECRIVAIN

#### 1. Objectifs

L’objectif principal de ce projet est de concevoir et réaliser un système robotique, c’est-à-dire sa partie mécanique, sa motorisation, sa commande et son interface de pilotage. Le cahier des charges fourni précise les fonctions que doit réaliser le système et les contraintes qu’il doit respecter.

Pour les étudiants, l’objectif est au moins autant d’apprendre par la pratique les bases de la gestion d’un projet (c’est-à-dire la façon de s’organiser en équipe pour atteindre un objectif donné avec des moyens donnés) que d’aboutir à un prototype fonctionnel.

#### 2. Cahier des charges

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

##### 2.1 Fonctions à réaliser

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

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

a. Une ligne de 5cm de long,

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

c. Un cercle de 2.5cm de rayon,

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

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

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

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

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

##### 2.2 Fonctions contraintes

Les contraintes imposées sont :

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

Ces [machines](https://wiki.fablab.sorbonne-universite.fr/BookStack/books/machines) du FABLAB de sont pas toutes accessibles tout le temps ni en même temps. C’est une contrainte qu’il vous faut intégrer dans la gestion de votre projet (par exemple, privilégier la découpe LASER qui est très rapide, lorsque c’est possible).

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

- Programmation en C utilisant la chaîne de développement Arduino IDE.

#### 3. Organisation

Les étudiants sont organisés en groupe de 3 dans la mesure du possible. Chaque groupe bénéficie de 6 séances encadrées tout au long du semestre.

En dehors des séances encadrées, il est possible d’accéder au FABLAB en accès libre les lundis, mardis, jeudis et vendredis de 14h à 18h30. Pour cela il faut s’adresser au FABLAB.

Le suivi des objectifs est un élément essentiel de la gestion de projet. Il a pour but de situer l’avancement du projet. Pour ce premier projet réalisé dans le cadre de votre cursus, des objectifs intermédiaires sont fixés par l’équipe enseignante afin d’éviter des erreurs de planification liées à l’inexpérience. Les objectifs sont ici exprimés en termes de *livrables*, qui sont les suivants :

##### 3.1 Avant le début de la deuxième séance : 

o Remise d’un dossier de conception préliminaire. Il s’agit d’un dossier qui précise les choix généraux faits pour la solution que vous allez mettre en œuvre.

o Remise d’un diagramme de GANTT : il s’agit d’un schéma qui précise qui-fait-quoi-quand.

##### 3.2 Cinq jours après la fin de la troisième séance

Remise d’un dossier de conception détaillée. Il s’agit d’un dossier qui précise tous les choix technologiques faits. Ce dossier contient notamment la CAO, les schémas électriques de connexion et les algorithmes de commande. Lorsqu’un dossier de conception détaillé est bien fait, en principe, le reste du projet consiste à réaliser le prototype en se référant à ce dossier.

##### 3.3 Au plus tard 2h avant la fin de la dernière séance :

o Démonstration finale de réalisation des deux exercices.

Comme le timing est très serré, si des objectifs intermédiaires ne sont pas atteints, l’équipe enseignante fournit à l’équipe projet une solution type qui permet de poursuivre le projet selon le déroulement prévu.

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

- 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.

#### 5. Liste des fichiers fournis

- Ressources CAO.zip contient les fichiers Solidworks pour les deux modèles de servomoteurs
- datashetts.zip contient les documentations de quelques-uns des composants fourni

# New Page



# Présentation initiale

Sur cette page, vous pourrez trouvez les slides de la présentation qui vous est faite lors de la première séance (voir fichier joint).

# Quelques liens utiles vers des tutos, docs, etc.

#### 1. Programmation Arduino  


- Documentation officielle Arduino  
    
    - Référence Arduino : [https://www.arduino.cc/reference/en/](https://www.arduino.cc/reference/en/)
    - Bibliothèque servo : [https://www.arduino.cc/reference/en/libraries/servo/](https://www.arduino.cc/reference/en/libraries/servo/)
    - Utilisation des interruptions :  
        
        - [https://www.arduino.cc/reference/en/language/functions/interrupts/interrupts/](https://www.arduino.cc/reference/en/language/functions/interrupts/interrupts/)
        - [https://www.arduino.cc/reference/en/language/functions/externalinterrupts/attachinterrupt/](https://www.arduino.cc/reference/en/language/functions/externalinterrupts/attachinterrupt/)
- Divers tutoriels et exemples. Il existe des exemples dans l'IDE (Fichiers &gt; Exemples) :

- - [https://docs.arduino.cc/built-in-examples/](https://docs.arduino.cc/built-in-examples/)
    - [https://docs.arduino.cc/tutorials/](https://docs.arduino.cc/tutorials/)

#### 2. Schéma électrique

- Utilisation de résistances de rappel : [http://wiki.t-of.info/Arduino/R%C3%A9sistanceDeRappel](http://wiki.t-of.info/Arduino/R%C3%A9sistanceDeRappel)
- Utilisation de boutons poussoirs : [https://docs.arduino.cc/built-in-examples/digital/StateChangeDetection](https://docs.arduino.cc/built-in-examples/digital/StateChangeDetection)
- Utilisation d'une LED : [https://docs.arduino.cc/built-in-examples/basics/Fade](https://docs.arduino.cc/built-in-examples/basics/Fade)

#### 3. Tutos Solidworks

<div class="gmail_default" id="bkmrk-m.-carillet-vous-a-p">- M. Carillet vous a préparé un petit tuto pour préparer la découpe laser : [https://youtu.be/IkJtQY5cAtI](https://youtu.be/IkJtQY5cAtI)
- Et un autre qui porte sur la création de l'empreinte du palonnier : [https://youtu.be/PK6qqXcBA3c](https://youtu.be/PK6qqXcBA3c)

</div>

# PROJET ROB de Maroua, Marco, Yanis

## Projet Maranis : Un robot écrivain

##### <span style="color: rgb(0, 0, 0);">**Informations** </span>

- Membres : 
    - Maroua Hriouit
    - Yanis Sadoun
    - Marco Grandclaude
- Mail: 
    - <maroua.hriouit@etu.sorbonne-universite.fr>
    - <yanis.sadoun@etu.sorbonne-universite.fr>
    - <marco.grandclaude@etu.sorbonne-universite.fr>
- Polytech ROB 3 Année 2023-2024
- 7 février 2024 - 22 mai 2024

#### **Contexte et objectifs :**

**<span lang="FR" style="mso-ansi-language: FR;">Définition et objectifs du projet : <span style="mso-spacerun: yes;"> </span>Un robot qui dessine</span>**

<span lang="FR" style="mso-ansi-language: FR;">Dans le cadre de nos études en robotique, on est amené à concevoir un robot capable de dessiner a l’aide d’un crayon fixé à l’extrémité terminale du robot. </span>

<span lang="FR" style="mso-ansi-language: FR;">L'objectif principal de ce projet consiste à élaborer et mettre en œuvre un système robotique complet, englobant sa composante mécanique, son système de motorisation, son dispositif de commande, ainsi que son interface de pilotage. Le cahier des charges fourni définit de manière détaillée les fonctions que le système doit exécuter et les contraintes auxquelles il doit se conformer.</span>

<span lang="FR" style="mso-ansi-language: FR;">Pour nous, étudiants, ce projet offre l'opportunité d'acquérir une expérience professionnelle en gestion de projet, en mettant particulièrement l'accent sur le travail en équipe. Il nous permettra également de mettre en pratique tout ce que nous avons étudié tout au long du premier semestre, y compris la conception et la modélisation, le calcul des modèles géométriques direct et inverse, ainsi que la programmation en C. Et enfin apprendre à manipuler des machines d’impression 3D et découpe LASER.</span>

<span lang="FR" style="mso-ansi-language: FR;">  
</span>Lors de notre première séance, nos professeurs nous ont fourni une description fonctionnelle détaillée des besoins et contraintes pour notre projet. C'est sur cette base que nous avons construit et développé notre plan de travail. Voici un résumé de ces exigences clés :

<span lang="FR" style="mso-ansi-language: FR;"> **Description fonctionnelle des besoins :**</span>

<span lang="FR" style="mso-ansi-language: FR;">1 - Dessin Précis : Le robot doit être capable d'exécuter des dessins précis définies en 10 secondes +/- 0.2 secondes conformément aux spécifications fournies, en respectant les dimensions et les formes définies :</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: black; mso-themecolor: text1; mso-ansi-language: FR;">a. Une ligne de 5cm de long,</span>

<span lang="FR" style="mso-ansi-language: FR;">b. Une ligne pointillée de 5cm de long,</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: black; mso-themecolor: text1; mso-ansi-language: FR;">c. Un cercle de 2.5cm de rayon,</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: black; mso-themecolor: text1; mso-ansi-language: FR;">d. Un cercle pointillé de 2.5cm de rayon.</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: black; mso-themecolor: text1; mso-ansi-language: FR;">2 - Dessiner, en utilisant un crayon fixé à l'extrémité du bras robotique, un motif prédéfini sur le plan de la plaque de support, dans un carré de dimensions 5 cm par 5 cm. Le déplacement du bras robotique sera contrôlé par un joystick. Il est à noter que la figure peut être discontinue, ce qui implique la nécessité de pouvoir soulever le crayon du support horizontal au besoin.</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">3 - Une fonctionnalité supplémentaire pourrait être mise en œuvre : La possibilité de régler la vitesse de déplacement du robot à travers l'interface.</span>

**<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">Moyens à disposition :</span>**

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Un crayon</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Interface de commande :</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Une carte arduino UNO avec câble USB-B ;</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Un joystick ;</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Une platine de prototypage ;</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Alimentation régulée 5V ;</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Câbles, LEDs, boutons poussoirs, résistances.</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Motorisation :</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Deux servomoteurs HS422 180° ;</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Un servomoteur Emax ES08A 180°.</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Mécanique :</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Matière PLA pour impression 3D ;</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Feuilles medium : 3mm et 6mm d’épaisseur ;</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">- Vis et écrous : M2, M2.5, M3, M4.</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;"> - Roulements et axes de diamètre 4mm.</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">**<span lang="FR" style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;"><span style="mso-list: Ignore;"><span style="font-style: normal; font-variant: normal; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';"> </span></span></span>Diagramme de Gantt :**</span>

[![Capture d'écran 2024-02-18 153313.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/capture-decran-2024-02-18-153313.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/capture-decran-2024-02-18-153313.png)

💭 **Remarque Importante :** Il est important de noter que notre diagramme de Gantt est un outil vivant. Comme le projet progresse, nous pouvons nous attendre à ce qu'il soit ajusté et modifié pour refléter l'évolution de nos plans et la réalité de notre progression. Cette flexibilité nous permettra de rester réactifs et adaptatifs face aux défis et aux opportunités qui se présenteront.


#### **<span lang="FR" style="mso-ansi-language: FR;">Etape 1 : </span><span lang="FR" style="mso-ansi-language: FR;">Propositions de réalisation et analyse des risques 🔍⚙️</span>**

**<span lang="FR" style="mso-ansi-language: FR;">Solution 1 : Robot voiture </span>**

<span style="color: rgb(45, 194, 107);">**<span lang="FR">Principe : </span>**</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: black; mso-themecolor: text1; mso-ansi-language: FR;">Comme première solution, l'idée consiste d'utiliser une voiture à deux roues sur laquelle seront fixés nos deux moteurs. Ensuite, nous envisageons de positionner une forme cylindrique sur la voiture, à l'intérieur de laquelle sera intégré un engrenage. Cette configuration permettrait la translation du stylo selon l'axe z, offrant ainsi une méthode mécanique pour réaliser les mouvements nécessaires à notre robot.</span>

<span style="color: rgb(45, 194, 107);">**<span lang="FR">Croquis :</span>**</span>

![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/NCyimage.png)

 *<span style="text-decoration: underline;">figure 1 : croquis du robot voiture</span>*

<span style="color: rgb(45, 194, 107);">**<span lang="FR">Schéma cinématique : </span>**</span>

![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/jD4image.png)  <span style="text-decoration: underline;">*figure 2 : s<span lang="FR" style="color: rgb(68, 68, 68); text-decoration: underline;">chéma cinématique du robot voiture</span>*</span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;"><span style="color: rgb(45, 194, 107);">**Contraintes:**</span> </span>

<span lang="FR" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; color: #444444; mso-ansi-language: FR;">Compte tenu des moteurs utilisés, cette solution ne sera pas viable. En effet, les servomoteurs n'effectuent qu'une rotation de 180 degrés, ce qui signifie que pour parcourir une certaine distance D, il faudra effectuer n tours de 360 degrés. Cela nous obligerait à utiliser un diamètre de roues très important, entraînant des complications liées aux calculs et aux glissements.</span>

**Solution 2 : robot cartésien**

<span style="color: rgb(45, 194, 107);">**Principe :**</span>

Ce robot serait conçu pour se déplacer suivant un système de coordonnées en X et Y, offrant une grande précision dans un espace bidimensionnel.

La particularité de ce robot réside dans sa capacité à effectuer des translations le long de deux axes distincts : horizontal (axe X) et vertical (axe Y). Pour ce faire, le robot serait équipé de rails horizontaux et verticaux, permettant des mouvements fluides et contrôlés dans ces deux directions.

<span style="color: rgb(45, 194, 107);">**Croquis :**</span>

 ![IMG_0164.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/img-0164.jpg)

*<span style="text-decoration: underline;">figure 3: croquis du robot </span><u>cartésien </u>*

<span style="color: rgb(45, 194, 107);">**Schéma cinématique :** </span>

<span style="color: rgb(45, 194, 107);">![Schéma cinématique Robot cartésien.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/schema-cinematique-robot-cartesien.png)</span>

<span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*figure 4 : s<span lang="FR">chéma cinématique du robot cartésien</span>*</span></span></span>

<span style="color: rgb(45, 194, 107);">**<span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">Contraintes</span> :** </span>

**<span style="text-decoration: underline;">Manque de matériel pour les translations </span>:** Nous ne disposons pas des composants nécessaires, tels que des courroies, pour réaliser les translations efficaces sur les axes X et Y. L'absence de ces éléments essentiels est un obstacle à la construction de ce système .

**<span style="text-decoration: underline;">Complexité de fabrication des rails </span>:** La conception et la réalisation des rails, essentiels pour les déplacements précis du robot, nous semblent particulièrement complexes, surtout avec les seuls servomoteurs disponibles.

**<span style="text-decoration: underline;">Incapacité de mouvement sur l'axe Z </span>:** Avec les composants actuels, le robot ne serait pas capable de lever le crayon le long de l'axe Z. Cette limitation rend impossible la réalisation de tracés en pointillés, une des exigences clés du cahier des charges.

Bien que conceptuellement intéressante, la solution du robot cartésien se heurte à des contraintes matérielles et techniques qui compromettent sa faisabilité dans notre contexte actuel.

**<span lang="FR" style="mso-ansi-language: FR;">Solution 3 : Robot </span><span lang="FR" style="mso-ansi-language: FR;">constitué d'axe en série </span>**

<span style="color: rgb(45, 194, 107);">**Principe :**</span>

Le robot envisagé se caractérise par une structure à axe en série. Il intègre un châssis stable comme base principale, sur lequel est fixé un bras articulé. Ce bras se compose de trois segments (bielles), chacun connecté au suivant via une liaison pivot, permettant ainsi une gamme étendue de mouvements. La dernière bielle est directement soudée à un adaptateur, conçu pour maintenir fermement un stylo. La stabilité et la précision du mouvement des bielles seront assurées par l'intégration de roulements. Parallèlement, un support de feuille sera installé, aligné dans le même plan que le châssis du robot, afin de faciliter l'interaction précise du stylo avec le papier.<span class="Apple-converted-space"> </span>

<span style="color: rgb(45, 194, 107);">**Croquis :** </span>

![IMG_0163.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/img-0163.jpg)

<span style="text-decoration: underline;">*figure 5 : croquis du robot à axe en série* </span>

<span style="color: rgb(45, 194, 107);">**Schéma cinématique :** </span>

[![IMG_3633A0B1757E-1.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/img-3633a0b1757e-1.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/img-3633a0b1757e-1.jpeg)

<span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*figure 6 : s<span lang="FR">chéma cinématique du robot à axe en série</span>*</span></span></span>

<span style="color: rgb(45, 194, 107);">**Avantages :**</span>

- **<span style="text-decoration: underline;"> Cinématique simple :</span>** La structure à axe en série offre une cinématique plus facile à concevoir et à programmer, grâce à une chaîne cinématique linéaire et moins complexe.

**<span style="color: rgb(45, 194, 107);">Risques et défis :</span>**

- **<span style="text-decoration: underline;"> Stabilité structurelle :</span>** Ces robots peuvent présenter des problèmes de stabilité, surtout lors de la manipulation de charges ou lors de mouvements rapides.
- **<span style="text-decoration: underline;"> Précision dans les positions extrêmes </span>:** La précision peut diminuer aux extrémités de la portée du robot, où les effets de la gravité et de la flexion des composants sont plus prononcés.

**<span lang="FR" style="mso-ansi-language: FR;">Solution 4 : Robot à trois rotations </span><span lang="FR" style="mso-ansi-language: FR;"> </span>**

**<span style="color: rgb(45, 194, 107);">Principe :</span>**

Ce concept de robot s'inspire directement de la morphologie humaine, intégrant trois axes de rotation pour imiter les mouvements naturels du corps. En faisant une analogie avec le corps humain, la gestion de la hauteur de la pince (qui agirait comme une main) est assurée par deux rotations principales : une au niveau de l'« épaule » et une autre au niveau du « coude », correspondant respectivement aux rotations 2 et 3 du système. Cette configuration permet une manipulation verticale précise et polyvalente de la pince. Pour compléter la gamme de mouvements, une troisième rotation est ajoutée au niveau du « poignet », offrant la capacité de torsion. Cette troisième rotation apporte une flexibilité supplémentaire, essentielle pour des tâches complexes nécessitant une orientation fine de la pince.<span class="Apple-converted-space"> </span>

<span style="color: rgb(45, 194, 107);">**Croquis :** </span>

 ![IMG_0161.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/Ik3img-0161.jpg)

*<span style="color: rgb(0, 0, 0);"><span style="text-decoration: underline;">figure 7 : croquis du robot à 3 rotations </span></span>*

<span style="color: rgb(45, 194, 107);">**Schéma cinématique :** </span>

 ![IMG_8F75CAC7EA79-1.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/img-8f75cac7ea79-1.jpg)

<span style="color: rgb(0, 0, 0);"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*<span style="text-decoration: underline;">figure 8</span>*</span></span><span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"> *: s<span lang="FR">chéma cinématique du robot à trois rotations </span>*</span></span></span>

 **<span style="color: #2dc26b;"><span style="caret-color: rgb(45, 194, 107);">Avantages : </span></span>**

- **<span style="text-decoration: underline;"> Fabrication<span class="Apple-converted-space"> </span>plus efficace :</span>** L’ensemble des pièces peuvent être réalisé en découpe laser ce qui permet une production plus rapide et précise des pièces.

**<span class="Apple-converted-space"><span style="color: #2dc26b;">Inconvénients :</span></span>**

- **<span style="text-decoration: underline;"> Stabilité du stylo :</span>** Assurer que le stylo reste précisément à la position voulue durant les mouvements complexes.
- **<span style="text-decoration: underline;"> Complexité du modèle cinématique inverse :</span>** La gestion des trois rotations (épaule, coude, poignet) rend le calcul du modèle cinématique inverse complexe, crucial pour la précision des mouvements du robot.

**<span lang="FR">Solution 5 : Robot avec bras parallèles </span><span lang="FR"> </span>**

**<span style="color: rgb(45, 194, 107);">Principe : </span>**

Le concept envisagé ici est celui d'un robot à bras parallèle à deux axes. Afin de gérer les déplacements verticaux du stylo le long de l'axe Z, le système sera doté d'un mécanisme pignon-crémaillère. Ce dispositif garantit une transition douce et maîtrisée du stylo, évitant ainsi les saccades ou les décalages qui pourraient compromettre la qualité du tracé.(le stylo montera et descendra avec une fluidité et une régularité qui permettront de maintenir une qualité de dessin constante). Comme pour le modèle à axe en série, les points de pivot au niveau des "coudes" du robot seront équipés de roulements.

<span style="color: rgb(45, 194, 107);">**Croquis :** </span>

 ![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/KFdimage.png)

[![image.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/RNgimage.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/RNgimage.jpeg)

<span style="text-decoration: underline;">figure 11: croquis détaillé de notre robot à bras parallèles </span>

**<span style="color: rgb(45, 194, 107);">Schéma cinématique :</span>**

 ![IMG_19200C22B67A-1.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/img-19200c22b67a-1.jpeg)

<span style="color: rgb(0, 0, 0);"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"> *<span style="text-decoration: underline;">figure 12</span>*</span></span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*<span style="color: #000000;"><span style="font-style: normal;"><u> : s</u></span></span><span lang="FR"><span style="color: #000000;"><span style="font-style: normal;"><u>chéma cinématique du robot à bras </u></span><span style="caret-color: rgb(0, 0, 0);"><u>parallèles</u></span><span style="font-style: normal;"><u> </u></span></span></span>*</span>

**<span style="color: rgb(45, 194, 107);">Avantages : </span>**

- **<span style="text-decoration: underline;">Solidité structurelle :</span>** Les robots parallèles offrent une grande solidité et stabilité, ce qui est avantageux pour des tâches nécessitant de la précision et de la force.
- **<span style="text-decoration: underline;"> Cinématique simplifiée possible </span>:** En configurant les bras du robot pour former un parallélogramme avec les axes de servomoteurs alignés, il est possible de simplifier la cinématique, facilitant ainsi la programmation et le contrôle.

**<span style="color: rgb(45, 194, 107);">Risques et défis:</span>**

- **<span style="text-decoration: underline;"> Complexité cinématique initiale :</span>** Sans cette simplification, la cinématique des robots parallèles peut être initialement plus complexe, nécessitant une compréhension approfondie des systèmes mécaniques.

De plus , il faut s’assurer que les rotations des servomoteurs de 180° permettent de couvrir l’ensemble de la surface souhaitée.


##### <span lang="FR" style="mso-ansi-language: FR;">**Solution retenue**</span>

Suite à une analyse approfondie des différentes options, notre équipe a décidé de privilégier la conception d'un robot parallèle pour la suite du projet. Cette décision s'appuie sur plusieurs facteurs clés :

- **Conformité au cahier des charges :** Le robot parallèle répond efficacement aux exigences spécifiées dans le cahier des charges. Sa structure offre la précision et la solidité requises pour les tâches prévues, tout en permettant une gamme de mouvements adaptée à nos besoins.
- **Faisabilité technique :** Avec les composants et les ressources à notre disposition, la réalisation d'un robot parallèle est non seulement possible mais également pratique. La possibilité de simplifier sa cinématique en configurant ses bras en parallélogramme facilite sa programmation et son contrôle, rendant le projet plus gérable dans le cadre de nos contraintes techniques et temporelles.

<span style="text-decoration: underline;">Nota bene</span> : Le nom de notre robot sera "Maranis"; il est formé en combinant les prénoms Maroua, Marco, et Yanis. Il symbolise l'union de nos efforts et la collaboration au cœur de notre projet...

#### **<span lang="FR" style="mso-ansi-language: FR;">Etape 2 : Conception Détaillée de Notre Projet 🌟🛠️💡 </span>**


#### **<span lang="FR" style="mso-ansi-language: FR;">A) calculs Mécaniques 🛠️ </span>**

À cette étape, nous nous sommes concentrés sur les aspects techniques du projet en abordant la modélisation mécanique appliquée aux bras de notre robot. Notre objectif ? Détailler les modèles géométriques, à la fois direct et inverse, que nous avons développés. En effet, ces modèles sont cruciaux pour préciser la position de l'effecteur du robot.

L'utilisation de ces modèles géométriques nous offre la capacité de réguler avec exactitude la position et l'orientation de l'effecteur, en se basant sur les angles des articulations. Cette précision est fondamentale pour diverses applications dans les domaines de la robotique et de l'automatique, où la manipulation et le positionnement exacts sont primordiaux.

<span style="text-decoration: underline;"><span style="color: rgb(45, 194, 107); text-decoration: underline;">A - Modélisation du problème</span></span>

![Pasted Graphic.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/pasted-graphic.png)

<div class="flex-shrink-0 flex flex-col relative items-end" id="bkmrk-chatgpt" style="text-align: justify;"><div><div class="pt-0.5"><div class="gizmo-shadow-stroke flex h-6 w-6 items-center justify-center overflow-hidden rounded-full"><div class="relative p-1 rounded-sm h-9 w-9 text-white flex items-center justify-center align-center"><span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*figure 13*</span></span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*<span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; color: rgb(0, 0, 0); text-decoration: underline;"><span style="font-style: normal;"> : s</span></span><span lang="FR"><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline;">chéma cinématique du robot à br</span></span>*</span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*<span lang="FR"><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline;">as </span></span>*</span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*<span lang="FR"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span style="caret-color: rgb(0, 0, 0); font-style: normal;">parallèles </span></span></span>*</span></span></div><div class="relative p-1 rounded-sm h-9 w-9 text-white flex items-center justify-center">  
</div></div></div><div class="relative p-1 rounded-sm h-9 w-9 text-white flex items-center justify-center">  
</div></div></div><div class="relative p-1 rounded-sm h-9 w-9 text-white flex items-center justify-center" id="bkmrk--23" style="text-align: justify;">  
</div>- <span style="text-decoration: underline;">Configuration des Moteurs et Simplification Géométrique :</span> Les moteurs de notre robot sont disposés l'un au-dessus de l'autre, mais orientés en sens inverse. Cette configuration particulière permet d'aligner les axes des moteurs, réduisant ainsi l'espace entre deux corps liés et simplifiant de ce fait le modèle géométrique et son inverse. En effet, en alignant les corps opposés à une longueur égale (les quatre bras mesurant la même taille dans notre cas), nous transformons le système en un parallélogramme. Cette transformation apporte plusieurs relations internes utiles au système, liant les angles et les diagonales.

- <span style="text-decoration: underline;">Modélisation et Références du Système </span>: Nous définissons un repère galiléen 𝑅0 = (𝑥0 , 𝑦0 , 𝑧0 ) associé au bâti (0). Le robot est composé de quatre bras : les bras 2 et 4 mesurant une longueur 𝐿1, tandis que les bras 1 et 3 ont une longueur 𝐿2. - Le bras 1 est en liaison pivot autour de l'axe (𝑂0, 𝑧0) avec le bâti. L'angle formé est noté θ1 = (𝑥0, 𝑥1) = (𝑦0, 𝑦1). - Le bras 2, aussi en liaison pivot autour de l'axe (𝑂0, 𝑧0) avec le bâti, a un angle θ2 = (𝑥0, 𝑥2) = (𝑦0, 𝑦2). - Le bras 3 est en liaison pivot autour de l'axe (𝑂3, 𝑧0) avec le bras 2. L'angle α3 = (𝑥2, 𝑥3) = (𝑦2, 𝑦3) est défini, avec le bras 3 restant horizontal et parallèle à l'axe 𝑥0. - Le bras 4, en liaison pivot autour de l'axe (𝑂4, 𝑧0) avec le bras 1, n'est <span style="background-color: rgb(191, 237, 210);">pas visible dans notre modèle simplifié puisque n’intervenant pas dans nos calculs .</span>

L'effecteur du robot se trouve au point P et a pour coordonnées (𝑥, 𝑦) dans ce système.

Cette modélisation permet de comprendre clairement la structure mécanique du robot et facilite la programmation et le contrôle de ses mouvements.

<span style="text-decoration: underline;"><span style="color: rgb(45, 194, 107); text-decoration: underline;">B - Modèle géométrique direct </span></span>

Dans notre projet robotique, nous avons élaboré un modèle géométrique direct qui se base sur des principes de trigonométrie fondamentaux, rendant sa détermination relativement simple. Ce modèle utilise des formules basiques pour calculer les positions du robot.

<p class="callout info">On rappelle que notre modèle se base sur un parallélogramme.  **📐**Or, dans un parallélogramme, les côtés opposés sont égaux et les angles adjacents sont complémentaires. De plus, les diagonales se coupent en leur milieu et forment des triangles rectangles avec les côtés du parallélogramme. Nous pouvons donc utiliser ces propriétés pour établir des relations entre les longueurs des bras .</p>

Dès lors :

Pour un robot standard avec des bras de longueurs différentes, les coordonnées x et y de l'effecteur peuvent être exprimées comme suit :

<table border="1" id="bkmrk-x-%3D-l1-sin%28%CE%B82%29---l2-" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td>x = L1 sin(θ2) - L2 sin(θ1)</td><td>y = L1 cos(θ2) +L2 cos(θ1)</td></tr></tbody></table>

Cependant , nous avons spécifiquement choisi de travailler avec un losange, où ( L = L1 = L2 ). Cette approche réduit la complexité des calculs et permet une meilleure compréhension de la cinématique du robot.

Avec cette simplification, notre modèle géométrique direct se résume à des formules plus simples :

<table border="1" id="bkmrk-%C2%A0x-%3D-l-%28sin%28%CE%B82%29---si" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td><p class="callout success"> x = L (sin(θ2) - sin(θ1))</p>

</td><td><p class="callout success">y = L (cos(θ2) + cos(θ1))</p>

</td></tr></tbody></table>

💭 **Remarque** :"Pour le détail des calculs, veuillez consulter le PDF intitulé 'Calcul Modèle Géométrique', joint en annexe."

Nous avons pu valider notre modèle géométrique direct en utilisant SolidWorks. Après avoir conçu une version simplifiée de notre robot et défini des angles pilotes, nous avons simulé plusieurs positions pour obtenir les coordonnées <span class="math math-inline"><span class="katex"><span class="katex-mathml">x</span></span></span> et <span class="math math-inline"><span class="katex"><span class="katex-mathml">y via le logiciel</span></span></span>. La comparaison de ces résultats avec ceux calculés par nos formules mathématiques a montré une correspondance notable, validant ainsi la fiabilité de notre modèle géométrique.

![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/rs7image.png)

<span style="text-decoration: underline;">figure 14: capture d'écran de notre teste du modèle géométrique direct sur SolidWorks</span>

<span style="text-decoration: underline;"><span style="color: rgb(45, 194, 107); text-decoration: underline;">C- Modèle géométrique Inverse :</span></span>

L’élaboration du modèle géométrique inverse est une étape essentielle pour le contrôle précis de notre robot. Ce modèle nous permet de calculer les angles nécessaires aux moteurs pour positionner l'effecteur à un point spécifique (x, y) dans l'espace.

Pour commencer, nous avons établi l'angle α1 en utilisant la fonction arctangente, qui est dérivée du rapport entre les côtés opposé et adjacent d'un triangle rectangle formé par les coordonnées de l'effecteur :

<span style="background-color: rgb(248, 202, 198);">α1 =Arctan(x/y)</span>

Ensuite, nous avons appliqué le théorème de Pythagore au triangle rectangle ayant pour longueur 𝑥, 𝑦 𝑒𝑡 𝑙 pour déterminer la longueur de l'hypoténuse l en fonction des coordonnées x et y :

<span style="background-color: rgb(248, 202, 198);">𝑙 = √(x^2+y^2)</span>

En utilisant la propriété fondamentale des triangles selon laquelle la somme des angles internes est égale à 180°, nous avons déduit une relation entre les angles α3 et α2:

<span style="background-color: rgb(248, 202, 198);">α3 = 180°-2\*α2</span> et <span style="background-color: rgb(248, 202, 198);"> α2=90°-α3/2</span>

Enfin, grâce à la loi des cosinus ou la formule d'Al-Kashi, nous avons pu exprimer α3 en termes des longueurs des bras L1 , L2 et de l’hypoténuse 𝑙 :

<span style="background-color: rgb(248, 202, 198);">α3= arccos((L1^2+L2^2-𝑙^2)/(2 L1 L2))</span>  
Ces relations nous permettent de déterminer les angles des moteurs:

<span style="background-color: rgb(248, 202, 198);">θ1=α2-α1 </span> et <span style="background-color: rgb(248, 202, 198);">θ2=α2+α1</span>

Toutefois, grâce à notre simplification du modèle par un losange ; longueur 𝐿 = 𝐿1 = 𝐿2. On obtient les relations suivantes :

<table border="1" id="bkmrk-%CE%B11-%3Darctan%28x%2Fy%29-%CE%B12%3D9" style="border-collapse: collapse; width: 34.938272%; height: 274px;"><colgroup><col style="width: 100%;"></col></colgroup><tbody><tr><td><p class="callout success">α1 =Arctan(x/y)</p>

</td></tr><tr><td><p class="callout success">α2=90°-α3 /2</p>

</td></tr><tr><td><p class="callout success">α3= arcos((2L^2-𝑙^2)/2L^2)</p>

</td></tr><tr><td><p class="callout success">θ1=α2-α1</p>

</td></tr><tr><td><p class="callout success">θ2=α2+α1</p>

</td></tr></tbody></table>

Avec ces formules, nous avons en main un système complet qui nous permet de calculer les angles des moteurs pour positionner précisément l'effecteur à un point (x, y) dans l'espace, en considérant les bras de longueur égale.

<span style="text-decoration: underline;"><span style="color: rgb(45, 194, 107); text-decoration: underline;">D - Modélisation de la translation :</span></span>

<p class="callout info">Notre mécanisme de translation axiale s'appuie sur un agencement pignon-crémaillère. La crémaillère présente un diamètre de base Bbase 41,25 mm. En prenant en compte un module de conception m de 1,5, nous procédons au calcul du diamètre effectif Deff qui sera utilisé dans les calculs suivants .</p>

- Le diamètre effectif est calculé comme suit : Deff = Bbase + 2,5 m=41,25+2,5×1,5=45 mm

<p class="callout warning">Le calcul du diamètre effectif s'appuie sur des données initiales issues de nos premières simulations réalisées sur SolidWorks, en particulier pour le mécanisme pignon-crémaillère. Il est important de noter que ces chiffres, bien que précis dans le cadre de nos simulations initiales sont susceptibles d'évoluer et d'être ajustés au fur et à mesure de l'avancement de notre projet et à mesure que de nouvelles données seront recueillies et analysées.</p>

- Le lien entre le nombre de révolutions complètes Nrev du servomoteur Emax ES08A et l'angle de déplacement θ est donné par la relation :

<span style="background-color: rgb(248, 202, 198);">Nrev=θ/360°</span>

La position verticale z de la plaque mobile peut être déduite à partir de θ en utilisant l'équation : z=Nrev \*Deff \* pi ⟹

<span style="background-color: rgb(248, 202, 198);">z=θ/360° \* Deff \* pi</span>

Ceci nous conduit aux expressions des modèles géométriques de translation axiale :

<p class="callout success"> z=θ/360° \* Deff \* pi ( modele direct)  
θ=(360°\*z)/(Deff \* pi ) ( modèle inverse)</p>

Ces équations nous fournissent un moyen précis pour établir la position verticale de la plaque en se basant sur l'angle de rotation du servomoteur et, à l'inverse, pour calculer l'angle nécessaire pour atteindre une position verticale déterminée.


#### **<span lang="FR" style="mso-ansi-language: FR;"> B) conception CAO 🖥️✏️📐: </span>**

<span lang="FR" style="mso-ansi-language: FR;">Nous passons maintenant à la phase de modélisation des composants de notre robot. Nous utiliserons SolidWorks pour cette tâche, un outil de CAO parfait pour transformer nos plans en modèles numériques. C'est une étape importante pour rendre nos idées concrètes et fonctionnelles.</span>

<span lang="FR" style="mso-ansi-language: FR;">Notre création robotique est une interprétation du robot pantographe, caractérisée par une conception où les axes de deux servomoteurs convergent, orchestrant les mouvements des bras et en conséquence, la trajectoire du stylo.</span>

<span lang="FR" style="mso-ansi-language: FR;">La structure du robot est articulée autour de trois sous-ensembles principaux:</span>

1. **Le bâti :** Formant la fondation du robot, ce premier sous-ensemble est chargé d'accueillir et de stabiliser les deux servomoteurs principaux. Ces moteurs sont essentiels pour actionner les mouvements latéraux et longitudinaux, conférant au robot une capacité de translation précise sur le plan 2D.
2. **Les Bras et le Porte-Stylo :** Ce sous-ensemble représente les membres actifs du robot. Attachés aux servomoteurs, les bras articulés du robot sont la clé de sa capacité à dessiner. Ils suivent avec fidélité les instructions de mouvement pour guider le stylo sur la surface dédiée. ,
3. **Le Mécanisme de Translation Verticale :** Incorporant un système de pignon et crémaillère, ce troisième sous-ensemble enrichit le robot d'une fonctionnalité verticale. Il permet à la surface de dessin de s'élever ou de s'abaisser, donnant au robot la faculté de ponctuer le papier de dessins en pointillés ou de lever le stylo entre les points, conformément aux spécifications techniques préétablies.

**- <span style="text-decoration: underline;">*Idées Créatives pour la Conception des Pièces*</span> 🎨🔩**

 ![image.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/QgOimage.jpeg) .

<span lang="FR" style="mso-ansi-language: FR;"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*figure 14*</span></span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline; color: #000000;"> : Idée de bâti pour la </span><span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><u>modélisation</u></span></span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline; color: #000000;"> </span></span></span>

 ![2.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/aSJ2.jpg)

<span lang="FR" style="mso-ansi-language: FR;"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*figure 15*</span></span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline; color: #000000;"> : Idée de bras pour la </span><span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><u>modélisation</u></span></span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline; color: #000000;"> </span></span></span>

 ![3.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/lJR3.jpg)

<span lang="FR" style="mso-ansi-language: FR;"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*figure 16*</span></span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline; color: #000000;"> : Idée de plaque élévatrice pour la </span><span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><u>modélisation</u></span></span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline; color: #000000;"> </span></span></span>

**-<span style="text-decoration: underline;"> le Développement des Pièces 🛠️:</span>**

![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/QJiimage.png)

<span style="text-decoration: underline;"><span lang="FR" style="font-size: 11pt; line-height: 107%; font-family: Calibri, sans-serif; color: black; text-decoration: underline;">*Figure 17 : Capture d’écran de notre conception de robot sur solidWorks*</span></span>

**<span lang="FR" style="mso-ansi-language: FR;">A)</span><span lang="FR" style="font-family: 'Arial',sans-serif; mso-fareast-font-family: Arial; mso-ansi-language: FR;"> </span><span lang="FR" style="mso-ansi-language: FR;">Bâtis :</span>**

<span lang="FR" style="mso-ansi-language: FR;">Notre bâti est composé de quatre pièces différentes. Nous avons créé des logements pour les deux servomoteurs grâce aux dimensions qui nous ont été fournies. Notre bâti assure ainsi le maintien en position des deux servomoteurs grâce à des liaisons appuis-plan réalisées par un épaulement. La mise en position est assurée par des vis qui seront installées lors du montage de nos pièces. </span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/GYcimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/GYcimage.png)

<span style="text-decoration: underline;"><span lang="FR" style="mso-ansi-language: FR;">*Figure 18 : Epaulement et montage des moteurs sur le bâti*</span></span><span lang="FR" style="mso-ansi-language: FR;"><span style="mso-spacerun: yes;"> </span></span>

**<span lang="FR" style="mso-ansi-language: FR;">B)</span><span lang="FR" style="font-family: 'Arial',sans-serif; mso-fareast-font-family: Arial; mso-ansi-language: FR;"> </span><span lang="FR" style="mso-ansi-language: FR;">Bras:<span style="mso-spacerun: yes;"> </span></span>**

<span lang="FR" style="mso-ansi-language: FR;">L'assemblage du bras de notre robot se compose de quatre pièces distinctes : deux demi-bras, l'un côté moteur et l'autre côté effecteur, ainsi qu'un support cylindrique qui nous permettra de loger notre marqueur. Pour assembler les deux demi-bras, nous utiliserons un roulement à billes et un axe en métal afin d'assurer la liaison pivot. </span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/R0Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/R0Eimage.png)

<span style="text-decoration: underline;">*<span lang="FR" style="mso-ansi-language: FR;">Figure 19: <span lang="FR" style="font-size: 11pt; line-height: 107%; font-family: Calibri, sans-serif; color: black; text-decoration: underline;">assemblage des bras</span></span>*</span>

- <span lang="FR" style="mso-ansi-language: FR;">Demi-bras 1: (coté moteur)</span>

<span lang="FR" style="mso-ansi-language: FR;">Ce demi-bras est une bielle qui permet la liaison directe entre le servomoteur et le reste du bras robotique. Il est fixé au servomoteur via un système de vis.De l’autre côté de la pièce, un enlèvement de matière circulaire a été creusé pour laisser de la place à un roulement à bille.</span>

![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/xWtimage.png)

*<span style="text-decoration: underline;"><span lang="FR" style="mso-ansi-language: FR;"><span lang="FR" style="font-size: 11pt; line-height: 107%; font-family: Calibri, sans-serif; color: black; text-decoration: underline;">Figure 20 : demi-bras 1</span></span></span>*

- <span lang="FR" style="mso-ansi-language: FR;">Demi-bras 2 : (cote effecteur) </span>

Ce demi-bras est conçu pour tenir et manipuler l'effecteur, ici un marqueur.À une extrémité, ce demi-bras présente un creux compatible avec la liaison pivot, permettant une rotation fluide et un alignement précis avec le premier demi-bras. L'autre extrémité est spécialement élargie pour former un anneau, dans lequel est placé le cylindre creux tenant le marqueur.

![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/t6eimage.png)

<span lang="FR" style="mso-ansi-language: FR;">  
<span style="text-decoration: underline;">*Figure 21 : demi-bras 2* </span>  
</span>

<span lang="FR" style="mso-ansi-language: FR;">*💭 **Remarque** : La pièce mentionnée ici se trouve en deux exemplaires dans l'assemblage du robot. Les extrémités en forme d'anneau de ces deux composants sont disposées l'une sur l'autre, créant ainsi une superposition alignée. Ces deux bras sont alors connectés l'un à l'autre par l'intermédiaire d'une pièce cylindrique, le support du stylo , dont nous détaillons la conception et la fonction dans la suite de notre présentation.*</span>

- Support du stylo

Le support à marqueur est constitué d’un cylindre creux et d’un rebord rectangulaire qui assure un contact appui plan avec l’anneau d’une des bielles, ce qui évite que le support ne glisse. Il est essentiel que les bras puissent tourner autour de ce cylindre, d'où la nécessité d'une liaison pivot avec un léger jeu entre le cylindre et les deux demi-bras côté effecteur. Sur le bord du cylindre, un trou a été aménagé pour permettre l'insertion d'un axe. Cet axe sert à maintenir et ajuster la position du marqueur à l'intérieur du support. Un écrou fixé sur cet axe garantira que le marqueur reste stable et en place dans le cylindre.

 ![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/FTsimage.png)

<span style="text-decoration: underline;"><span lang="FR" style="mso-ansi-language: FR;">*Figure 22 : Support du marqueur*</span></span>

<span lang="FR" style="mso-ansi-language: FR;">**C) Plaque montante:**</span>

<span lang="FR" style="mso-ansi-language: FR;">Afin de soulever le stylo et exécuter les motifs de dessin spécifiés dans notre cahier des charges, nous avons choisi d'implémenter un mécanisme de pignon-crémaillère. Ce système est conçu pour élever la plaque sur laquelle le dessin est effectué. Pour la conception de ce mécanisme, nous avons utilisé l'outil Toolbox de Solidworks, un choix stratégique qui nous a permis de modéliser avec précision et efficacité le système pignon-crémaillère adapté à nos besoins spécifiques tout en gagnant du temps . Cet outil nous a offert la flexibilité nécessaire pour ajuster les paramètres de conception .   
</span>

<p class="callout warning"><span lang="FR" style="mso-ansi-language: FR;">Il est important de veiller à la cohérence du module utilisé pour le pignon et la crémaillère, car ils doivent impérativement être identiques pour assurer un fonctionnement correct et efficace. Pour notre projet, nous avons opté pour un module de 1,5. Ce choix garantit une compatibilité parfaite entre le pignon et la crémaillère, essentielle pour une transmission de mouvement fluide et précise.</span></p>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/pIwimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/pIwimage.png)

<span style="text-decoration: underline;">*<span lang="FR" style="mso-ansi-language: FR;">Figure 23 : plaque montante</span>*</span>

<span lang="FR" style="mso-ansi-language: FR;">Dans notre conception, nous avons soigneusement intégré une encoche dans la plaque de dessin spécifiquement conçue pour y loger la crémaillère (pour renforcer la fixation de la crémaillère sur la plaque, nous prévoyons d'ajouter des points de colle aux emplacements stratégiques.)</span>

<span lang="FR" style="mso-ansi-language: FR;">Par ailleurs, pour garantir la stabilité de la plaque de dessin, nous avons conçu une pièce supplémentaire ( petit pied représenté en noir sur la figure 21). Cette pièce est spécialement élaborée pour accueillir un axe .L'insertion de cet axe dans la pièce conçue assure un maintien ferme et stable de la plaque, une caractéristique essentielle pour la précision et la qualité des dessins réalisés par le robot.</span>

<span lang="FR" style="mso-ansi-language: FR;">Enfin , pour maintenir en place l'ensemble des pièces précédemment évoquées, nous allons découper une  
plaque sur laquelle nous allons assembler toutes ces pièces.</span>

<div class="flex-shrink-0 flex flex-col relative items-end" id="bkmrk-chatgpt-1"><div><div class="pt-0.5"><div class="gizmo-shadow-stroke flex h-6 w-6 items-center justify-center overflow-hidden rounded-full"><div class="relative p-1 rounded-sm h-9 w-9 text-white flex items-center justify-center">ChatGPT</div></div></div></div></div>**- Processus de Fabrication 🏗️⚙️**

<span lang="FR" style="mso-ansi-language: FR;">Nous avons choisi la découpe laser pour fabriquer la majorité nos pièces. Cette décision découle de plusieurs raisons. Tout d'abord, la découpe laser offre une précision remarquable dans la réalisation de pièces, permettant des finitions nettes et détaillées. De plus, elle est rapide et efficace, rendant le processus de fabrication plus rapide comparé à l'impression 3D, qui peut prendre plus de temps pour produire des objets complexes. La découpe laser excelle également dans la découpe de matériaux variés, offrant une flexibilité dans le choix des matériaux adaptés aux besoins spécifiques du projet. En outre, elle est souvent plus économique pour la production en série de pièces, offrant une alternative rentable par rapport à l'impression 3D, notamment pour des applications où la solidité mécanique et la précision sont essentielles.  
</span>

<span lang="FR" style="mso-ansi-language: FR;">Toutefois , nous avons opté pour l'impression 3D pour la fabrication des pieds qui servent de support à notre plaque de dessin, ainsi que pour le support cylindrique destiné à accueillir le stylo. Cette décision est motivée par la complexité de la conception de ces pièces et leur épaisseur importante , qui rendent leur fabrication difficile avec la découpe laser disponible à Polytech. L'impression 3D offre la flexibilité et la précision nécessaires pour réaliser ces composants aux formes spécifiques et aux dimensions requises.</span>

<p class="callout info"><span lang="FR" style="mso-ansi-language: FR;">Notre modélisation Solidworks est accessible en annexe dans le fichier zip "solidworksRobot.zip"</span></p>

<p class="callout info"><span lang="FR" style="mso-ansi-language: FR;">Nos fichiers DXF et SVG, préparés pour la découpe laser, sont également disponibles dans "solidworksRobot.zip" .</span></p>



#### **<span lang="FR" style="mso-ansi-language: FR;">C)<span style="text-decoration: underline;"> Etude électrique </span>⚡🔌</span>**

Dans cette section, nous détaillons l'architecture électronique de notre robot, en mettant l'accent sur le matériel, l'alimentation et la connectique.<span class="Apple-converted-space"> </span>

- ***<span style="text-decoration: underline;"><span class="Apple-converted-space">Le matériel utilisé :</span></span>***

Le cœur de notre système de commande est une carte Arduino Uno. Elle est configurée pour contrôler trois servomoteurs : deux servomoteurs HS422 et un servomoteur Emax ES08A. De plus, nous intégrons trois boutons-poussoirs et un joystick pour assurer une interaction utilisateur intuitive, en particulier pour la commande manuelle du stylo. La visualisation de l'état du système et des modes de fonctionnement est rendue possible par l'utilisation de LED : deux pour signaler l'activation des fonctions principales et une troisième pour indiquer le type de trait (continu ou pointillé). Les connexions électriques entre ces composants sont établies à l'aide d'une plaque de prototypage.

- ***<span style="text-decoration: underline;"><span class="Apple-converted-space">L'alimentation :</span></span>***

Le système robotique est alimenté directement par une carte Arduino Uno, car les besoins en tension et en courant sont compatibles avec ses capacités ( suffisamment faibles). Pour garantir une source d'énergie stable et fiable, nous utiliserons le chargeur standard de l'Arduino, branché via sa prise jack, assurant ainsi le fonctionnement optimal de notre robot.

- *<span style="text-decoration: underline;">**Connectique des Éléments à l’Arduino :**</span>*

Le tableau ci-dessous récapitule la connexion des divers composants aux pins correspondants de la carte Arduino Uno :

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/hUlimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/hUlimage.png)

- <span style="text-decoration: underline;">***<span lang="FR" style="mso-ansi-language: FR;">Le joystick:</span>***</span>

Le joystick est un composant clé pour la deuxième fonctionnalité attendue, à savoir le contrôle manuel du déplacement du stylo dans un carré de 5 cm de côté. Il dispose de trois sorties : un bouton poussoir et deux potentiomètres fournissant des valeurs analogiques entre 0 et Vcc. Ces valeurs sont traduites en pourcentages de vitesse pour chaque axe, variant de -100% à +100%, permettant ainsi un contrôle précis et réactif du mouvement du stylo.

- <span style="text-decoration: underline;">***Schéma électrique :***</span>

Pour la réalisation du schéma électrique et le câblage de notre solution robotique, nous avons choisi d'utiliser le logiciel Tinkercad. Cet outil en ligne s'est révélé être un choix judicieux. En effet, le logiciel offre une large gamme de composants électroniques virtuels qui peuvent être facilement glissés et déposés dans le schéma, permettant ainsi une représentation précise de notre configuration matérielle.

![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/XJeimage.png)<span style="text-decoration: underline;">figure 24 : Illustration du câblage de notre robot </span>

💭 **Remarque** : Ici ,le joystick est imité avec deux potentiomètres et un bouton-poussoir, en raison de l'absence de joystick dans le logiciel. Nous avons également inclus un bloc d'alimentation temporaire pour tester la conformité électrique du circuit, qui ne sera pas inclus dans le montage final.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/r02image.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/r02image.png)<span style="text-decoration: underline;">figure 25: Schéma électrique de notre robot</span>

#### **<span lang="FR" style="mso-ansi-language: FR;"> D)<span style="text-decoration: underline;"> Algorithmes de commande 📊💻</span></span>**

- ***<span style="text-decoration: underline;"> Les Bibliothèques utilisées: </span>***

La bibliothèque `Servo.h` est un composant essentiel de l'environnement de développement Arduino, spécialement conçue pour la commande des servomoteurs. Cette bibliothèque intègre un ensemble de fonctions destinées à simplifier la gestion des signaux PWM, qui sont important pour le contrôle précis de la position et de la vitesse des servomoteurs. Parmi les fonctions offertes par `Servo.h`, on retrouve :

\- `attach()` : pour lier un servomoteur à une broche spécifique.

\- `write()` : pour définir la position du servomoteur en degrés.

\- `read()` : pour lire la position actuelle du servomoteur.

\- `writeMicroseconds()` : pour un contrôle plus fin en spécifiant la durée de l'impulsion.

\- `detach()` : pour libérer la broche associée au servomoteur.

\- 'pinMode()' : pour donner le mode d’entrée ou de sortie de la broche spécifiée.

Grâce à cette bibliothèque, il est possible de gérer simultanément plusieurs servomoteurs de manière autonome, ce qui est indispensable pour la complexité de notre projet.

- ***<u>Développement d'algorithmes secondaires : </u>***

Notre programme intègre diverses fonctions secondaires qui permettent de faire fonctionner les fonctions principales.

- Une fonction de détermination des coordonnées actuelles basée sur les angles des servomoteurs, conformément au modèle géométrique du robot.
- Une fonction de calcul des angles requis pour les servomoteurs afin d'atteindre un point cible, suivant le modèle géométrique inverse.
- Une fonction spécifique pour localiser le point le p lus proche sur un cercle de rayon 2,5 cm, centré sur la surface de travail, par rapport à la position actuelle du stylo.
- Une fonction de calcul du point de départ optimal pour tracer une ligne de 5 cm de longueur à l'intérieur d'un carré de 5 cm de côté.
- Une fonction d'estimation de l'intervalle d'angles possibles pour les segments de 5 cm débutant au point actuel, tout en restant dans les limites du carré prédéfini.
- Une fonction de commande qui ajuste la hauteur de la plaque de dessin, permettant ainsi au stylo de toucher ou de se retirer de la surface, facilitant de ce fait la création de motifs continus ou en pointillés.

- <span style="text-decoration: underline;">***Le fonctionnement général de notre algorithme :***</span>

La logique centrale de notre programme est conçue pour réagir aux signaux des boutons poussoirs, initiant ainsi des actions prédéfinies correspondantes.

**-** <span style="text-decoration: underline;">*Fonction de Dessin de Cercle :*</span>

La première opération programmée est le dessin d'un cercle. Cette fonction débute par la localisation du point initial du cercle. Une fois ce point identifié, elle positionne le stylo pour débuter le tracé et entreprend ensuite le parcours circulaire, complétant un tour complet de 360 degrés.

*<span style="text-decoration: underline;">- Fonction de Traçage de Ligne :</span>*

La seconde fonction a pour objectif de tracer une ligne droite de 5 cm à l'intérieur d'une zone carrée de dimensions égales. Le programme dirige d'abord l'effecteur vers le point de départ le plus approprié à l'intérieur de ce carré. Il utilise ensuite une routine secondaire pour générer une orientation aléatoire, mais admissible pour le tracé, avant de procéder à l'exécution du tracé de la ligne.

<span style="text-decoration: underline;">*- Fonction de Contrôle Manuel :*</span>

La troisième fonctionnalité offre un contrôle manuel du mouvement du stylo via un joystick. Les signaux issus des potentiomètres du joystick sont convertis en un pourcentage de vitesse, qui peut varier de -100% à 100% pour les deux axes du plan.

<span style="text-decoration: underline;">*- Fonction de Navigation Autonome :*</span>

Enfin, une fonction de navigation autonome est implémentée pour déplacer le robot vers un point cible prédéterminé. Cette fonction calcule les angles nécessaires pour chaque servomoteur afin de diriger précisément le stylo vers le point désigné.

<p class="callout info">Notre algorithme est entièrement accessible dans le document joint, intitulé "code robot maranis.ino".</p>

<p class="callout info">Le pseudo code de notre programme est également accessible dans le document joint, intitulé "Les différents pseudo-codes du programme.pdf"</p>

#### **<span lang="FR" style="mso-ansi-language: FR;"> E)<span style="text-decoration: underline;"> Test de notre modèle électrique-informatique ⚡🖥️</span></span>**

<span lang="FR" style="mso-ansi-language: FR;">Pour valider notre modèle électrique et informatique, nous avons effectué une simulation sur le simulateur Arduino Wokwi. Les résultats se sont révélés concluants : les servomoteurs réagissent conformément à nos attentes, en réponse aux signaux des boutons poussoirs et du joystick en mode manuel. Cette simulation est accessible </span>[ici](https://wokwi.com/projects/391181415387739137)<span lang="FR" style="mso-ansi-language: FR;">, permettant ainsi de tester et d'expérimenter notre conception directement.</span>

#### **<span lang="FR" style="mso-ansi-language: FR;"> F)</span>**<span style="text-decoration: underline;">**<span lang="FR" style="mso-ansi-language: FR;"> Montage et test du robot 🛠️🤖✔️</span>**</span>

Nous avons consacré la troisième séance à la fabrication des différentes pièces de notre robot. Pour garantir que notre plaque verticale soit bien droite, nous avons ajouté une autre plaque de guidage afin de nous assurer que nos deux axes métalliques soient parfaitement parallèles.

 ![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/F4iimage.png)

 <span style="text-decoration: underline;">figure 26: Photo de notre première version de robot </span>

Lors de l'exécution de notre code, la translation selon l'axe Z, assurée par la plaque de dessin pour réaliser les pointillés, fonctionnait parfaitement.

 ![gif yanis .gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/gif-yanis.gif)

 <span style="text-decoration: underline;">figure 27: Gif de la montée de notre plaque de dessin </span>

Cependant, nous avons constaté que nos bielles ne se déplaçaient pas comme prévu. Ce dysfonctionnement était dû à la grande défectuosité des petits servomoteurs qui contrôlaient le mouvement des bielles, présentant une erreur d'environ 30 % par rapport aux performances attendues.

<span lang="FR" style="mso-ansi-language: FR;">*💭 **Remarque*** </span>: Après plusieurs recherches, nous avons découvert que ces servomoteurs fonctionnaient de 0 à 280 degrés, et non de 0 à 180 degrés comme mentionné dans la documentation.

<p class="callout warning">Malheureusement, notre montage ne permettait pas simplement de remplacer ces moteurs par des plus grands. Néanmoins, nous n'avons pas baissé les bras et avons décidé de repartir de zéro afin de concevoir un modèle nous permettant d'utiliser de grands servomoteurs pour les bras de notre robot et un petit servomoteur pour le mouvement de translation.</p>

**\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_**


#### **<span lang="FR"><span style="text-decoration: underline;">Proposition de Réalisation du nouveau Robot :</span>🤖🔧</span>**

#### A) <span style="text-decoration: underline;">Principe de Conception :</span>

Dans le cadre du développement de cette nouvelle version de notre robot, l'objectif principal a été de concevoir un système où les composants sont agencés de manière optimale pour que les plaques puissent à la fois supporter le poids des servomoteurs et minimiser le gaspillage de matériel. Pour ce faire, nous avons opté pour une approche de réutilisation des composants existants tout en éliminant les éléments devenus superflus.

Nous avons commencé par démonter la partie supérieure de l'ancien robot, tout en conservant ses bras, ce qui nous a permis de réduire les coûts et de limiter l'impact environnemental associé à la production de nouvelles pièces.

Par la suite, nous avons procédé à la réduction dimensionnelle des deux axes de guidages qui permettaient auparavant à la plaque dessin de se lever, en optant pour une solution plus compacte et efficace. Nous avons choisi d'utiliser uniquement le palonnier d'un petit servomoteur pour réaliser le mouvement de translation de la plaque (retirant ainsi le mécanisme de pignon-crémaillère). Cette modification a non seulement simplifié la conception globale, mais elle a aussi contribué à alléger le robot.

![CamScanner 19-05-2024 17.12(1)_1.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/camscanner-19-05-2024-17-121-1.jpg)

 <span style="text-decoration: underline;">figure 28 : dessin de l'allure de notre nouvelle version de robot écrivain </span>

Cette approche révisée offre donc une structure plus légère et économiquement viable, tout en conservant l'efficacité et la fonctionnalité requises pour les tâches que le robot est destiné à accomplir.

####  B) <span style="text-decoration: underline;"><span style="mso-ansi-language: FR;">Schéma cinématique :</span></span>

**[![IMG-2767 (1).jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/img-2767-1.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/img-2767-1.jpg)**

<div class="relative p-1 rounded-sm h-9 w-9 text-white flex items-center justify-center align-center" id="bkmrk-figure-29%C2%A0%3A-sch%C3%A9ma-c"><span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*figure 29*</span></span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*<span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; color: rgb(0, 0, 0); text-decoration: underline;"><span style="font-style: normal;"> : s</span></span><span lang="FR"><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline;">chéma cinématique de notre nouveau robot </span></span>*</span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*<span lang="FR"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span style="caret-color: rgb(0, 0, 0); font-style: normal;"> </span></span></span>*</span></span></div><div class="relative p-1 rounded-sm h-9 w-9 text-white flex items-center justify-center align-center" id="bkmrk--38"></div><div class="relative p-1 rounded-sm h-9 w-9 text-white flex items-center justify-center align-center" id="bkmrk--39"></div>#### <span lang="FR" style="mso-ansi-language: FR;">C) <span style="text-decoration: underline;">Conception Détaillée de Notre Nouveau Robot :</span></span>

### **<span style="font-variant-ligatures: normal; color: rgb(45, 194, 107);"><span lang="FR"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal;"><span style="caret-color: rgb(0, 0, 0);"><span style="color: rgb(45, 194, 107);">1- </span><span style="text-decoration: underline; color: rgb(45, 194, 107);">Calcul Mécanique :</span></span></span></span></span>**

<span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*<span lang="FR"><span style="color: rgb(0, 0, 0);"><span style="caret-color: rgb(0, 0, 0); font-style: normal;">Pour analyser la mécanique du système, nous avons étudié les deux triangles, O1BP et O2AC, où P représente le point d'intersection entre la droite BC et celle passant par O1. Cela nous a permis de calculer les différents paramètres nécessaires pour notre conception.</span></span></span>*</span>

<span style="mso-ansi-language: FR;">Grace à la formule d’Al Kashi on a : </span>

<span style="mso-ansi-language: FR;">α = arcos((l1<sup>2</sup> – l4<sup>2</sup> + O1P<sup>2</sup>)/(2L1\*OP1))<span style="mso-spacerun: yes;"> </span>avec OP1 = √((-a+x)^2+y^2)</span>

<span style="mso-ansi-language: FR;"><span style="mso-spacerun: yes;"> </span>β = arctan(y / (a-x))</span>

<p class="callout success"><span style="background-color: rgb(191, 237, 210);">θ1= π – (α - β) </span></p>

<span style="mso-ansi-language: FR;">δ = arcos( (l2<sup>2</sup> – l3<sup>2</sup> + O2C<sup>2</sup>)/ 2\*l2\*O2C) avec O2C= √(a+x)<sup>2</sup>-y<sup>2</sup></span>

<span style="mso-ansi-language: FR;">et ϒ = arctan (y/(a+x))</span>

<p class="callout success"><span style="mso-ansi-language: FR;">Donc <span style="background-color: rgb(191, 237, 210);">θ2 = δ + ϒ</span></span></p>


### **<span style="font-variant-ligatures: normal; color: rgb(45, 194, 107);"><span lang="FR"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal;"><span style="caret-color: rgb(0, 0, 0);"><span style="color: rgb(45, 194, 107);">2- </span><span style="text-decoration: underline; color: rgb(45, 194, 107);">Conception CAO:</span></span></span></span></span>**

Le nouveau robot est composé de trois sous-ensembles principaux :

1. **Le Bâti :** Plus compact, il héberge deux grands servomoteurs pour les mouvements latéraux et longitudinaux, permettant une navigation précise sur le plan 2D.
2. **Les Bras et le Porte-Stylo :** Les bras du robot sont articulés et reliés aux servomoteurs, permettant des mouvements fluides. Le porte-stylo, situé à l'extrémité des bras, maintient fermement un stylo.
3. **Le Mécanisme de Translation Verticale :** Permet l'ajustement de la hauteur de la plaque pour réaliser les pointillés.

### **<span style="font-variant-ligatures: normal; color: rgb(45, 194, 107);"><span lang="FR"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal;"><span style="caret-color: rgb(0, 0, 0);"><span style="color: rgb(45, 194, 107);">3- <span style="text-decoration: underline;">Développement des pièces :</span> </span></span></span></span></span>**

**1) Bâti :**

Notre bâti est constitué de deux éléments distincts.<span style="mso-ansi-language: FR;"><span style="font-size: 11.0pt; line-height: 107%; font-family: 'Calibri',sans-serif; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: Arial; mso-bidi-theme-font: minor-bidi; mso-ansi-language: FR; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"> Sur la plaque horizontale nous avons créé des logements pour les deux servomoteurs grâce aux dimensions qui nous ont été fournies. Notre bâti assure ainsi la mise en position des deux servomoteurs grâce à des liaisons appuis-plan réalisées par un épaulement. Le maintien en position est assurée par des vis qui seront installées lors du montage de nos pièces.</span></span>

### <span style="text-decoration: underline;"><span style="mso-ansi-language: FR;"><span style="font-size: 11.0pt; line-height: 107%; font-family: 'Calibri',sans-serif; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: Arial; mso-bidi-theme-font: minor-bidi; mso-ansi-language: FR; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">[![Screenshot 2024-05-18 210043.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/screenshot-2024-05-18-210043.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-18-210043.png)</span></span></span>

<div class="relative p-1 rounded-sm h-9 w-9 text-white flex items-center justify-center align-center" id="bkmrk-figure-30%C2%A0%3A-capture-"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*figure 30*</span></span><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; color: rgb(0, 0, 0); text-decoration: underline;"><span style="font-style: normal;"> : capture d'écran SolidWorks de notre </span></span><span lang="FR"><span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><u>bâti</u></span></span></span></span></div>**2) Bras :**

L'assemblage des bras de notre robot conserve la configuration du modèle précédent, constitué de quatre pièces distinctes. Cela inclut deux demi-bras, l'un attaché côté moteur et l'autre côté effecteur, ainsi qu'un support cylindrique conçu pour tenir un marqueur. Pour relier les deux demi-bras, nous employons un roulement à billes accompagné d'un axe en métal, formant ainsi une liaison pivot robuste et fiable. Cette conception permet une rotation fluide et précise

### <span style="text-decoration: underline;">[![Screenshot 2024-05-18 210928.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/screenshot-2024-05-18-210928.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-18-210928.png)</span>

#### <span style="color: rgb(0, 0, 0);"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"> </span></span><span style="text-decoration: underline;"><span style="text-decoration: underline; color: rgb(0, 0, 0);"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*figure 31*</span></span><span style="font-variant-ligatures: normal;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline; color: rgb(0, 0, 0);"><span style="font-style: normal;"> : capture d'écran SolidWorks de l'assemblage de nos bras </span></span></span></span>


**3) Plaque Montante :**

Pour faciliter la translation verticale selon l'axe Z, nous avons équipé une plaque horizontale d'un petit servomoteur. Cette plaque est solidement maintenue par trois axes parallèles, assurant ainsi une bonne stabilité et précision lors des mouvements verticaux. Le palonnier du servomoteur est spécifiquement utilisé pour élever et abaisser la plaque de dessin.

<span style="mso-ansi-language: FR;">[![Screenshot 2024-05-18 212345.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/screenshot-2024-05-18-212345.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-18-212345.png)</span>

#### <span style="color: rgb(0, 0, 0);"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"> </span></span><span style="text-decoration: underline;"><span style="text-decoration: underline; color: rgb(0, 0, 0);"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*figure 32*</span></span><span style="font-variant-ligatures: normal;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline; color: rgb(0, 0, 0);"><span style="font-style: normal;"> : capture d'écran SolidWorks de notre nouvelle plaque de dessin</span></span></span></span>

<p class="callout success">En raison d'un bug sur la plateforme qui nous empêche de déposer nos dossiers ZIP, notre nouvelle modélisation SolidWorks est accessible sur le drive via le lien suivant : [Accéder à la modélisation SolidWorks](https://drive.google.com/drive/folders/1roma5w44KzyZTNIGD-LbKH-3KGSrTOo8?usp=drive_link).</p>

### **<span style="font-variant-ligatures: normal; color: rgb(45, 194, 107);"><span lang="FR"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal;"><span style="caret-color: rgb(0, 0, 0);"><span style="color: rgb(45, 194, 107);">4- <span style="text-decoration: underline;">Processus de fabrication </span></span></span></span></span></span><span style="font-size: 10.5pt; line-height: 107%; font-family: 'Segoe UI Symbol',sans-serif; mso-bidi-font-family: 'Segoe UI Symbol'; color: #444444; border: none windowtext 1.0pt; mso-border-alt: none windowtext 0in; padding: 0in; background: white; mso-ansi-language: FR;">🏗</span><span style="font-size: 10.5pt; line-height: 107%; font-family: 'Segoe UI',sans-serif; color: #444444; border: none windowtext 1.0pt; mso-border-alt: none windowtext 0in; padding: 0in; background: white; mso-ansi-language: FR;">️</span><span style="font-size: 10.5pt; line-height: 107%; font-family: 'Segoe UI Symbol',sans-serif; mso-bidi-font-family: 'Segoe UI Symbol'; color: #444444; border: none windowtext 1.0pt; mso-border-alt: none windowtext 0in; padding: 0in; background: white; mso-ansi-language: FR;">⚙: </span>**

Cette technique est privilégiée pour sa précision, sa rapidité et sa capacité à produire des coupes nettes et exactes, ce qui est essentiel pour assurer l'alignement correct et le fonctionnement fluide de toutes les parties mécaniques du robot. En complément, certaines pièces spécifiques sont fabriquées à l'aide de l'impression 3D, une méthode choisie pour sa flexibilité et sa capacité à créer des formes complexes qui seraient autrement difficiles à réaliser avec des méthodes traditionnelles.

[![Vidéo.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/video.gif)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/video.gif)

#### <span lang="FR" style="mso-ansi-language: FR;">D) <span style="text-decoration: underline;">Etude électronique :</span></span>

<span lang="FR" style="mso-ansi-language: FR;">L'étude électrique de notre nouveau robot suit le même schéma que celui du modèle précédent. Cette continuité nous permet de capitaliser sur les connaissances et les expériences antérieures, garantissant ainsi la fiabilité et l'efficacité des systèmes électriques déjà éprouvés. </span>

<span lang="FR" style="mso-ansi-language: FR;">Seuls les pins utilisés pour les branchements électroniques ont été modifiés dans la conception actuelle. Voici un tableau qui résume les broches (pins) utilisées dans le code Arduino, leurs numéros, et à quoi elles correspondent :</span>

![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/pCGimage.png)

<span lang="FR" style="mso-ansi-language: FR;">E) <span style="text-decoration: underline;">algorithme de commande:</span></span>

 Développement d’algorithmes secondaires :

**- Fonction de détermination des coordonnées** **:** Calcul les coordonnées actuelles du robot en fonction des angles des servomoteurs, basée sur le modèle géométrique du robot.  
\- **Fonction pour tracer un cercle :** Ajuste les angles des servomoteurs en utilisant la fonction de détermination des coordonnées pour tracer un cercle précis.  
**- Fonction pour tracer une ligne horizontale :** Active lorsque le bouton poussoir b10 est enfoncé, elle commande le robot pour tracer une ligne horizontale.  
**- Fonction pour tracer une ligne pointillée :** Lorsque le bouton connecté à la broche b8 est enfoncé, cette fonction alterne les positions de monServo3 (petit servomoteur qui est contrôlé en vitesse) pour créer une ligne pointillée.  
\- **Fonction pour tracer un cercle pointillé :** Active par le bouton poussoir b7, elle alterne monServo3 entre 70 et 110 degrés pour tracer un cercle pointillé, incluant des temporisations pour chaque segment.

<p class="callout info"><span lang="FR" style="mso-ansi-language: FR;">Nous avons également réalisé un organigramme détaillé de notre code afin de structurer et visualiser clairement les différentes fonctions et leur enchaînement avant de procéder à la programmation<span style="text-decoration: underline;">.</span></span></p>

<span lang="FR" style="mso-ansi-language: FR;"><span style="text-decoration: underline;"><span style="font-size: 10.5pt; line-height: 107%; mso-ascii-font-family: Calibri; mso-fareast-font-family: Calibri; mso-hansi-font-family: Calibri; mso-bidi-font-family: Calibri; mso-ansi-language: FR;"><span style="mso-list: Ignore;"><span style="font: 7.0pt 'Times New Roman';"><span style="font-size: 10.5pt; line-height: 107%; font-family: 'Segoe UI',sans-serif; mso-ansi-language: FR;">[![Screenshot 2024-05-19 171423.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/screenshot-2024-05-19-171423.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-19-171423.png)</span></span></span></span></span></span>

#### <span style="color: rgb(0, 0, 0);"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"> </span></span><span style="text-decoration: underline;"><span style="text-decoration: underline; color: rgb(0, 0, 0);"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">*figure 33*</span></span><span style="font-variant-ligatures: normal;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline; color: rgb(0, 0, 0);"><span style="font-style: normal;"> : Organigramme de notre code pour faire fonctionner le robot </span></span></span></span>

<span style="text-decoration: underline;"><span style="font-variant-ligatures: normal;"><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; text-decoration: underline; color: rgb(0, 0, 0);"><span style="font-style: normal;">Voici notre nouveau code :</span></span></span></span>

```c++


float angle_effecteur=180-105;

// initialisation des variables d'entree

float l1=5;  //moteur pas colorie droite
float l4=7;  //bielle droite
float l2=5;  // bielle gauche
float l3=7; // bielle gauche
float l5=0;
float a=1.5; // distance moteur centre
 
int axeX=A0;  // pin A0
int axeY=A1;  // pin A1
int BOUTON = 2; //bouton joystick pour monter

float cpt =0;

float posx=0;
float posy=0;
float an=0;

// Définition des positions pour le joystick
float haut=80;
float bas=90;

// Définition des broches pour les boutons
int b10=10;
int b11=11;
int b8=8;
int b7=7;

int b10_stat=0;
int b11_stat=0;
int b8_stat=0;
int b7_stat=0;

#include <Servo.h>

Servo monServo1; 
Servo monServo2; 
Servo monServo3;


void setup() {
  
Serial.begin(9600);
monServo1.attach(5);
monServo2.attach(6);
monServo3.attach(9);

// Configuration des broches pour les capteurs de position et le bouton
pinMode (axeX, INPUT);
pinMode (axeY, INPUT);
pinMode(BOUTON,INPUT_PULLUP);
pinMode (b10, INPUT_PULLUP);
pinMode (b11, INPUT_PULLUP);
pinMode (b7, INPUT_PULLUP);
pinMode (b8, INPUT_PULLUP);
  
an=bas;
}

void loop() {
b10_stat=digitalRead(b10);
b11_stat=digitalRead(b11);
b7_stat=digitalRead(b7);
b8_stat=digitalRead(b8);


// ----------------cercle-------------------------
if (b11_stat==LOW){
  // Déplacement des servomoteurs
  monServo2.write(180-theta2(-2.5,8+sqrt((2.5*2.5)-(-2.5*-2.5))));
  monServo1.write(180-theta1(-2.5,8+sqrt((2.5*2.5)-(-2.5*-2.5))));
  monServo3.write(110);
   delay(400);
   monServo3.write(90);
   delay(200);

for(float x=-2.5;x<=2.5;x=x+0.1){
  // Afficher la valeur retournée par la fonction theta1 et la valeur de x sur le moniteur série
  Serial.print(theta1(x,x));Serial.print("   ");
  Serial.println(x);
  // sqrt((2.5*2.5)-(x*x)) calcule la coordonnée y d'un point sur un cercle de rayon 2.5
  monServo2.write(180-theta2(x,8+sqrt((2.5*2.5)-(x*x))));
  monServo1.write(180-theta1(x,8+sqrt((2.5*2.5)-(x*x))));
  delay(10);
}

for(float x=2.5;x>=-2.5;x=x-0.1){
  Serial.print(theta1(x,x));Serial.print("   ");
  Serial.println(x);
  monServo2.write(180-theta2(x,-sqrt((2.5*2.5)-(x*x))+8));
  monServo1.write(180-theta1(x,-sqrt((2.5*2.5)-(x*x))+8));
  delay(10);
}

   delay(2000);
   monServo3.write(70);
   delay(400);
   monServo3.write(90);
}
  
// ---------------ligne------------------------
if(b10_stat==LOW){
  // Positionner les deux servomoteurs en utilisant les fonctions theta1 et theta2 
  monServo2.write(180-theta2(-2.5,8));
  monServo1.write(180-theta1(-2.5,8));
  monServo3.write(110);
   delay(400);
   monServo3.write(90);
   delay(200);

for(float x=-2.5;x<=2.5;x=x+0.1){
  monServo2.write(180-theta2(x,0+8));
  monServo1.write(180-theta1(x,0+8));
  delay(50);
}

 

   delay(1000);
   monServo3.write(70);
   delay(400);
   monServo3.write(90);
}
  
// ---------------ligne pointillé------------------------
if(b8_stat==LOW){
  monServo2.write(180-theta2(-2.5,8));
  monServo1.write(180-theta1(-2.5,8));
monServo3.write(110);
   delay(400);
   monServo3.write(90);
   delay(200);
cpt=0;
an=haut;
for(float x=-2.5;x<=2.5;x=x+0.1){
  monServo2.write(180-theta2(x,0+8));
  monServo1.write(180-theta1(x,0+8));

  // controler le servomoteur 3 pour monter et descendre la plaque 
  cpt=cpt+0.1;
  Serial.println(cpt);
  if(cpt>=1.0 && an==haut){
    monServo3.write(110);
   delay(400);
   monServo3.write(90);
    an=bas;
    cpt=0;
   delay(700);
  }

  if(cpt>=1.0 && an==bas){
    monServo3.write(70);
   delay(400);
   monServo3.write(90);
    an=haut;
    cpt=0;
    delay(700);
  }
  delay(10);
}


  delay(1000);


monServo3.write(70);
   delay(400);
   monServo3.write(90);

}

// ---------------cercle  pointille ------------------------
if(b7_stat==LOW){
  monServo2.write(180-theta2(-2.5,8+sqrt((2.5*2.5)-(-2.5*-2.5))));
  monServo1.write(180-theta1(-2.5,8+sqrt((2.5*2.5)-(-2.5*-2.5))));
monServo3.write(110);
   delay(400);
   monServo3.write(90);
   delay(200);
cpt=0;
an=haut;
for(float x=-2.5;x<=2.5;x=x+0.1){
  Serial.print(theta1(x,x));Serial.print("   ");
  Serial.println(x);
  monServo2.write(180-theta2(x,sqrt((2.5*2.5)-(x*x))+8));
  monServo1.write(180-theta1(x,sqrt((2.5*2.5)-(x*x))+8));
   cpt=cpt+0.1;
  if(cpt>=1.0 && an==haut){
    delay(500);
    monServo3.write(70);
   delay(400);
   monServo3.write(90);

    an=bas;
    cpt=0;
   delay(700);
  }

  if(cpt>=1.0 && an==bas){
    delay(500);
    monServo3.write(110);
   delay(400);
   monServo3.write(90);

    an=haut;
    cpt=0;
    delay(500);
  }
  delay(10);
}

for(float x=2.5;x>=-2.5;x=x-0.1){
  Serial.print(theta1(x,x));Serial.print("   ");
  Serial.println(x);
  monServo2.write(180-theta2(x,-sqrt((2.5*2.5)-(x*x))+8));
  monServo1.write(180-theta1(x,-sqrt((2.5*2.5)-(x*x))+8));
   cpt=cpt+0.1;

  if(cpt>=1.0 && an==haut){
    delay(500);
    monServo3.write(70);
   delay(400);
   monServo3.write(90);
    an=bas;
    cpt=0;
   delay(500);
  }

  if(cpt>=1.0 && an==bas){
    delay(500);
    monServo3.write(110);
   delay(400);
   monServo3.write(90);

    an=haut;
    cpt=0;
    delay(500);
  }
  delay(10);
}

monServo3.write(70);
   delay(400);
   monServo3.write(90);
}

// ---------------joystick------------------------

if(b10_stat==HIGH && b8_stat==HIGH && b7_stat==HIGH && b11_stat==HIGH){
  
  float X=analogRead(axeX)+15; // CHANGER LE DECALAGE
  float Y=analogRead(axeY)+8;
  double convx=((X*0.2)/1023)-0.1;
  double convy=((Y*0.2)/1023)-0.1;
Serial.println(" ");  Serial.print("   posx= ");Serial.print(posx);Serial.print("   posy= ");Serial.print(posy); Serial.print("   theta1= ");Serial.print(theta1(posx,posy-1)); Serial.print("   theta2= ");Serial.print(theta2(posx,posy-1)); 

if(posx>=2.5 && convx>=0){
  convx=0;
}
if(posx<=-2.5 && convx<=0){
  convx=0;
}
if(posy>=2.5 && convy<=0){
  convy=0;
}
if(posy<=-2.5 && convy>=0){
  convy=0;
}
posx=posx+convx;
posy=posy-convy;
monServo2.write(180-theta2(posx,posy+8));
monServo1.write(180-theta1(posx,posy+8));

if(!digitalRead(BOUTON) && an==haut){
  Serial.println("--------------BOUTON-------------- ");
  monServo3.write(110);
   delay(400);
   monServo3.write(90);
  an=bas;
  delay(350);
}

else if(!digitalRead(BOUTON) && an==bas){
  Serial.println("--------------BOUTON-------------- ");
  monServo3.write(70);
   delay(400);
   monServo3.write(90);
  an=haut;
   delay(350);

}


delay(50);




}
}


// Fonction pour calculer l'angle du premier servo
float theta1(float xp,float yp){
  // Implementation du modele geometrique inverse pour calculer theta1 et theta2
  float theta;
  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;
  if(xp>a){
    theta=180-(90+(90+beta)+alpha);
  }
  else{
    theta=180-(beta+alpha);
  }
  return theta;

}

// Fonction pour calculer l'angle du deuxième servo
float theta2(float xp,float yp){
  float theta2;
  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;

  if(xp<-a){
    theta2=90+(90+beta2)+alpha2;
  }
  else{
    theta2=beta2+alpha2;
  }

  return theta2;

}
```

Voici un résumé des principales fonctions de ce code Arduino utilisant des servomoteurs pour dessiner avec des mouvements contrôlés par un joystick :

1\. **Initialisation (`setup`)**:  
\- Configure les communications série et attache les trois servomoteurs à leurs broches respectives (5, 6 et 9).  
\- Initialise les broches du joystick et des boutons comme entrées, avec certaines configurées pour utiliser des résistances de pull-up.

2\. **Boucle principale (`loop`)**:  
\- Lit l'état des boutons pour déterminer quel dessin exécuter (ligne, cercle, ligne pointillée, cercle pointillé).  
\- Pour chaque type de dessin, le code ajuste les positions des servomoteurs pour créer les formes désirées en utilisant les fonctions `theta1` et `theta2` qui calculent les angles nécessaires pour chaque servomoteur basés sur la géométrie du système.

3\. **Dessin de cercles et de lignes:**  
\- Cercles : Le code parcourt une série de points sur le périmètre d'un cercle et ajuste les angles des servomoteurs pour suivre cette trajectoire.  
\- Lignes : Des mouvements linéaires sont générés en ajustant progressivement les angles des servomoteurs pour déplacer l'effecteur d'un point à un autre en ligne droite.

4\. **Dessin en pointillé:**  
\- Pour les lignes et les cercles en pointillé, le code alterne entre des positions hautes et basses de l'effecteur pour créer l'effet de pointillé, utilisant un compteur (`cpt`) pour gérer le timing de ces mouvements.

5\. **Contrôle par Joystick:**  
\- En dehors des dessins, si aucun bouton n'est pressé, le joystick contrôle directement les positions des servomoteurs via des lectures analogiques, permettant un contrôle manuel de la position de l'effecteur.

6\. **Calcul des angles (`theta1`, `theta2`)**:  
\- Ces fonctions calculent les angles nécessaires pour les servomoteurs basés sur la géométrie du bras robotique (longueurs des bielles, distances entre les pivots, etc.), en utilisant la trigonométrie pour résoudre les configurations du mécanisme.


#### <span lang="FR" style="mso-ansi-language: FR;">F)</span><span style="text-decoration: underline;"><span lang="FR" style="mso-ansi-language: FR;"> Montage et test du nouveau robot </span>**<span lang="FR" style="mso-ansi-language: FR;">🛠️🤖</span>**</span>

Suite à l'assemblage des différentes pièces de notre robot, nous avons procédé à l'exécution de nos programmes. Les tests ont démontré que le robot était capable de réaliser avec succès toutes les tâches spécifiées dans le cahier des charges.

 ![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/VL6image.png)

 <span style="text-decoration: underline;">figure 34: Photo de notre deuxième version de robot </span>

Voici quelques images GIF illustrant les dessins réalisés par notre robot, conformément aux spécifications demandées:

 ![image.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/5e6image.gif)

 <span style="text-decoration: underline;">figure 35: Réalisation d'une ligne de 5cm de long</span>

 ![image.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/Wz9image.gif)

 <span style="text-decoration: underline;">figure 36: Réalisation d'un cercle de 2.5cm de rayon</span>

 ![image.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/JAmimage.gif)

 <span style="text-decoration: underline;">figure 37: Réalisation d'une ligne pointillée de 5cm de long</span>

<p class="callout success">Pour visionner l'ensemble des dessins réalisés par le robot, y compris le cercle en pointillés et le joystick, vous pouvez accéder à la vidéo sur notre drive en cliquant sur le lien suivant: [Visionner la vidéo](https://drive.google.com/drive/folders/1roma5w44KzyZTNIGD-LbKH-3KGSrTOo8?usp=drive_link).</p>

### **Conclusion:** 

Au cours de ce projet, nous avons mis en pratique les connaissances théoriques acquises durant notre formation, les transformant en solutions concrètes et fonctionnelles. Cette expérience nous a non seulement permis de voir nos calculs et théories prendre vie, mais aussi de comprendre une réalité cruciale du génie : l'imprévisibilité des défis techniques.

En tant que futurs ingénieurs, nous avons appris que les obstacles imprévus sont une constante dans notre domaine et qu'ils se présenteront régulièrement tout au long de notre carrière. L'important est de persévérer, d'adapter nos approches et de continuer à innover malgré les difficultés.

> Comme le disait Winston Churchill, « Qui ose, gagne », une leçon de résilience qui nous guidera dans notre future pratique professionnelle.


### <span style="text-decoration: underline;">Journal de Bord - Évolution du Projet Robotique </span>🤖

#### 📅 Jeudi 7 Février 2024

- **Formation des Groupes** : Les équipes ont été créées, favorisant une belle diversité de compétences et d'expériences.
- **Brainstorming** : Séance intense de brainstorming en groupe. Des idées variées ont été proposées, allant de concepts innovants à des applications pratiques pour le robot.
- **Choix des Idées** : Avec tant d'idées intéressantes, la difficulté principale était de se concentrer sur les plus réalisables. Trouver un consensus a pris du temps mais a été enrichissant. Heureusement, l'orientation des professeurs a été cruciale; ils nous ont guidés pour éviter de tomber dans des pièges ou de concevoir des prototypes irréalistes.
- **Planification Initiale** : La mise en place d'un plan d'action initial a été un peu chaotique🚨, avec plusieurs opinions sur la direction à prendre. Après discussion, nous avons décidé de fusionner certaines idées pour créer un concept de robot plus cohérent et réalisable. Nous avons ainsi établi un plan d'action plus structuré pour la prochaine séance, en se concentrant sur des objectifs spécifiques.🚀

💡 **Note pour la Prochaine Séance**

- Se concentrer sur l'élaboration d'un prototype de base pour le robot avec calculs précis des modèles cinématiques.
- Affiner les rôles au sein de l'équipe pour une efficacité accrue.

#### 📅 Jeudi 21 Février 2024 

🔧 **Répartition des Tâches** Aujourd'hui, nous avons réparti les tâches pour booster notre efficacité. Tandis qu’un travaillait sur la modélisation CAO sur SolidWorks, les autres se sont concentrés sur le modèle électronique pour Arduino et la création du code informatique pour assurer les mouvements adéquats du robot.

1. **Électronique et Informatique**
    
    
    - La partie électronique-informatique est maintenant réalisée et fonctionnelle. Un grand pas en avant pour notre projet !
2. **Réflexion sur la Création des Pièces**
    
    
    - Nous avons décidé des matériaux à utiliser et de l'épaisseur souhaitée pour nos pièces.
    - Les mesures clés, comme la longueur des bielles formant le bras et du bâti, ont été déterminées.
    - Première expérience avec la machine à découpe laser. Nous avons identifié certaines contraintes : principalement, le laser est plus adapté pour graver que pour faire de gros trous, pour éviter d'enflammer le matériau.
    - Nos pièces seront conçues pour s'emboîter, à la manière des petites boîtes à idées du FabLab, avec des encoches pour faciliter la fixation.
3. **Retour sur le Modèle Géométrique**
    
    
    - Moment de discussion enrichissant avec le professeur à propos de nos calculs géométriques. Cette révision nous a permis d'affiner notre approche.

**🔜 Prochaines Étapes**

- - Notre objectif pour la prochaine séance est d'avoir terminé la modélisation afin de la soumettre aux professeurs pour validation.
    - Nous envisageons de commencer la fabrication des pièces avec la découpe laser.

#### 📅 Jeudi 29 Février 2024

**🔍 Modèle Géométrique sur SolidWorks:**

Nous avons testé et validé notre modèle géométrique direct sur SolidWorks.

**Discussion et Solution avec le Professeur 🗣️**

Nous avons eu une discussion productive avec notre professeur sur la façon de fixer notre robot, étant donné que nous ne pouvons pas le fixer directement au sol. Après un brainstorming constructif, nous avons trouvé une solution ingénieuse : créer une plaque qui servira de support stable pour le robot, où il pourra être fixé à l'aide d'une MAP .

**Finalisation et Assemblage Virtuel des Pièces**

Nous avons finalisé la conception des différentes pièces sur SolidWorks et commencé l'assemblage virtuel. Cela nous a donné une première vision concrète de la façon dont les pièces s'emboîteront dans la réalité.

**Prochaine Étape : Fabrication Réelle 🏗️**

Notre objectif est d'avoir déjà fabriqué nos pièces avec la découpe laser et l'imprimante 3D pour la prochaine session.En effet, notre conception inclut beaucoup de pièces différentes, ce qui signifie un temps de fabrication assez long. On veut s'y prend à l'avance pour ne pas être pris de court et assurer une progression fluide du projet.

#### 📅 Mercredi 24 Avril - Refonte du Modèle Géométrique 😊

Aujourd'hui, nous avons entamé la refonte du modèle géométrique du robot. Après avoir analysé les performances de la première version, nous avons identifié plusieurs améliorations potentielles. Les calculs ont été révisés pour optimiser la structure et la fonctionnalité des composants. Une journée productive qui pose les bases solides pour les étapes suivantes!

#### 📅 Mercredi 30 Avril - Modélisation sur SolidWorks 😄

Nous avons commencé la modélisation du robot sur SolidWorks. Cela implique de transposer nos calculs géométriques en un modèle 3D précis. Chaque pièce a été conçue avec attention pour garantir l'intégration et la compatibilité des différents sous-ensembles. C'est toujours impressionnant de voir le projet prendre forme visuellement!

#### 📅 Vendredi 3 Mai - Codage Arduino 🧐

Le développement du code Arduino pour contrôler notre robot a débuté aujourd'hui. Nous avons intégré des fonctions pour la détermination des coordonnées, le tracé de lignes et de cercles, ainsi que la gestion de l'interface utilisateur via des boutons. Des tests préliminaires montrent une bonne réactivité des commandes, mais quelques ajustements sont encore nécessaires.

#### 📅 Mercredi 15 Mai - Assemblage du Robot 🛠️

L'assemblage des différentes pièces du robot a été réalisé aujourd'hui. Tout s'emboîte parfaitement, grâce à la précision de notre modélisation sur SolidWorks. Chaque composant a été vérifié et ajusté pour assurer un fonctionnement fluide. Demain, nous passerons aux tests complets - un moment crucial!

#### 📅 Jeudi 16 Mai - Tests du Robot et Finalisation 🎉

Une journée intense de tests! Nous avons exécuté plusieurs cycles pour vérifier la stabilité et la précision des mouvements du robot. Après quelques petits ajustements dans le code Arduino et la calibration des servomoteurs, notre robot fonctionne comme prévu. C'est une réussite et un grand soulagement de voir le robot accomplir les tâches du cahier des charges. Un excellent moyen de conclure notre projet!

#### 📅 Mercredi 22 Mai - Présentation du Projet Robotique 🎓

Un support visuel pour la présentation est accessible en annexe sous le nom de "Diaporama Présentation Robot Écrivain".

<span style="mso-ansi-language: FR;"><span style="font-size: 11.0pt; line-height: 107%; font-family: 'Calibri',sans-serif; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: Arial; mso-bidi-theme-font: minor-bidi; mso-ansi-language: FR; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"> </span></span>

<span style="mso-ansi-language: FR;"><span style="font-size: 11.0pt; line-height: 107%; font-family: 'Calibri',sans-serif; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: Arial; mso-bidi-theme-font: minor-bidi; mso-ansi-language: FR; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">  
</span></span>

##### <span style="font-size: 10.5pt; line-height: 107%; font-family: 'Segoe UI',sans-serif; mso-fareast-font-family: 'Segoe UI'; border: none windowtext 1.0pt; mso-border-alt: none windowtext 0in; padding: 0in; mso-ansi-language: FR;"><span style="mso-list: Ignore;"> </span></span>

##### <span style="font-size: 10.5pt; line-height: 107%; font-family: 'Segoe UI',sans-serif; mso-fareast-font-family: 'Segoe UI'; border: none windowtext 1.0pt; mso-border-alt: none windowtext 0in; padding: 0in; mso-ansi-language: FR;"><span style="mso-list: Ignore;">3  </span></span>

<span style="font-size: 10.5pt; line-height: 107%; mso-ascii-font-family: Calibri; mso-fareast-font-family: Calibri; mso-hansi-font-family: Calibri; mso-bidi-font-family: Calibri; mso-ansi-language: FR;"><span style="mso-list: Ignore;"><span style="font: 7.0pt 'Times New Roman';"><span style="font-size: 10.5pt; line-height: 107%; font-family: 'Segoe UI',sans-serif; mso-ansi-language: FR;">  
</span></span></span></span>

# Projet de : Ayoub, Julie, Joachim

### <span style="text-decoration: underline;">Dossier de conception préliminaire :</span>

#### Informations

- Prénoms et noms :
- Ayoub HADJAB
- Joachim PERRIN
- Julie MAUGUIT

- Adresses mail :
- ayoub.hadjab@etu.sorbonne-universite.fr
- joachim.perrin@etu.sorbonne-universite.fr

- Cursus :

1ere année cycle ingénieur en Robotique à Polytech Sorbonne

- Date de début - Date de fin :

Mercredi 7 Février 2024 jusqu'au Mercredi 22 Mai 2024

#### Cahier des charges 

##### Définition du projet :

Le projet robotique de ce semestre est de concevoir et réaliser une solution qui répond aux différentes consignes données ci-dessous :

- 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

#### <span style="background-color: rgb(251, 238, 184);">Objectifs du projet</span>

<span style="background-color: rgb(251, 238, 184);">  
</span>

<span style="background-color: rgb(251, 238, 184);">Pour répondre aux consignes du projet, nous avons réfléchi à trois différentes solutions de système robotisé.</span>

<span style="background-color: rgb(251, 238, 184);">Les trois peuvent être réalisables mais deux des solutions sont plus complexes à concevoir et réaliser. PAS UTILE ICI</span>

#### Description fonctionnelle des besoins

Fonction contrainte (externe au robot) : s’adapter au stylo

Fonction contrainte (externe au robot) : s’appuyer sur la table

Fonction principale (robot) : dessiner les formes/dessins demandés

#### Moyens à disposition

Pour réaliser notre solution, nous aurons besoin des procédés de fabrication suivants :

\- L’impression 3D afin de faire la liaison entre le moteur et le stylo et réaliser la translation du stylo pour avoir contact entre le stylo et le sol ou non

\- Le laser afin de faire les différents <span style="background-color: rgb(251, 238, 184);">axes (corps plutôt ? ) </span>qui sont reliés aux 2 autres moteurs.

Le matériel à disposition est :

- Un crayon
- Interface de commande :
- Une carte arduino UNO avec câble USB-B;
- Un joystick:
- Une platine de prototypage;
- 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.



#### Diagramme de Gantt

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/8dRimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/8dRimage.png)

#### Propositions de réalisation

####  Première solution : **2 degree of freedom Writer Robot (arm)**

Le robot écrivain à deux degrés de liberté est un système conçu pour manipuler un stylo ou un crayon sur une surface plane afin de dessiner ou d'écrire. Il se compose généralement d'un bras robotisé doté de deux articulations qui lui permettent de se déplacer dans deux directions différentes : horizontalement et verticalement.**![](https://lh7-us.googleusercontent.com/2T7l2B9O9bt5ucMdQRHmEJfDXE8cncxvKIEF_TdK7u4OYIQP7nj-CaGmVZwNNQMJgzpAtVNUvecCY-LCfKHThBcWeClx8XxJcDvUHQ-KLfiGlmSL4-ik-UnnBV0OuOee5Lcma417L56osmPzQvY_4Q)**

##### Fonctionnement de cette solution : 

Contrôle de la position :

**![](https://lh7-us.googleusercontent.com/iY-W0z7gCn-G4d2CPJ_bauXfv8kUVmQNQirkPKOr311MGFV2chQ--QL4sI-aWHUSxX7_iPBDshWUyitEuof6MJ4AIUVYsbHo2KlwDFkKBiJoGrShlQ20gntc41OoiKKyZ-8sDJOWaH_sHF56I9vj6A)**

Les deux gros servomoteurs sont utilisés pour contrôler la position des deux axes du bras robotisé. Chaque moteur est relié à une articulation du bras, ce qui permet de déplacer le stylo sur la surface de manière précise et contrôlée. Le contrôle de la position se fait en coordonnées polaires.

Contrôle du contact du stylo :

**![](https://lh7-us.googleusercontent.com/jTgL6uRphEk6E-VEFf2U1UN1jHfgjcb_HIn9MhJv2rJMzW6nrWoqO9EPNZbinLy7U1bqW0_dElNEnJL_0zPyPmEeVa4rC1guJtIdTkx4naVeSfOb-vDHawXHHeJXtsTPLlyAbVmBHDiGp9PM1krd7Q)**

Le petit servomoteur est utilisé pour la fonction de contact ou non du stylo, est intégré à un mécanisme de crémaillère. Ce mécanisme est conçu pour abaisser ou lever le stylo en fonction des instructions données au robot.

<span style="text-decoration: underline;">Avantages :</span>

- Structure simple et compacte, facilitant la conception, la fabrication et la maintenance.
- Coût de production potentiellement plus bas en raison de sa simplicité.
- Contrôle relativement simple en raison du nombre limité de degrés de liberté.
- Adapté aux applications où l'espace est restreint en raison de sa compacité.

<span style="text-decoration: underline;">Inconvénients :</span>

- Capacité limitée à réaliser des mouvements complexes ou des dessins détaillés en raison du nombre restreint de degrés de liberté.
- Moins précis et moins polyvalent que les robots avec plus de degrés de liberté.
- Limitations dans la portée des mouvements en raison de sa conception.
- Peut ne pas être adapté pour des tâches nécessitant une grande précision.

####  Deuxième solution :

Cette solution serait composée de deux axes liés aux 2 gros moteurs par des paliers lisses, et un petit moteur avec son axe qui commande la position de l’effecteur (entre les 2 états possible : contact ou non-contact).

##### Fonctionnement de cette solution : 

![](https://lh7-us.googleusercontent.com/hlXQrwPPvMqYjW1VbzSOu8FXD09-dy5QAawuUIgif2hQQchkWyhC8X-9JRaDLVD_dRSVsjRWg2ZfBr1DRqOYtb_0bx5lKsqKub99lWlzuLYYhJAyVnAQlDa9VUNRPpV0vj2498Ltz6T2J21c54sVeac)

L'effecteur se trouve à la jonction de deux axes, lesquels sont contrôlés par les deux servomoteurs. la liaison entre les axes et le bâti permet aux axes de glisser. De cette façon, on peut modéliser ce système comme deux droites de longueur variables dont le croisement dans le plan de la feuille se trouve être la position du stylo. De la même façon que pour la première solution, le troisième servomoteur est utilisé pour contrôler le contact entre la feuille et le stylo. Une roue folle de guidage est donc nécéssaire pour soutenir l'effecteur.

<span style="text-decoration: underline;">Inconvénient :</span>

- Les liaisons n'étant pas parfaites, cette solution requiert une attention particulière aux forces de frottements.
- Des calculs complexes (pas en coordonnées cartésiennes ou polaire)
- Structure difficile à déplacer
- Manque de précision

<span style="text-decoration: underline;">Avantage :</span>

- Pas beaucoup d’utilisation de matières

Mais d’après les différents inconvénients, on se rend bien compte qu'il est compliqué de réaliser cette solution.

####  Troisième solution : Procédé pantographe

La construction d’un pantographe commence par relier deux paires de bras – une paire longue et une paire courte – bout à bout avec une articulation pivotante, formant une paire de formes en V flexibles. Les extrémités libres des bras courts sont reliées par des articulations pivotantes aux centres des bras longs, formant un parallélogramme ou une forme de losange, avec deux bras s’étendant depuis les côtés supérieurs du losange. Un stylet est placé sur le pivot au bas du diamant et un stylo est attaché à l’extrémité d’un bras. L’extrémité de l’autre bras est verrouillée dans une position fixe pendant la copie.

![](https://lh7-us.googleusercontent.com/9350Yo9UHJuJ2p50mM8H2tIEvaJCyK_mDvvcVodcoYo0ibDvnYple2Q_74man55fCPFtFva5eijn1VQCtRVxmaSW7kvXmUxkaM3OTkxmv5PEWT6mO0Pfpb1F1KHoFWL3faPjDI4zmqIr7EFshY7isIM)

![](https://lh7-us.googleusercontent.com/qDU8BXz2W3jcUWvG_087H8BV6LMZ-TG_zh6vY1SdgddieyJ_tmLXqDeYB4Uh_k_eirdoZaD7hLV3WERMp-lhvBLXcPzE0DxeXOLrHlhDHuxrZZDQs5IF5xwEonZdlO-qhtU1bof0ZjYIG8rm7wKcDiE)![](https://lh7-us.googleusercontent.com/k6Wg80vuLCSyXTzL2KZglyc2sqDp0o_URZ12d_tV0LiajinBcEy32OUsNt5nWKGyQqgo_bPAD6fgYpIIkpIUFveKMv4pbitKoq5Lz_zsfuNQUdJuMGvM6fO3i4_V1pZDpP6Lf0TwDA8sNB12m_EN0XY)

Pour contrôler la position du stylo par rapport à la surface de l'écriture. Notre approche repose sur l'utilisation d'un servo-moteur modifié et d'un mécanisme d'engrenage pour permettre deux modes de fonctionnement distincts.

##### Description du Système :

Dans notre configuration, nous avons retiré l'hélice du servo-moteur, ne conservant que l'arbre moteur (nous avons jugé que les forces en jeu sont assez faibles pour ne pas se soucier de l’effort transmis directement sur l’arbre moteur). Sur cet arbre moteur, nous avons fixé une roue dentée préalablement conçue à l'aide de logiciels de modélisation 3D tels que SolidWorks. Cette roue dentée est essentielle pour la transmission du mouvement à un système d'engrenage plus complexe.

Fonctionnement :

Le système d'engrenage que nous avons mis en place permet deux modes de fonctionnement distincts du stylo :

\- Mode d'Écriture :

Dans ce mode, le stylo est en contact direct avec la surface de l'écriture (feuille). Le robot est alors simplement en appuie sur la surface de contact et le troisième servomoteur n'est pas engagé.

\- Mode Repos :

Contrairement au mode d'écriture, dans ce mode, le stylo est légèrement surélevé par rapport à la surface de l'écriture, évitant ainsi tout contact. Pour ce faire, le petit servomoteur est réglé de manière à soulever le robot par la base (avec un système de levier).

Avantages :

- grande polyvalence d’échelle pour les bras
- comparée à aux deux premières solutions envisagées, celle-ci permet d'alleger la partie mobile car les trois moteurs sont à la base du robot. <span style="background-color: rgb(251, 238, 184);">OUI</span>

Inconvénients :

- Les équation de mouvement ne sont pas simple à determiner. <span style="background-color: rgb(251, 238, 184);">SI</span>

#### Solution choisie :

Finalement, nous avons décidé de choisir le procédé pantographe. En effet, celui-ci nous semble le plus adapté car c'est celui qui présente le moins d'inconvénients.

#### Partie mécanique :

![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/embedded-image-5xodcfdh.png)

[![cartesien.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/cartesien.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/cartesien.png)

**L'origine de mon repère est le point O = P1**

Dans cette partie nous allons calculer le modèle géométrique inverse de notre robot. Le modèle géométrique inverse est un concept crucial en robotique qui permet de déterminer les positions et orientations des moteurs nécessaires de notre robot pour atteindre une position spécifique avec son effecteur. En d'autres termes, il s'agit de calculer les angles des articulations en fonction des coordonnées de l'extrémité du robot dans l'espace.

Dans le cadre de notre projet de conception d'un robot écrivain, nous avons utilisé le modèle géométrique inverse pour contrôler précisément les mouvements de notre robot. Notre approche pour calculer ce modèle géométrique inverse consiste à diviser le pentagone formé par notre robot en trois triangles, puis à appliquer le théorème d'Al-Kashi dans chaque triangle.

Plus précisément, nous avons décomposé la structure du pantographe en trois triangles pour simplifier le calcul des angles nécessaires pour positionner l'extrémité du robot.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/CSGimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/CSGimage.png)

[![Capture d’écran 2024-02-21 à 11.49.58.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/capture-decran-2024-02-21-a-11-49-58.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/capture-decran-2024-02-21-a-11-49-58.png)

[![300px-ATAN2_arguments.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/300px-atan2-arguments.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/300px-atan2-arguments.png)

La fonction **atan2** est une fonction trigonométrique qui donne l'angle en radians entre l'axe x positif et un point donné dans le plan xy, en tenant compte des signes des coordonnées x et y pour déterminer le quadrant dans lequel se trouve le point.

Pour une explication détaillée des calculs effectués pour obtenir le modèle géométrique inverse de notre robot pantographe, veuillez consulter le document disponible à l'adresse suivante :

 [https://www.cim.mcgill.ca/~haptic/pub/GC-QW-VH-IROS-05.pdf](https://www.cim.mcgill.ca/~haptic/pub/GC-QW-VH-IROS-05.pdf)

[![Capture d’écran 2024-02-29 à 11.18.19.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/capture-decran-2024-02-29-a-11-18-19.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/capture-decran-2024-02-29-a-11-18-19.png)

#### Conception XAO :

<span style="text-decoration: underline;">La base avec les trois moteurs</span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/1tMimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/1tMimage.png)

##### [![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/RRHimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/RRHimage.png)

La base est composée de deux plateaux, celui du bas est fixe par rapport au plan de travail et le second est mobile, guidé verticalement par deux axes. Sur le plateau du haut sont fixés les deux petits servo moteurs qui contrôlent la position du stylo sur le plan de la feuille. Le gros servo moteur est fixé sur le plateau du bas et entraine la pièce ci-dessus, que nous avons conçu pour que la hauteur du point de contact avec le plateau du haut varie selon l'angle du moteur. Cette architecture permet de soulever toute la partie supérieure du robot d'1cm en actionnant le moteur inférieur. Cette action coupe le contact entre le stylo est la surface de dessin.

<span style="text-decoration: underline;">Les bras</span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/wNZimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/wNZimage.png)

Nos bras sont composés de 4 bielles.

Deux bielles sont reliées au moteur par l'empreinte des palonniers .

De plus, nous avons de chaque côté, les deux bielles qui sont reliées par un roulement à bille. Ces 4 bielles, nous les fabriquons avec la découpe laser. Enfin, nous avons le support du bouchon, que nous avons fait avec l'imprimante 3D.


##### Montage

Comme indiqué par la coloration sur les image de SolidWorks ci-dessus, nous avions conçu nos pièces pour utiliser en majorité des plaques de médium mais aussi deux pièces plastique. Nous avons donc utilisé la découpeuse laser et les imprimantes 3D.

Une fois que l'on avait réalisé nos pièces, il a fallut faire des ajustement. D'abord, le guidage par les deux axes était difficile car le contacte était trop court et la liaison se comportait comme une linéaire annulaire. Nous avons donc ajouté des bouts de tube pour assurer le guidage, étant donné que le jeu entre l'axe et le tube était relativement grand, nous avons choisi une pièce de longueur importante.

Nous avons aussi observé que le medium se dégradait rapidement autour de plusieurs liaisons. Nous avons donc utilisé de la colle entre le tube et le medium pour renforcer la liaison de l'axe, et ajouté du scotch râpeux sur un des roulement à billes pour contrebalancer le jeu créé.

Après avoir monté le robot, nous avons constaté que le moteur inférieur n'était pas au meilleur emplacement, nous avons donc percé de nouveaux trous dans le plateau inférieur pour le repositionner plus proche de la liaison glissante.

# Projet ROB (Amel, Clarence, Adrien)

#### Réalisation d'un système robotisé "Robot écrivain"

#### Informations

- Prénoms et noms : 
    - - Amel HADDADI
        - Clarence PFISTER
        - Adrien MILLE
- Adresses mail : 
    - - [amel.haddadi@etu.sorbonne-universite.fr](mailto:amel.haddadi@etu.sorbonne-unuversite.fr)
        - <adrien.mille@etu.sorbonne-universite.fr>
        - clarence.pfister@etu.sorbonne-universite.fr
- Cursus : 
    - - 1ere année cycle ingénieur en Robotique à Polytech Sorbonne
- Date de début - Date de fin estimée (ou réelle) : 
    - - 07/02/2024<span style="background-color: rgb(255, 255, 255);"> - 22/05/2024</span>

#### Contexte

Ce projet est le sujet de notre UE Robotique. ([https://wiki.fablab.sorbonne-universite.fr/BookStack/books/projets-due-2023-2024/page/le-sujet-du-projet](https://wiki.fablab.sorbonne-universite.fr/BookStack/books/projets-due-2023-2024/page/le-sujet-du-projet "Lien du sujet du projet de robotique"))

#### Objectifs

1. L'objectif de ce projet est de réaliser un système robotisé : sa partie mécanique, son actionnement, sa commande et son interface de pilotage. Ce système doit être dessinateur puisqu'il doit répondre à deux exercices :

- Le premier consiste à tracer différentes figures prédéfinies dans un carré de 5cmx5cm en 10 secondes : Une ligne droite de 5cm, une ligne pointillée de 5cm, un cercle de rayon 2,5cm et un cercle pointillé de 2,5cm.
- Le deuxième consiste à reproduire un dessin imposé (inconnu) à l'aide d'un joystick dans un carré de 5cmx5cm.

 2.L'objectif pour chacun d'entre nous est de réussir à bien s'organiser au sein de l'équipe, la gestion du temps et apprendre les bases de la gestion projet dans le but de parvenir à concevoir un mécanisme robotisé fonctionnel.

### I - Conception préliminaire :

#### 1. Cahier des charges

Le but est de concevoir un robot capable de dessiner sur un support plan horizontal :

a. Une ligne de 5cm de long.

<div aria-label="Page Section Options" class="pointer-container" id="bkmrk-%C2%A0" refs="pointer@pointer" tabindex="-1"><div class="pointer flex-container-row items-center justify-space-between p-s anim is-page-editable"><div class="flex-container-row items-center gap-s" refs="pointer@mode-section"><button class="text-button icon px-xs" title="Permalink mode, Press to show include tag"><svg class="svg-icon" data-icon="link" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button><div class="input-group"> <button class="button outline icon" title="Copy Link" type="button"><svg class="svg-icon" data-icon="copy" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button></div></div><svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></div></div>b. Une ligne pointillée de 5cm de long.

c. Un cercle de 2.5cm de rayon.

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

e. Un dessin imposé (Le déplacement de l'organe terminal devra être piloté par un joystick)

Une fonction supplémentaire : Être capable de modifier la vitesse de déplacement du robot via l’interface.

##### 1.1 : Contraintes 

Plusieurs contraintes nous ont été imposées dans la réalisation de ce projet , on les énumère ci-dessous :

1. Les dessins imposés : Ligne, cercle en continu et en discontinus.
2. Le temps fixé pour le dessin : 10 secondes.
3. Utilisation de composants (moteurs, contrôleurs, boutons, éléments de guidage, alimentation stabilisée, boutons, etc.) parmi un ensemble imposé.
4. Programmation en C utilisant la chaîne de développement Arduino IDE.
5. Interface de pilotage: Joystick.
6. Contrainte sur les machines du fablab (Machine à découpe LASER, Imprimantes RAISE 3D PRO2) qui ne sont pas toutes accessibles tout le temps ni en même temps.

##### 1.2 : Matériel

Pour accomplir ce projet, nous disposons d'une liste de composants et de matériels disponibles :

- Un crayon
- Interface de commande : 
    - Une carte Arduino UNO avec câble USB-B;
    - Un joystick:
    - Une platine de prototypage;
    - 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

##### 1.3 : Machines utilisées

Afin de réaliser ce projet, nous disposons des machines du fablab permettant la fabrication des pièces à savoir :

- Machine à découpe LASER.
- Imprimantes RAISE 3D PRO2.

#### 2. Diagramme de Gantt 

Afin d'organiser au mieux nos séances de travail, et pour que l'équipe soit productif vis à vis de notre projet, nous avons réalisé un diagramme de Gantt, qui sera un outil de répartition des tâches et un calendrier prévisionnel . (En attachement le diagramme de Gantt)

<span style="background-color: rgb(255, 255, 255);">[![Capture d'écran 2024-03-03 211734.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-03-211734.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-03-211734.png)</span>

<span style="background-color: rgb(255, 255, 255);">Figure(1) : Diagramme de Gantt</span>

#### 3. Propositions de réalisation 

Afin de réaliser ce projet, et répondre au cahier des charges, nous avons essayé de discuter plusieurs solutions et propositions avant de choisir la plus adéquate et la plus convenable.

Parmi les solutions que nous avons proposées, on y trouve :

1. Système 3P (inspiré du fonctionnement d'une imprimante 3D) : Un système sur deux rails (pignon/crémaillère) permettant la translation en x, en y et en z d'un support pour le stylo.

![](https://lh7-us.googleusercontent.com/mHumEDpVHTMah_OuPWhzr8HyCcHWLVeweaI4yy2bwhjdIJxpACo0n098rKYhkBcumrAp5istw8BRTzGp6NQpAokrd2UvgUq6TrhdnKgwyCGFV54acDUrAVszI5qH7m1qB6ayz9o90oT2D2GOWhkE6_k)figure(2) : Schéma cinématique système 3P

Points forts :

- Résolution simple des modèles géométriques direct et inverse en utilisant la convention "Denavit-Hartenberg" (<span style="background-color: rgb(251, 238, 184);">ou pas)</span>
- Pièces compatibles avec le procédé découpe laser (Gain de temps).
- Bonne précision et simplicité de contrôle.

Point faibles :

- Complexité des guidages en translation.
- Pas de limit switch dans le matériel disponible, ce qui peut rendre cette solution risquée (aucun autre moyen que les calculs pour vérifier si l'on est arrivé au bout du rail).
- Solution peu compacte.

 2. Système 2RP (en partie inspiré du robot Fanuc) : Un système comportant deux rotoïdes dans le plan pour les déplacements en x et en y, ainsi qu'une liaison prismatique pour gérer la hauteur du stylo.

<span id="bkmrk--3" style="font-weight: normal;"><span style="font-size: 11pt; font-family: Arial, sans-serif; color: rgb(0, 0, 0); background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; white-space-collapse: preserve;"><span style="border-width: initial; border-style: none; display: inline-block; overflow: hidden; width: 241px; height: 180px;">![](https://lh7-us.googleusercontent.com/vR_OhtyPofDkOEDR6BiSCRL-9ngRtzlY2UwveCfi8RK0ceV-R48aWv9zWcWQqjHw69NGOrZxvITaYAdI5DWCbbQSBX3pOuiEC4wBgtLtbvHXKM2JqQUCwj0lrHDXNucNsEKBnBF8XY2Z7Uzo79PZaZ8)  
</span></span></span>

Figure (3) : Schéma cinématique système 2RP

Points forts :

- Résolution simple des modèles géométriques direct et inverse en utilisant la convention "Denavit-Hartenberg".

Points faibles :

- Problème de stabilité lié à la présence de deux servo-moteurs éloignés du bâti (en plus de l'effecteur), ce qui pourrait entraîner un risque de flexion.
- Vigilance nécessaire avec l'espace de travail pour éviter les problèmes de singularité possibles.

 3. Système à structure parallèle (pantographe) : Système à deux bras en parallèle se rejoignant au niveau de l'effecteur (stylo).![](https://lh7-us.googleusercontent.com/fsUwYVRKbz2xOUGBxHK4ci7r8ImNXqXtGb5-AJV258UzJv3TYLYeA1u7maejGmdRPF-uKEg_rSyeGvOxqX--YhGqkG_snmG7hDf71hxALEKniiB7Iytcp6bKASoafNj7KUj5SNnszSmoeK28JCCPi3s)

Fifure(4): Schéma cinématique structure parallèle

Points forts :

- Structure légère, pas de problème de flexion.
- Résistance aux vibrations.
- Réduction de l'inertie.

Points faibles :

- Complexité de la cinématique : pour ce système on ne peut pas appliquer la convention de "Denavit-Hartenberg". (On peut tout de même s'en sortir avec un peu de géométrie).

4\. Système à une rotation et une translation (RP)

<span id="bkmrk--5" style="font-weight: normal;"><span style="font-size: 11pt; font-family: Arial, sans-serif; color: rgb(0, 0, 0); background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; white-space-collapse: preserve;"><span style="border-width: initial; border-style: none; display: inline-block; overflow: hidden; width: 255px; height: 190px;">![](https://lh7-us.googleusercontent.com/VkQUVyq2ZLbgq3In6HRSTUIx0F1yo22vNOjlXnc2t--J3V30Huq4pFQeI00eWcdtv6N8o2XnKDnzZscp8u8ZLdI1TKLzf9IkF83kbsMfoYfDehOhuflUdxuxDOelruhjqAr9JB8FufIsu5sQaEgudCk)</span></span></span>

Figure(5): Schéma cinématique système RP

Points forts :

- Résolution simple des modèles géométriques direct et inverse en utilisant la convention "Denavit-Hartenberg".

Points faibles :

- Tout comme la solution inspirée du Fanuc, on pourrait avoir des problèmes de flexion lorsque l'effecteur se situe au bout du rail.

#### 4. Solution choisie

Après réflexion, nous avons choisi la solution du système à structure parallèle car c'est la solution qui nous a paru la moins contraignante et la plus sûre pour répondre au cahier des charges fourni. Afin d'éviter d'avoir des problèmes d'ajustement avec le stylo entre glissant pour monter ou descendre, et serré pour être maintenu, nous avons imaginé une solution différente pour gérer la hauteur du stylo vis à vis de la feuille. Effectivement, nous avons pensé à utiliser une solution pignon/crémaillère pour régler la hauteur de la feuille directement, qui sera donc sur un support léger (pour que la charge soit supportable pour le servomoteur).

[![Structure parallèle](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/robot-parallele-page-0001.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/robot-parallele-page-0001.jpg)

Figure(6): Croquis à main levé de la solution

Nous avons également pensé à une autre solution se basant sur le même concept, le changement apporté est au niveau des deux bras partant de deux points différents dans la solution précédente à deux bras partant du même point pour cette autre solution dans le but de simplifier les calculs. (à en discuter davantage afin de choisir la meilleure option).

 [![Croquis 2_page-0001.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/croquis-2-page-0001.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/croquis-2-page-0001.jpg)

Figure(7) : Croquis

### II - Conception détaillée : 

Dans cette partie, nous nous intéressons à la mécanique du robot en terme d'élaboration des modèles géométriques direct et inverse, de la CAO réalisée et le choix des pièces. Nous traiterons également la partie électronique en évoquant le schéma électrique et le câblage effectué. Et pour finir nous élaborons quelques algorithmes de commande afin de coder la solution proposée.

Après réflexion, nous avons choisi le système où les deux moteurs n'ont pas le même axe, et nous avons changé notre solution précédente afin que la solution pignon/crémaillère assure la translation du stylo et non la translation de la feuille, nous avons choisi cette solution car nous la trouvons plus simple et nous économise en matière de fabrication.

#### 1. Modèles géométriques direct et inverse, et Jacobienne : 

Afin de pouvoir déterminer la position du stylo en fonction de l'angle des servomoteurs, et inversement, nous avons calculé les modèles géométriques directs et indirects de notre système. Ces deux modèles seront nécessaires dans la partie algorithmique dans le but de dessiner les formes désirées. Etant donné les contraintes du cahier des charges concernant la vitesse d'exécution des différents exercices, nous auront également besoin de la Jacobienne pour déterminer les vitesses de rotation des servomoteurs. Pour être plus précis, nous aurons besoin de la Jacobienne inverse, permettant de calculer ces vitesses angulaires à partir de la vitesse de l'effecteur souhaitée, mais nous pourrons pour cela nous servir de fonctions dans la partie algorithmique.

##### 1.1 : Modèles géométriques direct et inverse 

##### [![Projet_ROB_MG.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/projet-rob-mg.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/projet-rob-mg.png)1.2 : Jacobienne 

[![Projet_ROB_Jac_1.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/projet-rob-jac-1.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/projet-rob-jac-1.png)

[![Projet_ROB_Jac_2.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/projet-rob-jac-2.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/projet-rob-jac-2.png)[![Projet_ROB_Jac_3.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/projet-rob-jac-3.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/projet-rob-jac-3.png)

#### 2. Conception mécanique :

Pour faire la CAO de notre système, nous nous sommes servis du logiciel SolidWorks et nous avons fait de sorte que la majorité des pièces puissent être réalisées par le procédé de découpe laser. En effet, cela sera pour nous un gain de temps conséquent lors de la réalisation. En revanche, certaines pièces devront tout de même être faites par impression 3D par soucis de simplicité, elles sont différenciées dans le modèle 3D par un gris plus foncé.

Avant de passer à la modélisation sur SolidWorks, nous avons essayé de faire quelques croquis à main levé de nos pièces, en choisissant des dimensions ainsi que le procédé de fabrication.

[![Pieces_page-0001.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/pieces-page-0001.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/pieces-page-0001.jpg)

Figure(8) : Croquis des pièces à concevoir

[![Bati _page-0001.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/bati-page-0001.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/bati-page-0001.jpg)

Figure(9) : Croquis des pièces du bâti à concevoir

Afin d'expliquer cette modélisation, on peut diviser ce système en 3 sous-assemblages, qui sont le bâti, le pantographe (bielles) permettant les mouvements en x et y, et le support du stylo, permettant une translation selon z.

[![Ensemble.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/ensemble.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/ensemble.png)

Figure(10): Conception du robot sur SolidWorks

##### 2.1 : Bâti

Nous avons pensé à une structure emboitée en montage serré composée de 4 pièces qui seront réalisées en découpe laser.

[![Capture d’écran (48).png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-48.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-48.png)

Figure(11) : Assemblage du Bati

##### 2.2 : Pantographe

Les deux premières bielles mises en mouvement par les servomoteurs sont vissées sur ces derniers, et elles seront fabriquées par impression 3D du fait de l'empreinte du palonnier les rendant inconcevables par découpe laser. La transmission des efforts est ici assurée par les palonniers encastrés dans les bielles.

[![Capture d’écran (52).png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-52.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-52.png)

Figure(12): Assemblage Bielle, palonnier et servomoteur

Le guidage en rotation de ces deux premières bielles avec les deux suivantes se fait à l'aide d'un tube en acier dans lequel passera une vis associée à un écrou.

[![Guidage_Bielles.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-05-140742.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-05-140742.png)

Figure(13) : Guidage en rotation des bielles

Ensuite, dans le système d'origine que nous avions imaginé, un problème se posait au niveau de l'effecteur du fait des deux bielles de même hauteur. C'est pour cela que nous avons remplacé l'une d'entre elles par une chape, pour pouvoir ensuite réaliser le dernier pivot. Afin de pouvoir réaliser cette pièce par découpe laser, nous l'avons divisée en 3 pièces, qui seront simplement assemblées par des vis avec écrous.

[![Chape.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/KZTchape.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/KZTchape.png)

Figure(14) : Chape

Enfin, pour la dernière liaison de bielles au niveau de l'effecteur, l'axe assurant un guidage en rotation sera cette fois un tube dans lequel le stylo pourra glisser librement. Ce tube contenant le stylo, il ne pourra pas être fixé avec le même système que les bielles précédentes. En effet, il sera vissé à la partie inférieure de la chape, grâce à une extrusion de matière le long de cette dernière, suffisamment important pour que l'écrou inséré au milieu ne soit pas un obstacle à l'autre bielle.

[![Capture d'écran 2024-03-05 141822.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-05-141822.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-05-141822.png)

Figure(15) : Guidage en rotation au niveau de l'effecteur

##### 2.3 : Support stylo

Pour la pièce de support au système permettant le maintient et le mouvement vertical du stylo, c'est la partie supérieure de notre chape qui réalise cette fonction. De ce fait, la pièce a été modifiée de sorte à pouvoir y placer précisément et fixer le servomoteur ainsi que la crémaillère, par l'intermédiaire de deux pièces encastrées par serrage. Il est toutefois important de noter que la crémaillère n'est pas totalement fixe, puisqu'il reste la translation selon z, mais cette translation est limitée comme nous le verrons juste après. De plus, un enlèvement de matière a été réalisé de sorte à ne pas bloquer le palonnier, qui ne sera pas gêné non plus par la bielle au niveau inférieur. En effet, d'après nos calculs, la variation d'angle nécessaire pour entraîner la translation de la crémaillère de quelques millimètres est suffisamment faible.

[![Chape_Sup.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/chape-sup.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/chape-sup.png)

[![Chape Support.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/9cnchape-support.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/9cnchape-support.png)

Figure(16) : Partie supérieure de la chape Figure(17) : Assemblage de la chape, du servomoteur et de la crémaillère

Afin de garantir le mouvement vertical du stylo, nous avons utilisé le système de pignon/crémaillère (module 1.5), avec une crémaillère d'assez faible dimension, étant donné que le stylo doit simplement pouvoir être légèrement surélevé afin d'arrêter de dessiner. On peut par ailleurs observer deux vis sur la capture d'écran ci-dessous qui permettent de limiter la translation de la crémaillère. Ces vis ont donc à la fois pour objectif d'empêcher le contact entre le pignon et la crémaillère de disparaître, mais également de fixer cette dernière.

[ ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-54.png) [![Capture d’écran (55).png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-55.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-55.png)

Figure(18) : Pignon/Crémaillère

Finalement, pour le maintien serré du stylo, nous avons décidé d'utiliser un clip, qui sera encastré dans la crémaillère.

[![Clip.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/clip.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/clip.png)

Figure(19) : Clip

#### 3. Schémas électroniques :

Pour cette partie de conception électronique, nous nous sommes servis du logiciel TinkerCad, afin de faire à la fois le schéma de câblage et le schéma électrique.

##### 3.1 : Schéma de câblage

Notre schéma électronique se constitue donc d'une carte Arduino Uno qui permettra le contrôle des 3 servomoteurs, et d'une platine d'essai permettant notamment de relier les différents composants à l'alimentation et la masse. On retrouve sur cette platine 4 boutons pressoirs correspondant aux 4 figures prédéfinies à tracer, qui sont chacun reliés à une broche numérique. Une résistance de 10 kOhm est associée à chaque bouton poussoir pour diminuer l'intensité de courant électrique les traversant.

Pour ce qui est de la petite platine d'essai sur laquelle se trouvent deux potentiomètres et un bouton poussoir, elle représente en réalité un joystick, puisque ce composant n'est pas disponible sur ce logiciel. Cette représentation se justifie par le fait que le joystick analogique possède deux potentiomètres qui déterminent la position du joystick sur les axes X et Y. Ces deux sorties seront donc reliées à des broches analogiques (tension variant entre 0V et 5V). Le joystick possède également un bouton, qui, lorsqu’il est relâché, laisse le joystick revenir en douceur à la position centrale.

Pour finir, les 3 servomoteurs sont connectés à des broches numériques PWM (Pulse Width Modulation), puisque c'est la largeur des impulsions envoyées qui va déterminer la position de l’arbre de sortie.

[![Projet ROB version finale.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/projet-rob-version-finale.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/projet-rob-version-finale.png)

##### 3.2 : Schéma électrique

[![Capture d’écran du 2024-05-21 13-34-58.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-du-2024-05-21-13-34-58.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-du-2024-05-21-13-34-58.png)

#### 4. Algorithme de commande :

\#include &lt;Servo.h&gt;

/\*Paramètres ServoMoteur\*/  
const int pinServo1 = 8;  
const int pinServo2 = 9;  
const int pinServo3 = 10;  
Servo servo1; // servomoteur au point A (bras gauche)  
Servo servo2; // servomoteur au point B (bras droit)  
Servo servo3; // servomoteur qui lève et baisse le stylo  
/\*Paramètres Bouton poussoir\*/  
const int button1 = 3; // Pin digital pour le bouton poussoir  
const int button2 = 4;  
const int button3 = 5;  
const int button4 = 6;  
int buttonState1; // état du bouton poussoir (HIGH ou LOW)  
int buttonState2;  
int buttonState3;  
int buttonState4;  
/\*Paramètres Joystick\*/  
const int SW\_pin = 2; // Pin digital pour indiquer la postion du bouton poussoir du Joystick  
int buttonStateSW; // état du bouton poussoir du Joystick  
int Pen; // 1 si le stylo touche le papier, 0 sinon  
const int X\_pin = A0; // Pin analogique pour la coordonnée X  
const int Y\_pin = A1; // Pin analogique pour la coordonnée Y  
float joyX, joyY; // Variables pour les valeurs données par le joystick à potentiomètre 2 axes  
/\*Paramètres du Modèle Géométrique\*/  
float Ex, Ey; // coordonnées cartésiennes du stylo  
float theta1, theta2; // correspondent respectivement à l'angle theta A et theta B du modèle géométrique  
const float angleHIGH = 100; // angles de servo3 correspondants aux positions basses et hautes du stylo  
const float angleLOW = 110;  
const float D = 80; // distance entre deux servomoteurs 1 et 2 en mm  
const float L = 90; // longueur d'un bras en mm  
const float centerX = 40; // coordonnées du centre du carré 50mm x 50mm  
const float centerY = 140;  
const float R = 25; // rayon de cercle en mm  
const float Xmin = centerX - R; // cadrer un carré de 50mm x 50mm  
const float Xmax = centerX + R;  
const float Ymin = centerY - R;  
const float Ymax = centerY + R;  
/\*Paramètres Vitesse\*/  
String message; // chaîne de caractères pour stocker la commande reçue à partir du moniteur série  
int speed; // vitesse de mouvement pendant le mode Joystick  
 // allons de 0 à 5 // 0 : pas de mouvement, 1 : très lent, 3 : moyen, 5 : très rapide  
int pause; // le temps de pause à chaque mouvement pendant le mode Joystick  
 // plus le nombre est petit, plus la rotation est rapide  
const int autoPause = 50; // la pause pendant les modes automatiques  
const int transitTime = 300; // le temps de passage de servo1,2.write() à servo3.write() (et inversement)

void setup() {  
 /\*Initialisation Servomoteur\*/  
 pinMode(pinServo1, OUTPUT);  
 pinMode(pinServo2, OUTPUT);  
 pinMode(pinServo3, OUTPUT);  
 servo1.attach(pinServo1);  
 servo2.attach(pinServo2);  
 servo3.attach(pinServo3);  
 servo3.write(90);  
 delay(transitTime);  
 theta1 = servo1.read();  
 theta2 = servo2.read();  
 calculatePosition(theta1, theta2);  
 GoToPoint(centerX, centerY);  
 /\*Initialisation Bouton poussoir\*/  
 pinMode(button1, INPUT\_PULLUP); // INPUT\_PULLUP lie l'entrée à 5V avec une résistance interne de 10kOhm  
 pinMode(button2, INPUT\_PULLUP);  
 pinMode(button3, INPUT\_PULLUP);  
 pinMode(button4, INPUT\_PULLUP);  
 buttonState1 = digitalRead(button1);  
 buttonState2 = digitalRead(button2);  
 buttonState3 = digitalRead(button3);  
 buttonState4 = digitalRead(button4);  
 /\*Initialisation Joystick\*/  
 pinMode(SW\_pin, INPUT\_PULLUP);  
 buttonStateSW = digitalRead(SW\_pin);  
 pinMode(X\_pin, INPUT);  
 pinMode(Y\_pin, INPUT);  
 /\*Configuration du moniteur série\*/  
 Serial.begin(9600);  
 Serial.setTimeout(1); // définit le nombre maximum de millisecondes d'attente pour les données série  
 /\*Configuration de la vitesse\*/  
 Serial.println("\\nVeuillez régler la vitesse (0 à 5): ");  
 message = "";  
 setSpeed();  
 servo3.write(angleHIGH);  
 Pen = 0;

 delay(1000);  
}

void loop() {  
 /\*Réglage de la vitesse\*/  
 if (Serial.available() &gt; 0) {  
 setSpeed();  
 }  
 /\*Mode de pilotage par Joystick\*/  
 if (digitalRead(SW\_pin) != buttonStateSW) // si le bouton1 est appuyé  
 {  
 PenUpDown();  
 delay(500);  
 }  
 joyX = analogRead(X\_pin); // lire les valeurs de potentiomètre  
 joyY = analogRead(Y\_pin);  
 if (joyX &gt; 700 &amp;&amp; Ex &lt; Xmax) {  
 Ex += 0.1;  
 }  
 if (joyX &lt; 300 &amp;&amp; Ex &gt; Xmin) {  
 Ex -= 0.1;  
 }  
 if (joyY &gt; 700 &amp;&amp; Ey &gt; Ymin) {  
 Ey -= 0.1;  
 }  
 if (joyY &lt; 300 &amp;&amp; Ey &lt; Ymax) {  
 Ey += 0.1;  
 }  
 calculateAngle(Ex, Ey);  
 servo1.write(theta1);  
 servo2.write(theta2);  
 delay(pause);  
 /\*Tracer une ligne\*/  
 if (digitalRead(button1) != buttonState1) // si le bouton1 est appuyé  
 {  
 Serial.println("Tracer une ligne");  
 servo3.write(angleHIGH); // lever le stylo  
 delay(transitTime);  
 GoToPoint(Xmin, Ey); // aller au point le plus gauche  
 delay(transitTime);  
 servo3.write(angleLOW); // baisser le stylo  
 delay(transitTime);  
 while (Ex &lt; Xmax) { // déplacer horizontalement le stylo vers la droite par millimètres  
 Ex++;  
 calculateAngle(Ex, Ey);  
 servo1.write(theta1);  
 servo2.write(theta2);  
 delay(autoPause);  
 }  
 delay(transitTime);  
 servo3.write(angleHIGH); // lever le stylo  
 Pen = 0;  
 delay(transitTime);  
 }  
 /\*Tracer un cercle\*/  
 if (digitalRead(button2) != buttonState2) {  
 Serial.println("Tracer un cercle");  
 servo3.write(angleHIGH); // lever le stylo  
 delay(transitTime);  
 float theta = 0;  
 float startX = centerX + R \* cos(theta);  
 float startY = centerY + R \* sin(theta);  
 GoToPoint(startX, startY); // aller au point de l'angle de 0 rad  
 delay(transitTime);  
 servo3.write(angleLOW); // baisser le stylo  
 delay(transitTime);  
 while (theta &lt; 2 \* PI) { // allons de 0 rad à 2\*pi rad  
 theta = theta + 0.1; // augmenter l'angle de 0.1 rad  
 Ex = centerX + R \* cos(theta);  
 Ey = centerY + R \* sin(theta);  
 calculateAngle(Ex, Ey);  
 servo1.write(theta1);  
 servo2.write(theta2);  
 delay(autoPause);  
 }  
 delay(transitTime);  
 servo3.write(angleHIGH); // baisser le stylo  
 Pen = 0;  
 delay(transitTime);  
 }  
 /\*Tracer une ligne pointillée\*/  
 if (digitalRead(button3) != buttonState3) {  
 Serial.println("Tracer une ligne pointillée");  
 servo3.write(angleHIGH);  
 delay(transitTime);  
 GoToPoint(Xmin, Ey);  
 Ex = Xmin;  
 delay(transitTime);  
 servo3.write(angleLOW);  
 Pen = 1;  
 delay(transitTime);  
 while (Ex &lt; Xmax) {  
 Ex++;  
 if ((int)Ex % 5 == 0) // lever ou baisser le stylo tous les 5 mm  
 {  
 PenUpDown();  
 }  
 calculateAngle(Ex, Ey);  
 servo1.write(theta1);  
 servo2.write(theta2);  
 delay(autoPause);  
 }  
 delay(transitTime);  
 servo3.write(angleHIGH);  
 Pen = 0;  
 delay(transitTime);  
 }  
 /\*Tracer un cercle pointillé\*/  
 if (digitalRead(button4) != buttonState4) {  
 Serial.println("Tracer un cercle pointillé");  
 servo3.write(angleHIGH);  
 delay(transitTime);  
 float theta = 0;  
 float startX = centerX + R \* cos(theta);  
 float startY = centerY + R \* sin(theta);  
 GoToPoint(startX, startY);  
 delay(transitTime);  
 servo3.write(angleLOW);  
 Pen = 1;  
 delay(transitTime);  
 while (theta &lt; 360) { // allons de 0° à 360°  
 theta = theta + 1; // augmenter l'angle de 1°  
 if ((int)theta % 15 == 0) { // lever ou baisser le stylo tous les 15°  
 PenUpDown();  
 }  
 Ex = centerX + R \* cos(radians(theta));  
 Ey = centerY + R \* sin(radians(theta));  
 calculateAngle(Ex, Ey);  
 servo1.write(theta1);  
 servo2.write(theta2);  
 delay(15);  
 }  
 delay(transitTime);  
 servo3.write(angleHIGH);  
 Pen = 0;  
 delay(transitTime);  
 }  
}

/\* Loi entrée/sortie du modèle géométrique direct\*/  
void calculatePosition(float x, float y) {  
 /\*Ajuster à l'angle des servos\*/  
 x = 180 - x;  
 y = 180 - y;

 x = radians(x);  
 y = radians(y);  
 float Dx = L \* cos(x);  
 float Dy = L \* sin(x);  
 float Cx = D + L \* cos(y);  
 float Cy = L \* sin(y);  
 float P = sqrt(pow(Cx - Dx, 2) + pow(Cy - Dy, 2));  
 float alpha1 = acos(P / (2 \* L));  
 float alpha2 = atan((Cy - Dy) / (Cx - Dx));  
 Ex = Dx + L \* cos(alpha1 + alpha2);  
 Ey = Dy + L \* sin(alpha1 + alpha2);  
}

/\* Loi entrée/sortie du modèle géométrique inverse\*/  
void calculateAngle(float x, float y) {  
 float n = sqrt(pow(x, 2) + pow(y, 2));  
 float m = sqrt(pow(D - x, 2) + pow(y, 2));  
 float alpha1 = acos(n / (2 \* L));  
 float alpha2 = acos(m / (2 \* L));  
 float beta1 = atan(y / x);  
 float beta2 = atan(y / (D - x));  
 theta1 = alpha1 + beta1;  
 theta2 = PI - (alpha2 + beta2);  
 theta1 = degrees(theta1);  
 theta2 = degrees(theta2);

 /\*Ajuster à l'angle des servos\*/  
 theta1 = 180 - theta1;  
 theta2 = 180 - theta2;  
}  
/\*Lever ou baisser le stylo\*/  
void PenUpDown() {  
 if (Pen == 1) // si le stylo touche le papier  
 {  
 servo3.write(angleHIGH); // lever le stylo  
 Pen = 0;  
 } else // sinon  
 {  
 servo3.write(angleLOW); // baisser le stylo  
 Pen = 1;  
 }  
}  
/\*Réglage de vitesse\*/  
void setSpeed() {  
 speed = 0;  
 while (speed == 0) {  
 while (!Serial.available()) {  
 delay(1); // attandre de recevoir la commande de l'utilisateur  
 }  
 while (Serial.available()) {  
 delay(2); // délai pour permettre au buffer de se remplir  
 if (Serial.available() &gt; 0) {  
 char c = Serial.read();  
 message += c;  
 }  
 }  
 Serial.print("La vitesse : ");  
 Serial.print(message);  
 if (message != "0\\n") { // si la vitesse commandée n'est pas de 0  
 speed = message.toInt();  
 pause = (int)(10 - speed \* 2);  
 Serial.println(pause);  
 }  
 message = "";  
 }  
}  
/\*Aller au point désigné\*/  
void GoToPoint(float x, float y) {  
 while (Ex &lt; x - 0.1 || Ex &gt; x + 0.1 || Ey &lt; y - 0.1 || Ey &gt; y + 0.1) {  
 if (Ex &lt; x &amp;&amp; Ex &lt; Xmax) {  
 Ex += 0.1;  
 }  
 if (Ex &gt; x &amp;&amp; Ex &gt; Xmin) {  
 Ex -= 0.1;  
 }  
 if (Ey &lt; y &amp;&amp; Ey &lt; Ymax) {  
 Ey += 0.1;  
 }  
 if (Ey &gt; y &amp;&amp; Ey &gt; Ymin) {  
 Ey -= 0.1;  
 }  
 calculateAngle(Ex, Ey);  
 servo1.write(theta1);  
 servo2.write(theta2);  
 delay(1);  
 }  
}  
/\*Vérification de fonctionnalités\*/  
void check() {  
 Serial.println("Coordonnées");  
 Serial.println(Ex, 4);  
 Serial.println(Ey, 4);  
 Serial.println(theta1, 4);  
 Serial.println(theta2, 4);  
 Serial.println("Etats des boutons");  
 Serial.println(digitalRead(button1));  
 Serial.println(digitalRead(button2));  
 Serial.println(digitalRead(button3));  
 Serial.println(digitalRead(button4));  
 Serial.println("Etat du joystick");  
 Serial.println(digitalRead(SW\_pin));  
 Serial.println(analogRead(X\_pin));  
 Serial.println(analogRead(Y\_pin));  
 delay(1000);  
}

#### 4. Fabrication :

Nous avons procédé à la fabrication de nos pièces en utilisant différentes technologies en fonction de leur géométrie. Certaines pièces ont été fabriquées par impression 3D, tandis que d'autres ont été découpées au laser.

Pour cette phase de fabrication, nous avons utilisé les machines du FabLab et suivi les documentations fournies. Nous avons ainsi appris à utiliser les logiciels Inkscape pour la découpe laser et Ideamaker pour l'impression 3D, sur lesquels nous avons importé les mises en plan de nos pièces. Ces outils nous ont permis de préparer nos fichiers de conception.

Par ailleurs lors de la fabrication, nous avons remarqué quelques soucis techniques, pour cela nous avons dû revoir quelques aspects de la CAO. Certaines dimensions ont dû être légèrement modifiées, quand bien même dans la majeure partie des cas, limer un peu les pièces était suffisant. En revanche, la modification la plus importante concerne la liaison pignon - crémaillère, puisque nous avons réalisé que nous avions fait l’erreur de ne pas prévoir de guidage pour la translation de la crémaillère. Pour pallier cela, nous avons donc ajouté un pilier au sein de la crémaillère, collé à la bielle inférieure, évitant ainsi les degrés de liberté non désirés.

![](https://lh7-us.googleusercontent.com/-b97g88Sfq8awhXm0bcZY5K-bJoaW3pH3Xle_dQQGv7wwivM5jsB3qpSQ7fgCJMduVIK7KUwhqgI8ojGJ0EV0dzPr85fDeB0kGiP0PEGhofYFNl9YCd68WKDFtdX1uHwGGuPUtmk695Ulz9sbdDWNSA)

figure(20)

Pour ce qui est des liaisons pivots, l’écrou assurant la MAP étant en contact avec la bielle, celui-ci était entraîné en rotation et se dévissait légèrement, créant du jeu. Pour résoudre ce problème, quand bien même l’idéal aurait été de prendre cela en compte dans la CAO, nous avons usé d’écrous freins, qui ont pour avantage de ne pas se dévisser.

On peut finalement noter que pour certaines pièces réalisées par découpe laser telles que les pièces du bâti, certaines parties de la MAP n’étaient pas présentes dans la CAO, ce qui s’explique par le fait qu’elles ont été collées entre elles.

Après avoir fabriqué toutes les pièces, nous les avons toutes assemblées afin de réaliser notre robot final et par la suite exécuter le programme et faire des tests afin de vérifier son bon fonctionnement.

[![image_50462209.JPG](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/image-50462209.JPG)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/image-50462209.JPG)

#### 5. Tests :

Après avoir finalisé l'assemblage de notre robot, nous avons réaliser les tâches demandées dans le cahier de charge en exécutant le code : une ligne droite de 5cm, une ligne pointillée de 5cm, un cercle de 2.5cm et un cercle en pointillé de rayon 2.5cm. Nous avons également essayer de reproduire un dessin à l'aide d'un joystick.

Résultat : ces tâches ont été réalisées avec succès par le robot.

#### 6. Conclusion et points d'amélioration :

Pour conclure, ce projet nous a permis de mettre en pratique nos différents acquis théoriques au cours de notre formation, nous montrant également l'importance de la théorie avant sa concrétisation. À travers ce projet, nous avons pu atteindre nos objectifs initiaux en concevant un système robotique divisé en quatre axes : mécanique, actionnement, commande et interface de pilotage.

De plus, ce projet nous a permis de comprendre l'importance du travail en équipe. Nous avons appris à nous organiser au sein du groupe en répartissant et synchronisant les tâches, afin de gérer le temps et les délais du projet. En nous entraidant face à chaque difficulté, nous avons relevé tous les défis possibles, démontrant ainsi que l'union fait la force.

Ce projet nous a également donné l'occasion de découvrir et de maîtriser un nouvel environnement de travail, le FabLab, ce qui nous a permis d'accéder directement aux technologies de fabrication.

Si jamais nous devions refaire ce projet, certaines améliorations seraient nécessaires. Tout d’abord, nous avons manqué de rigueur dans le dimensionnement des pièces, ce qui a conduit à un système surdimensionné. Concernant les bielles, il est important de bien délimiter l’espace de travail du robot pour éviter les singularités. Le problème provient également de l'épaisseur excessive de nos pièces, qui aurait pu être réduite. Un autre point à améliorer est celui des liaisons pivots entre les bielles, pour lesquelles l’utilisation de roulements aurait permis de réduire les frottements.

En somme, ce projet a été une expérience enrichissante, nous permettant d’appliquer nos connaissances théoriques, de travailler efficacement en équipe et de nous familiariser avec des technologies de pointe, tout en identifiant des domaines où nous pouvons encore progresser.

<div class="mt-1 flex gap-3 empty:hidden juice:-ml-3" id="bkmrk--28"><div class="items-center justify-start rounded-xl p-1 flex"><div class="flex items-center"><button class="rounded-lg text-token-text-secondary hover:bg-token-main-surface-secondary"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button><button class="rounded-lg text-token-text-secondary hover:bg-token-main-surface-secondary"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button><button class="rounded-lg text-token-text-secondary hover:bg-token-main-surface-secondary"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button><div class="flex"><button class="rounded-lg text-token-text-secondary hover:bg-token-main-surface-secondary"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button><button class="rounded-lg text-token-text-secondary hover:bg-token-main-surface-secondary"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button>  
</div><div class="flex items-center pb-0.5 juice:pb-0"><svg class="icon-md h-4 w-4" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>  
</div><button aria-expanded="false" aria-haspopup="menu" class="cursor-pointer rounded-md px-1 text-token-text-secondary h-[30px] hover:bg-token-main-surface-secondary" data-state="closed" id="bkmrk--29" type="button"></button></div></div></div>

# Projet ROB3 : Joshua , Grigor , Dilhan

# Présentation du projet

<div id="bkmrk-">  
</div>#### Informations

- NOM PRENOM : 
    - Hauzay Joshua
    - Pelibossian Grigor
    - Emir Dilhan
- ROB 3
- adresses mail : 
    - - [dilhan.emir@etu.sorbonne-universite.fr](mailto:dilhan.emir@etu.sorbonne)
    - - [grigor.pelibossian@etu.sorbonne-universite.fr](mailto:dilhan.emir@etu.sorbonne)
    - - [joshua.hauzay@etu.sorbonne-universite.fr](mailto:dilhan.emir@etu.sorbonne)
- 7 février 2024 - mai 2024

#### 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 :

<div aria-label="Page Section Options" class="pointer-container" id="bkmrk-%C2%A0-1" refs="pointer@pointer" tabindex="-1"><div class="pointer flex-container-row items-center justify-space-between p-s anim is-page-editable"><div class="flex-container-row items-center gap-s" refs="pointer@mode-section"><button class="text-button icon px-xs" title="Permalink mode, Press to show include tag"><svg class="svg-icon" data-icon="link" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button><div class="input-group"> <button class="button outline icon" title="Copy Link" type="button"><svg class="svg-icon" data-icon="copy" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button></div></div><svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></div></div>- 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](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](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/aLk2.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/aLk2.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](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/schema-solution.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/schema-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.

##### <span style="color: rgb(0, 0, 0);">Troisième</span><span style="color: rgb(0, 0, 0);"> solution :</span>

La troisième solution consiste à créer un <span style="color: rgb(0, 0, 0);">pignon crémaillère afin d'effectuer des déplacements directement selon les axes x, y et z.</span>

[![SmartSelect_20240221_103953_Samsung Notes.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/smartselect-20240221-103953-samsung-notes.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/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).

<div aria-label="Page Section Options" class="pointer-container" id="bkmrk-%C2%A0-2" refs="pointer@pointer" tabindex="-1"><div class="pointer flex-container-row items-center justify-space-between p-s anim is-page-editable"><div class="flex-container-row items-center gap-s" refs="pointer@mode-section"><button class="text-button icon px-xs" title="Permalink mode, Press to show include tag"><svg class="svg-icon" data-icon="link" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button><div class="input-group"> <button class="button outline icon" title="Copy Link" type="button"><svg class="svg-icon" data-icon="copy" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button></div></div><svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></div></div>##### 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](https://docs.google.com/spreadsheets/d/1rBMSOXjBwbDXSA9WxZV4CNlc4wGikqxUgBZ74uLwpI0/edit?usp=sharing)

#### Calcul mécanique :

Nous nous servons de ce schéma afin d'effectuer nos calculs:

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/cQLimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/cQLimage.png)

On sait que :

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/Hqtimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/Hqtimage.png)

En utilisant les formules trigonométriques, on trouve alors :

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/qpAimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/qpAimage.png)

(sur le schéma, L<sub>1</sub> et L<sub>2</sub> sont représenté par l<sub>1 </sub>et l<sub>2</sub>)

De plus, on note :

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/oBOimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/oBOimage.png)

Ainsi, on détermine [![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/16Himage.png) et ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/16Himage.png)[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/UHlimage.png) :](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/UHlimage.png)

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/Q0Dimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/Q0Dimage.png)

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/f9Zimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/f9Zimage.png)

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

#### 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](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/circuit-2.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/circuit-2.png)

Ce schéma intègre trois servomoteurs en position et 4 bouton-poussoir, destiné à basculer entre les modes automatique et manuel ainsi que pour choisir le dessin voulu.

Nous avons décidé de rajouter aussi 3 LEDs afin de montrer le mode de fonctionnement dans lequel le robot est (manuel ou automatique) et si on est en mode automatique, quel figure il dessine :

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/q8Qimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/q8Qimage.png)

Je vais maintenant détailler le schéma électronique.

La carte Arduino est alimenté en 5V. L'alimentation et la masse sont relié à la plaque Labdec. Chaque servomoteur est relié à l'alimentation, à la masse et à un PIN digital (1 PIN par servomoteur, les PINs 3,5 et 6) sur la carte Arduino. Chacun des quatre boutons est relié à la masse, ainsi qu'à l'alimentation avec une résistance de 1 ㏀ et à un PIN digital (1 PIN par bouton-poussoir, les PINs 2,7,8 et 9) sur la carte Arduino. Chaque LED est relié à un PIN digital avec une résistance de 1 ㏀ (1 PIN par LED, les PINs 10,11 et 12). Le joystick est relié à l'alimentation ainsi qu'à la masse, mais aussi à 2 PINs analogique(Les PINs A2 et A3).

#### 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](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/zvEimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/zvEimage.png)

Cependant nous nous sommes rendus compte que la base réalisé en 3D n'était pas nécessaire et nous avons donc modélisé une base à partir de découpage laser et collage. On obtient ce résultat:

[![base.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/Tfbbase.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/Tfbbase.png)

#####   


##### <span style="text-decoration: underline;">Fonctionnement:</span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/vChimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/vChimage.png)

**<span id="bkmrk-ce-premier-sous-asse-1" style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ce premier sous-assemblage correspond à la base de notre robot, dans lequel nous allons ajouter du contrepoids. Ces derniers permettront d'éviter que le robot ne se déplace de manière intempestive. Au centre de cette base, se trouve notre servomoteur principal. Celui-ci aura pour rôle de diriger le premier bras du robot. Afin de maintenir ce servomoteur en place, nous avons modélisé un socle en bois. La taille de ce socle a été minutieusement étudiée, afin de correspondre exactement à celle du servomoteur. Cela permettra une mise en position précise et efficace. Toutefois, il est important de noter que le maintien en position n'est pas nécessaire dans ce cas précis. La raison de notre changement de base, pour passer d'une base en 3D à une base en bois, s'explique simplement. En effet, nous avons opté pour cette solution en raison du temps que cela nous permettait de gagner. La création des pièces pour la base en bois s'est faite en à peine quelques heures, alors que si nous l'avions réalisée via impression 3D, cela nous aurait pris beaucoup plus de temps. Ainsi, le choix d'une base en bois s'est avéré être la solution la plus efficace et la plus rapide pour notre projet.</span>**

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/ISEimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/ISEimage.png)

<span id="bkmrk-ce-sous-assemblage-c-1" style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ce sous-assemblage ci-joint correspond au premier bras de notre robot. Nous avons opté pour cette forme particulière pour une raison de poids. En effet, elle est plus légère qu'un rectangle tout en offrant la même rigidité.Le premier bras est doté d'un trou circulaire qui sert de liaison avec le servomoteur principal situé dans la base du robot. En outre, le premier bras possède également un trou rectangulaire qui correspond exactement à la taille d'un petit servomoteur. Ce trou a été conçu pour insérer ce servomoteur secondaire, qui sera chargé de manipuler le deuxième bras du robot. Cette conception permet une intégration facile et rapide du servomoteur, tout en évitant un maintien en position inutile </span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/G5Vimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/G5Vimage.png)

<span style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">  
</span>

<span style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Voici le dernier sous-assemblage de notre robot, qui correspond au deuxième bras. Ce bras est similaire au premier bras en ce qui concerne le trou circulaire pour la liaison avec le bras précédent. Cependant, il possède des trous rectangulaires sur toute sa longueur, qui sont destinés à accueillir une pièce de support pour le servomoteur qui va soulever le stylo. Nous avons donc modélisé un support pour le stylo, dans lequel nous avons laissé une ouverture de la forme du palonnier. Cela permettra au servomoteur de soulever et d'abaisser le stylo avec précision. De plus, nous avons prévu un trou supplémentaire dans le support pour permettre un réglage facile du stylo utilisé. Ainsi, notre robot pourra s'adapter à différents types de stylos sans nécessiter de modifications majeures.</span>

#### <span style="text-decoration: underline;">Montage:</span>

A partir de cette modélisation nous avons pu commencer l'assemblage du robot, pour cela nous avons imprimé le support du stylo via l’impriment 3D

[![WhatsApp Image 2024-05-14 à 16.26.58_245cb67a.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/whatsapp-image-2024-05-14-a-16-26-58-245cb67a.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/whatsapp-image-2024-05-14-a-16-26-58-245cb67a.jpg)

Nous avons effectué le découpage laser et collage de chaque assemblage individuellement (socle, bras 1 et bras 2), puis on les a assemblés pour obtenir finalement comme résultat final avec les branchements :

[![WhatsApp Image 2024-05-21 à 22.49.48_244f8fd8.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/whatsapp-image-2024-05-21-a-22-49-48-244f8fd8.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/whatsapp-image-2024-05-21-a-22-49-48-244f8fd8.jpg)

#### Code Arduino :

<span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;">organigramme :</span></span>

<div id="bkmrk-root-%28arduino-progra">  
1. **Root (Arduino Program: Servo Control with Potentiometer)**
    
    
    - **Bibliothèques**
        
        
        - Servo
        - math.h
    - **Variables globales**
        
        
        - Objets Servo
            
            
            - myservo1
            - myservo2
            - myservoZ
        - Pins d'entrée
            
            
            - potx
            - poty
            - bouton\_mode
            - boutonstylo
            - bouton\_dessin
            - bouton\_lancerdessin
        - Pins de sortie
            
            
            - ledmode
            - led\_dessin
            - led\_pointille
        - Constantes
            
            
            - servo1
            - servo2
            - servoZ
            - a1
            - a2
        - Autres variables
            
            
            - calibrage
    - \*\*Fonction setup()
        
        
        - Initialiser les pins
        - Attacher les servos
        - Initialiser la communication série
    - **Fonction loop()**
        
        
        - Boucle principale de contrôle
        - Calibration et contrôle du mode dessin
    - **Fonctions auxiliaires**
        
        
        - Goto(float x, float y)
        - lever\_stylo(int i)
        - Fonctions de dessin
            
            
            - trait()
            - trait\_pointille()
            - cercle()
            - cercle\_pointille()
            - allumer\_led(int n)
        - dessin()
        - joystick()

</div>[![Votre texte de paragraphe.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/votre-texte-de-paragraphe.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/votre-texte-de-paragraphe.png)

#### Documentation utilisateur :

Monter le robot :

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>Brancher le robot comme indiqué sur le schéma électrique

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>Alimenter le montage en branchant l’alimentation

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>Une fois l’alimentation branchée les moteurs vont se mettre en place : Il vous faut monter les bras alignés du coté ou l’axe du servo moteur est le plus proche du bord.

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>Appuyez sur le premier bouton pour finaliser le montage.

Placer le stylo :

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>Appuyez sur le dernier bouton pour baisser le support de feutre

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>Le Premier bouton permet de changer de mode

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>Lorsque la led bleue est allumée on est dans le mode joystick

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>Lorsqu’elle est éteinte on est en mode dessin

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>Les led rouges permettent de choisir le dessin en appuyant sur le 2ème bouton, elles indiquent en binaire le dessin sélectionné :

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span> 0= trait , 1 = trait pointillé, 2 = cercle, 3 = cercle pointillé

Le 3<sup>ème</sup> bouton permet de lancer le dessin.

# Projet ROB3 - Robot écrivain : Bastien Antonin Antonin

#### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Informations</span></span></span></span>

<table border="1" id="bkmrk-couque-bastien-%C2%A0bast" style="border-collapse: collapse; width: 91.48148148148147%; height: 87px;"><colgroup><col style="width: 23.616734143049932%;"></col><col style="width: 46.82860998650472%;"></col><col style="width: 29.41970310391363%;"></col></colgroup><tbody><tr style="height: 29px;"><td style="height: 29px;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">COUQUE Bastien</span></span></span></span></td><td style="height: 29px;"> [<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">bastien.couque@etu.sorbonne-universite.fr</span></span></span></span>](mailto:bastien.couque@etu.sorbonne)</td><td><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Étudiant Robotique 3-A </span></span></span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Polytech Sorbonne</span></span></span></span>

</td></tr><tr style="height: 29px;"><td style="height: 29px;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">CHAUVET Antonin</span></span></span></span></td><td style="height: 29px;">[<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">antonin.chauvet@etu.sorbonne-universite.fr</span></span></span></span>](mailto:bastien.couque@etu.sorbonne)</td><td><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Étudiant Robotique 3-A </span></span></span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Polytech Sorbonne</span></span></span></span>

</td></tr><tr style="height: 29px;"><td style="height: 29px;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">CENSIER Antonin</span></span></span></span></td><td style="height: 29px;">[<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">antonin.censier@etu.sorbonne-universite.fr</span></span></span></span>](mailto:antonin.censier@etu.sorbonne-universite.fr)

</td><td><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Étudiant Robotique 3-A </span></span></span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Polytech Sorbonne</span></span></span></span>

</td></tr></tbody></table>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Date de début de Projet : </span></span> </span></span>**<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">8 Janvier 2024</span></span></span></span>**

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Date de fin du Projet : </span></span></span>**<span style="color: rgb(0, 0, 0);"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">30 mai 2024</span></span></span></span>**</span>

#### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Sommaire</span></span>

- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Contexte</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Objectifs</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Matériel</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Machines utilisées</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Gantt</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Fonctionnement</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Résultats</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Dossier de conception détaillé</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Construction</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Journal de bord</span></span>

#### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Contexte</span></span></span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Ce projet de robotique s'inscrit dans le cadre de nos études en Robotique, plus précisément pour notre projet du deuxième semestre de notre première année. Ce projet est pour chacun de nous le premier projet robotique.</span></span></span></span>

#### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Objectifs</span></span></span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Les objectifs de ce projet nous ont été donnés par nos responsables d'UE et sont précisés via le lien suivant :</span></span>

[<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">https://wiki.fablab.sorbonne-universite.fr/BookStack/books/projets-due-2023-2024/page/le-sujet-du-projet</span></span>](https://wiki.fablab.sorbonne-universite.fr/BookStack/books/projets-due-2023-2024/page/le-sujet-du-projet)

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Nous les résumés ci-dessous :</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">L'objectif principal de ce projet est de concevoir et réaliser un système robotique, c'est-à-dire sa partie mécanique, sa motorisation, sa commande et son interface de pilotage. Les fonctions que notre système robotique doit être capable de réaliser sont :</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">- Tracer, avec l'aide d'un crayon fixé sur l'organe terminal du robot une ligne de 5 cm de long, une ligne pointillée de 5cm de long, un cercle de 2,5 cm de rayonne, un cercle pointillé de 2 ,5 cm de rayonne.</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">- Le tracé de chacune des figures doit être réalisé en </span></span>**<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">10 secondes</span></span>**<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"> +/- 0,2 secondes.</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">- Tracer, avec l'aide d'un crayon fixé sur l'organe terminal du robot, un dessin imposé dans un carré de 5cm par 5cm. Le déplacement de l'organe terminal du robot devra être </span></span>**<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">piloté par un joystick</span></span>**<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"> . Il est possible que la figure soit discontinue, et donc il faut prévoir de pouvoir relever le crayon du support horizontal sur lequel on écrit.</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Une fonction supplémentaire, optionnelle , peut être réalisée :</span></span>

- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Être capable de modifier la vitesse de déplacement du robot via l'interface.</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">L'objectif reste avant tout d'apprendre par la pratique les bases de la gestion d'un projet (c'est-à-dire la façon de s'organiser en équipe pour atteindre un objectif donné avec des moyens donnés) que d' aboutir à un prototype fonctionnel</span></span>

Photo du Robot

[![photoJP.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/photojp.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/photojp.jpg)

#### <span style="vertical-align: inherit; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Matériel</span></span></span></span>

<span style="vertical-align: inherit; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Voici la liste du matériel donné (imposé) par nos responsables de projet :</span></span></span></span>

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

#### <span style="vertical-align: inherit; background-color: rgb(255, 255, 255);"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Machines utilisées</span></span></span></span>

<span style="vertical-align: inherit; background-color: rgb(255, 255, 255);"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Les machines mises à notre disposition sont celles du Fablab. </span></span>  
<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Nous pouvons utiliser les découpes laser et les imprimantes 3D (Nous n'en avons pas encore utiliser pour le moment)</span></span></span></span>

#### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Gantt</span></span>

[![gant.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/gant.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/gant.png)

#### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Fonctionnement</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Le robot comporte deux boutons et un joystick pour réaliser 5 fonctions, de ce fait il y a des combinaisons pour lancer les différents dessins. Le joystick doit être placé de sorte que ses broches soient vers nous.</span></span>

- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Ligne continue : BOUTON 2</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Cercle continue : BOUTON 1</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Ligne pointillée : Joystick vers la droite puis maintenir BOUTON 2</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Cercle pointillé : Joystick vers la droite puis maintenir BOUTON 1</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Joystick : Joystick vers la gauche</span></span>
    - <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Monter / descendre l'effecteur : BOUTON 2</span></span>
    - <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Sortir du mode Joystick : BOUTON 1</span></span>

#### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Résultats</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Voici le résultat de notre travail en vidéo :</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Ligne droite : </span></span>[<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">vidéo ligne continue</span></span>](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/778)

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Ligne pointillée : </span></span>[<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">vidéo ligne pointillée</span></span>](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/787)

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Cercle : </span></span>[<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">vidéo cercle continue</span></span>](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/776)

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Cercle pointillé : </span></span>[<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">vidéo cercle pointillé</span></span>](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/788)

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Joystick : </span></span>[<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">joystick vidéo</span></span>](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/789)

#### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Dossier de conception détaillé</span></span>

##### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Modélisation</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Conception globale du robot :</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Le mouvement est réalisé par deux bielles pour le déplacement dans le plan et un effecteur qui supportera le stylo qui se déplacera selon l'axe Z pour réaliser le mouvement en fonction de l'axe vertical.</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Robot modélisé :</span></span>

[![robot.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/robot.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/robot.png)

*<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">La plaque sous l'effecteur correspond à la zone d'écriture du robot</span></span>*

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Toutes les pièces du robot sont réalisées en découpe laser, à l'exception des trois pièces qui constituent l'effecteur, qui sont réalisées en impression 3D. Pour la base et les bras, les bielles sont montées serrées entre elles pour constituer le robot, et les 3 servomoteurs sont vissés sur les bielles. La base contient la carte Arduino. Comme on le voit sur l'image, le robot écrira sur le côté par rapport à la base pour éviter la singularité lorsque les deux parties du bras sont colinéaires. Cela permet également d'éviter les problèmes de collision du robot lorsqu'il écrit proche de la base.</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Guidage :</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Le guidage de l'effecteur est réalisé par deux bielles dans lesquelles coulisse l'effecteur pour effectuer le mouvement de haut en bas :</span></span>

[![effecteur.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/effecteur.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/effecteur.png)

Le stylo est maintenu par la bague inférieure qui maintient le stylo à la bonne hauteur et la bague supérieure qui pince le stylo pour éviter qu’il ne bouge.

La première partie du bras est reliée par deux roulements à la base, ils sont montés serrés dans les bielles. Il y a une rondelle entre le roulement et le support de la base sur lequel est boulonné le bras pour que la partie du roulement intérieur soit reliée exclusivement au support de la base. Sachant que l’extérieur du roulement est relié à la bielle avec le montage serré, cette rondelle permet de mouvement la rotation du roulement.

La seconde partie du bras est reliée à la première partie du bras par le même principe que la première partie. Des roulements et des rondelles sont utilisés. La partie supérieure est boulonnée et la partie inférieure est guidée par la vis qui tient le palonnier dans le servomoteur, nous allons utiliser une vis plus longue pour prendre dans la vis les deux bielles pour se viser dans le servomoteur 2. Cela permet de combiner la transmission d’effort avec le guidage. Cela est possible avec des contraintes contenues sur cette liaison, c’est pour cela que nous n’avons pas utilisé cette méthode de transmission d’effort pour la première partie du bras.

Transmission des efforts

Pour la première partie du bras : un servomoteur est vissé à la base, nous utilisons un palonnier circulaire pour relier la transmission du servomoteur à la bielle. Ce palonnier circulaire permet de visser 6 vis dans la bielle depuis le palonnier.

[![servo 1.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/servo-1.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/servo-1.png)

<span style="mso-no-proof: yes;">  
</span>

Pour le second servomoteur, la transmission est réalisée avec le guidage du servomoteur, l’adhérence permet la transmission.

[![servo 2.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/servo-2.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/servo-2.png)

Pour la mise en mouvement de l’effecteur selon l’axe vertical :

Le servomoteur met en mouvement un palonnier avec un axe glissé dans une fourchette sur l’effecteur. Lorsque le servomoteur tourne, le palonnier va entraîner l’effecteur avec lui, qui réalisera un mouvement vertical.

[![servo3.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/servo3.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/servo3.png)

Nous ferons courir les fils des servomoteurs le long des bielles pour aller jusqu’à la base pour être reliés à la carte Arduino.

Tous les ajustements ont été réalisés pour les différents montages et les cotes ont été reportées sur les fichiers SolidWorks.

Voici les fichiers SolidWorks :

 [modélisation.zip](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/576)

Voici les fichiers pour la découpe laser des pièces :

[decoupe plaque de 3mm.svg](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/574)

[decoupe plaque de 6mm.svg](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/575)

Voici les fichiers pour l'impression 3D :

Fichier ideaMaker : [fichier idea.idea](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/772)

Fichier d'impression :

- [impression3D.gcode](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/773) [ ](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/771)
- [impression3D.data](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/771)

<span style="display: none; mso-hide: all;">Haut du formulaire</span>

##### Schéma électrique

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/gqeimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/gqeimage.png)

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/ZOQimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/ZOQimage.png)

##### Modèle géométrique

[![2.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/TRz2.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/TRz2.png)

[![1.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/bky1.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/bky1.png)

[![3.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/J0c3.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/J0c3.png)

##### Organigramme de programmation

[Organigramme\_Code.svg](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/779)

##### Code Arduino

Voici le code Arduino : [code\_ardu.ino](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/802)

#### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Construction</span></span>

##### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Étape 1</span></span>

Imprimer et découper toutes les pièces à partir des fichiers de découpe et du fichier d'impression 3D placé dans la partie *dossier de conception détaillé.*

##### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Étape 2</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Assembler les différentes pièces à partir du fichier Solidworks qui contient le robot complet (*dossier de conception détaillé*). Il est possible de réaliser le montage dans le sens suivant : </span></span>

- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">monter les deux bielles séparément</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">assembler les deux pièces assemble</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">monter l'effecteur</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">monter la base du robot sauf la plaque supérieur pour faciliter le montage du bras</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">assembler le bras monté avec la base</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">monter la plaque supérieur de la base</span></span>

##### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Étape 3</span></span>

Réaliser le câblage à partir des schémas de câblages.

##### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Étape 4</span></span>

Téléverser le code <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">(*dossier de conception détaillé*) dans la carte Arduino</span></span>.

#### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Journal de bord</span></span>

*<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Avancée du projet à chaque étape, difficultés rencontrées, modifications et adaptations (facultatif pour les petits projets)</span></span>*

##### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">08/02/2024</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">La première étape de notre projet était de poser sur une feuilles toutes nos idées. Trois solutions ont eu le mérite d'être schématisées. Bien qu'elles répondent toutes à la même problématique, chaque solution possède ses propres inconvénients et avantages. Le but de cette étape était d'analyser les propriétés de chaque solutions, se projeter au niveau des problèmes de conception enfin de choisir la solution la plus adaptée à nos compétence et au problème final. </span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">La première solution serait un robot à deux roues, avec en un point du châssis, son effecteur. Il y aurait un moteur pour chaque roue ainsi qu'un moteur pour lever et baisser l'effecteur. </span></span>

[![schéma_robot_3.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/schema-robot-3.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/schema-robot-3.jpeg)

Seulement ce robot nous pose quelques problèmes :

- précision de l'odométrie : les roues des robots peuvent glisser ou patiner ce qui entraîne des erreurs dans la mesure du déplacement.
- utilisation de servomoteurs pour contrôler la rotation des roues : nos servomoteurs peuvent réaliser seulement un demi tour ce qui rend difficile son utilisation pour réaliser plusieurs tours de roue.
- positionnement sur la feuille, il est influencé par l'endroit où nous le posons

Cette option propose néanmoins des points forts :

- Compact
- possibilité d'expansion au delà de la feuille
- Peu de matériel

La deuxième solution est un bras, constitué de deux articulations, une base et un effecteur. Il y aurait donc un moteur par articulation. Pour répondre au cahier des charges il faudrait aussi permettre une translation sur la hauteur afin de contrôler le contact entre l'effecteur et la feuille.

[![schéma_robot_2.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/schema-robot-2.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/schema-robot-2.jpeg)

Voici les avantages que présente cette option :

- Guidages des déplacements dans le plan de la feuille simplifiés comparés aux autres
- Utilisation des servomoteurs simplifié
- modèle géométrique de la position de l'effecteur simplifié
- Positionnement simplifié

Et voici ses défauts :

- guidage de la translation selon l'axe z

La dernière solution imaginée est inspirée du fonctionnement d'une imprimante 3D. Le déplacement de l'effecteur se consiste de deux translations dans le plan et une dernière perpendiculaire au plan. La première consiste a déplacer l'effecteur suivant un rail horizontal et la seconde consiste à déplacer le rail précédent sur un second rail horizontal. Ces deux mouvements permettent le mouvement dans le plan pour écrire. Le mouvement de translation permettant la montée est descente de l'effecteur est réalisé par un autre moteur sur l'axe de l'effecteur.

[![schéma_robot_1.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/0L5schema-robot-1.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/0L5schema-robot-1.jpeg)

Nous avons pensé à trois différents moyen de transmissions d'effort pour déplacer les chariots :

- Bielle manivelle
- Roue et rail denté
- Système de courroie

Avantages :

- paramétrage des mouvements simples à concevoir
- positionnement global

Inconvenants :

- guidage
- transmissions des efforts (servomoteur)

Le premier choix ne nous semble pas optimal principalement à cause du manque de précision de l'odométrie mais aussi le manque de précision lors du positionnement du robot, cette solution ne sera donc pas celle choisie.

Le troisième choix présente des avantages mais les guidages et la transmission d'effort nous semble problématique à concevoir avec l'utilisation de servomoteur qui ne peuvent pas réaliser de tours complets.

Le second choix nous semble le meilleur compromis pour répondre à notre problème grâce à une bien meilleure précision comparé au premier choix ainsi qu'aux guidages et transmissions d'efforts moins complexes que ceux du troisième choix. Cependant, nous devront réfléchir au placement des servomoteurs et au guidage de la translation selon la hauteur.

Nous choisissons donc le choix deux pour ce projet

##### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">15/02/2024</span></span>

#### Schéma électronique :

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/z8Vimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/z8Vimage.png)

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/I0wimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/I0wimage.png)

Notre schéma électronique comporte la carte arduino, la platine de prototypage ainsi que les boutons poussoirs, les servomoteurs, 2 potentiomètres (qui sont normalement le joystick mais le logiciel sur lequel nous avons crée notre schéma électronique ne le proposait pas en bibliothèque) et les résistances (et câbles). Nous utilisons donc nos 3 servomoteurs ainsi que 5 boutons poussoirs (changé par la suite par 2 boutons poussoirs seulement). Ces boutons poussoirs nous serviront à déterminer le mode de fonctionnement du robot selon lequel des boutons a été appuyé. Il y a donc 5 boutons pour le trait continu, le trait pointillé, l'arc de cercle continu, l'arc de cercle pointillé, et le guidage par un joystick. Le câblage du bouton poussoir est décrit dans la documentation ci-contre : [https://docs.arduino.cc/built-in-examples/digital/Button/](https://docs.arduino.cc/built-in-examples/digital/Button/)

En résumé, un fil lie l'alimentation 5V à la platine, un autre la masse et un troisième par d'une broche numérique de la carte arduino à une patte du bouton. Ensuite, nous connectons une patte directement à l'alimentation sur la platine et l'autre à travers une résistance de 10Kohm et vers la masse.  
Pour le branchement des servomoteurs, nous avons suivis la méthode expliquée dans ce site : [https://www.volta.ma/comment-controler-les-servomoteurs-avec-arduino/arduino/](https://www.volta.ma/comment-controler-les-servomoteurs-avec-arduino/arduino/)

Il est expliqué :"il vous suffit de connecter trois fils: alimentation, masse et signal. Le fil d’alimentation est généralement rouge et doit être connecté à 5 V." "Le fil de terre est généralement noir ou marron et doit être connecté à la broche de terre de l’Arduino."

"Le fil de signal est généralement jaune, orange ou blanc peut être connecté à l’une des broches numériques de l’Arduino."   
Dans notre cas, nous avons bien veillés à connecter nos servomoteurs sur les broches numériques PWM (Pulse Width Modulation) car les servomoteurs sont contrôlés en envoyant un signal PWM à la ligne de signal du servo et la largeur des impulsions détermine la position de l’arbre de sortie. Cependant, il n'est pas forcément nécessaire de le brancher aux pins PWM spécifiques car la bibliothèque Servo d'Arduino nous permet de contrôler un servo à partir de n'importe quelle broche numérique. Le fonctionnement du PWM est détaillé dans la documentation suivante : [https://docs.arduino.cc/learn/microcontrollers/analog-output/](https://docs.arduino.cc/learn/microcontrollers/analog-output/)[ ](https://docs.arduino.cc/learn/microcontrollers/analog-output/)

Enfin, le joystick a été représenté par 2 potentiomètres car le joystick analogique est un bouton monté sur une charnière avec deux potentiomètres. L’inclinaison du bouton fait tourner les potentiomètres et modifie la tension de sortie, ce qui permet de contrôler le degré de déviation du bouton par rapport au point central et, grâce à cela, de contrôler l'angle des servomoteurs.

#### Modélisation

Nous avons réalisé la modélisation du robot à l'aide du logiciel SolidWorks. Nous avons commencé par dimensionner le bras. Celui-ci est composé de deux parties que nous avons nommées pour la suite : la partie reliant la base à la seconde partie du bras sera appelée « bras », et la seconde partie, qui relie le bras à l’effecteur, sera appelée « avant-bras ». Ces deux parties seront réalisées à l’aide de deux bielles superposées et fabriquées par découpe laser. La liaison de ces deux bielles superposées est réalisée par une bielle de liaison qui sera montée serrée dans les deux bielles. La liaison du bras avec l'avant-bras sera réalisée par des roulements et un boulonnage.

La base du robot sera également réalisée en découpe laser pour concevoir une sorte de boîte, comme on peut le voir sur la première version de la modélisation du robot sans l’effecteur. Ce support est composé de plaques de 3 mm d’épaisseur pour les plaques inférieure et supérieure, ainsi que la plaque du fond de la base. Il contiendra des plaques de 6 mm d’épaisseur pour les plaques latérales qui supporteront également les plaques de 6 mm d’épaisseur pour soutenir le bras et le servomoteur 1. Cette base permettra aussi de contenir le microcontrôleur.

[![Modélisation V0.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/aKYv0-modelisation.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/aKYv0-modelisation.png)

Ce qui nous a posé le plus de problèmes a été le positionnement des servomoteurs. Nous avons choisi, pour des raisons d’encombrement, d’utiliser un Hitec HS422 pour la rotation du bras (servomoteur 1) et deux FT90MR pour la rotation de l’avant-bras (servomoteur 2) et la translation selon l’axe vertical de l’effecteur (servomoteur 3).

Le servomoteur 2 est fixé grâce à un support monté serré sur l’avant-bras, le servomoteur 3 est également fixé avec un support monté serré mais lui sur le bras. Le servomoteur 1 est fixé sur une plaque de 6 mm dans la base.

Explication du guidage :

Pour l’avant-bras : la liaison est réalisée au bras avec l’aide de roulements. Pour la bielle supérieure, elle sera boulonnée avec le roulement et pour la bielle inférieure, le guidage du servomoteur sera utilisé pour viser la bielle. La bielle sera vissée avec le roulement et le servomoteur, pinçant ainsi le roulement et le palonnier.

Pour le bras : le guidage est indépendant du servomoteur, contrairement à l’avant-bras. Le guidage est réalisé avec des roulements et un boulonnage.

Pour la transmission des efforts :

Pour l’avant-bras : l’axe du servomoteur sert de guidage, donc la transmission de l’effort est réalisée en même temps que le guidage.

Pour le bras : nous utilisons un palonnier cylindrique, avec 4 axes montés serrés dans la bielle qui se glisse dans les trous du palonnier.

Effecteur :

Pour la conception de l’effecteur, notre première réflexion était de pouvoir tenir le feutre, via une mise en positon (MIP) et un maintien en position (MAP). Nous nous sommes servis du décalage d’épaisseur entre la partie inférieur et le supérieur du feutre pour faire un anneau de butée qui assure la MIP. Un autre anneau est nécessaire pour assurer que le stylo ait une fixation linéaire et non annulaire. Ce second anneau se trouve plus haut et nous avons pensé à réaliser un serrage avec un système écrou/vis afin de réaliser la MAP.

Pour que l’effecteur se déplace à la verticale il fallait lui laissait un degré de liberté mais tout de même le guider. Pour ceci nous avons utilisé la partie qui relie l’anneau inférieur et supérieur que nous avons élargi latéralement. Le but était d’ensuite venir fixer sur les bielles deux plaques aux formes complémentaires pour réaliser un guidage glissière.

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">La dernière problématique était de faire bouger l'effecteur. Pour cela, nous utilisons la rotation du servomoteur selon l'axe x, auquel est fixé un palonnier avec un petit cylindre enfoncé à son extrémité. Il nous suffisait ensuite d'emprisonner cet axe à l'arrière de notre effecteur, entre deux « plaques » qui lui permettent le mouvement en x (qui est nous inutile mais inéluctable) et surtout qui guiderons l'effecteur selon z.</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Calcul nécessaire : Soit L la distance entre axe palonnier/cylindre, O l'angle de rotation dans le sens inverse trigo : alors z = Lsin(O) et x = Lcos(O).</span></span>

##### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">28/02/2024</span></span></span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Lors de cette séance, nous avons réalisé des tests de découpe laser. Lors de ces tests, nous nous sommes rendus compte que des pièces de 3 mm d'épaisseur manquaient de rigidité. Nous avons donc choisi d'utiliser principalement des pièces découpées au laser de 6 mm d'épaisseur. Après cette conclusion, nous avons donc dû réaliser des modifications sur la modélisation.</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Toujours dans le cadre des tests de découpe laser, nous avons réalisé des essais sur les ajustements entre une bielle et un roulement, ainsi qu'entre deux bielles qui doivent être montées serrées. Voici une photo des pièces de tests assemblées avec le bon ajustement :</span></span>[![IMG_9118.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/img-9118.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/img-9118.jpg)

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Toutes les cotes avec les ajustements sont à retrouver dans les fichiers SolidWorks. </span></span>

##### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">03/07/2024</span></span></span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Lors de cette séance nous avons imprimé toutes les pièces de notre robot et entamé l'assemblage du robot. Les pièces emboités sont également collées avec de la colle à bois pour consolider le robot en plus du montage séré. En parallèle nous avons commencé à programmer la carte Arduino. Nous avons également réalisé quelques tests avec les moteurs pour prendre en main la programmation de ces derniers.</span></span>

##### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">02/05/2024</span></span></span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Lors de cette séance nous avons terminé le montage du robot. Puis nous avons programmé les différentes fonctions pour remplir le cahier des charges. Nous avons également modifié le câblage en utilisant 2 boutons poussoirs au lieu de 5, rendant le tout plus compact. Ainsi on utilise un même bouton pour effectuer plusieurs fonctions en se servant du joystick en parallèle :</span></span>

- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Ligne continue : BOUTON 2</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Cercle continue : BOUTON 1</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Ligne pointillée : Joystick vers la droite puis maintenir BOUTON 2</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Cercle pointillé : Joystick vers la droite puis maintenir BOUTON 1</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Joystick : Joystick vers la gauche</span></span>
    - <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Monter / descendre l'effecteur : BOUTON 2</span></span>
    - <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Sortir du mode Joystick : BOUTON 1</span></span>

# Projet ROB3 : Mathys CLAUDEL, Sarah EL ZEGHENDY, Romain DARDE

### <span style="text-decoration: underline;">**Projet ROB3 S6**</span>

### <span style="text-decoration: underline;">**ROBOT ÉCRIVAIN**</span>

#### **Informations**

- Mathys CLAUDEL
- mathysclaudel@gmail.com

- Sarah EL ZEGHENDY
- sarah.el\_zeghendy@etu.sorbonne-universite.fr

- Romain DARDE
- <span style="color: rgb(0, 0, 0);"><romaindarde.rd@gmail.com></span>

- Date de début : 08/02/2024 - Date de fin : 02/05/2024

#### **Contexte**

Nous disposons des différentes machines présentent au Fablab, avec une boîte de matériels bien précis et limité. Nous devrons répondre au cahier de charge imposé ([Cahier des Charges](https://wiki.fablab.sorbonne-universite.fr/BookStack/books/projets-due-2023-2024/page/le-sujet-du-projet "Chartre")) et faire toutes les étapes nécessaires pour obtenir un système robotisé.

#### **Objectifs**

L’objectif principal de ce projet est de concevoir et réaliser un système robotique, c’est-à-dire sa partie mécanique, sa motorisation, sa commande et son interface de pilotage. Le cahier des charges fourni précise les fonctions que doit réaliser le système et les contraintes qu’il doit respecter.

<span style="text-decoration: underline;">**I. Cahier des** </span>**<u>charges:</u>**

Le robot doit être capable de réaliser deux exercices :

- 1\) Tracer, avec l’aide d’un crayon fixé sur l’organe terminal du robot, dans le plan de la plaque support différentes figures imposées de difficulté croissante :
    
    a. Une ligne de 5cm de long,
    
    b. Une ligne pointillée de 5cm de long,
    
    c. Un cercle de 2.5cm de rayon,
    
    d. Un cercle pointillé de 2.5cm de rayon.
    
    Le tracé de chacune des figures doit être réalisé en **10 secondes** +/- 0.2 secondes.
- 2\) Tracer, avec l’aide d’un crayon fixé sur l’organe terminal du robot, dans le plan de la plaque support, un dessin imposé dans un carré de 5cm par 5cm. Le déplacement de l’organe terminal du robot devra être **piloté par un joystick**. Il est possible que la figure soit discontinue, et donc il faut prévoir de pouvoir relever le crayon du support horizontal sur lequel on écrit.

<span style="text-decoration: underline;">**II. Matériels**</span>**<u>:</u>**

- Un crayon
- Interface de commande : 
    - Une carte arduino UNO avec câble USB-B;
    - Un joystick:
    - Une platine de prototypage;
    - 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.

<span style="text-decoration: underline;">**III. Machines utilisées**</span>**<u>:</u>**

- Découpe laser

#### <span style="text-decoration: underline;">**GANTT**</span>

[![Capture d’écran 2024-02-28 à 08.57.26.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/capture-decran-2024-02-28-a-08-57-26.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/capture-decran-2024-02-28-a-08-57-26.png)

#### **I. Conception préliminaire**

#### **1.1- <span style="text-decoration: underline;">Solutions proposées</span>**

Voici nos trois solutions proposées:

*<span style="text-decoration: underline;">**Première solution:**</span>* Nous avons tout d'abord pensé à un système robotisé qui a le même mode de fonctionnement qu'une machine 3D.

Schéma :

*<span style="text-decoration: underline;">**[![IMG_2647.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/img-2647.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/img-2647.jpg)**</span>*

Risques :

- Beaucoup de matériels et matières nécessaires à la conception
- Complexité élevée
- Taille du robot importante

*<span style="text-decoration: underline;">**Deuxième solution:**</span>* C'est un robot mobile, qui se déplace en transportant notre stylos pour effectuer le dessin demandé.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/xMlimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/xMlimage.png)

Risques :

- Précision faible
- Connaissance de la position du robot à chaque instant
- Les servos moteurs fournis ne sont pas adaptés

*<span style="text-decoration: underline;">**Troisième solution:**</span>* Nous avons choisi de faire une base fixe avec un bras robotique horizontale auquel s'attache au bout notre effecteur : la pointe du stylo.

[![img-0073.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/6isimg-0073.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/6isimg-0073.jpg)

#### **1.2- <span style="text-decoration: underline;">Solution Choisie </span>**

Nous avons opté pour la troisième solution, qui nous paraît la plus accessible en terme de temps et de complexité.

En effet, la première solution demandais une conception d'un système comportant des pièces complexes et en grands nombres afin de réaliser les différentes translations voulues sans pour autant nous garantir une précision et une fiabilité élevée. De plus, cette solution aurait nécessité du matériel en plus de ce qui était fourni, nous avons donc décidé de l'éliminer.

D'autre part, le robot mobile qui nous paraissait comme une bonne idée, ne nous permettra pas de savoir la position exacte de notre stylo. Nous aurions dû utiliser des moteurs continus à la place des servomoteurs. <span style="color: rgb(0, 0, 0);">Pourtant,</span> même avec ça, la stabilité (le glissement) du robot lors du déplacement n'aurait pas été garantie.

De ce fait, nous avons choisi la troisième solution qui certes demandera de nombreux calculs (changements de base, articulations...). Cependant, ayant déjà réalisé des calculs similaires durant nos cours, nous partons avec une longueur d'avance et donc du temps gagné pour l'optimisation de notre robot. Bien qu'il nous faudra être rigoureux afin de ne pas mettre notre robot dans des positions de singularité auquel cas ce dernier sera bloqué.

#### **II. Conception détaillée**

Vous trouverez en pièces jointes notre assemblage SolidWorks des différentes pièces. Sur cet assemblage (Assem2 dans notre fichier Solidworks), vous pourrez consulter les différentes mesures ainsi que la façon dont chaque pièce a été réalisée.

#### **2.1- <span style="text-decoration: underline;">Conception mécanique</span>   
2.1.1-** <span style="text-decoration: underline;">**Base du robot:**</span>

En premier lieu, nous avons créé la base de notre robot sur laquelle la main du robot viendra se poser. Nous avons également dû trouver une solution pour stabiliser la base afin d'éviter qu'elle ne tombe une fois le stylo relevé, en utilisant deux languettes. Nous avons décidé d'assembler notre base en montage serré, en emboîtant chaque partie de la base dans l'autre, tout en prévoyant des trous pour la sortie des fils des servomoteurs. Il fallait aussi penser à laisser quelques millimètres de plus en longueur pour le trou du servomoteur afin d'éviter les problèmes lors du montage du servomoteur sur notre base.

Pour concevoir notre base, nous avons utilisé du MDF de 6 mm d'épaisseur et avons utilisé la machine de découpe du fablab.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/DNPimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/DNPimage.png)

La base de notre robot sera placée sur notre feuille où nous allons dessiner. Nous avons laissé suffisamment d'espace pour notre zone de dessin, un carré de 5x5 cm.

#### **2.1.2-** <span style="text-decoration: underline;">**Première partie du bras:**</span>

Pour la conception de notre bras, nous avons décidé que chaque partie de notre bras sera faite en deux plaques différentes, chacune de 3 mm d'épaisseur, qui seront fixées ensemble par des vis. La partie inférieure contient l'empreinte du palonnier qui viendra se loger à l'intérieur. Et la partie supérieure du bras contiendra juste un trou pour fixer le servomoteur et quatre autres trous qui viendront se fixer au palonnier à l'aide d'axes pour éliminer tout jeu. Dans les deux parties du bras, nous avons le trou où viendra se loger le second servomoteur avec les trous pour le fixer. Ainsi que deux autres trous pour fixer les deux plaques entre elles.

<span style="text-decoration: underline;">**Partie inférieur du bras:**</span> **<span style="text-decoration: underline;">Partie supérieur du bras:</span>**

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/5c3image.png) ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/5c3image.png)[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/yZlimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/yZlimage.png)

#### **2.1.3- <span style="text-decoration: underline;">Deuxième partie du bras:</span>**

Cette deuxième partie est également constituée de deux plaques différentes, chacune de 3 mm d'épaisseur. Nous utilisons la même méthode de fixation pour les palonniers et les deux parties du bras que précédemment. En revanche, pour positionner notre troisième et dernier servomoteur, nous utilisons cette fois deux encoches où le servomoteur viendra se visser.

<span style="text-decoration: underline;">**Partie inférieur du bras:**</span> **<span style="text-decoration: underline;">Partie supérieur du bras:</span>**

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/F7bimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/F7bimage.png)[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/AT2image.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/AT2image.png)

<span style="text-decoration: underline;">**Assemblage avec le servomoteur:**</span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/5naimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/5naimage.png)

#### **2.1.4- <span style="text-decoration: underline;">Troisième partie du bras:</span>**  


Pour la troisième partie, nous avons également décidé de diviser le bras en deux parties, chacune ayant une épaisseur de 3 mm. Nous utilisons également la même méthode que précédemment pour la fixation du palonnier. De l'autre côté du bras, nous allons simplement percer un trou dans les deux parties du bras pour accueillir le support du stylo.

<span style="text-decoration: underline;">**Partie inférieur du bras:**</span> **<span style="text-decoration: underline;">Partie supérieur du bras:</span>**

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/Vuximage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/Vuximage.png)[![kp3image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/78Skp3image.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/78Skp3image.png)

#### **2.1.5- <span style="text-decoration: underline;">Stylo:</span>**

Pour le stylo, nous avons fait le choix de ne pas utiliser un système de glissière, mais simplement de le relever vers le côté à l'aide du servomoteur. Certes, cela laissera des traces sur notre feuille, mais cela n'impacte pas l'objectif principal de notre projet. Pour cela, le support de notre stylo contient un trou pour accueillir notre stylo d'une part. L'autre partie de notre stylo vient se positionner dans le trou dédié à cet effet dans le bras, et sera fixée à une pièce carrée par une vis et un écrou, qui servent juste à éliminer tout jeu.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/GSeimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/GSeimage.png)

#### **2.1.6- <span style="text-decoration: underline;">Tests support stylo:</span>**

Lors de la dernière séance de conception, plusieurs tests ont été effectués sur le support du stylo pour vérifier si le diamètre choisi était suffisant pour la position souhaitée de notre support sur le stylo. En effet notre stylo possède une forme en cône, c'est-à-dire que son diamètre change selon sa hauteur.

#### **2.1.7- <span style="text-decoration: underline;">Découpe laser</span>**  


Pour la découpe laser, nous utilisons la machine du Fablab. Pour pouvoir découper à partir de notre pièce SolidWorks, il faut enregistrer chaque pièce de notre robot individuellement sous un fichier DXF. Ensuite, à l'aide du logiciel Inkscape, nous importons notre pièce enregistrée sous un fichier DXF. Ensuite, nous sélectionnons notre contour et choisissons la couleur Rouge 255 RGB et 1 px. Une fois tout cela fait, nous pouvons enregistrer notre fichier sous un fichier SVG sur une clé USB. Enfin, nous allons sur l'ordinateur du Fablab, importons notre fichier et suivons le tutoriel d'utilisation de la machine du Fablab pour lancer la découpe.

[![IMG_0249 (1).png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/F9bimg-0249-1.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/F9bimg-0249-1.png)

Vous trouverez en pièces jointes, dans un dossier zip, tous nos fichiers SVG si vous souhaitez reproduire les mêmes pièces que nous avec les mêmes dimensions.

#### **2.1.8- <span style="text-decoration: underline;">Calcul du modèle géométrique direct et inversé</span>** 

**Le problème est traité comme un problème plan, ainsi nous traiterons uniquement les coordonnées X et Y.**

l1 et l2 correspondent aux différentes longueurs des bras de notre robot. Attention, à noter que les bras l2, l3 et l4 forment une classe d'équivalence, c'est-à-dire que ces derniers sont fixes.

Ainsi, nous avons uniquement 2 pivots d'axes (O1, z0) et (O2,z0) sans compter la pivot qui sert uniquement à surélever le stylo de notre feuille de papier.

Le point P correspond à notre effecteur, c'est-à-dire la pointe de notre stylo. Ce dernier étant décalé par rapport au bras l2, nous avons décidé de calculer l'angle de décalage entre l'axe x2 du bras l2 et et l'axe nommé x2' qui correspond à l'axe entre le point O2 et le point P de l'effecteur. Ainsi, afin d'alléger les calculs, ces derniers ont été menés avec l'angle θ2' puis à la fin nous nous ramènerons à l'angle réel θ2 du servo moteur.

**Modèle Géométrique direct :** (coordonnées de l'effecteur (Xp et Yp) en fonction des angles des servo moteur (θ1 et θ2)) exprimé dans le base R0 : (x0, y0, z0).

Xp = l₁*cos(θ₁) + l₂cos*(θ₁+θ₂') = l₁*cos(θ₁) + l₂cos*(θ₁+(θ₂ - Δθ₂))

Yp = l₁*sin(θ₁) + l₂sin*(θ₁+θ₂') = l₁*sin(θ₁) + l₂sin*(θ₁+(θ₂ - Δθ₂))

**Modèle Géométrique inverse :** (angles des servo moteur (θ1 et θ2) en fonction des coordonnées de notre effecteur (Xp et Yp)).

[![ModelGeom_page-0001.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/modelgeom-page-0001.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/modelgeom-page-0001.jpg)

#### **2.2- <span style="text-decoration: underline;">Conception électronique</span>**  


Notre système électronique se divise en deux parties clés : la commande, gérée par la carte Arduino UNO, et l'alimentation. L'utilisateur communique avec la carte Arduino via un joystick. Les servomoteurs HS422 et FT90M agissent comme les bras du système : le HS422 contrôle les mouvements principaux, tandis que le FT90M contrôle le mouvement du stylo. Une alimentation de 5V garantit une tension stable pour les moteurs et alimente à la fois la carte Arduino et les servomoteurs.

Pour faire notre schéma électrique on a utiliser le logiciel KiCad:

[![IMG_0336.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/img-0336.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/img-0336.jpg)

#### **2.3- <span style="text-decoration: underline;">Conception logiciel</span>** 

**Logigramme**

[![logi.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/logi.png) Ligne Ligne Pointillée Cercle Cercle Pointillé](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/logi.png)

[![ligne.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/ligne.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/ligne.png)[![ligne_piony.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/ligne-piony.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/ligne-piony.png)[![cercle.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/XYXcercle.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/XYXcercle.png)[![cerclep.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/cerclep.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/cerclep.png)

 Joystic Mouvement du stylo Pointillé

[![joy.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/joy.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/joy.png)[![movpen.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/movpen.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/movpen.png)[![pointille.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/pointille.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/pointille.png)

**Code arduino :**

Initialisation des différentes constantes nécessaires

**[![Capture d’écran 2024-05-29 à 23.23.59.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-29-a-23-23-59.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-29-a-23-23-59.png)**

Implémentation du modèle géométrique dans arduino

[![Capture d’écran 2024-05-29 à 23.24.53.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-29-a-23-24-53.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-29-a-23-24-53.png)

Fonction déplacement avec en arguments la position souhaitée du stylo Xp et Yp

[![Capture d’écran 2024-05-29 à 23.25.55.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/Iv1capture-decran-2024-05-29-a-23-25-55.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/Iv1capture-decran-2024-05-29-a-23-25-55.png)

Fonction ligne :

[![Capture d’écran 2024-05-29 à 23.26.30.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-29-a-23-26-30.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-29-a-23-26-30.png)

Fonction rond :

[![Capture d’écran 2024-05-29 à 23.27.46.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-29-a-23-27-46.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-29-a-23-27-46.png)

Fonction carré : (4 lignes pour former carré)

[![Capture d’écran 2024-05-29 à 23.28.44.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-29-a-23-28-44.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-29-a-23-28-44.png)

Fonction Joystick :

[![Capture d’écran 2024-05-29 à 23.30.16.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-29-a-23-30-16.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-29-a-23-30-16.png)

Initialisation du robot :

[![Capture d’écran 2024-05-29 à 23.30.28.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/9pHcapture-decran-2024-05-29-a-23-30-28.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/9pHcapture-decran-2024-05-29-a-23-30-28.png)

Boucle principale du code arduino :

[![Capture d’écran 2024-05-29 à 23.31.06.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-29-a-23-31-06.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-29-a-23-31-06.png)

[![Capture d’écran 2024-05-29 à 23.31.17.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-29-a-23-31-17.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-29-a-23-31-17.png)

[![Capture d’écran 2024-05-29 à 23.31.56.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-29-a-23-31-56.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-29-a-23-31-56.png)

Phases de test :

#### **[![2ee57638-e4b9-4f07-91ae-1ac3110243ae.JPG](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/2ee57638-e4b9-4f07-91ae-1ac3110243ae.JPG)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/2ee57638-e4b9-4f07-91ae-1ac3110243ae.JPG)[![IMG_1013.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/img-1013.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/img-1013.jpg)**

#### **2.4- <span style="text-decoration: underline;">Résultat final et conclusion  
</span>**

**[![IMG_1015.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/img-1015.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/img-1015.jpg)**

Vous pourrez aussi trouver une vidéo en pièce jointe du fonctionnement de notre robot.

Ce projet a été une expérience extrêmement enrichissante, malgré les nombreuses difficultés rencontrées en cours de route. En travaillant avec les différentes machines et le matériel du Fablab, nous avons pu développer un système robotisé répondant aux exigences du cahier des charges.

<span style="text-decoration: underline;">**Défis et Solutions**</span>

  
**Complexité de la Conception:** La conception du robot, notamment le bras articulé, a demandé de nombreux calculs et ajustements. Nous avons choisi la solution la plus accessible en termes de temps et de complexité, bien qu'elle ait nécessité des calculs rigoureux pour éviter les singularités en s'appuyant sur le modèle géométrique.

  
**Précision des Mouvements:** Assurer la précision des mouvements du robot, notamment pour dessiner les figures imposées, a été un défi majeur. Grâce à des tests rigoureux nous avons pu améliorer notre système pour obtenir les résultats souhaités.

<span style="text-decoration: underline;">**Compétences Développées**</span>

  
**Compétences Techniques:** Nous avons amélioré nos compétences en conception mécanique, en programmation Arduino, et en utilisation de logiciels comme SolidWorks et KiCad.

  
**Travail d'Équipe:** La collaboration a été essentielle pour surmonter les obstacles techniques. Chaque membre de l'équipe a apporté son expertise, ce qui a permis de créer un système cohérent et fonctionnel.

  
**Gestion de Projet:** La gestion du temps et des ressources a été cruciale. Le respect du Gantt nous a aidés à rester organisés et à suivre les étapes du projet de manière structurée.

**Réflexion et Créativité**: Le fait de réfléchir par nous-mêmes à une solution nous a beaucoup aidés en tant qu'ingénieurs. Trouver des solutions innovantes aux problèmes posés est la base de l'ingénierie. Ce processus de réflexion et de création nous a permis de développer des compétences essentielles, telles que la pensée critique et la résolution de problèmes, qui sont inestimables pour notre avenir professionnel.

Le robot est capable de réaliser les deux exercices imposés avec succès, traçant des figures avec précision dans le temps imparti.

# Projet ROB3 : Fares, Ilyes, Albéric

## Projet ROB3 : 

## Ilyes Elotreuch, Fares Charni, Albéric Fasquelle

## **Informations**

<p class="callout info">Polytech Sorbonne - Spécialité Robotique - Projet de 3eme année </p>

##### <span style="text-decoration: underline;">Contact des membres de l'équipe :</span>

<table border="1" id="bkmrk-alb%C3%A9ric-fasquelle-al" style="border-collapse: collapse; width: 100%; height: 88.8px;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr style="height: 29.6px;"><td style="height: 29.6px;">Albéric Fasquelle</td><td style="height: 29.6px;">alberic.fasquelle@etu.sorbonne-universite.fr</td></tr><tr style="height: 29.6px;"><td style="height: 29.6px;">Ilyes Elotreuch</td><td style="height: 29.6px;">ilyes.elotreuch@etu.sorbonne-universite.fr  
</td></tr><tr style="height: 29.6px;"><td style="height: 29.6px;">Fares Charni</td><td style="height: 29.6px;">fares.charni@etu.sorbonne-universite.fr</td></tr></tbody></table>

### **Introduction**

Dans le cadre de ce projet de robotique nous avons à réaliser un robot écrivain. Une vidéo de démonstration est disponible à la fin de cette page. Celui-ci dispose de plusieurs fonctions et mode qui participe à la complexité de ce projet.

En premier lieu nous avons le mode manuel qui pilotera le robot à l'aide d'un joystick afin de dessiner ce que l'on souhaite. De plus notre robot dispose de quatre fonctions supplémentaires qui dessinerons de manière automatique une cercle et une ligne.

Le présent document détaille les exigences du projet, les différentes étapes de sa réalisation, ainsi que les ressources et les échéances qui nous guideront tout au long de ce processus.

#### **Cahier des charges**   


Dans ce cahier des charges, nous sommes chargés de concevoir un robot capable de réaliser des dessins sur une surface plane. Nous devons lui permettre d'accomplir différentes tâches, telles que tracer des lignes et des cercles de longueurs et de rayons spécifiques dans un temps défini. De plus, il doit être en mesure de reproduire un dessin particulier dans un carré donné, tout en étant contrôlé par un joystick pour son mouvement. Nous pouvons envisager d'ajouter une fonctionnalité supplémentaire pour ajuster la vitesse du robot selon les besoins. Les contraintes incluent l'utilisation exclusive des équipements du FABLAB de Sorbonne Université, le choix des composants prédéfinis, la fabrication des pièces avec des machines spécifiques, et la programmation en C via l'IDE Arduino. Notre objectif sera également de minimiser la quantité de matériau utilisé pour ce projet.

### <span style="text-decoration: underline;">**1. Conception préliminaire** </span>

Dans cette section, nous présentons trois solutions potentielles pour la conception et la réalisation du robot écrivain, en tenant compte des exigences du cahier des charges et des contraintes spécifiées. Chaque solution est accompagnée de schémas, ainsi qu'une explication pour faciliter la compréhension. Nous avons retenu une proposition parmi les trois proposé ci dessous en fonction du cahier des charges et de nos préférences personnelles.

#### **Solution 1 :**

![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/embedded-image-o49d1det.png)

La première solution utilise pour les mouvements dans le plan horizontal de la feuille un mécanisme en boucle fermée à 4 barres, 5 liaisons pivots, dont deux sont motorisées. Voir une explication de son fonctionnement sur ce site . Pour les mouvements verticaux, on produit une translation verticale de la base qui soulève l'ensemble du robot.

<p class="callout info">Nous nous sommes inspiré du robot Cozmo WeDraw pour la création de cette solution. [Voir ici](https://www.youtube.com/watch?v=RcgzqiYM7aw) (minute 2:25 de la vidéo)</p>

#### **Solution 2 :** 

![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/embedded-image-cecsctgi.png)

Notre deuxième solution est un bras robotique classique utilisant les servomoteurs en série afin de déplacer le bras selon les axes X et Y. Le troisième servo est utilisé ici pour soulever l'effecteur. Cette solution possède certains avantage comme une configuration cinématique assez simple. Cependant, elle présente des risques de stabilité structurelle, surtout lors de mouvements rapides. De plus, la précision du robot peut être compromise aux extrémités au niveau de l'effecteur, en raison des effets de la gravité et de la flexion des composants(notamment des servomoteurs).

#### **Solution 3 :** 

![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/embedded-image-nswdxrs7.png)

Notre 3eme solution s'appuie sur un principe de guidage linéaire, à la manière des imprimantes 3D en retirant la composante Z. Un dispositif de guidage supporte le crayon et se déplace le long de rails des guidages pour réaliser les dessins sur la plaque support. Cette solution utilise deux rails de guidage ainsi que des courroies pour déplacer l'effecteur selon l'axe X et Y. Pour soulever le stylo nous ajoutons un servomoteur au niveau du stylo. Cette solution ne sera pas retenu en raison des contraintes matériels.

##### <span style="text-decoration: underline;">Choix de la solution </span>

L’idée 3 à été écarté des possibilités en raison des composants disponibles.

<table border="1" id="bkmrk-solution%C2%A0-id%C3%A9e-1-id%C3%A9" style="border-collapse: collapse; width: 108.519%; height: 93.9791px;"><colgroup><col style="width: 33.3608%;"></col><col style="width: 33.3608%;"></col><col style="width: 33.3608%;"></col></colgroup><tbody><tr style="height: 29.4583px;"><td style="height: 29.4583px;">Solution </td><td style="height: 29.4583px;">Avantages</td><td style="height: 29.4583px;">Inconvénients</td></tr><tr style="height: 35.0625px;"><td style="height: 35.0625px;">Idée 1

</td><td style="height: 35.0625px;">-Facilité de conception

-Esthétique

-Précision : pas de contraintes mécanique trop importante sur l'axe des servomoteurs

</td><td style="height: 35.0625px;">-Possibilité d'une écriture du code plus complexe en raison de la forme.</td></tr><tr style="height: 29.4583px;"><td style="height: 29.4583px;">Idée 2</td><td style="height: 29.4583px;">-Mise en place simple

-Architecture simple

-Pas de contrainte potentielle sur les composants

</td><td style="height: 29.4583px;">-Possiblement difficile à réaliser car la contrainte mécanique sur l'axe d'un des servomoteur.

-Pas spécialement beau

</td></tr><tr><td>Idée 3</td><td>\- modèle cinématique facile à réaliser

</td><td>-Guidage difficile à réaliser au niveau des courroies

-Composant non disponibles: courroie, rails de guidage

-possibilité de perte de précision lors des déplacements à causes des roulements

</td></tr></tbody></table>

<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);">Nous avons décidé après l'étude des différentes solution de sélectionner la première proposition. D'une part puisque nous trouvions le design agréable et original. Et d'autre part pour certaines raisons pratiques cités ci-dessus. </span>

##### <span style="text-decoration: underline;">Ensemble des tâches à réaliser pour la conception du robot :</span>

Voici dessous l'ensemble des tâches réaliser lors des différentes étapes de la réalisation de ce projet.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/2pzimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/2pzimage.png)

##### <span style="text-decoration: underline;">Diagramme de Gantt :</span>

Voici ci dessous le diagramme de Gantt prévisionnel du projet. Celui-ci est amené à être modifié selon l'avancement du projet.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/2Obimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/2Obimage.png)

### <span style="text-decoration: underline;">**2. Conception détaillé du robot**</span>  


#### <span style="text-decoration: underline;">**2.1 Schéma électronique :**</span>

Pour la réalisation du schéma électronique, nous avons tout d'abord fait la liste de tout le matériel nécessaire à la bonne conception de celle-ci. La carte électronique est segmenté en plusieurs parties:

- Nous avons tout d'abord l'élément central, l'Arduino. Il s'agit du microcontrôleur, c'est à dire le "cerveau" de la carte. Celui-ci est relié à chaque composant afin de les faire fonctionner entre eux.
- Ensuite nous avons la partie des servomoteurs visualisés ici par des autocoms.
- Nous avons également ajouté une partie debug pour la partie des 4 modes à réaliser. Nous avons ajouter un bouton pour activer ou non les modes. Et nous avons ajouter une led rgb pour deux intérêts, d'une par pour pouvoir afficher l'état ou l'avancement du mode en court, il s'agit donc d'une aide pour debug. Et il y a également un côté esthétique.
- Enfin nous avons l'alimentation et le joystick modélisé également par des autocoms.

<span style="color: rgb(255, 255, 255); background-color: rgb(255, 255, 255);">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/XUTimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/XUTimage.png)</span>

<span style="color: rgb(0, 0, 0);">Pour modélisé la carte nous avons fait le choix d'utiliser le logiciel KiCad pour deux raisons. LA première est que ce logiciel a déjà été utilisé par certains membres du groupe. Et la seconde pour son côté pratique qui nous permettra si le temps nous le permet d'imprimer une carte électronique(PCB). Pour rendre le projet encore plus attrayant. </span>

#### <span style="text-decoration: underline;">**2.2 Équations de mouvement du robot** </span>

Dans cette section, nous nous concentrerons sur la manière pratique de gérer le mouvement du robot dessinateur. Notre objectif est de comprendre comment convertir les coordonnées souhaitées de la pointe du stylo sur la surface de dessin en mouvements précis des articulations du robot. Pour ce faire, nous aborderons les principes de base de la cinématique directe, qui nous permettent de déterminer la position du stylo en fonction des angles des articulations du robot.

Ensuite, nous explorerons le modèle géométrique inverse, une méthode essentielle pour programmer le mouvement du robot avec précision et efficacité. Ce modèle nous permettra d'établir les équations qui relient les coordonnées de la pointe du stylo aux angles des articulations du robot, fournissant ainsi un cadre pratique pour contrôler le mouvement du robot dessinateur dans diverses situations.

#### <span style="color: rgb(0, 0, 0);">**Modèle géométrique inverse**</span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/8Y5image.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/8Y5image.png)

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/M5pimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/M5pimage.png)

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/vH7image.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/vH7image.png)

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/sJMimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/sJMimage.png)

Nous avons ensuite réalisé une esquisse de notre robot sur SolidWorks pour vérifier les équations. En rendant les cotations des angles pilotées, nous pouvons introduire une position de la pointe du stylo, et obtenir les angles correspondants, avec la prise en compte des longueurs des bielles du robot. On observe que les valeurs concordent avec celles données par les équations.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/vhbimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/vhbimage.png)

Nous avons ensuite fait un code python pour calculer les valeurs des angles à partir de la position de la pointe du stylo:

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/CNoimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/CNoimage.png)

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/ZFJimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/ZFJimage.png)

On observe que les valeurs obtenues avec SolidWorks concordent avec celles obtenues par les équations.

On peut valider le modèle géométrique.

On prendra en particulier pour simplifier les calculs une structure de losange formée par les bielle 1 2 3 et 4 .

#### <span style="text-decoration: underline;">**2.3 Conception de la structure du code et de l'interface**</span>

Pour structurer notre code, nous avons d'abord conçu l'interface utilisateur à l'aide du matériel fourni.  
Cette interface permet de répondre aux exigences du cahier des charges en assurant un changement dynamique entre différents modes de dessins et une interruption rapide du processus en cas de besoin.

##### <span style="text-decoration: underline;">Logigramme de l'interface :</span>

Notre interface est composé du bouton démarrage, du joystick et d'un bouton de changement de mode.

On a choisit, pour rendre notre interface plus compacte d'implémenter le système suivant, où l'appui sur le bouton changement de Mode suivi d'un mouvement du joystick permettra de changer entre 4 modes.

  
L'appui sur le joystick permet par ailleurs d'interrompre ou de reprendre de manière aisée et rapide le dessin.

##### <span style="text-decoration: underline;">[![Capture d'écran 2024-05-29 162655.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-29-162655.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/logigramme-interface.png)</span>

Détaillons le logigramme du code pour le mouvement du stylo et le changement de l'état Stylo levé/Stylo bas :

<span style="text-decoration: underline;">**Changement de position :**</span>

On voit que les nouvelles valeurs des angles dépendent d'elles mêmes.  
On implémentera lors de nos tests 2 codes différents pour le calcul de la nouvelle position:

  
Le premier calculera les nouvelles positions à partir des positions actuelles -&gt; Plus rapide

Le deuxième utilisera la dichotomie pour résoudre l'équation du mouvement -&gt;Plus précis mais calcul très coûteux

[![Logigramme Mouvement Joystick.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/logigramme-mouvement-joystick.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/logigramme-mouvement-joystick.png)

<span style="text-decoration: underline;">**Changement d'état :**</span>

Le guidage du moteur 3 ainsi que l'angle de la rotation pour le changement de l'état restent à définir.

<span style="text-decoration: underline;">**[![Logigramme Appuie sur Joystick.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/logigramme-appuie-sur-joystick.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/logigramme-appuie-sur-joystick.png)**</span>

#### <span style="text-decoration: underline;">**2.4 Écriture du code** </span>

A partir de ce logigramme nous avons réalisé la création du code (**deplacement\_robot\_final.ino** en pièce-jointe).

En résumé, ce code permet de contrôler un bras robotisé à trois servomoteurs via un joystick, avec des modes spécifiques pour tracer des lignes et des cercles. Il utilise des calculs de cinématique inverse pour déterminer les angles des servomoteurs nécessaires pour atteindre des positions spécifiques. Voici une explication de son fonctionnement :

<div class="flex flex-grow flex-col max-w-full" id="bkmrk-initialisation%3A-les-"><div class="min-h-[20px] text-message flex flex-col items-start whitespace-pre-wrap break-words [.text-message+&]:mt-5 juice:w-full juice:items-end overflow-x-auto gap-2" data-message-author-role="assistant" data-message-id="a9a7bcdc-08db-4262-bb58-dc64f1f76f43" dir="auto"><div class="flex w-full flex-col gap-1 juice:empty:hidden juice:first:pt-[3px]"><div class="markdown prose w-full break-words dark:prose-invert dark">1. **Initialisation**:
    
    
    - Les broches pour les LEDs RGB, les servomoteurs, le joystick et un bouton de sélection de mode sont définies.
    - Les servomoteurs sont attachés à leurs broches respectives et initialisés à des positions spécifiques.
    - Les LEDs RGB sont également configurées pour indiquer les états et les sélections de mode.
2. **Variables et paramètres**:
    
    
    - Les limites de lecture du joystick et de mouvement du robot sont définies.
    - Les dimensions géométriques des bras du robot (longueurs des segments) sont définies.
    - Les variables pour stocker les positions actuelles du robot sont initialisées.
3. **Fonctions de mouvement**:
    
    
    - `calculate_theta_1` et `calculate_theta_2` : Calculent les angles des servomoteurs nécessaires pour atteindre une position donnée `(x, y)` en utilisant la cinématique inverse.
    - `move_in_line` et `move_in_line_disc` : Permettent au robot de tracer des lignes droites, continues et discontinues respectivement.
    - `move_in_circle_half1`, `move_in_circle_half2`, `move_in_circle_half1_disc`, `move_in_circle_half2_disc` : Permettent de tracer des cercles continus et discontinus.
4. **Fonction principale (`loop`)**:
    
    
    - Lecture des valeurs du joystick.
    - Si le bouton de sélection de mode est activé, le code entre dans un mode de sélection où différentes couleurs de LED indiquent les différents modes. Selon la position du joystick, un mode est sélectionné.
    - En mode 1 et 2, le robot trace une ligne droite continue ou discontinue en fonction du mode sélectionné.
    - Si aucun mode n'est activé, le joystick contrôle directement les mouvements du robot en temps réel, avec un lissage pour les mouvements.
5. **Détails des modes**:
    
    
    - Mode 1 : Tracer une ligne droite.
    - Mode 2 : Tracer une ligne droite discontinue.
    - Mode 3 et 4 : Tracer un cercle continu
    - Mode 4: Tracer un cercle discontinu.
6. **LED de validation**:
    
    
    - Les LEDs RGB changent de couleur pour indiquer la sélection et le fonctionnement des différents modes.

</div></div></div></div>Voici un détail des fonctions utilisées :

### Fonction `move_in_line`

Cette fonction permet au robot de se déplacer le long d'une ligne droite en plusieurs étapes.

1. **Initialisation des paramètres:**
    
    
    - `x_start` et `y_start` définissent le point de départ de la ligne.
    - `length` est la longueur de la ligne.
    - `steps` est le nombre de segments en lesquels la ligne sera divisée.
    - `l_1`, `l_2`, `l_3`, `l_4`, `l_5` sont les paramètres géométriques du robot.
2. **Calcul des incréments de déplacement:**
    
    
    - `step_size` est la distance à parcourir à chaque étape.
    - `time_per_step` est le temps alloué pour chaque étape.
3. **Boucle de déplacement:**
    
    
    - Pour chaque étape `i`, les nouvelles coordonnées `x_p` et `y_p` sont calculées en fonction du point de départ et de l'incrément de déplacement.
    - Les angles `theta_1` et `theta_2` sont calculés pour positionner les servomoteurs en utilisant les fonctions `calculate_theta_1` et `calculate_theta_2`.
    - Les servomoteurs sont déplacés aux angles calculés.
    - Un délai est introduit pour attendre jusqu'au moment approprié pour la prochaine étape.

### Fonction `move_in_circle_half1 et half2`

Cette fonction permet au robot de se déplacer le long d'un arc de cercle en plusieurs étapes. L'association de move\_in\_circle\_half1 et half2 permet de faire un demi cercle supérieur puis un demi cercle inférieur ce qui donne un cercle complet.

1. **Initialisation des paramètres:**
    
    
    - `center_x` et `center_y` définissent le centre du cercle.
    - `radius` est le rayon du cercle.
    - `steps` est le nombre de segments en lesquels le cercle sera divisé.
    - `l_1`, `l_2`, `l_3`, `l_4`, `l_5` sont les paramètres géométriques du robot.
2. **Calcul des incréments de déplacement:**
    
    
    - `time_per_step` est le temps alloué pour chaque étape.
    - `angle` est l'angle incrémental en radians pour chaque étape.
3. **Boucle de déplacement:**
    
    
    - Pour chaque étape `i`, les nouvelles coordonnées `x_p` et `y_p` sont calculées en utilisant les équations paramétriques du cercle.
    - Les angles `theta_1` et `theta_2` sont calculés pour positionner les servomoteurs en utilisant les fonctions `calculate_theta_1` et `calculate_theta_2`.
    - Les servomoteurs sont déplacés aux angles calculés.
    - Un délai est introduit pour attendre jusqu'au moment approprié pour la prochaine étape.

### Gestion du temps et découpage en étapes

Les fonctions utilisent une méthode de découpage en étapes pour créer un mouvement fluide et précis. Le mouvement est divisé en un nombre défini d'étapes (`steps`), et chaque étape est exécutée en un intervalle de temps déterminé (`time_per_step`). Voici comment cela fonctionne:

1. **Calcul du temps total et du temps par étape:**
    
    
    - Le temps total pour effectuer le mouvement est défini (par exemple, 9800 ms pour `move_in_line`).
    - Le temps par étape est calculé en divisant le temps total par le nombre d'étapes.
2. **Boucle de contrôle temporelle:**
    
    
    - Pour chaque étape, le programme calcule les nouvelles positions et les angles correspondants.
    - Les servomoteurs sont déplacés aux positions calculées.
    - Le programme utilise une boucle `while` pour attendre jusqu'au moment approprié pour passer à l'étape suivante, en vérifiant constamment l'heure actuelle (`millis()`) par rapport au temps de début et au temps alloué pour chaque étape.

Nous avons remarqué que du à l'encombrement du robot et les limites des angles des servo-moteurs, nous ne pouvons pas atteindre toutes les positions. Ainsi nous avons restreint le robot à une zone de dessin :

[![Drawing_area.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/drawing-area.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/drawing-area.png)

##### <span style="text-decoration: underline;">1) Dessin de la ligne continue de 5 cm:</span>

```c
// Tracer une ligne droite horizontale dans le sens des x négatifs
void move_in_line(double x_start, double y_start, double length, int steps, double l_1, double l_2, double l_3, double l_4, double l_5) {
    double step_size = length / steps;
    // double time_per_step = 10000.0 / steps; // 10 secondes (10000 ms) divisé par le nombre de steps
    unsigned long total_time = 9800; // Temps total en millisecondes (10 secondes)
    unsigned long time_per_step = total_time / steps;
    unsigned long start_time = millis(); // Start time
    
    for (int i = 0; i <= steps; i++) {
        double x_p = x_start - i * step_size; //Tracer la ligne dans le sens des x négatifs
        double y_p = y_start;
        
        double theta_1 = calculate_theta_1(x_p, y_p, l_1, l_4, l_5);
        double theta_2 = calculate_theta_2(x_p, y_p, theta_1, l_1, l_2, l_3, l_4, l_5);

        // Convertir les angles en degrés
        double theta_1_deg = theta_1 * 180 / M_PI;
        double theta_2_deg = theta_2 * 180 / M_PI;

        // Déplacer les servos aux angles calculés
        servo1.write(theta_1_deg);
        servo2.write(180 - theta_2_deg);

        // Afficher les angles actuels dans le moniteur série
        Serial.print("Step ");
        Serial.print(i);
        Serial.print(": Theta_1 = ");
        Serial.print(theta_1_deg);
        Serial.print(", Theta_2 = ");
        Serial.println(theta_2_deg);

        // delay(time_per_step);  // Délai pour chaque étape

        // Attendre jusqu'au temps approprié pour le prochain pas
        unsigned long current_time = millis();
        unsigned long next_step_time = start_time + (i + 1) * time_per_step;
        while (current_time < next_step_time) { // Boucle while remplace le delay
            current_time = millis();
        }
    }

    // Vérification finale du temps écoulé
    unsigned long actual_end_time = millis();
    Serial.print("Temps total: ");
    Serial.println(actual_end_time - start_time);
    
}
```

##### <span style="text-decoration: underline;">2) Dessin de la ligne discontinue de 5 cm:</span>

```c
// Tracer une ligne droite discontinue
void move_in_line_disc(double x_start, double y_start, double length, int steps, double l_1, double l_2, double l_3, double l_4, double l_5) {
  servo3.write(115);
  double step_size = length / steps;
  unsigned long total_time = 9800;  // Temps total en millisecondes (10 secondes)
  unsigned long time_per_step = total_time / steps;
  unsigned long start_time = millis();  // Start time

  for (int i = 0; i <= steps; i++) {
    double x_p = x_start - i * step_size;  // Tracer la ligne dans le sens des x négatifs
    double y_p = y_start;

    double theta_1 = calculate_theta_1(x_p, y_p, l_1, l_4, l_5);
    double theta_2 = calculate_theta_2(x_p, y_p, theta_1, l_1, l_2, l_3, l_4, l_5);

    // Convertir les angles en degrés
    double theta_1_deg = theta_1 * 180 / M_PI;
    double theta_2_deg = theta_2 * 180 / M_PI;

    // Déplacer les servos aux angles calculés
    servo1.write(theta_1_deg);
    servo2.write(180 - theta_2_deg);

    // Lever et abaisser le stylo pour créer une ligne discontinue
    if (i % 10 < 5) {
      servo3.write(90);  // Abaisser le stylo
    } else {
      servo3.write(100);  // Lever le stylo
    }

    // Afficher les angles actuels dans le moniteur série
    Serial.print("Step ");
    Serial.print(i);
    Serial.print(": Theta_1 = ");
    Serial.print(theta_1_deg);
    Serial.print(", Theta_2 = ");
    Serial.println(theta_2_deg);

    // Attendre jusqu'au temps approprié pour le prochain pas
    unsigned long current_time = millis();
    unsigned long next_step_time = start_time + (i + 1) * time_per_step;
    while (current_time < next_step_time) {  // Boucle while remplace le delay
      current_time = millis();
    }
  }

  // Vérification finale du temps écoulé
  unsigned long actual_end_time = millis();
  Serial.print("Temps total: ");
  Serial.println(actual_end_time - start_time);
}
```

##### <span style="text-decoration: underline;">3) Dessin du cercle continu de rayon 2.5 cm:</span>

```c
// Utiliser les équations paramétriques d'un cercle pour calculer les positions des points autour du cercle

void move_in_circle_half1(double center_x, double center_y, double radius, int steps, double l_1, double l_2, double l_3, double l_4, double l_5) {
    unsigned long total_time = 4800; // Total time in milliseconds (10 seconds)
    unsigned long time_per_step = total_time / steps;
    unsigned long start_time = millis(); // Start time

    for (int i = 0; i <= steps; i++) { 
        // Calcul des coordonnées x et y pour le cercle
        double angle = 1 * M_PI * i / steps; // Angle en radians
        double x_p = center_x + radius * cos(angle);
        double y_p = center_y + radius * sin(angle);

        double theta_1 = calculate_theta_1(x_p, y_p, l_1, l_4, l_5);
        double theta_2 = calculate_theta_2(x_p, y_p, theta_1, l_1, l_2, l_3, l_4, l_5);

        // Convertir les angles en degrés
        double theta_1_deg = theta_1 * 180 / M_PI;
        double theta_2_deg = theta_2 * 180 / M_PI;

        // Déplacer les servos aux angles calculés
        servo1.write(theta_1_deg);
        servo2.write(180 - theta_2_deg);

        // Afficher les angles actuels dans le moniteur série
        Serial.print("Step ");
        Serial.print(i);
        Serial.print(": Theta_1 = ");
        Serial.print(theta_1_deg);
        Serial.print(", Theta_2 = ");
        Serial.println(theta_2_deg);

        // Attendre jusqu'au temps approprié pour le prochain pas
        unsigned long current_time = millis();
        unsigned long next_step_time = start_time + (i + 1) * time_per_step;
        while (current_time < next_step_time) {
            current_time = millis();
        }
        //delay(time_per_step);
    }

    // Vérification finale du temps écoulé
    unsigned long actual_end_time = millis();
    Serial.print("Temps total: ");
    Serial.println(actual_end_time - start_time);
}

// Utiliser les équations paramétriques d'un cercle pour calculer les positions des points autour du cercle
void move_in_circle_half2(double center_x, double center_y, double radius, int steps, double l_1, double l_2, double l_3, double l_4, double l_5) {
    unsigned long total_time = 4800; // Total time in milliseconds (10 seconds)
    unsigned long time_per_step = total_time / steps;
    unsigned long start_time = millis(); // Start time

    for (int i = 0; i <= steps; i++) { 
        // Calcul des coordonnées x et y pour le cercle
        double angle = 1 * M_PI * i / steps; // Angle en radians
        double x_p = center_x - radius * cos(angle);
        double y_p = center_y - radius * sin(angle);

        double theta_1 = calculate_theta_1(x_p, y_p, l_1, l_4, l_5);
        double theta_2 = calculate_theta_2(x_p, y_p, theta_1, l_1, l_2, l_3, l_4, l_5);

        // Convertir les angles en degrés
        double theta_1_deg = theta_1 * 180 / M_PI;
        double theta_2_deg = theta_2 * 180 / M_PI;

        // Déplacer les servos aux angles calculés
        servo1.write(theta_1_deg);
        servo2.write(180 - theta_2_deg);

        // Afficher les angles actuels dans le moniteur série
        Serial.print("Step ");
        Serial.print(i);
        Serial.print(": Theta_1 = ");
        Serial.print(theta_1_deg);
        Serial.print(", Theta_2 = ");
        Serial.println(theta_2_deg);

        // Attendre jusqu'au temps approprié pour le prochain pas
        unsigned long current_time = millis();
        unsigned long next_step_time = start_time + (i + 1) * time_per_step;
        while (current_time < next_step_time) {
            current_time = millis();
        }
        //delay(time_per_step);
    }

        // // Position finale
         double x_f = center_x - radius * cos(M_PI / 6);
         double y_f = center_y - radius * sin(M_PI / 6);

         double theta_1_f = calculate_theta_1(x_f, y_f, l_1, l_4, l_5);
         double theta_2_f = calculate_theta_2(x_f, y_f, theta_1_f, l_1, l_2, l_3, l_4, l_5);

         // Convertir les angles en degrés
         double theta_1_deg_f = theta_1_f * 180 / M_PI;
         double theta_2_deg_f = theta_2_f * 180 / M_PI;

         // Déplacer les servos aux angles calculés
         servo1.write(theta_1_deg_f);
         servo2.write(180 - theta_2_deg_f);

    // Vérification finale du temps écoulé
    unsigned long actual_end_time = millis();
    Serial.print("Temps total: ");
    Serial.println(2*(actual_end_time - start_time));
}
```

##### <span style="text-decoration: underline;">4) Dessin du cercle discontinue de rayon 2.5 cm:</span>

```c
void move_in_circle_half1_disc(double center_x, double center_y, double radius, int steps, double l_1, double l_2, double l_3, double l_4, double l_5) {
  unsigned long total_time = 4800;
  unsigned long time_per_step = total_time / steps;
  unsigned long start_time = millis();

  for (int i = 0; i <= steps; i++) {
    double angle = 1 * M_PI * i / steps;
    double x_p = center_x + radius * cos(angle);
    double y_p = center_y + radius * sin(angle);

    double theta_1 = calculate_theta_1(x_p, y_p, l_1, l_4, l_5);
    double theta_2 = calculate_theta_2(x_p, y_p, theta_1, l_1, l_2, l_3, l_4, l_5);

    double theta_1_deg = theta_1 * 180 / M_PI;
    double theta_2_deg = theta_2 * 180 / M_PI;

    servo1.write(theta_1_deg);
    servo2.write(180 - theta_2_deg);

    if (i % 10 < 5) {
      servo3.write(90);  // Stylo en bas
    } else {
      servo3.write(100);  // Stylo en haut
    }

    Serial.print("Step ");
    Serial.print(i);
    Serial.print(": Theta_1 = ");
    Serial.print(theta_1_deg);
    Serial.print(", Theta_2 = ");
    Serial.println(theta_2_deg);

    unsigned long current_time = millis();
    unsigned long next_step_time = start_time + (i + 1) * time_per_step;
    while (current_time < next_step_time) {
      current_time = millis();
    }
  }

  unsigned long actual_end_time = millis();
  Serial.print("Temps total: ");
  Serial.println(actual_end_time - start_time);
}

void move_in_circle_half2_disc(double center_x, double center_y, double radius, int steps, double l_1, double l_2, double l_3, double l_4, double l_5) {
  unsigned long total_time = 4800;
  unsigned long time_per_step = total_time / steps;
  unsigned long start_time = millis();

  for (int i = 0; i <= steps; i++) {
    double angle = M_PI + M_PI * i / steps;
    double x_p = center_x + radius * cos(angle);
    double y_p = center_y + radius * sin(angle);

    double theta_1 = calculate_theta_1(x_p, y_p, l_1, l_4, l_5);
    double theta_2 = calculate_theta_2(x_p, y_p, theta_1, l_1, l_2, l_3, l_4, l_5);

    double theta_1_deg = theta_1 * 180 / M_PI;
    double theta_2_deg = theta_2 * 180 / M_PI;

    servo1.write(theta_1_deg);
    servo2.write(180 - theta_2_deg);

    if (i % 10 < 5) {
      servo3.write(90);  // Stylo en bas
    } else {
      servo3.write(100);  // Stylo en haut
    }

    Serial.print("Step ");
    Serial.print(i);
    Serial.print(": Theta_1 = ");
    Serial.print(theta_1_deg);
    Serial.print(", Theta_2 = ");
    Serial.println(theta_2_deg);

    unsigned long current_time = millis();
    unsigned long next_step_time = start_time + (i + 1) * time_per_step;
    while (current_time < next_step_time) {
      current_time = millis();
    }
  }

  unsigned long actual_end_time = millis();
  Serial.print("Temps total: ");
  Serial.println(actual_end_time - start_time);
}
```

##### <span style="text-decoration: underline;">5) Dessin en mode manuel (avec le joystick) :</span>

```c
void loop() {
 // Lire les valeurs du joystick
    int vrxValue = analogRead(VrxPin);
    int vryValue = analogRead(VryPin);

    // Inverser la valeur du joystick pour l'axe Y
    vryValue = joystickMax - vryValue;

    // Vérifier si le joystick est centré (dans la tolérance)
    bool joystickCentered = (abs(vrxValue - (joystickMax / 2)) < joystickCenterTolerance) &&
                            (abs(vryValue - (joystickMax / 2)) < joystickCenterTolerance);

    if (!joystickCentered) {
        // Mapper les valeurs du joystick aux coordonnées (xp, yp)
        double target_x_p = map(vrxValue, joystickMin, joystickMax, minX, maxX);
        double target_y_p = map(vryValue, joystickMin, joystickMax, minY, maxY);

        // Lissage des mouvements
        current_x_p += (target_x_p - current_x_p) * smoothingFactor;
        current_y_p += (target_y_p - current_y_p) * smoothingFactor;
    }


    double theta_1 = calculate_theta_1(current_x_p, current_y_p, l_1, l_4, l_5);
    double theta_2 = calculate_theta_2(current_x_p, current_y_p, theta_1, l_1, l_2, l_3, l_4, l_5);

    // Convertir les angles de radians en degrés
    int angleServo1 = int(theta_1 * 180 / M_PI);
    int angleServo2 = 180 - int(theta_2 * 180 / M_PI);

    Serial.print("Theta_1 = ");
    Serial.println(theta_1 * 180 / M_PI);
    Serial.print("Theta_2 = ");
    Serial.println(theta_2 * 180 / M_PI);

    servo1.write(angleServo1);
    servo2.write(angleServo2);

    delay(100);
  
}
```

#### **<span style="text-decoration: underline;">2.5 Conception mécanique du robot</span>**

La conception mécanique du robot écrivain est essentielle pour assurer sa stabilité, sa précision et sa facilité d'utilisation. Pour la réalisation de celui-ci nous nous sommes inspiré du Wedraw de Cozmo que nous avons trouvé original. Notre robot est composé d'un corps principal sur lequel sont montés deux servomoteurs pour contrôler les bras. Les bras, joints au niveau de leur main, supportent le crayon utilisé pour le traçage des figures sur la surface de la plaque support.

**Description du Robot**

Le corps principal du robot est conçu pour abriter l'électronique de contrôle ainsi que les mécanismes de mouvement. Les deux servomoteurs, placés de manière symétrique de chaque côté du corps, assurent les mouvements des bras dans le plan horizontal de la feuille. À l'extrémité de chaque bras se trouve une articulation permettant le mouvement du crayon dans toutes les directions nécessaires pour dessiner les figures spécifiées dans le cahier des charges.

Ci dessous notre vue 3D de notre robot. Les couleurs ont été apportés pour amener du contraste dans notre structure afin de mieux visualiser les composants.

[![7l9image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/GU37l9image.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/GU37l9image.png)

**Choix des matériaux**

Lors de ce projet, nous avons fait le choix de privilégier certains matériaux. Nous avons choisi en priorité l'utilisation de la découpe laser pour la fabrication des pièces principales de la structure, notamment le corps principal du robot et les bras articulés. La découpe laser offre une grande précision dans la réalisation des pièces, permettant ainsi d'obtenir des assemblages parfaitement ajustés et une structure globalement robuste. De plus, ce processus de fabrication est rapide et efficace, ce qui nous permet de produire les pièces simplement.

Quant aux pièces de l'effecteur, telles que le support du crayon et les éléments de fixation, nous avons opté pour l'impression 3D. Ce procédé nous offre une grande flexibilité dans la conception des pièces, nous permettant ainsi de réaliser des formes complexes. L'impression 3D est très utile pour les petites pièces mais peut vite devenir un problème si nous devions réaliser de grande pièce. C'est pour cela nous avons privilégier la découpe laser pour les pièces structurant notre projet.

**Choix de la structure général**

En ce qui concerne la disposition des composants mécaniques, nous avons décidé de placer les deux servomoteurs sur le même axe verticale. Cette disposition simplifie non seulement les équations de mouvement du robot, mais elle offre également une répartition uniforme des charges.

Les bras du robot sont articulés à l'extrémité du corps principal, permettant ainsi une grande liberté de mouvement pour le crayon utilisé dans le traçage des figures sur la surface de la plaque support. Cette conception garantit également une précision optimale dans l'exécution des dessins. Celle-ci nous permet donc de séparer la partie utilisateur du bras mécanique.

**Maintien de la structure**

Afin de maintenir la structure en place nous avons fait le choix de prendre des tiges filetés pour serrer la structure sur elle même. Des écrous maintiendrons le tout en place. Nous avons fait le choix de cette solution puisqu'elle présente plusieurs avantages. La première est la simplicité de mise en place. Et la seconde est le fait de pouvoir accéder facilement au composant si l'on veut faire de la maintenance. Nous avons besoin seulement de dévisser 4 écrous.

**Mécanisme de Relevage du Crayon**

Pour relever le crayon du support horizontal lorsqu'il n'est pas en cours d'utilisation, nous avons envisagé plusieurs solutions. Initialement, l'idée était de soulever le corps du robot, mais des préoccupations ont été soulevées quant à la capacité du servomoteur à supporter la charge de tout le système sans que la précision ne soit affecté. Nous nous sommes finalement rabattu sur la seconde solution. Nous avons donc placé un servomoteur au niveau du stylo qui viendra directement lever celui-ci sans avoir à relever l’ensemble de la structure.

Afin de lever le stylo de manière linéaire nous avons fait le choix d'une glissière. Un principe souvent utilisé en mécanique et simple à mettre en œuvre.

Voici ci dessous les différentes vu de l'intérieur de notre robot :

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/7u5image.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/7u5image.png)

<p class="callout info">Ci-joint le fichier SolidWorks du projet</p>

### **Montage final du robot :** 

Le processus de montage et de réalisation de notre robot dessinateur a été conçu pour être simple et efficace, grâce à une planification minutieuse en CAO.

##### Étape 1 : Préparation des Pièces

<div id="bkmrk-d%C3%A9coupe-laser-%3A-les-"><div>1. **Découpe Laser** : Les pièces principales de la structure, comme le corps et les bras articulés, ont été découpées avec précision grâce à une machine de découpe laser.
2. **Impression 3D** : Les petites pièces, telles que le support du crayon et les éléments de fixation, ont été réalisées par impression 3D pour permettre des conceptions complexes.

</div></div>##### Étape 2 : Assemblage de la Structure Principale

<div id="bkmrk-montage-du-corps-pri"><div>1. **Montage du Corps Principal** : Les pièces découpées au laser ont été assemblées à l'aide de tiges filetées et d’écrous, permettant une structure stable et facilement démontable.
2. **Installation des Servomoteurs** : Les deux servomoteurs ont été montés symétriquement sur le corps principal, simplifiant les équations de mouvement et assurant une répartition uniforme des charges.

</div></div>##### Étape 3 : Fixation des Bras et du Support de Crayon

<div id="bkmrk-fixation-des-bras-%3A-"><div>1. **Fixation des Bras** : Les bras articulés ont été fixés aux extrémités du corps principal, offrant une grande liberté de mouvement pour le crayon.
2. **Montage du Support de Crayon** : Le support de crayon a été fixé à l’extrémité des bras. Un servomoteur supplémentaire permet le relevage du crayon via une glissière.

</div></div>##### Étape 4 : Intégration de l’Électronique

<div id="bkmrk-installation-de-l%E2%80%99%C3%89l"><div>1. **Installation de l’Électronique de Contrôle** : L’électronique de contrôle devait être loger dans le coeur du robot au cas ou nous aurions le temps d'imprimer notre propre carte électronique. Cependant cela n'a pas été possible et nous avons donc laisser l'électronique de côté.
2. **Connexion des Servomoteurs** : Les servomoteurs ont été connectés au microcontrôleur pour contrôler les mouvements des bras et du crayon.

</div></div>##### Étape 5 : Tests et Ajustements

<div id="bkmrk-calibration-initiale"><div>- **Calibration Initiale** : Après le montage, le robot a été calibré pour assurer la précision des mouvements.
- **Tests de Dessin** : Des tests de dessin ont été réalisés pour évaluer et optimiser les performances du robot.

</div></div>Pour conclure, le montage et la réalisation de notre robot dessinateur ont été simplifiés grâce à une conception CAO réfléchie, combinant découpe laser et impression 3D. Cette approche a permis d'obtenir une structure robuste, précise et facile à entretenir, capable de réaliser des dessins avec une précision très correcte.

#### Simplicité de Montage et Démontage

La conception CAO a été pensée pour simplifier le montage et le démontage du robot. Les assemblages par tiges filetées et écrous permettent d'accéder facilement aux composants pour la maintenance en ne dévissant que quelques écrous. Cela assure une intervention rapide et efficace, facilitant les ajustements et les réparations.

<div id="bkmrk-voici-ci-dessous-le--1"><div><span style="text-decoration: underline;">**Voici ci-dessous le résultat de notre robot monté:**</span></div><div>  
</div></div>[![WhatsApp Image 2024-05-31 à 18.11.06_b596a62a.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/whatsapp-image-2024-05-31-a-18-11-06-b596a62a.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/whatsapp-image-2024-05-31-a-18-11-06-b596a62a.jpg)[![WhatsApp Image 2024-05-31 à 18.11.06_12579ce7.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/whatsapp-image-2024-05-31-a-18-11-06-12579ce7.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/whatsapp-image-2024-05-31-a-18-11-06-12579ce7.jpg)

<div id="bkmrk--28"><div>  
</div></div><div id="bkmrk-%23include-%3Carduino.h%3E"><div>  
</div><div><span style="text-decoration: underline;">**Bilan du travail de l'équipe**</span></div></div><div id="bkmrk--29"></div>- <span style="text-decoration: underline;">**Séance 1:**</span> Après avoir pris connaissance du sujet du projet, nous nous sommes directement mis à la recherche et à l'exploration de robots similaires existants pour s'en inspirer et nous aider à construire une idée concrète de notre but.
- On s'est également réparti les tâches grâce à un diagramme de Gantt et à une liste des objectifs à atteindre.  
    Nous avons enfin entamé la CAO après avoir établi des sketchs du robot et nous avons également commencé à chercher les équations du mouvement, indispensables par la suite.
- <span style="text-decoration: underline;">**Séance 2:**</span> Durant cette séance, on a réussi à finir, comme prévu la CAO, le schéma du branchement préliminaire ainsi que le calcul des équations du mouvement, adaptés à la structure "losange" de notre robot pour simplifier par la suite les programmes. On a ensuite commencé à s'interroger sur la logique suivie par notre robot surtout sur différentes manières de changer de mode. Après une bonne réflexion, pour prendre le moins d'espace possible et pour rendre les interactions plus rapides, on a décidé d'implémenter une interface permettant de contrôler le robot grâce à un seul bouton et du mouvement du joystick. On a pour cela établi les logigrammes correspondants.
- 
- **<span style="text-decoration: underline;">Séance 3:</span>** Lors de cette séance, on a finalisé la conception du robot en prévoyant les solutions de guidages et de roulements à considérer pour le mouvement. Nous avons également commencé à coder tout d'abord en insistant sur une bonne structure du code pour simplifier les tests et la résolution d'éventuels bugs. On a aussi décidé d'utiliser la découpe laser pour la création de notre robot, vu qu'elle est plus rapide, économique et convenable quant aux dimensions et aux formes du robot.
- 
- **<span style="text-decoration: underline;">Séance 4 : </span>**Pendant cette séance, on a tâché de construire notre robot et de l'assembler. On a testé un premier code sur le robot mais en vain. En effet, une partie de notre modèle géométrique n'était pas assez adapté à la structure de notre robot, à cause des contraintes réelles du montage. À ce moment, on a décidé qu'il était judicieux de se partager la tâche de la programmation sur deux personnes, Ilyes, qui essaiera d'adapter le modèle géométrique aux contraintes réelles notamment celle de la zone de dessin grâce à des tests successifs et Fares, qui continuera à coder un programme final, complet, qui intègrera les résultats trouvés par Ilyes.
- 
- **<span style="text-decoration: underline;">Séance 5 : </span>**La dernière séance avant le rendu, on s'est retrouvé face à plusieurs problèmes notamment du côté de la programmation, vu que le programme complet ne fonctionnait pas , la zone de dessin étant très particulière, mais aussi du côté de l'assemblage du robot car certaines pièces n'étaient pas parfaitement faites par la découpe laser et on a eu besoin de les remplacer. Heureusement, on a pu, mais dans des programmes séparés, effectuer chacune des figures du cahier des charges , mais avec une certaine imprécision vu la nature expérimentale des constantes appliquées.

### <span style="text-decoration: underline;">**Guide d'utilisation :**</span>

- **Démarrage :** brancher le câble Arduino.
- **Le robot se met dans une position initiale (-50,100) par rapport à son repère.**
- **Mode de fonctionnement par défaut :** le déplacement du joystick, c'est à dire que dès qu'on bouge le joystick si aucun autre mode n'est sélectionné alors le bras bougera en fonction de la position du joystick.
- **Choix d'un mode spécifique de fonctionnement :** Pour choisir un mode spécifique, il faut tout d'abord appuyer sur le bouton afin de dire que l'on veut choisir un mode. Une fois le bouton activer le mode de déplacement avec le joystick est mis en pause le temps du choix du mode. Pour chacun des modes la led RGB changera de couleur afin de savoir quel mode nous allons sélectionner. Pour sélectionner un mode il faut déplacer le joystick dans l'une des 4 directions.

 **→Vers le haut → Mode 1:** Dessine une ligne de 5 cm en trait continu.

 **→Vers la bas → Mode 2:** Dessine une ligne de 5cm en trait discontinu.

 **→Vers la droite → Mode 3:** Dessine un cercle continu de 2.5 cm de rayon.

 **→Vers la gauche → Mode 4:** Dessine un cercle discontinu de 2.5 cm de rayon.

Après avoir sélectionner un mode, il faut le valider en rappuyant sur le bouton. Le mode se met donc en marche. A la fin de l'execution d'un mode le mode par défaut se remet en route.

- **Bouton Pause :** Appuyer sur le bouton du joystick, permet de mettre le stylo en position haute et donc de déplacer le stylo sans dessiner. Réappuyer sur le bouton permet de remettre le stylo ne position basse et de continuer le fonctionnement.

### <span style="text-decoration: underline;">**Démonstration :**</span>

Voici le lien youtube pour visionner notre démonstration de notre robot : https://youtu.be/blnAuUA3ipw

<div id="bkmrk--32"></div><div class="notranslate" id="bkmrk--33" style="all: initial;"></div>

# Projet de ROB3 : Damien CORSET et Romane COUEDEL

## **<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Informations</span></span>**

- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">CORSET Damien - damien.corset@etu.sorbonne-universite.fr</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">COUEDEL Romane - romane.couedel@etu.sorbonne-universite.fr</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Date de début : 08/02/2024 - Date de fin : 30/05/2024</span></span>

## **<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"> Introduction </span></span>**

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Le projet Robot Écrivain a pour objectif de concevoir un système robotique capable de dessiner sur une surface plane horizontale. </span><span style="vertical-align: inherit;">En combinant les domaines de la mécanique, de l'électronique et de la programmation, notre équipe s'engage à relever ce défi. </span><span style="vertical-align: inherit;">Pour ce faire, nous devons respecter un cahier des charges précis et utiliser les machines disponibles au FABLAB, ainsi qu'une liste de matériel prédéfinie. </span><span style="vertical-align: inherit;">Ce projet représente une opportunité d'apprentissage, nous permettant de développer nos compétences en collaboration d'équipe et en utilisant des technologies avancées comme la découpe LASER et l'impression 3D.</span></span>

**<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Cahier des charges</span></span>**

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Le robot doit être fixé ou posé sur une plaque horizontale carrée de 250mm par 250mm et doit être capable de réaliser les deux exercices suivants :</span></span>

**<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Exercice 1</span></span>**

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Le robot doit être capable de tracer différentes figures imposées dans le plan de la plaque support, avec un crayon fixé sur son organe terminal. </span><span style="vertical-align: inherit;">Chaque figure doit être réalisée en 10 secondes, avec une marge d'erreur de +/- 0,2 secondes. </span><span style="vertical-align: inherit;">Les chiffres imposés sont les suivants :</span></span>

- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Une ligne de 5 cm de long,</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Une ligne pointillée de 5cm de long,</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Un cercle de 2,5 cm de rayon,</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Un cercle pointillé de 2,5 cm de rayon.</span></span>

**<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Exercice 2</span></span>**

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Le robot doit être capable de tracer un dessin dans un carré de dimensions 5 cm par 5 cm, avec un crayon fixé sur son organe terminal. </span><span style="vertical-align: inherit;">Le déplacement de celui-ci doit être contrôlé par un joystick. </span><span style="vertical-align: inherit;">Il est important de noter que la figure à tracer peut être discontinue, ce qui signifie qu'il faut prévoir la possibilité de relever le crayon du support horizontal pendant le tracé.</span></span>

<p class="callout info"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">De plus, une fonctionnalité facultative consiste à offrir la possibilité de régler la vitesse de déplacement du robot via l'interface utilisateur. </span><span style="vertical-align: inherit;">Cela permet d'ajuster la vitesse de tracé en fonction des besoins spécifiques de chaque dessin.</span></span></p>

**<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Fonctions contraintes</span></span>**

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Les contraintes imposées pour le projet Robot Écrivain sont :</span></span>

- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Respect des règles d'utilisation du FABLAB de Sorbonne Université</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Utilisation de composants (moteurs, contrôleurs, boutons, éléments de guidage, alimentation stabilisée, boutons, etc.) parmi un ensemble imposé.</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Fabrication des pièces grâce au Machine à découpe LASER et Imprimantes RAISE 3D PRO2.</span></span>
- <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Programmation en C utilisant la chaîne de développement Arduino IDE.</span></span>

**Liste des composants et matériels disponibles**

- Un crayon
- Interface de commande :
- Une carte Arduino UNO avec câble USB-B;
- Un joystick:
- Une platine de prototypage;
- 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.


**Gantt**

<p class="callout success">Répartition du travail en équipe [ici](https://docs.google.com/spreadsheets/d/1l3xwK5V_pOysevd3q7F5Jwf33_8ALGLU7fZH52m7O9I/edit#gid=1115838130).</p>

## **I - Conception préliminaire**

**Proposition 1:**

## ![](https://lh7-us.googleusercontent.com/jk_FdxSzhpfsYbrlamJ3qDR-lqQPAKbDfuLu3Z8TO6O5HADqt1uVUyZ7J_QPTYSC60-16rEN63a3yEz4avPYDLpqH5STXEl_FF0CGT4z1McedPMZEX2TQ2n2GF-yVqz_3ACptGma0lxiNZt28mhlegE)

Cette proposition utilise un système comprenant un premier rail de guidage linéaire immobile, fixé à deux masses, auquel est ajouté un chariot. Un second rail, perpendiculaire au premier, est également présent. Sur ce rail mobile, un chariot est fixé, intégrant l'effecteur, ici un stylo. Ainsi, lorsque le rail mobile se déplace, le stylo se déplace selon l'axe y, et lorsque le chariot bouge, le stylo se déplace selon l'axe x, conformément au repère tracé sur le dessin. Un premier servomoteur est utilisé pour déplacer le chariot le long de l'axe y, et un second, fixé sur le chariot, contrôle les déplacements de l'effecteur le long de l'axe x. Enfin, un dernier servomoteur, plus petit, est monté sur le chariot afin de pouvoir abaisser ou relever le stylo.

<p class="callout info">Inspiration : [AxiDraw V3](https://eu.robotshop.com/fr/products/axidraw-v3-personal-writing-drawing-robot-intl?gad_source=1&gclid=Cj0KCQiAw6yuBhDrARIsACf94RXAKLoYkCLJ3MuaRa6hlcLJr7fabXooPkDBvN3BWfvUlw3OVqt995QaAhrQEALw_wcB)</p>

**Proposition 2:**

## ![](https://lh7-us.googleusercontent.com/6dQh8R4xZy5zi8potylr07qsZyiMhc4li8cvnWhxSVdw3XkVThheMWl3QAeBtdHEA_n5TSuXSgBpWlkO4XyhMp00k_ej0lPC4msJYo8-mmb_GOKbsRvOa3M67fkzZQTlPyfJMom3RNwXikey4mw_EXk)

Dans la même idée que la proposition 1, cette proposition est constituée d’un chariot auquel est fixé le stylo, qui se déplace linéairement sur un rail de guidage mobile qui lui-même se déplace linéairement et repose sur deux autres rails immobiles. Ce système est déjà commercialisé non pas pour faire du dessin mais plutôt pour de la gravure au laser.  
Pour les mêmes raisons que précédemment cette proposition ne sera pas notre choix final.

<p class="callout info">Inspiration : [Machine à Graver Laser](https://www.vevor.fr/machine-de-gravure-laser-c_11141/vevor-machine-a-graver-laser-graveur-laser-cnc-6-w-zone-de-gravure-460x810-mm-p_010795045860)</p>

**Proposition 3:**

## ![](https://lh7-us.googleusercontent.com/f5q12pOXE9khUkgioINaaNyr51bM7RgR7qcIPEmkRtEv_Ci6KRHOfjg4HvzC5osGDvllgjAeiK8JKQ0wxKeZ9CYlQcIK1DC3-hFJhw2qhHFqazOnpk06uvXc_Q_uqqkvgFZRjqpMIacOyhQtYmNRFdw)

Le robot est composé d'un corps principal sur lequel est montés deux servomoteurs pour contrôler les bras. Les bras sont joints au niveau de leur main, où est fixé le crayon. Pour relever le crayon, nous avions pensé à soulever le corps du robot mais il est possible que le servomoteur ne supporte pas la charge de tout le système.

<p class="callout info">Inspiration : [Robot dessinateur](https://shopibest.com/product/robot/)</p>

**Proposition 4:**

## ![](https://lh7-us.googleusercontent.com/WUB5eCxQ0-_YBfuls5CfRj6rmwoYP5RysNizSkwoYsXD6tl_99DY2jFFnJ0TzobTHyTEIekoQdqVRSP4mNBiAdvrneJg9mzBMy10wm5CODGrMF0BRrAcLQxAAebc1DYyPxDWtx_8Svmkz_g28fTMWrw)

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Cette idée reprend la proposition 3, mais au lieu de soulever le corps entier du robot pour relever le cayon, on met en place un mécanisme indépendant pour soulever uniquement le crayon. </span><span style="vertical-align: inherit;">Le mécanisme se situe au niveau des principales articulations. </span><span style="vertical-align: inherit;">Il existe tout de même un risque minime que l'ensemble soit trop lourd à porter pour les deux servomoteurs si les mains trop lourdes et/ou si la longueur des bras sont trop importantes. </span><span style="vertical-align: inherit;">Cependant ces servomoteurs sont plus gros et plus puissants que celui qui se situe sur les mains. </span><span style="vertical-align: inherit;">L'inconvénient de ce système se situe au niveau de la tenue du crayon, puisqu'il faut à la fois qu'il soit serré et qu'il soit glissant pour permettre le mouvement des pièces. </span></span>

**<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Choix retenu:</span></span>**

[![choix.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/choix.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/choix.jpeg)

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Cette solution reprend la proposition 4, sauf qu'on allonge l'avant bras sur lequel est fixé le servomoteur du crayon. </span><span style="vertical-align: inherit;">Le crayon se trouve à l'extrémité de cet avant-bras où il est serré. </span><span style="vertical-align: inherit;">Entre le crayon et le servomoteur qui le relève, les deux pièces se rejoignent ce qui permet le mouvement.</span></span>

## **<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">II - Conception détaillée</span></span>**

#### **<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">2.1. Conception mécanique</span></span>**

##### **2.1.1. Modélisation et vérification des ajustements**

Nous avons utilisé le logiciel de CAO SolidWorks pour modéliser l'ensemble du robot. Pour simplifier notre processus de conception et d'assemblage, nous avons divisé l'assemblage en plusieurs parties distinctes :

- Le premier sous-assemblage, nommé "base", est un boîtier abritant tous les composants électroniques, laissant les deux servomoteurs des bras visibles à l'extérieur. Sur le dessus de ce boîtier, se trouve le joystick, l'élément unique avec lequel l'utilisateur interagit. Pour faciliter le montage, des ouvertures sont prévues sur la plaque supérieure du boîtier pour permettre le passage des moteurs et la fixation du joystick. De plus, une ouverture latérale est réalisée pour permettre l'alimentation de la carte Arduino. La face inférieure du boîtier est constituée d'une plaque qui couvre entièrement la surface du robot, servant de support pour la feuille de dessin.
- Le deuxième sous-assemblage, appelé "effecteur", est mis en place par l'utilisateur à l'aide d'une vis, similaire au dispositif des compas, qui serre le stylo au système. Pour lever le stylo, un petit servo-moteur est fixé au bras le plus long, prévu avec des encoches pour permettre sa fixation. Des trous sont également prévus dans l'avant-bras pour fixer le mécanisme de levage du stylo, qui sera fabriqué en impression 3D.

<p class="callout info">Séparer notre assemblage en plusieurs sous-assemblages simplifie l'identification et la manipulation de chaque composant individuel, favorise une meilleure collaboration entre les membres de l'équipe et simplifie la maintenance et les potentielles modifications ultérieures.</p>

<p class="callout info">Il convient de souligner que notre processus de conception a nécessité la réalisation de tests sur les pièces nécessitant un montage serré, afin d'ajuster avec précision les dimensions des composants. Les variations dues aux ajustements et aux tolérances des machines ont été prises en compte pour garantir un assemblage correcte du robot.</p>

![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/embedded-image-zun5epxq.png)

<p class="callout success">Nous avons maximiser l'utilisation de la découpe laser pour la fabrication de nos pièces pour plusieurs raisons. Tout d'abord, la découpe laser offre une solidité, une précision supérieures et un avantage en termes de rapidité de production, nous permettant de concrétiser notre projet de manière efficace. De plus, cette méthode nous a permis de réduire les coûts matériels.</p>

<p class="callout success">L'ensemble des pièces ainsi que l'assemblage sont disponibles [ici](https://drive.google.com/file/d/1NKOxVvD_H19jJoK8b_mGIjhFfFu6UY81/view?usp=drive_link). Les fichiers de fabrication sont également disponibles aux formats DXF, SVG ou STL.</p>





##### **2.1.2. Schéma cinématique**

Ci dessous le schéma cinématique du robot :

[![image18.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/image18.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/image18.jpg)

##### **2.1.3. Calcul du modèle géométrique direct et inverse**

Dans cette section, nous procédons au calcul du modèle géométrique direct et inverse pour notre système. Ces calculs sont nécessaires pour prédire le comportement du système.

**Références du Système :**

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/zALimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/zALimage.png)

**Modèle Géométrique Direct :**

Le Modèle Géométrique Direct (MGD) permet de déterminer la position et l'orientation de l'effecteur final d'un robot en connaissant les valeurs des angles de ses articulations. En d'autres termes, il permet de prédire où se situera l'effecteur du système en fonction des positions de ses articulations.

![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/embedded-image-vsvtu4qa.png)

<details id="bkmrk-d%C3%A9tails-du-calcul-%5Bi"><summary>Détails des calculs du MGD</summary>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/auAimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/auAimage.png)

</details> **Modèle Géométrique Inverse :**

D'autre part, le Modèle Géométrique Inverse (MGI) permet à l'inverse de calculer les valeurs des angles des articulations nécessaires pour atteindre une position spécifique de l'effecteur final. Autrement dit, il permet déterminer les mouvements que le système doit effectuer pour placer son effecteur à un endroit précis dans l'espace.

![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/embedded-image-rmmrxzij.png)

<details id="bkmrk-d%C3%A9tails-des-calculs-"><summary>Détails des calculs du MGI</summary>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/0cFimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/0cFimage.png)

</details><p class="callout info">Pour valider nos résultats et assurer leur précision, nous avons utilisé les logiciels SolidWorks et MATLAB. SolidWorks a été employé pour récréer le modèle du système à l'aide d'une esquisse, tandis que MATLAB a été utilisé pour effectuer des simulations numériques à l'aide des équations trouvées précédemment. Les résultats de nos calculs sous Matlab ont été comparés avec les valeurs renvoyées par le logiciel SolidWorks.</p>

<p class="callout success">Les fichiers SolidWorks et MATLAB correspondants sont disponibles [ici](https://drive.google.com/file/d/1NKOxVvD_H19jJoK8b_mGIjhFfFu6UY81/view?usp=drive_link).</p>


#### **<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">2.2. Conception électronique</span></span></span></span>**

##### **2.2.1. Architecture électronique**

Dans notre conception électronique, nous distinguons deux aspects essentiels : l'électronique de commande, où la carte Arduino UNO joue un rôle central dans la gestion et la synchronisation des composants, et l'électronique de puissance. Le joystick, en tant qu'interface utilisateur principale, transmet les données d'entrée à la carte Arduino. Les deux servomoteurs HS422 et le servomoteur FT90MR servent d'actionneurs, les HS422 contrôlant les mouvements du système en x et y et le FT90MR en contrôlant la hauteur du stylo sur l'axe z. Une alimentation régulée de 5V assure une tension constante pour les moteurs. Cette alimentation régulée alimente à la fois la carte Arduino et les servomoteurs.

<p class="callout warning">Il est important de noter que la carte Arduino ne peut pas fournir des courants élevés à des actionneurs tels que les servomoteurs. Cette limitation peut compromettre le fonctionnement de la carte et entraîner des dysfonctionnements ou des dommages. C'est pourquoi en séparant la partie puissance de la partie électronique, nous évitons que la carte soit surchargée en courant ou détériorée.</p>

<p class="callout info">Nous avons fait le choix d'utiliser uniquement un joystick dans notre système, ce qui permet à la fois de naviguer dans les menus et de piloter manuellement le robot. Ce choix simplifie l'interface utilisateur et sera expliqué en détail dans la section sur la conception logicielle.</p>



##### **2.2.2. Schéma des connexions électriques**

Nous utilisons le logiciel KiCad pour réaliser le schéma des connexions. Il offre une interface conviviale et des fonctionnalités avancées pour la conception de circuits électroniques. Il nous permet de représenter de manière claire et précise les connexions entre les différents composants de notre système électronique.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/FSnimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/FSnimage.png)

#### **<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">2.3. Conception logicielle</span></span></span></span></span>**

##### **<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">2.3.1. Architecture du code du menu principal</span></span></span></span></span>**

<span id="bkmrk--19" style="font-weight: normal;">![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/embedded-image-exvzqq8h.png)</span>

<details id="bkmrk-code-du-menu-princip"><summary>Code du menu principal (C++)</summary>

```c++
#include <Arduino.h>
#include <Servo.h>
#include "fonctions.h"
#include "dessin.h"

int initialisationIO(void)
{
  pinMode(PIN_VRX, INPUT);
  pinMode(PIN_VRY, INPUT);
  pinMode(PIN_SW, INPUT);

  return 1;
}

int initialisationCom(void)
{
  Serial.begin(921000); // Pour debug
  return 1;
}

Servo servo1;
Servo servo2;
Servo servo3;

int initServo(void)
{
  servo1.attach(PIN_SERVO_1);
  servo2.attach(PIN_SERVO_2);
  servo3.attach(PIN_SERVO_3);

  return 1;
}

void setup()
{
  Serial.print("InitialisationCOM...\n");
  if (!initialisationCom())
  {
    Serial.print("Erreur...\n");
    abort();
  }
  Serial.print("InitialisationCOM reussie\n");

  Serial.print("InitialisationIO...\n");
  if (!initialisationIO())
  {
    Serial.print("Erreur...\n");
    abort();
  }
  Serial.print("InitialisationIO reussie\n");

  Serial.print("InitialisationSERVOS...\n");
  if (!initServo())
  {
    Serial.print("Erreur...\n");
    abort();
  }
  Serial.print("InitialisationSERVOS reussie\n");

  controlServoCalibration(45, 52);
  Serial.print("Debut programme...\n");
}

void loop()
{
  switch (choixJoystick(2, 0.5, 60, true))
  {
  case EXERCICE_1:
    Serial.print("Exercice 1\n");
    exercice1();
    break;

  case EXERCICE_2:
    Serial.print("Exercice 2\n");
    exercice2();
    break;

  default:
    Serial.print("Fin programme\n");
    abort();
  }
}


int choixJoystick(int nombreChoix, float triggerModule, int offset, bool BP)
{
  int choix = 0;

  do
  {
    //Valeur brut des capteurs
    int rawValX = analogRead(PIN_VRX) - OFFSET_VRX;
    int rawValY = 1023 - analogRead(PIN_VRY) - OFFSET_VRY;

    // Conversions des valeurs bruts en valeur centrées entre -512 / +512
    float ValX = float(map(rawValX, -OFFSET_VRX, (1023 - OFFSET_VRX), -1000, 1000)) / 1000.0;
    float ValY = float(map(rawValY, -OFFSET_VRY, (1023 - OFFSET_VRY), -1000, 1000)) / 1000.0;

    // Récupérations des données en coordonnées polaires
    float module = sqrt(ValX * ValX + ValY * ValY);
    int angle = atan2(ValY, ValX) * RAD_TO_DEG;

    // Ajustement pour rester dans notre plage angulaire 0-360° et module 0-1
    if (module > 1.0)
      module = 1.0;
    if (angle < 0.0)
      angle += 360.0;

    // Interprétation du résultat
    if (module > triggerModule)
    {
      for (int i = 0; i < nombreChoix; i++)
      {
        if (i == 0) // Cas particulier choix 0
        {
          if ((angle <= offset && angle >= 0) || (angle <= 360 && angle >= 360 - offset))
          {
            choix = 1;
            break;
          }
        }
        else // Détermination du choix entre 1 et nombreChoix
        {
          int angleRef = i * (360.0 / nombreChoix);

          if (angle >= (angleRef - offset) && angle <= (angleRef + offset))
          {
            choix = i + 1;
            break;
          }
        }
      }
    }
    _delay_ms(10);

  } while (choix == 0 || (digitalRead(PIN_SW) && BP)); // Tant qu'on a pas de choix ou bouton non appuyé

  return choix;
}

```

</details>##### **<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">2.3.2. Architecture du code "Exercice 1"</span></span></span></span></span>**

<span id="bkmrk--23" style="font-weight: normal;">![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/embedded-image-brdbgl9t.png)  
</span>

<details id="bkmrk-code-%22exerice-1%22-%28c%2B"><summary>Code "Exerice 1" (C++)</summary>

```c++
// Fonction principale de l'exercice 1
int exercice1(void)
{
    // Sélectionne une action en fonction du choix de l'utilisateur avec le joystick
    switch (choixJoystick(4, 0.5, 30, true))
    {
    case LIGNE_CONTINUE:
        // Trace une ligne continue
        tracerLigne(5, 25, X_MAX, 25, 200, TRAIT_CONTINU);
        break;

    case CERCLE_CONTINU:
        // Trace un cercle continu
        tracerCercle(30, 25, 23, 360, TRAIT_CONTINU);
        break;

    case LIGNE_DISCONTINUE:
        // Trace une ligne discontinue
        tracerLigne(5, 25, X_MAX, 25, 200, TRAIT_DISCONTINU);
        break;

    case CERCLE_DISCONTINU:
        // Trace un cercle discontinu
        tracerCercle(30, 25, 23, 360, TRAIT_DISCONTINU);
        break;
    }
    // Affiche la fin de l'exercice dans la console série
    Serial.print("Fin exercice 1\n");
    _delay_ms(1000); // Pause de 1 seconde
    return 1;
}

// Fonction pour tracer une ligne
int tracerLigne(float xFrom, float yFrom, float xTo, float yTo, int steps, bool trait)
{
    // Vérifie si les coordonnées sont dans les limites autorisées
    if (xFrom < X_MIN || xFrom > X_MAX || yFrom < Y_MIN || yFrom > Y_MAX)
        return -1;
    if (xTo < X_MIN || xTo > X_MAX || yTo < Y_MIN || yTo > Y_MAX)
        return -1;

    // Calcule les incréments pour chaque étape
    float xSteps = (xTo - xFrom) / float(steps);
    float ySteps = (yTo - yFrom) / float(steps);
    float q1, q2, compteur = 0;

    // Positionne le servo Z
    controlServoZ(85);
    _delay_ms(250);

    // Convertit les coordonnées en angles pour les servos XY
    inverseModeleGeom(xFrom, yFrom + OFFSET_Y, &q1, &q2);
    controlServoXY(q1, q2);
    _delay_ms(250);
    controlServoZ(95);

    // Boucle pour tracer la ligne
    for (float i = 0; i < steps; i++)
    {
        xFrom += xSteps;
        yFrom += ySteps;

        inverseModeleGeom(xFrom, yFrom + OFFSET_Y, &q1, &q2);
        controlServoXY(q1, q2);

        // Gère le trait discontinu si nécessaire
        if (trait)
        {
            if (compteur == 7)
            {
                controlServoZ(95);
            }
            else if (compteur == 10)
            {
                controlServoZ(85);
                compteur = 0;
            }
            compteur++;
        }
        _delay_ms(90); // (temps boucle + delay) * 50 = 10000ms avec temps boucle = 5ms (delay = 90 pour 10sec)
    }
    controlServoZ(75); // Ramène le servo Z à sa position initiale
    return 1;
}

// Fonction pour tracer un cercle
int tracerCercle(float xFrom, float yFrom, float radius, int steps, bool trait)
{
    float q1, q2, compteur = 0;
    float xTo = xFrom;
    float yTo = yFrom;

    controlServoZ(85);
    _delay_ms(250);

    // Positionne le servo XY pour commencer le cercle
    inverseModeleGeom(xFrom + radius, yFrom + OFFSET_Y, &q1, &q2);
    controlServoXY(q1, q2);
    _delay_ms(250);
    controlServoZ(105);

    // Boucle pour tracer le cercle
    for (int i = 0; i <= steps + 5; i++)
    {
        xTo = xFrom + radius * cos(i * (360.0 / steps) * DEG_TO_RAD);
        yTo = yFrom + radius * sin(i * (360.0 / steps) * DEG_TO_RAD);

        inverseModeleGeom(xTo, yTo + OFFSET_Y, &q1, &q2);
        controlServoXY(q1, q2);

        // Gère le trait discontinu si nécessaire
        if (trait)
        {
            if (compteur == 2)
            {
                controlServoZ(105);
            }
            else if (compteur == 4)
            {
                controlServoZ(85);
                compteur = 0;
            }
            compteur++;
        }
        _delay_ms(100); // (temps boucle + delay) * 90 = 10000ms avec temps boucle = 5ms (delay = 100 pour 10sec)
    }
    return 1;
}

// Fonction pour convertir les coordonnées (x, y) en angles pour les servos
int inverseModeleGeom(float x, float y, float *q1, float *q2)
{
    float O1E = sqrt(pow((x - D0), 2) + pow(y, 2));
    float Alpha1 = atan2(y, x - D0);
    float Alpha2 = acos((pow(L1, 2) - pow((L4 + L5), 2) + pow(O1E, 2)) / (2 * L1 * O1E));
    float Theta1 = Alpha1 + Alpha2;

    float Cx = (L4 / (L4 + L5)) * x + (L5 / (L4 + L5)) * (L1 * cos(Theta1) + D0);
    float Cy = (L4 / (L4 + L5)) * y + (L5 / (L4 + L5)) * (L1 * sin(Theta1));

    float O2C = sqrt(pow((Cx - D0 - D1), 2) + pow(Cy, 2));

    float Beta1 = atan2(Cy, (D0 + D1) - Cx);
    float Beta2 = acos((pow(L2, 2) - pow(L3, 2) + pow(O2C, 2)) / (2 * L2 * O2C));
    float Theta2 = PI - (Beta1 + Beta2);

    *q1 = Theta1 * RAD_TO_DEG;
    *q2 = Theta2 * RAD_TO_DEG;

    return 1;
}

```

</details>##### **<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">2.3.3. Architecture du code "Exercice 2"</span></span></span></span></span>**

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/vGvimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/vGvimage.png)

<details id="bkmrk-code-%22exercice-2%22-%28c"><summary>Code "Exercice 2" (C++)</summary>

```c++
int exercice2(void)
{
  float x = 0, y = 0, q1, q2;
  float vitesse = 0.05;

  while (!digitalRead(PIN_SW))
    ; // Anti rebond

  while (digitalRead(PIN_SW))
  {
    // Valeurs bruts des capteurs
    int rawValX = analogRead(PIN_VRX) - OFFSET_VRX;
    int rawValY = 1023 - analogRead(PIN_VRY) - OFFSET_VRY;

    // Conversions des valeurs bruts en valeur centrées entre -512 / +512
    float ValX = float(map(rawValX, -OFFSET_VRX, (1023 - OFFSET_VRX), -1000, 1000)) / 1000.0;
    float ValY = float(map(rawValY, -OFFSET_VRY, (1023 - OFFSET_VRY), -1000, 1000)) / 1000.0;

    // Récupérations des données en coordonnées polaires
    float module = sqrt(ValX * ValX + ValY * ValY);
    int angle = atan2(ValY, ValX) * RAD_TO_DEG;

    // Ajustement pour rester dans notre plage angulaire 0-360° et module 0-1
    if (module > 1.0)
      module = 1.0;
    if (angle < 0.0)
      angle += 360.0;

    // Interprétation du résultat
    if (module > 0.2)
    {
      x = x + vitesse * module * cos(angle * DEG_TO_RAD);
      y = y + vitesse * module * sin(angle * DEG_TO_RAD);

      // Saturation numérique pour éviter dépassement
      if (x < X_MIN)
        x = X_MIN;
      if (x > X_MAX)
        x = X_MAX;
      if (y < Y_MIN)
        y = Y_MIN;
      if (y > Y_MAX)
        y = Y_MAX;

      inverseModeleGeom(x, y + OFFSET_Y, &q1, &q2);
      controlServoXY(q1, q2);
    }
  }
  Serial.println("Fin exercice 2");
  _delay_ms(1000);
  return 1;
}
```

</details><p class="callout success">Le programme complet est disponible [ici](https://drive.google.com/drive/folders/1I3kV_7YYsN62A0KeueDZHmTrLymUBlCz?usp=sharing)</p>

## **<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">III - Réalisation </span></span>**

![image.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/Cwqimage.gif) ![image.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/MeWimage.gif)

 ![image.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/ejQimage.gif)

## **IV - Guide d'utilisation** 

**1. Navigation dans le menu principal :**

- **Choix des exercices :**
    - **Joystick à gauche ou à droite :** Sélectionner l'exercice 1 ou 2.
    - **Joystick en position neutre et validation :** Terminer le programme.
    - **Validation :** Appuyer sur le bouton poussoir du joystick pour confirmer la sélection et entrer dans l'exercice choisi.

**2. Exercice 1 - Tracé de figures :**

- **Sélection du mode de tracé :**
    - **Joystick à droite :** Tracé d'une ligne continue.
    - **Joystick vers le haut :** Tracé d'un cercle continu.
    - **Joystick à gauche :** Tracé d'une ligne discontinue.
    - **Joystick vers le bas :** Tracé d'un cercle discontinu.
- **Validation :** Appuyer sur le bouton poussoir du joystick pour lancer le tracé de la figure sélectionnée.

**3. Exercice 2 - Tracé libre :**

- **Déplacement et dessin :**
    - **Joystick :** Utiliser le joystick pour déplacer librement le robot dans le carré de 5 cm par 5 cm.
    - **Dessin :** Le robot dessine tant que le joystick est déplacé.
    - **Fin du tracé :** Appuyer sur le bouton poussoir du joystick pour arrêter le dessin et revenir au menu principal.

**4. Retour au menu principal :**

- Une fois un exercice terminé, le robot retourne automatiquement au menu principal.
- Le processus de sélection peut être répété pour lancer un autre exercice ou terminer le programme.

## **V - Limite du projet**

Bien que le projet Robot Écrivain ait été une réussite, il est important de noter certaines limitations liées aux matériaux et aux composants utilisés :

1. **Précision du matériel :**
    
    
    - **Servomoteurs :** Les servomoteurs que nous avons utilisés ont une résolution d'1°, ce qui limite la précision des mouvements. Cela pose des défis pour le tracé de figures nécessitant une haute précision.
    - **Absence de homing :** Le manque de capteurs de position initiale (homing) rend difficile le repositionnement exact du robot après une mise hors tension ou une interruption. Chaque redémarrage doit en théorie, nécessiter un recalibrage manuel.
2. **Capacités du microcontrôleur :**
    
    
    - **Carte Arduino UNO :** Notre système repose sur un microcontrôleur AVR à 16 MHz, avec un seul cœur. Cette architecture ne supporte pas le multitâche, ce qui signifie que les calculs et les tâches doivent être exécutés séquentiellement, ralentissant ainsi les performances globales.
    - **Limites de calcul :** Les capacités limitées de calcul du microcontrôleur entraînent des délais supplémentaires, surtout lors de la gestion des calculs géométriques pour le tracé des figures. Un microcontrôleur plus puissant, comme un ESP32, aurait permis des calculs plus rapides et une gestion multitâche.
3. **Conception mécanique et matériaux :**
    
    
    - **Découpe laser et impression 3D :** Bien que ces méthodes offrent de la précision et de la rapidité, les matériaux utilisés (PLA pour impression 3D et medium pour découpe laser) ont leurs propres limitations en termes de rigidité et de durabilité.
    - **Encombrement et stabilisation :** La structure du robot, en raison de la simplicité des matériaux et de la conception, peut manquer de la stabilité et de précision

Ces limitations ont impacté la précision, la rapidité et la facilité d'utilisation du robot. Cependant, elles ont également fourni des opportunités d'apprentissage précieuses et ont mis en lumière les domaines à améliorer pour des projets futurs plus ambitieux. Nous envisageons que des améliorations, telles que l'utilisation de composants plus avancés et la conception de systèmes de retour de position (servomoteurs intelligents), pourraient considérablement augmenter les capacités de notre robot.

## **<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Conclusion</span></span>**

Le projet Robot Écrivain a été une expérience enrichissante, combinant mécanique, électronique et programmation pour créer un robot capable de dessiner sur une surface plane. En respectant un cahier des charges précis et en utilisant les ressources du FABLAB, nous avons surmonté plusieurs défis techniques.

À travers les étapes de brainstorming, planification, modélisation CAO sur SolidWorks, et programmation en C++, chaque membre a contribué à la réussite du projet. Nos choix de conception, validés par nos professeurs ainsi que par des simulations et tests, ont assuré la précision et la fonctionnalité du robot.

L'architecture électronique a optimisé la gestion de la puissance et des commandes via Arduino, tandis que le développement du code a permis le tracé précis de figures imposées et la gestion de l'interface utilisateur. Les tests finaux ont confirmé le bon fonctionnement du robot, accomplissant toutes les tâches requises.

Ce projet nous a permis de développer des compétences techniques et de collaboration, constituant une base solide pour nos futures études et projets en ingénierie. Nous sommes fiers du travail accompli et des connaissances acquises tout au long de cette expérience.

## Journal de bord

08 février

- <span style="text-decoration: underline;">**Découverte du projet**</span> : Présentation PowerPoint détaillant le cahier des charges du robot dessinateur.
- <span style="text-decoration: underline;">**Formation des groupes**</span> : Les équipes ont été formées.
- <span style="text-decoration: underline;">**Brainstorming**</span> : Séance de brainstorming, générant une variété d’idées et de projets différents.
- <span style="text-decoration: underline;">**Choix d’un système :**</span> Sélection du robot le plus réalisable et efficace.
- <span style="text-decoration: underline;">**Répartition des tâches :**</span> Création d’un diagramme de Gantt.
- <span style="text-decoration: underline;">**Schéma électronique :**</span> Sélection des composants nécessaires

15 février

- <span style="text-decoration: underline;">**Choix des matériaux :**</span> quels matériaux sont les plus adaptés en tenant compte des choix disponibles.
- <span style="text-decoration: underline;">**Début de la modélisation solidworks.**</span>
- <span style="text-decoration: underline;">**Schéma électronique :**</span> élaboration du schéma électronique sur Kicad.
- **<span style="text-decoration: underline;">Modèle géométrique:</span>** Discussion autour de celui-ci en interne pour savoir comment le déterminer

28 février

- <span style="text-decoration: underline;">**Finalisation de la modélisation solidworks**</span>
- <span style="text-decoration: underline;">**Fabrication des pièces :**</span> Les premiers tests de fabrication ont été réalisés, notamment ceux liés à des ajustements (ex: les bras qui accueillent les roulements)
- <span style="text-decoration: underline;">**Modèle géométrique:**</span> avec l’aide de nos professeurs nous avons pu déterminer le modèle géométrique

07 mars

- <span style="text-decoration: underline;">**Fabrication des pièces:**</span> Création de toutes les pièces fabriquées à la découpeuse laser
- <span style="text-decoration: underline;">**Assemblage:**</span> Le robot est entièrement monté sauf l’organe terminal
- <span style="text-decoration: underline;">**Câblage + codage :** </span>On test de manière unitaire les composants

02 mai

- <span style="text-decoration: underline;">**Fabrication des pièces:**</span> Impression des dernières pièces qui permettent de lever le crayon
- <span style="text-decoration: underline;">**Assemblage:**</span> le robot est monté entièrement
- **<span style="text-decoration: underline;">Codage :</span>** exercice 1, exercice 2

30 mai

- <span style="text-decoration: underline;">**Codage:**</span> Derniers ajustements du code.

# Projet ROB3: Rami, Yannis, Vasilis

## **LineaScribe Robot**

### **Informations**

#### Membres

<table border="1" id="bkmrk-nom-pr%C3%A9nom-email-tob" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td>**Nom Prénom**</td><td>**Email**</td></tr><tr><td>TOBBAL Yannis</td><td><tobbalya@gmail.com></td></tr><tr><td>ARIDI Rami</td><td><rami.aridi@etu.sorbonne-universite.fr></td></tr><tr><td>SKARLEAS Vasilis</td><td><vasileios.skarleas@etu.sorbonne-universite.fr></td></tr></tbody></table>

#### Cursus

Polytech 3eme année | Spécialité: Robotique

#### Délais

Début: 14/02/24 | Fin: 23/05/24

#### Projet final

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube.com/embed/9x2VUmMjCeY?si=snVatNEHd9O4eVO-" width="560"></iframe>

### **But, objectifs et contexte**

#### But

Le but est de créer un robot capable de dessiner différentes formes sur une feuille de papier. Il doit pouvoir réaliser des formes préprogrammée ainsi qu'être contrôlé manuellement.

Le robot est fixé sur un support carré horizontal comportant une zone de dessin de 10\*10 cm. Il y a 2 exercice qu'il doit réussir. En outre, le robot faut être capable de répondre au cahier des charges disponible <span style="text-decoration: underline;">[ici](https://wiki.fablab.sorbonne-universite.fr/BookStack/books/projets-due-2023-2024/page/le-sujet-du-projet)</span>.

**<span style="text-decoration: underline;">Exercice 1  
</span>***Dessiner des formes prédéfinies*

Le robot doit être capable de réaliser en 10 +- 0.2 secondes:

-Une ligne droite de 5cm  
-Une ligne droite de 5cm en pointillés  
-Un cercle de 2.5cm de rayon  
-Un cercle de 2.5cm de rayon en pointillés

<span style="text-decoration: underline;">**Exercice 2** </span>*Permettre à un utilisateur de dessiner*<span style="text-decoration: underline;">  
</span>

L'utilisateur doit être capable d'utiliser le robot pour dessiner la forme qu'il veut sur la zone de dessin. Le robot est contrôlé par un joystick qui doit donc être doté des fonctions utilisés dans l'exercice 1 (Déplacement, relever le stylo etc...)

#### Besoins

Il faut donc créer un robot qui:

- Maintienne un effecteur (le stylo) afin de dessiner
- Se déplace: 
    - Dans un plan horizontal: Créer les formes
    - Verticalement: Dessiner ou non, pour les pointillés
- Enregistre des formes prédéfinies
- Soit capable d'être contrôlé précisément par le joystick

#### Matériel  


Les moyens qu'on a à notre disposition sont les suivantes:

- 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 MDF : 3mm et 6mm d'épaisseur;
    - Vis et écrous : M2, M2.5, M3, M4.
    - Roulements et axes de diamètre 4mm.
- Informatique 
    - Ressources CAO.zip contient les fichiers Solidworks pour les deux modèles de servomoteurs
    - datasheets.zip contient les documentations de quelques-uns des composants fourni

#### Machines utilisées

Utilisation de l'impression 3D pour des pièces sophistiquée et éventuellement de la technologie de découpe laser pour les autres pièces.

##### Matière consommée:

MDF: 64 cm<sup>3 </sup>(Bras) + 302 cm<sup>3 </sup>(Tour): 366 cm<sup>3</sup> total   
PLA: 7.3 cm<sup>3 </sup>(Effecteur) + 9 cm<sup>3 </sup>(Actionneur) : 16.3 cm<sup>3 </sup>total

### **Diagramme de GANTT**

Il y a un lien interactif qui est mis à jour à chaque modification via [https://airtable.com/appVydj1BDLSFj432/shrm5Cjk0diMBPmgL](https://airtable.com/appVydj1BDLSFj432/shrm5Cjk0diMBPmgL)

[![project-fablab-rob3-tasks-1.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/project-fablab-rob3-tasks-1.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/project-fablab-rob3-tasks-1.png)[![project-fablab-rob3-tasks-2.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/project-fablab-rob3-tasks-2.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/project-fablab-rob3-tasks-2.png)

<p class="callout info">**Nota bene**  
Ce diagramme de GANTT est donnée à titre indicatif</p>

[Project FabLab ROB3 Tasks (GANTT).pdf](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/549)

### **Étape 1: Brainstorming, idées de réalisation et analyse des risques**  


Durant notre brainstorming: nous eûmes 5 idées que nous avons ultimement rejetées:

[![IMG_6529.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/img-6529.png)<span style="color: rgb(35, 111, 161);">*Figure 1: Photo de notre tableau - juste pour démonstration. Explications sont disponibles ci-dessous*</span>](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/img-6529.png)

<span style="color: rgb(34, 34, 34); font-family: var(--font-heading, var(--font-body)); font-size: 1.666em; font-weight: 400;">Idée 1 - Robot de roues</span>

<span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0);">Principe:</span></span>

Un robot sur deux roues motorisées. Il peut faire de rotations en faisant tourner ses roues dans des directions opposées

- Le stylo est attaché au centre de de la plateforme.
- Les roues seraient contrôlées grâce aux 2 servomoteurs HS422 d'une façon similaire au robot E-PUC. Les servomoteurs sont connectés à la plateforme et aux roues via des biellettes ou des engrenages.
- Un servomoteur ES08A est utilisé pour contrôler le mécanisme de levée et de descente du stylo. Ce servomoteur est plus petit que les HS422 et peut être monté sur la plateforme à proximité du stylo.

<span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0);">Croquis:</span></span>

[*![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/s2rimage.png)*](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-02-at-2-31-25-pm.png)[<span style="color: rgb(126, 140, 141);"><span style="color: rgb(35, 111, 161);">*Figure 2: Croquis du robot de* roues (type voiture avec une bille pour la stabilisation)</span></span>](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-02-at-2-31-25-pm.png)

<span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0);">Avantages:</span></span>

- <span style="color: rgb(0, 0, 0);">Le robot est facile à contrôler avec un joystick (important pour la réalisation de l’exercice 2)</span>
- <span style="color: rgb(0, 0, 0);">Sa construction et modélisation est simple</span>

<span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0);">Inconvénients: </span></span>

- On ne peut pas réaliser de trajectoires complexes. Le robot ne peut pas suivre des trajectoires complexes sans l'aide de capteurs odométrique.
- L'utilisation des servomoteurs empêcherait de faire rouler le robot indéfiniment. Cela ne serait pas un problème avec l'exercice 1. L'exercice 2 pourrait se révéler impossible à faire (Prenons par exemple un cas hyperbolique et fantaisiste: La forme à dessiner au joystick est une réplique de la Joconde. Le robot ne pourrait jamais faire ceci). Pour dépasser cet obstacle, il faudrait utiliser de roues avec une diamètre assez grande entraînant des complications aux glissements sur la surface.

#### Idée 2 - Robot XY (cartésien)

<span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0);">Principe:</span></span>

Un système similaire au fonctionnement d'une imprimante 3D:

- A l'aide d'un système de bielle manivelle, les deux servomoteurs HS422 commandent des liaisons glissières sur les axes x et y.
- La bielle tenant le stylo est elle même tenue par une bielle. Cette dernière se positionne sur la coordonnée de son axe, tandis que la bielle de l'effecteur choisit alors la deuxième coordonnée du point.
- Le servomoteur ES08A commande la levée et descente du stylo

<span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0);">Croquis:</span></span>

[![image (1).png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/image-1.png)*Figure 3: Le croquis d'un robot cartésien*](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/image-1.png)

<span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0);">Avantages:</span></span>

- Cette solution ne présente pas de singularités dans sa configuration. De plus, les calculs sont simplifiés par le fait qu'on ne réfléchisse que sur le plan cartésien. Ce qui signifie qu'il peut atteindre toutes les positions du plan cartésien.
- Ce système permet un mouvement fluide et précis du stylo.
- Les calculs pour contrôler le robot sont simplifiés par le fait qu'on ne réfléchit que sur le plan cartésien sans faire ce changements de <span style="color: rgb(0, 0, 0);">bases.</span>

<span style="text-decoration: underline; color: rgb(0, 0, 0);">Inconvénients:</span>

- Le système de bielle-manivelle peut être plus lourd qu'un système à roues motorisées, ce qui peut affecter la performance du robot.
- Le système de bielle manivelle pourrait se révéler trop massif pour le robot.
- La solution consommerait beaucoup de matière

#### Idée 3 - Scissors mecanism

<span style="text-decoration: underline; color: rgb(0, 0, 0);">Principe:</span>

Inspirés du "Scissors mechanism", on voudrait attacher deux servomoteurs à la base du mécanisme et un système de commande d'actionneur au point "STYLO". Cette solution présente des avantages telles que :

<span style="text-decoration: underline; color: rgb(0, 0, 0);">Croquis:</span>

[![image (3).png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/image-3.png)*Figure 4: Démonstration du mécanisme de ciseaux*](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/image-3.png)

<span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;">Avantages:</span></span>

- Le mécanisme "Scissors" permet d'avoir un espace d'écriture plus grand que les systèmes à roues motorisées ou à bielle-manivelle. Cela est dû à la tendance du mécanisme à s'étendre.
- De plus, ce mécanisme est particulièrement adapté à la création de cercles. La rotation des bras permet de dessiner des cercles de différentes tailles avec précision.
- En outre, le mécanisme "Scissors" permet de dessiner des lignes droites très précises dans le sens du mouvement du stylo.

<span style="text-decoration: underline; color: rgb(0, 0, 0);">Inconvénients:</span>

- Malheureusement, cette solution présente également un inconvénient. Les mouvements étant plutôt révolutionnaires, créer des lignes droites verticales du stylo semble limité et dans certains cas extrêmes impossible.

#### Idée 4 - Point d'intersection

<span style="text-decoration: underline; color: rgb(0, 0, 0);">Principe:</span>

Le robot sera doté d'un mécanisme de ciseaux alimenté par deux servomoteurs positionnés aux coins de la base d'écriture. Chacun entraînera la rotation d'une poutre, permettant des mouvements de glissement dans les deux directions du vecteur r de rotation,. Le point d'intersection des deux poutres (créant ainsi une liaison glissière complexe) serait équipé du stylo, assurant une couverture totale de la feuille grâce à cette configuration ingénieuse.

<span style="text-decoration: underline; color: rgb(0, 0, 0);">Croquis:</span>

[![File_000.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/file-000.png)*Figure 5: Une conception de l'idée de point d'intersection*](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/file-000.png)

<span style="text-decoration: underline; color: rgb(0, 0, 0);">Inconvénients:</span>

- L'effort tangent au mouvement du stylo généré par une poutre sur l'autre serait extrêmement important, dépassant probablement les limites de faisabilité. La nécessité d'un glissement ultra-lisse, sans aucun frottement, et d'une précision extrême dans les mouvements représente un défi technique considérable.

#### Idée 5 - Robot type SCARA

<span style="text-decoration: underline; color: rgb(0, 0, 0);">Principe:</span>

On a pensé de faire un robot qui a deux axes de rotation verticales et une axe de rotation horizontale. En fait, il y aura deux rotations autour de deux axes Z (Z1 et Z2) verticales et une troisième rotation autour de Z3 qui est perpendiculaire au axe (Z2).

<span style="text-decoration: underline;">Croquis:</span>

[![image (2).png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/image-2.png)*Figure 6: croquis du robot avec 2 dégrées de liberté*](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/image-2.png)

<span style="text-decoration: underline;">Avantages:</span>

- C'est un modèle connu du groupe, la partie mathématique est donc plus simple à réaliser
- Il y a beaucoup de manières de retirer de la matière avec une modélisation intelligente.

<span style="text-decoration: underline;">Inconvénients:</span>

- Poids excessive sur l'endroit du moteur 2, quelque chose qui pourrait impacter la précision de designs. Idéalement, on voudrait trouver une solution qui permettra de déplacer ce moteur sur le corps de la base principale du robot (où se trouve le moteur 1) en utilisant les outils qu'on a à notre disposition.

#### Idée 6 - Robot parallélépipède

<span style="text-decoration: underline;">Principe:</span>

Inspiré par le mécanisme du robot type SCARA, on avait une réflexion: "Pourquoi on ne déplace pas le moteur de la 2éme rotation (moteur2), sur le même axe de rotation qui celui du moteur 1. Le résultat du mouvement sera la même tout en ayant déplacé la majorité du poids sur le corps principale du robot.

<span style="text-decoration: underline;">Croquis:</span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/Km2image.png)Figure 7: Croquis du robot parallélépipède](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/Km2image.png)

<span style="text-decoration: underline;">Avantages:</span>

- Moins de poids sur les articulations mobiles du robot =&gt; meilleur précision par rapport l'idée d'avant.

<span style="text-decoration: underline;">Inconvénients:</span>

- Selon la manière d'expression du modèle géométrique direct, le calcul du modèle géométrique inverse pourrait être compliqué.
- La modélisation des quelques pièces unique pour la réalisation de ce type du robot pourrait augmenter le temps de fabrication et l'utilisation de matière.

#### Solution retenue

Ayant effectué une évaluation approfondie des différentes alternatives, notre équipe a choisi de privilégier le développement d'un robot type parallélépipède pour la prochaine étape du projet. Cette décision est basée sur plusieurs points clés :

1. Robot de roues  
    
    - Pour s'assurer de la validité de la trajectoire, il faudrait l’équiper de capteurs odométrique. Nous ne disposons pas de ce matériel
    - L'utilisation des servomoteurs empêcherait de faire rouler le robot indéfiniment. Cela ne serait pas un problème avec l'exercice 1. L'exercice 2 pourrait se révéler impossible à faire (Prenons par exemple un cas hyperbolique et fantaisiste: La forme à dessiner au joystick est une réplique de la Joconde. Le robot ne pourrait jamais faire ceci)
2. Robot XY  
    
    - Le système de bielle manivelle pourrait se révéler trop massif pour le robot.
    - La solution consommerait beaucoup de matière
3. Robot "scissors"  
    
    - Selon la mécanique de la pièce, la création des lignes droites perpendiculaires du stylo n'est pas toujours possible à cause des mouvements révolutionnaires du mécanisme
    - Les déplacement sont limités à des trajectoires bien précises, ce qui rend le contrôle au joystick frustrant.
4. Robot intersection  
    
    - Il s'agit d'une idée très complète. Cependant, lorsque l'effecteur se trouve à l'extrémité des deux axes de guidage, il faut exercer une force massive pour l'en sortir et le faire revenir près des moteurs.  
        Nous pourrions contourner ce problème en faisant en sorte que les axes soient bien plus grand que la zone de travail. Mais: 
        - Cela impliquerait un ajout de matière, et donc de masse
        - Cela n'empêcherait pas un utilisateur au joystick de bloquer le robot
5. Robot type SCARA 
    - Il s'agit de notre idée de départ de base, mais à la découverte de l'idée numéro 6 qui nous permettra de déplacer les deux moteur sur le corps de la base du robot, on a décidé de développer le robot type parallélépipède.

### **Étape 2: Conception détaillée**

#### Modèle géométrique

<p class="callout info">**Nota bene** On avait déjà commencé l'analyse du modèle cinématique du robot de l'idée numéro 5 (type SCARA). Ci-dessous vous allez trouver l'option également de visualiser et voir le calcul qui était effectué pour ce robot, ainsi que pour le robot type parallélépipède (idée numéro 6).  
Les équations trouvées dans le modèle parallélépipède étant impossible à résoudre, on se base d'abord sur celles du SCARA tout en adaptant ces-dernières aux spécificités de notre modèle  
</p>

<details id="bkmrk-robot-type-scara-cin"><summary>Robot type SCARA</summary>

### Cinématique

#### Schéma Cinématique + Tableau DH

<table border="1" id="bkmrk-solid-%CE%B8i%2B1-di%2B1-ai-%CE%B1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 20.0247%;"></col><col style="width: 20.0247%;"></col><col style="width: 20.0247%;"></col><col style="width: 20.0247%;"></col><col style="width: 20.0247%;"></col></colgroup><tbody><tr><td data-sheets-value="{"1":2,"2":"Solid"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">**Solid**</td><td data-sheets-value="{"1":2,"2":"θi+1"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">**ai**</td><td data-sheets-value="{"1":2,"2":"di+1"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">**αi**</td><td data-sheets-value="{"1":2,"2":"ai"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">**di+1**</td><td data-sheets-value="{"1":2,"2":"αi"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">**θi+1**</td></tr><tr><td class="align-right" data-sheets-value="{"1":3,"3":0}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom; text-align: right;">0</td><td class="align-right" data-sheets-value="{"1":2,"2":"θ1"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">0</td><td class="align-right" data-sheets-value="{"1":2,"2":"h1"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">0</td><td class="align-right" data-sheets-value="{"1":3,"3":0}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom; text-align: right;">h1</td><td class="align-right" data-sheets-value="{"1":3,"3":0}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom; text-align: right;">θ1</td></tr><tr><td class="align-right" data-sheets-value="{"1":3,"3":1}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom; text-align: right;">1</td><td class="align-right" data-sheets-value="{"1":2,"2":"θ2"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">L1</td><td class="align-right" data-sheets-value="{"1":2,"2":"h2"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">-π/2</td><td class="align-right" data-sheets-value="{"1":2,"2":"L1"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">h2</td><td class="align-right" data-sheets-value="{"1":3,"3":0}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom; text-align: right;">θ2-π/2</td></tr><tr><td class="align-right" data-sheets-value="{"1":3,"3":2}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom; text-align: right;">2</td><td class="align-right" data-sheets-value="{"1":2,"2":"-π/2"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">0</td><td class="align-right" data-sheets-value="{"1":3,"3":0}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom; text-align: right;">0</td><td class="align-right" data-sheets-value="{"1":2,"2":"L2"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">L2</td><td class="align-right" data-sheets-value="{"1":2,"2":"-π/2"}" style="overflow: hidden; padding: 2px 3px 2px 3px; vertical-align: bottom;">θ3</td></tr></tbody></table>

[![Schema cinématique du robot type SCARA](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/screenshot-2024-02-27-at-12-10-52-am.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/img-0149.jpeg)Les deux premières liaisons, pour 𝑖∈{1,..,2}, sont des liaisons pivot d’axe (𝑂𝑖,𝑧𝑖). La troisième liaison est une liaison pivot d'axe aussi selon z3.

#### Modèle géométrique directe (complet)

Calculant T<sub>0-&gt;1</sub>, T<sub>1-&gt;2</sub>, T<sub>2-&gt;effector</sub>, ainsi que T<sub>0-&gt;effector</sub>.

[![equations-scara-1.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/iNGequations-scara-1.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/equations-scara-1.png)

[![Equations scara-2.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/equations-scara-2.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/equations-scara-2.png)

Les résultas sont disponibles en PDF sur: [Matrices de transformation homogene.pdf](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/571)

#### Modèle géométrique directe (simplifié)

On peut aussi se concentrer uniquement sur les deux premières rotations car ce sont elles qui donneront la position finale du stylo. Après un moment donné pour écrire ou non, on peut configurer cela en programmation. De cette façon, nous pouvons simplifier le calcul comme ci-dessous :

[![SCARA Simplified Robot-1.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/scara-simplified-robot-1.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scara-simplified-robot-1.png)

[![SCARA Simplified Robot-2.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/scara-simplified-robot-2.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scara-simplified-robot-2.jpg)

Les résultats sont disponibles en PDF sur: [SCARA Simplified Robot.pdf](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/578)

#### Modèle géométrique inverse

Ainsi selon le modèle géométrique directe et le la trigonométrie du systéme:

[![Screenshot 2024-03-02 at 9.47.31 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-02-at-9-47-31-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-02-at-9-47-31-pm.png)

[![Screenshot 2024-03-02 at 9.47.18 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-02-at-9-47-18-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-02-at-9-47-18-pm.png)

</details><details id="bkmrk-robot-type-parall%C3%A9l%C3%A9"><summary>Robot type parallélépipède</summary>

#### Modèle géométrique directe

Ci-dessous, vous trouverez l'approche mathématique du robot type parallélépipède pour sa modèle géométrique directe.

[![Parallelipede-1.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/parallelipede-1.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/parallelipede-1.png)

[![Parallelipede-2.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/parallelipede-2.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/parallelipede-2.png)

Les résultats sont disponibles en PDF sur: [Parallélépipède Robot.pdf](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/572)

</details><details id="bkmrk-sp%C3%A9cifications-de-no"><summary>Spécifications de notre modéle</summary>

Avant trouver l'angle θ2 final, il faut procéder au choix de notre sens du plan, qui dépend de la configuration du robot et de l'angle θ1. Le calcul suivant nous permet d'obtenir la formule final de l'angle θ2:

[![Image-1.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-04/scaled-1680-/image-1.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-04/image-1.png)

</details>
#### Schéma électronique

Sur notre schéma électronique il y a un bouton qui permet de changer entre mode manuelle et mode automatique. De plus, il y a deux LED qui indiquent sur quel mode on est un moment donné. Par exemple si on est en mode manuelle, la LED bleue est allumée, sinon la LED verte est allumée. En outre, vous pouvez aussi trouver la connexion du joystick analogique dont on a besoin pour la réalisation de l'exercice 2. Il faut noter que le joystick à un fonctionnement de bouton intégré. On peut utiliser cette fonctionnalité pour contrôler plein de différentes choses, par exemple:

- Le stylo écrit ou pas.
- On fait un dessin avec le joystick qu'on visualise sur l'écran de l'ordinateur et on tape le bouton pour confirmer le dessin afin qu'il est créé par le robot.

[![LineaScript.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/CFNlineascript.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/CFNlineascript.png)

[Figure 8: Schéma électronique V1.5.0](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/CFNlineascript.png)

Une version optimisée pour plus de clarté et incluant les fonctions carré et joystick processing sera publiée prochainement

#### Modélisation

Notre objectif principal était de modéliser le robot selon un design à la fois compact et rigide. Un autre aspect important était de minimiser la quantité de matière utilisée et de réduire au maximum le temps de fabrication. Un modèle assemblé sur SolidWorks est disponible ci-dessous.

[![displayRobot.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/displayrobot.gif)Figure 9: Démonstration du mécanisme du robot LineaScribe](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/displayrobot.gif)


##### Sous-assemblages

1. Bâti support
2. Articulations parallèles
3. Pivot joint
4. Pivot motor
5. Axe d'effecteur
6. Effecteur

##### Bâti support

C'est le corps principal du robot. Son objectif principal est de maintenir les deux moteurs sur le même axe de rotation. Il doit être capable de supporter les forces exercées par les moteurs vers les articulations parallèles ainsi que le retour des forces de frottement.

[![Screenshot 2024-03-09 at 8.15.57 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-09-at-8-15-57-pm.png)Figure 10: Bâti support du robot avec les moteur assemblés](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-09-at-8-15-57-pm.png)

Le bâti est entièrement créé en utilisant la découpe laser. Concernant la conception de la pièce, il faut noter que le plan du moteur du haut (moteur 1) est conceptualisé de manière à ne pas permettre le détachement des pièces tout en acceptant un stress excessif par les articulations principales du robot.

##### Articulations parallèles (billettes)

Elles sont également entièrement conceptualisées pour la découpe laser (3 couches différentes de 3 mm). Elles sont montées sur les pièces "pivot joint" et "pivot motor" en utilisant des roulements 7201 BEGAP. Elles sont:

<table border="1" id="bkmrk-billette-principale-" style="border-collapse: collapse; width: 100%; height: 59.5938px;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Billette Principale**</td><td style="height: 29.7969px;">**Billette Secondaire**</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">[![Screenshot 2024-03-10 at 7.41.27 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-10-at-7-41-27-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-10-at-7-41-27-pm.png)</td><td style="height: 29.7969px;">[![Screenshot 2024-03-10 at 7.42.18 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-10-at-7-42-18-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-10-at-7-42-18-pm.png)</td></tr></tbody></table>

##### Pivot joint

Son rôle et la précision d'application sont essentiels pour le bon fonctionnement du robot. Il nous permet d'obtenir la distance correcte en parallélisme, comme indiqué dans le design ci-dessous. Il est entièrement créé en utilisant la découpe laser (2 couches de 3 mm).

[![Screenshot 2024-03-09 at 8.06.04 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/8vMscreenshot-2024-03-09-at-8-06-04-pm.png)Figure 11: Focalisation sur la pièce "pivot joint"](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/8vMscreenshot-2024-03-09-at-8-06-04-pm.png)

##### Pivot motor

C'est la seule pièce qui est modélisée pour l'impression 3D. Son rôle est le même que celui de la pièce "pivot joint". Elle est directement montée sur le moteur du bas (moteur 2). Pour renforcer la partie de la pièce qui recevra les forces de frottement du stylo, un triangle de renfort a été ajouté, comme vous pouvez le voir ci-dessous.

[![Screenshot 2024-03-09 at 8.12.07 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-09-at-8-12-07-pm.png)Figure 12: Triangle de renfort de "pivot motor"](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-09-at-8-12-07-pm.png)

<p class="callout info">L'axe centrique est un détail et il n'est pas requis pour le fonctionnement correct du mécanisme.</p>

<table border="1" id="bkmrk--13" style="border-collapse: collapse; width: 100%; height: 191.422px;"><colgroup><col style="width: 33.3539%;"></col><col style="width: 33.3539%;"></col><col style="width: 33.3539%;"></col></colgroup><tbody><tr style="height: 191.422px;"><td style="border-style: none; height: 191.422px;">[![Screenshot 2024-03-09 at 8.11.43 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-09-at-8-11-43-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-09-at-8-11-43-pm.png)</td><td style="height: 191.422px; border-style: none;">[![Screenshot 2024-03-09 at 8.12.13 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-09-at-8-12-13-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-09-at-8-12-13-pm.png)</td><td style="height: 191.422px; border-style: none;">[![Screenshot 2024-03-09 at 8.12.22 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-09-at-8-12-22-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-09-at-8-12-22-pm.png)</td></tr></tbody></table>

#####  Axe d'effecteur (billette Emax)

Il s'agit de l'axe qui supporte l'outil de l'effecteur. Il est guidé par les axes parallèles et mis en position (MIP) par la pièce "pivot joint". Le moteur est mis en position grâce à "Pignon Servo Emax". C'est la plateforme sur laquelle on fixe le moteur Emax comme on peut observer ci-dessous :

  
  
[![Screenshot 2024-03-10 at 7.50.44 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-10-at-7-50-44-pm.png)Figure 13: Billette Emax en assemblage avec le moteur 3 (Emax)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-10-at-7-50-44-pm.png)

[![Screenshot 2024-03-10 at 8.59.03 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-10-at-8-59-03-pm.png)Figure 14: Modèle d'un pignon servo Emax](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-10-at-8-59-03-pm.png)

##### Effecteur

L'outil de l'effecteur est l'élément terminal du robot qui entre en contact direct avec la surface d'écriture. Son rôle principal est de tracer des lignes en utilisant un stylo. Voici la deuxième pièce en impression 3D :

[![Screenshot 2024-03-10 at 9.00.51 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-10-at-9-00-51-pm.png)Figure 15: La pièce qui va soutenir l'outil (le stylo dans notre cas)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/screenshot-2024-03-10-at-9-00-51-pm.png)

##### Solidworks

Tous les fichiers et les fichiers d'assemblage sont disponibles sur: [LineaScribe Robot.zip](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/620). Voici l'organisation des fichiers :

- **Architecture :** il s'agit d'un fichier squelette des différentes configurations. Si vous changez les dimensions des pièces présentes dans ce squelette, elles sont mises à jour dans tous les assemblages.
- **Assemblage bras &gt; Pièce Liaison Billette Principale - Billette Emax :** C'est notre "pivot joint"
- **Assemblage bras &gt; ActionneurServo :** C'est notre "motor joint"
- **Assemblage bras &gt; Billette \* :** ils sont les différents billettes du robot
- **Assemblage bras &gt; Pignon servo max :** c'est pour la mise en position du moteur Emax commet on peut voir à la figure
- **Assemblage bras &gt; Liaison axe :** il s'agit de l'assemblage complet du mécanisme qui va se visser sur les actionneurs.
- **Assemblage &gt; Assemblage1 :** il s'agit de l'assemblage total du robot.
- **Assemblage bras &gt;** **Effecteur :** C'est notre "effecteur"

##### Fichiers SVG &amp; STL

1. [batis.svg](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/609) (MDF 6mm)
2. [pivot joint.svg](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/610) (MDF 3mm)
3. [bilette1.svg](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/611) - articulation parallèle 1 - billette principale (MDF 3mm)
4. [bilette2.svg](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/612) - articulation parallèle 2 - billette secondaire (MDF 3mm)
5. [pivot motor.STL](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/613) (3D Maker PLA 30% infill - no support)
6. [bilette3 et pignon EMAX.svg](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/638) (MDF 3mm)
7. [Effecteur.STL](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/662) (PLA 1.75mm)

#### Modèle géométrique inverse: vérification

D'après le calcul des robots de type parallélépipède et SCARA, nous avons développé un script sur MATLAB permettant de vérifier le calcul des coordonnées du plan cartésien x, y en fonction des angles θ1 et θ2.

Notre analyse a permis de conclure que :

- Dans le cadre de la limitation de l'espace d'écriture de la plateforme, il existe parfois plusieurs solutions possibles pour atteindre une position spécifique. Il ne s'agit pas de singularités, mais plutôt de libertés de rotation autour des axes des moteurs. Cependant, le robot ne peut pas se placer à certains endroits en raison de la modélisation (support du moteur 1).
- Il est donc nécessaire de trouver une procédure permettant de choisir la solution du système qui est acceptable.

Voici le fichier MATLAB: [MGI\_matlab.m](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/615)

Pour utiliser le fichier il suffit d'appeler la fonction MGI\_matlab, et passer comme arguments les coordonnées x, y et L1 et L2 les longueurs des articulations du robot. On a ci-dessous le résultat lorsqu'on exécute la fonction pour obtenir les 4 sommets d'un carré (5cm) et qu'on entre les angles renvoyés dans notre esquisse du bras.

[![Demo.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/demo.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/demo.png)

#### Pre-requis

Lors du montage du robot, les moteurs doivent être calibrés. Nous vous conseillons de mettre les moteurs en position 0 degré (servo 1) et 90 degrés (servo 2). Ensuite, levez le bras à une position de 90 degrés. Attention, servo1 et servo2 sont les références dans le code disponible ci-dessous.

```c++
void setup()
{
  ...
servo1.write(0);
servo2.write(90);
  ...
}
```

#### Pistes de programmation

##### Organigramme:

<span style="text-decoration: underline;">Programme principal (Setup+Loop)</span>

![Organigramme_Principal.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/organigramme-principal.png)

<span style="text-decoration: underline;">Ligne Droite</span>

[![Straight Line.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/straight-line.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/straight-line.png)

<span style="text-decoration: underline;">Ligne Pointillées</span>

<span style="text-decoration: underline;">[![Dotted Line.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/dotted-line.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/dotted-line.png)</span>

<span style="text-decoration: underline;">Cercle</span>

<span style="text-decoration: underline;">[![Cercle.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/cercle.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/cercle.png)</span>

<span style="text-decoration: underline;">Cercle Pointillés</span>

<span style="text-decoration: underline;">[![Dot Circle.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/dot-circle.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/dot-circle.png)</span>

L'organigramme des fonctions carré et joystick a changé récemment et sera posté plus tard

#### Programmation

##### Application du modèle géométrique inverse pour calculer les angles de contrôle de moteurs

```c++
/* Takes a cartesien position (x,y) and updates the angles teta1 and teta2 that control the two motors (located on the same r) */
void get_angles(double x, double y, float L1, float L2, double* teta1, double* teta2){

  //Distance between the center of the robot and the starting point of the writing area
  x+=dx;
  y+=dy;

  //Geometric inveresed model available under teh section "Robot type SCARA"
  co2 = (x*x+y*y-L1*L1-L2*L2)/(2*L1*L2);
  teta2prec = atan2((-sqrt(1-co2*co2)),co2); //The root decides the orientation according to the configuration

  //Calculating the angle 1
  *teta1 = atan2(y,x) - atan2((L2*sin(teta2prec)),(L1+L2*cos(teta2prec)));

  teta2prec = teta2prec*180/pi; //rad to degrees 
  *teta1 = *teta1*180/pi;
  *teta2 = *teta2*180/pi;

  //teta2 is the final corrected angle according to "Specifications de notre modele" available on the Robot's documentation -> voir wiki 
  *teta2=-abs(teta2prec)+*teta1+180;

  *teta2 = 180-*teta2;
}
```

##### Control du stylo

```c++
/* Controls the tool's position [choose between UP and DOWN] */
void pen_control(int control, int *penstate) //Down, up, swithc state
{
  if (control == DOWN) //write with pen [pen is down]
  {
    servo3.writeMicroseconds(pen_down); 
    *penstate=0;
  }
  if (control == DOWN_) //write with pen [pen is down]
  {
    servo3.writeMicroseconds(pen_down_); 
    *penstate=0;
  }
  else if (control == UP) //disable writing [pen is up]
  {
    *penstate=1;
    servo3.writeMicroseconds(pen_up);
  }
  else if (control == UP_) //disable writing [pen is up]
  {
    *penstate=1;
    servo3.writeMicroseconds(pen_up_);
  }
  else if (control == SWITCH) //disable writing [pen is up]
  {
    switch(*penstate){
      case 0:
        servo3.writeMicroseconds(pen_up);
        *penstate=1;
        break;
      case 1:
        servo3.writeMicroseconds(pen_down);
        *penstate=0;
        break;
    }
  }
  else
  {
    printf("An error occured on controling the pen\n");
  }
}
```

##### Designer une ligne

```c++
/* Draws a straight line in a specific length and to a given angle */
void straight_line(double *x_start, double *y_start, float length, double angle)
{  

  //Note: We divide the distance in multiple subpoints to be acquired. The greater the number, the most precision we can achieve of course with some limitations
  for (double i = 0; i < length*900; i++)
  {
    *x_start = *x_start + cos(angle)/900; //Current position + shift  
    *y_start = *y_start + sin(angle)/900;
    get_angles(*x_start,*y_start,L1,L2,&teta1, &teta2); //calculation of motors' angles
    servo1.write(teta1); //Sending data to the motors
    servo2.write(teta2);  
    delay(1);
  }
}
```

##### Designer une ligne en pointilles

```c++
/* Designs a dotted line in a specific length */
void dotted_line(double *x_start, double *y_start, int length, double angle, float dot_length, float space_length) {
  float i=0;

  //control for the desired length
  while(i < length) {
    
    //get into writing position
    pen_control(DOWN_, &penstate);
    delay(100);
    straight_line(x_start,y_start,dot_length, angle);


    i=i+dot_length; //The length that should write a line
    if(i>=length) break;

    //Pen is on UP_ state
    pen_control(UP_, &penstate);
    delay(100);
    straight_line(x_start,y_start,space_length, angle);
    i = i + space_length; //adding the space that shouldn't write anything on the paper

  }
}
```

##### Designer un cercle

```c++
/* Designing a circle in a specific radius and a specific starting point */
void circle(double x_center, double y_center, double angle_start, double angle, double radius, double *x, double *y, int init, int res)
{

  //Placement in a specific starting point
  if(init==0){
    *x = x_center + (radius * cos(radians(angle_start)));
    *y = y_center + (radius * sin(radians(angle_start)));
    get_angles(*x,*y,L1,L2,&teta1, &teta2);
    servo1.write(teta1); 
    servo2.write(teta2); 
    delay(1000);

    //Get into writing position
    pen_control(DOWN,&penstate);
    delay(500);
  }
  
  //Repetead calculation different points between a starting angle and a final angle
  for (double i = (angle_start*res); i < (angle*res); i++)
  {
    *x = x_center + (radius * cos(radians(i/res))); //Formula of finding the position of a point is based on the tan function decomposed in x and y axis
    *y = y_center + (radius * sin(radians(i/res)));
    get_angles(*x,*y,L1,L2,&teta1, &teta2); //Calculation of angles for the motors
    servo1.write(teta1); //Sending data to the motors
    servo2.write(teta2);
    delay(1);  
  }
}
```

##### Designer un cercle en pointilles 

```c++
/* Designs a dotted circle in a specific radius and a specific starting point */
void dotted_circle(double x_center, double y_center, double angle_space, double angle_dot, double radius, double *x, double *y)
{
  
  *x = x_center + (radius * cos(radians(0)));
  *y = y_center + (radius * sin(radians(0)));
  get_angles(*x,*y,L1,L2,&teta1, &teta2);
  servo1.write(teta1); 
  servo2.write(teta2); 
  delay(1000);

  //It's a recursive loop leading to a 360 degrees circle that calls circle function with a starting and final point
  double i=0.0;
  while(i < 360) {
    
    pen_control(DOWN_, &penstate);
    delay(200);
    circle(x_center, y_center,i, angle_dot+i, radius, x, y, 1, 10);
    delay(200);

    i = i + angle_dot; //update of the current position - required to verify of a circle of 360 degress has been designed

    if(i>=360) break;

    //Between delays we chage writing mode in order to create a dotted effect
    pen_control(UP, &penstate);
    delay(200);
    circle(x_center, y_center,i, (angle_space+i), radius, x, y, 1, 10);
    i = i + angle_space;
    delay(200);

  }
}
```

##### Designer un carre

```c++
/* Designs a square of a given length and in a given angle */
void square(double *x, double *y, int length, int angle)
{

  //Square is composed of four straight lines of a given length and they are vertical between them
 straight_line(x,y,length, radians(angle));
 delay(1000);
 straight_line(x,y,length, radians(angle+90));
 delay(1000);
 straight_line(x,y,length, radians(angle+180));
 delay(1000);
 straight_line(x,y,length, radians(angle+270));
 delay(1000);
}
```

##### Logique du Joystick en mode manuelle

Mode manuelle permet à l'utiliser de contrôler le robot via le Joystick tout en appuyant sur un bouton qui permet de contrôler si le stylo est en mode d'écriture ou non. Cette fonctionnalité existe sur la boucle principale comme un mode de fonctionnement. Pour rentrer dans ce mode, il suffit de presser une seule fois sur le Joystick, de même pour en sortir.

```c++
//Manual control of the robot using joystic
  if (buttonState5 == 0) {
    //Allows a smooth operation when a button is pushed (detect one time the tap)
    while (digitalRead(pinbutton1)==0){}

    digitalWrite(ledPin, HIGH);
    pen_control(UP,&penstate);
    x=0.0;
    y=0.0;
    delay(500);
    get_angles(x,y,L1,L2,&teta1, &teta2);
    servo1.write(teta1); 
    servo2.write(teta2);  
    delay(1000);

    pen_control(DOWN,&penstate);
    delay(500);

    double coef= 0.0003;
    
    while(digitalRead(pinbutton1)==1){
      //If the button is pressed then the effector is swithcing mode. For instance, if it was in writing position it goes UP and if it was UP then it gets into writing position.
      if (digitalRead(pinbutton5) == 1) {
        while (digitalRead(pinbutton5)==1){}
        pen_control(SWITCH,&penstate);
      }

      // Read analog values
      xtemp = int(512.0 - analogRead(pinx));
      ytemp = int(512.0 - analogRead(piny));

      // Apply dead zone for small movements
      if (abs(xtemp) <= 100) xtemp = 0;
      if (abs(ytemp) <= 100) ytemp = 0;

      // Update x and y coordinates
      x += xtemp * coef;
      y += ytemp * coef;

      Serial.print(x);
      Serial.print("\t");
      Serial.println(y);

      get_angles(x,y,L1,L2,&teta1, &teta2); //calculate motors' angles
      servo1.write(teta1);  //send data to the motors
      servo2.write(teta2);
      delay(10);

    }
    while (digitalRead(pinbutton1)==0){}
    digitalWrite(ledPin, LOW);
    pen_control(UP,&penstate);
    delay(500);
  }
```

##### Logique du Joystick en Processing  


Les données sont traitées à l'aide d'un programme de traitement qui permet de pré-visualiser ce que vous souhaitez concevoir puis les données sont envoyées via le port série à la carte afin de contrôler les moteurs.

```c++
/* Logig for joystick manipulation */
void Joystick(double *x, double *y)
{
  int dimx=0;
  int t=0;

  //Sending mode on, sending joystick data to processing
  int out=0;
  int out1=0;
  while(out==0){

    //We check if we read the values ​​of the Joystick where the user decided to stop (On verifie si on Lit les valeurs du Joystick ou l'utilisateur a decide d'arrete)
    if (Serial.available() > 0) {
      String response = Serial.readStringUntil('\n'); 
      response.trim();  // Remove any leading or trailing whitespace
      
      if (response.equals("Done")) {
        //digitalWrite(13,LOW);
        break;  // Stop sending data to processing
      }
    }
    //Reading Joysticks values
    xtemp = analogRead(pinx);
    ytemp = analogRead(piny);

    buttonval1 = 1-digitalRead(pinbutton1);
    buttonval2 = digitalRead(pinbutton2);

    //Sending Joysticks values to processing
    Serial.print(xtemp);
    Serial.print("\t");
    Serial.print(ytemp);
    Serial.print("\t");
    Serial.print(buttonval1); 
    Serial.print("\t");
    Serial.println(buttonval2);
    
    //This loop prevents the overlap of several values ​​given that the frequency of sending data from the Arduino is higher than the frequency of receiving processing (Cette boucle empeche le chevauchement de plusieur valeur etant donne que la frequence d';envoi de donne de l'arduino est plus eleve que la frequence de recoit de processing)
    //We therefore wait until the data is read by processing before sending another data (On attend donc jusqu'a ce que la donnee est bien lu par processing avant d'envoyer une autre donne)
    out1=0;
    while (out1 == 0) {
      //digitalWrite(13,LOW);
      if (Serial.available() > 0) {
        String response = Serial.readStringUntil('\n'); 
        response.trim();  // Remove any leading or trailing whitespace
        
        if (response.equals("Done")) {
          out=1; //get out of the loop  //checck  andif we really get out of the loop check if it doesnt give another line of data after i wanted to start
          out1=1;
        }
        else if (response.equals("Received")) out1=1;  // Exit while loop
      }
    }
  }
  
  //tab data
  double*** tab;

  //Receive tab dimensions
  while (true) {
    if (Serial.available() > 0) {
      String receivedString = Serial.readStringUntil('\n'); // Read until newline character
      //decode data
      int rowIndex = 0;
      int colIndex = 0;
      int depthIndex = 0;

      String buffer = ""; // Buffer to hold the float string
      
      //premier element
      int i = 0;
      while(1){
        char c = receivedString.charAt(i);
        if (c == ',') {
          dimx = buffer.toInt();
          buffer = ""; // Reset buffer
        }
        else if (c == ';') {
          t = buffer.toInt();
          buffer = ""; // Reset buffer
          i++;
          break;
        }
        else {
          buffer += c; // Add character to buffer
        }
        i++;
      }

      if(t==1) digitalWrite(ledPin, LOW);

      tab = (double ***)malloc(t * sizeof(double **));
      for (int l = 0; l < t; l++) {
        tab[l] = malloc(2 * sizeof(double*)); //tableau de donne
        for (int j = 0; j < 2; j++) {
          tab[l][j] = malloc(dimx * sizeof(double));
        }
      }

      for (i; i < receivedString.length(); i++) {
        char c = receivedString.charAt(i);
        if (c == ',') {
          tab[depthIndex][rowIndex][colIndex] = buffer.toDouble();
          colIndex++;
          buffer = ""; // Reset buffer
        } else if (c == ';') {
          tab[depthIndex][rowIndex][colIndex] = buffer.toDouble();
          rowIndex++;
          colIndex = 0;
          buffer = ""; // Reset buffer
        } else if (c == '|') {
        tab[depthIndex][rowIndex][colIndex] = buffer.toDouble();
        depthIndex++;
        rowIndex = 0;
        colIndex = 0;
        buffer = ""; // Reset buffer
        } else {
          buffer += c; // Add character to buffer
        }
      }
      // Capture the last float value
      tab[depthIndex][rowIndex][colIndex] = buffer.toDouble();

      break;
    }

  }



  for (int j = 0; j < t; j++) {

      get_angles(tab[j][0][0],tab[j][1][0],L1,L2,&teta1, &teta2); //Position initiale
      servo1.write(teta1); 
      servo2.write(teta2);
      delay(1000);

      pen_control(DOWN,&penstate);
      delay(500);

    for (int i = 0; i < dimx; i++) {

      double xt = tab[j][0][i];
      double yt = tab[j][1][i];

      if(xt!=-1 && yt!=-1){
        get_angles(xt,yt,L1,L2,&teta1, &teta2);
        servo1.write(teta1); 
        servo2.write(teta2);
        delay(100);
      }
    }
    pen_control(UP,&penstate);
    delay(500);
  }

}
```

##### Initialisation  


```c++
void setup() {
  servo1.attach(9);  // attaches the servo on pin 9 to the servo object
  servo2.attach(10); 
  servo3.attach(11);
  
  //declarations of different button as input ports to detect actions
  pinMode(pinx,INPUT);
  pinMode(piny,INPUT);
  pinMode(pinbutton1,INPUT_PULLUP);
  pinMode(pinbutton2,INPUT);
  pinMode(pinbutton3,INPUT);
  pinMode(pinbutton4,INPUT);
  pinMode(pinbutton5,INPUT);

  //declaration of LED pin as an output port to send commands (control if it's switched on or off)
  pinMode(ledPin,OUTPUT);

  //Get into a default starting point
  get_angles(0.0,0.0,L1,L2,&teta1, &teta2);
  servo1.write(teta1); 
  servo2.write(teta2);  

  delay(1000);
  //straight_line(&x,&y,15, radians(45));

  //Put the effector in UP position and stand by
  pen_control(UP,&penstate);

  //Start serial communication
  Serial.begin(9600);
}
```

##### Boucle principale

```c++
void loop() {  
  /* Simple implementations of existing functions for testing purposes.
  We have only one active every time. All the others has to be commented in order to observe the robot's mouvements */
  int buttonState1 = digitalRead(pinbutton5); // Read button 1 state
  int buttonState2 = digitalRead(pinbutton2); // Read button 2 state
  int buttonState3 = digitalRead(pinbutton3); // Read button 3 state
  int buttonState4 = digitalRead(pinbutton4); // Read button 4 state
  int buttonState5 = digitalRead(pinbutton1); // Joystick
  int buttonState6 = digitalRead(pinbutton6); // Read button 5 state
  int buttonState7 = digitalRead(pinbutton7); // Read button 5 state
  //square(&x,&y,5, 0);

  if (buttonState1 == 1) {
    while (digitalRead(pinbutton5)==1){}
    // Button 1 pressed, perform straight line

    //start
    digitalWrite(ledPin, HIGH);

    pen_control(UP,&penstate);
    x=0.0;
    y=0.0;
    delay(500);
    get_angles(x,y,L1,L2,&teta1, &teta2);
    servo1.write(teta1); 
    servo2.write(teta2);  
    delay(1000);

    pen_control(DOWN,&penstate);
    delay(500);

    //function
    straight_line(&x,&y,4, radians(90));

    //end
    pen_control(UP,&penstate);
    delay(500);
    digitalWrite(ledPin, LOW);
  } 

  if (buttonState2 == 1) {
    while (digitalRead(pinbutton2)==1){}
    // Button 1 pressed, perform straight line

    //start
    digitalWrite(ledPin, HIGH);

    pen_control(UP,&penstate);
    x=0.0;
    y=0.0;
    delay(500);
    get_angles(x,y,L1,L2,&teta1, &teta2);
    servo1.write(teta1); 
    servo2.write(teta2);  
    delay(1000);

    pen_control(DOWN,&penstate);
    delay(500);

    //function
    dotted_line(&x, &y, 4, radians(90), 0.5, 0.5);
    //straight_line(&x,&y,5, radians(90));

    //end
    pen_control(UP,&penstate);
    delay(500);
    digitalWrite(ledPin, LOW);
  } 

  //circle
  if (buttonState3 == 1) {
    while (digitalRead(pinbutton3)==1){}
    // Button 1 pressed, perform straight line

    //start
    digitalWrite(ledPin, HIGH);

    pen_control(UP,&penstate);
    x=1.0;
    y=1.0;

    //function
    circle(1, 1, 0, 360, 2.5, &x, &y, 0, 12);
    //straight_line(&x,&y,5, radians(90));

    //end
    pen_control(UP,&penstate);
    delay(500);
    digitalWrite(ledPin, LOW);
  } 

  //dotted circle
  if (buttonState4 == 1) {
    while (digitalRead(pinbutton4)==1){}
    // Button 1 pressed, perform straight line

    //start
    digitalWrite(ledPin, HIGH);

    pen_control(UP,&penstate);
    x=1.0;
    y=1.0;

    //function
    dotted_circle(1, 1, 10, 10, 2.5, &x, &y);

    //end
    pen_control(UP,&penstate);
    delay(500);
    digitalWrite(ledPin, LOW);
  } 

  //Joystick in processing
  if (buttonState6 == 1) {
    while (digitalRead(pinbutton6)==1){}
    digitalWrite(ledPin, HIGH);
    Joystick(&x,&y); 
    digitalWrite(ledPin, LOW);
  }

  if (buttonState7 == 1) {
    while (digitalRead(pinbutton7)==1){}
    // Button 1 pressed, perform straight line

    //start
    digitalWrite(ledPin, HIGH);

    pen_control(UP,&penstate);
    x=1.0;
    y=1.0;

    //function
    square(&x,&y,4, 0);
    //straight_line(&x,&y,5, radians(90));

    //end
    pen_control(UP,&penstate);
    delay(500);
    digitalWrite(ledPin, LOW);
  } 

  //Manual control of the robot using joystic
  if (buttonState5 == 0) {
    //Allows a smooth operation when a button is pushed (detect one time the tap)
    while (digitalRead(pinbutton1)==0){}

    digitalWrite(ledPin, HIGH);
    pen_control(UP,&penstate);
    x=0.0;
    y=0.0;
    delay(500);
    get_angles(x,y,L1,L2,&teta1, &teta2);
    servo1.write(teta1); 
    servo2.write(teta2);  
    delay(1000);

    pen_control(DOWN,&penstate);
    delay(500);

    double coef= 0.0003;
    
    while(digitalRead(pinbutton1)==1){
      //If the button is pressed then the effector is swithcing mode. For instance, if it was in writing position it goes UP and if it was UP then it gets into writing position.
      if (digitalRead(pinbutton5) == 1) {
        while (digitalRead(pinbutton5)==1){}
        pen_control(SWITCH,&penstate);
      }

      // Read analog values
      xtemp = int(512.0 - analogRead(pinx));
      ytemp = int(512.0 - analogRead(piny));

      // Apply dead zone for small movements
      if (abs(xtemp) <= 100) xtemp = 0;
      if (abs(ytemp) <= 100) ytemp = 0;

      // Update x and y coordinates
      x += xtemp * coef;
      y += ytemp * coef;

      Serial.print(x);
      Serial.print("\t");
      Serial.println(y);

      get_angles(x,y,L1,L2,&teta1, &teta2); //calculate motors' angles
      servo1.write(teta1);  //send data to the motors
      servo2.write(teta2);
      delay(10);

    }
    while (digitalRead(pinbutton1)==0){}
    digitalWrite(ledPin, LOW);
    pen_control(UP,&penstate);
    delay(500);
  }

}
```

### **Améliorations possibles** 

Il existe quelques améliorations qu'on pourrait effecteur pour que le prototype du robot LineaScribe soit plus performant et efficace.

1. Ajouter des pieds anti-friction sur la base du robot.
2. Conceptualiser un plan de design avec possibilité d'être monté sur le châssis du robot.
3. Utilisez beaucoup moins de boutons pour basculer entre les différents modes de fonctionnement via la détection du nombre d'appuis sur un bouton par exemple.
4. Pour obtenir un cercle parfait, il faudrait modifier l’angle d’écriture du stylo sur la moitié du cercle. De cette façon, il n’y aura pas de dimensionnement. Ceci s'explique par le fait que les coordonnées calculées concernent le point de montage de notre effecteur (outil) et non jusqu'au point de contact avec la surface du papier.

### **Journal de bord / Calendrier**  


*Avancée du projet à chaque étape, difficultés rencontrées, modifications et adaptations*

##### 14/02/2024

Discussion autour du Projet Robotique ROB3 - différents idées, décision, planning.

##### 16/02/2024

Création du schéma cinématique, de la table DH. Etablissement d'un premier modèle géométrique

##### 19/02/2024

Finalisation du dossier de conception préliminaire. Mise a jour du modèle géométrique et de la table DH, création du modèle géométrique inverse

##### 22/02/2024

Début de modélisation des pièces du robot

##### 24/02/2024

Recherche sur les méthodes de géométrie inverse du robot

##### 02/03/2024

Finalisation de la partie modèle géométrique directe et inverse

##### 08/03/2024

Impression des pièces du bâti support et on a lancé l'impression 3D du "pivot motor"

##### 24/04/2024

Programmation des fonctions lignes et carré (pour tests) et connexion au joystick.

##### 25/04/2024

Début de la fonction joystick. Assemblage et câblage définitif du robot. Programmation du cercle pour l'exercice 1

##### 22/05/2024

Finalisation du joystick. Programmation de la fonction pointillés

##### 23/05/2024

Finalisations du Joystick en mode Processing. Tests finaux et présentation.

# Projet ROB de Arnold, Evinia, Mathis

### Informations

- Membres de l'équipe 
    - <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Arnold AÏM</span></span>
    - <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Evinia ANASTASOPOULOU</span></span>
    - <span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Mathis RENARD</span></span></span></span>

- Adresses mail : 
    - - <arnold.aim@etu.sorbonne-universite.fr>
        - [evanthia\_virginia.anastasopoulou@etu.sorbonne-universite.fr](mailto:evanthia_virginia.anastasopoulou@etu.sorbonne-universite.fr)
        - <mathis.renard@etu.sorbonne-universite.fr>

- Cursus 
    - - 1ere année cycle ingénieur en Robotique à Polytech Sorbonne

- Date de début - Date de fin 
    - 14/02/2024 - 23/05/2024

### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Présentation du Projet</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">L'objectif de ce projet est de réaliser un petit mécanisme robotisé permettant de dessiner des formes géométriques simples définies à l'avance ou à l'aide d'un joystick manipulé par l'utilisateur en temps réel en utilisant des mécanismes prédéfinis. </span></span>  
<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Pour la réalisation de ce projet nous respectons le cahier des charges défini par nos enseignants Guillaume MOREL et Lilian Carillet.</span></span>


### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Cahier des charges et fonctions à réaliser</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Le mais général est de faire un robot capable de dessiner avec un crayon. L</span></span>e robot est fixé sur un support carré horizontal comportant une petite zone de dessin. <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Un objectif important est d'utiliser un minimum en quantité de matière pour la réalisation du projet. La p<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">rogrammation est fait en C et en utilisant la chaîne de développement Arduino IDE. </span></span></span></span>Il y a 2 exercices que le mécanisme doit effectuer et un exercice/fonction optionnel.

#### Exercices à réaliser


***<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Exercice 1</span></span>***

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Avoir un code prédéfini pour que le mécanisme puisse tracer, en appuyant sur un seul button, les dessins suivants : </span></span>

1. <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Une ligne de 5 cm de long,</span></span>
2. <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Une ligne pointillée de 5cm de long,</span></span>
3. <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Un cercle de 2,5 cm de rayon,</span></span>
4. <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Un cercle pointillé de 2,5 cm de rayon.</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Le tracé de chacune des figures doit être réalisé en </span></span><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">10 secondes</span></span><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"> +/- 0,2 secondes.</span></span>

***<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Exercice 2</span></span>***

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Dessiner une figure imposée dans un carré de 5cm par 5cm, tout en pilotant le mécanisme par un joystick.</span></span><span style="vertical-align: inherit;"><span style="vertical-align: inherit;"> Dans cet exercice il faut prendre en compte que la figure peut être discontinue, auquel cas l'effecteur du robot devrait être capable de se relever du support horizontal auquel il écrit.</span></span>

***<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Exercice 3 (optionnel) </span></span>***

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Ajouter une fonction supplémentaire qui sera capable de modifier la vitesse de déplacement du robot via l'interface.</span></span>

#### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Matériel à notre disposition</span></span>

- 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.

<div aria-label="Page Section Options" class="pointer-container" id="bkmrk-%C2%A0-4" refs="pointer@pointer" tabindex="-1"><div class="pointer flex-container-row items-center justify-space-between p-s anim is-page-editable"><div class="flex-container-row items-center gap-s" refs="pointer@mode-section"><button class="text-button icon px-xs" title="Permalink mode, Press to show include tag"><svg class="svg-icon" data-icon="link" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button><div class="input-group"> <button class="button outline icon" title="Copy Link" type="button"><svg class="svg-icon" data-icon="copy" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button></div></div><svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></div></div>

### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Réflexion</span></span>

##### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Idée Robot sur roues </span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Idée complexe à mettre en place, pas de roues à disposition donc fastidieux à construire plus compliquée de faire un circuit électrique propre à l'intérieur.</span></span>

[![brainstorming 1.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/Nm2brainstorm-1.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/Nm2brainstorm-1.jpg)

**Figure 1 : Idée de robot sur roues**


##### Idée Robot Type Imprimante 3D

Transformation de pivot en translation trop compliqué à faire car création de chaines en 3D trop dur à modéliser/ imprimer en 3D. Aussi, cela entraine une utilisation non pertinente des servomoteurs.

[![brainstorming 2.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/brainstorm-2.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/brainstorm-2.jpg)

**Figure 2 : Idée Robot Type Imprimante 3D**


##### Idée Robot Type FANUC

Nous avons ici une bonne utilisation des servo-moteurs, facile à modéliser/imprimer/découper par les outils en service.

[![1.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/1.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/1.jpg)

**<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Figure 3 : </span></span>Idée Robot Type FANUC**

##### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Décision finale </span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Toutes les idées semblaient être plus ou moins possible à concevoir. </span></span><span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Nous avons décidé, après argumentations, discussions auprès du professeur, de retenir cette dernière solution car elle va produire des résultats plus précises.</span></span>

**<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Lien de notre diagramme de Gantt:</span></span>**

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">[https://docs.google.com/spreadsheets/d/1OmamPJELbAN48oTG1ooIXSrjbCt2yrp1qGpkE4TFLDg/edit?usp=sharing](https://docs.google.com/spreadsheets/d/1OmamPJELbAN48oTG1ooIXSrjbCt2yrp1qGpkE4TFLDg/edit?usp=sharing)</span></span>

### <span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Calcul du modèle géométrique inverse</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">Premier idées de calcul de modèle géométrique, inverse, jacobienne… Finalement s'avérant inutile car le calcul d'angle était déjà donné dans le cours.</span></span>

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">[![1.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/6Vm1.jpg) ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/6Vm1.jpg)[![1.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/7yK1.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/7yK1.jpg)</span></span>

[![1.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/zg31.jpg) ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/zg31.jpg)[![1.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/w3E1.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/w3E1.jpg)

[![1.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/tpB1.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/tpB1.jpg)

**Figures 4 à 8 : Calcul du modèle géométrique**

Les formules de calcul finalement retenues sont donc les suivantes :

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/pyIimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/pyIimage.png)

**Figure 9 : Formules représentantes des angles**

Dans notre cas, il n'y a pas de bras violet, ni de bras rouge et vert en dessous. x' et y' deviennent juste x et y. Et theta3, alpha n'apparaissent plus dans le résultat final. Les angles du robot seront calculés dans une partie Matlab.



### Modélisation

<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">[![projet.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/Z5dprojet.gif)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/Z5dprojet.gif)</span></span>**Figure 10 : Mécanisme robotisé**

Notre robot se compose d'un châssis principal qui stabilise notre premier moteur HS422 180°, ainsi que d'un second bâti support plus petit qui supporte le servomoteur EMAX ES08A 180°. Deux palonniers sont utilisés comme bras. Le premier palonnier (le plus long), intègre le second moteur HS422 180°, responsable du mouvement de l'effecteur.

<span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400;">Nous avons décidé de positionner le servomoteur EMAX ES08A 180° à la sortie du premier servomoteur HS422 180° afin de contrôler à la fois les mouvements des bras du robot et leur rotation. Cette configuration et surtout cette rotation, nous permettra d'effectuer des dessins en pointillés en autorisant un mouvement vertical du stylo lorsque nécessaire ([Figure 11](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-22-221026.png)).</span>

[![Screenshot 2024-05-22 221026.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/screenshot-2024-05-22-221026.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-22-221026.png)

**Figure 11 : Rotation des bras**

#### Décomposition des éléments

##### <span style="text-decoration: underline;">*Bâti support*</span>

C'est le corps du robot. Il a été conçu pour maintenir notre premier servomoteur HS422 180° en place et il est capable de supporter le reste du robot. Le servomoteur permet la rotation du bras.

[![Screenshot 2024-05-22 111607.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/screenshot-2024-05-22-111607.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-22-111607.png)

**Figure 12 : Bâti support**



##### <span style="text-decoration: underline;">*Support petit servomoteur et support bras*</span>

Ces deux petit supports qui sont liés entre eux via l'actionneur du servomoteur EMAX ES08A 180° nous permettent :

- d'avoir un support pour le servomoteur EMAX ES08A 180°
- de transmettre la rotation du premier moteur au reste du robot
- d'avoir un support pour le bras du robot qui le relie à l' EMAX ES08A 180° et donc au corps
- de tourner le bras du robot pour contrôler si l'effecteur (crayon) touche ou pas la surface du dessin

Le support du petit servomoteur comporte l'empreinte du palonnier à la face du dessous ([Figure 14](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/ngvscreenshot-2024-05-22-224013.png)) pour bien le relier au premier servo. Nous avons décidé de placer un pont autour du servomoteur pour être sûr de son MAP avec le support. Nous avons aussi placé deux petits "freins" ([Figure 15](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-23-003150.png)) pour que le servomoteur puisse bien maintenir son position. Le palonnier du petit servomoteur est relié avec une vis centrale et deux fils de fer (parce que certains trous du palonnier sont trop petits et ne permettent pas l'insertion d'une vis) au support du bras. Cela fait partie du MAP de cet ensemble.

[![Screenshot 2024-05-22 223942.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/screenshot-2024-05-22-223942.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-22-223942.png)

**Figure 13 : Support petit servomoteur et support bras**

<table border="1" class="align-center" id="bkmrk-figure-13-%3A-support-" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td>[![Ngvscreenshot-2024-05-22-224013.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/ngvscreenshot-2024-05-22-224013.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/ngvscreenshot-2024-05-22-224013.png)  
</td><td>[![Screenshot 2024-05-23 003150.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/screenshot-2024-05-23-003150.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-23-003150.png)</td></tr><tr><td class="align-center">**Figure 14 : Support servomoteur face du dessous**</td><td class="align-center">**Figure 15 : "Freins" (en bleu)**</td></tr></tbody></table>

##### <span style="text-decoration: underline;">*Bras*</span>

Le "main" du robot est composé de deux bras. Le premier (celui de gauche et donc celui qui est plus long, [Figure 16](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-23-002741.png)) comporte le troisième servomoteur (HS422 180°) qui réalise la deuxième rotation de l'effecteur dont on a besoin. Le deuxième bras ([Figure 17](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-23-002809.png)) comporte l'empreinte du palonnier pour qu'il puisse être rélié au servomoteur ainsi qu'un trou pour positionner le crayon.

<table border="1" id="bkmrk-figure-15-%3A-bras-lon" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td>[![Screenshot 2024-05-23 002741.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/screenshot-2024-05-23-002741.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-23-002741.png)</td><td>[![Screenshot 2024-05-23 002809.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/screenshot-2024-05-23-002809.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/screenshot-2024-05-23-002809.png)</td></tr><tr><td class="align-center">**Figure 16 : Bras long**  
</td><td class="align-center">**Figure 17 : Bras en extrémité**</td></tr></tbody></table>



##### Fabrication des pièces

Toutes nos pièces sont fabriquées et prototypées en utilisant la méthode de découpe LASER Troctec Speedy 100. En effet, la précision de la machine permet d'obtenir des pièces précises et simples pour notre robot.


### Conception

Nous avons procédé à l'assemblage du robot en utilisant des vis et des écrous, de la colle à bois et des fils de fer. Cependant, le système initial avait un problème assez inqiétant, en raison d'une surcharge supportée par le petit servomoteur. Pour remédier à ce problème, nous avons réduit la taille du bras en extrémité. Par la suite, afin de faciliter sa manipulation lors du processus de dessin, nous avons fixé le robot sur un support en bois à l'aide de colle.

[![20240522_100001.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/20240522-100001.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/20240522-100001.jpg)

**Figure 18 : Robot monté**

### Schéma éléctronique

Sur notre schéma éléctronique il y a 4 boutons, chacun d'entre eux s'occupant d'un dessin prédéfini et un joystick analogique qui s'occupe du mode manuel, qui est tout le temps activé. Nous branchons les moteurs qui reçoient le signal en PWM representé par les petites vagues à côté de chaque pin (9, 10 et 11) de l'ARDUINO.

[![circuit_elec_propre.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/circuit-elec-propre.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/circuit-elec-propre.png)

**Figure 19 : Montage électronique**

Sur la [Figure 21](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/20240522-100004.jpg), nous pouvons visualiser le cablage qui a été fait en réalité et qui comporte tous les éléments éléctroniques dont nous avons besoin.

[![20240522_100004.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/20240522-100004.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/20240522-100004.jpg)

**Figure 20 : Système électronique**

### Programmation 

#### Organigramme

[![organigramme 2.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/organigramme-2.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/organigramme-2.png)

**Figure 21 : Organigramme du programme**

Pour le code du joystick on est parti d'une base existante qui est celle du code de Nacim et de Mehdy qui nous ont envoyé eux mêmes. Nous avons ensuite modifié ce code pour l'adapter à nos besoins, notamment la partie utilisant le bouton switch du joystick.

#### Tests du code et finalisation

Le premier test du modèle géométrique n'étant pas concluant, nous avons décidé de réaliser plus de tests en amont afin de déterminer les potentiels problèmes rencontrés. En effet, le modèle géométrique utilisé par rapport à la réalité ne convenait pas et après plusieurs tests et retravail sur le bras en extrémité, les angles données par le modèle géométrique étaient corrects.

[![20240523_102807.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/20240523-102807.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/20240523-102807.jpg)

**Figure 22 : Dessins imposés par le cahier des charges (cercle plein et pointillé de diamètre 5cm, ligne pleine et pointillée 5cm)**

Vous pouvez consultez le schéma éléctronique de la [Figure 20](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/circuit-elec-propre.png) ainsi que le programme de l'Arduino sur le lien suivant : [https://wokwi.com/projects/390879808315743233](https://wokwi.com/projects/390879808315743233)

### Conclusion 

Nous avons pu au travers de ce projet une bonne partie de la conception d'un robot 2R simple qui avait pour but de dessiner certaines formes prédéfinies et d'être piloté manuellement. Ce projet nous a permis d'apprendre et de perfectionner chacun.e de connaissances et compétences, pour certain.e.s cela était plus axé sur l'éléctronique et l'informatique quant à d'autres ont préféré perfectionner leur comrehénsion de modélisation et conception d'un mécanisme via SolidWorks (logiciel utilisé).

De plus, ce projet nous a initié à l'utilisation de certaines machines assez évoluées, mises à disposition grâce au FabLab SU, comme la Trotec Speedy100 et 360. Nous avons voulu, dans un souci de sobriété ne pas utiliser les imprimantes 3D qui utilisent plus d'énérgie et de matière dû à leur temps d'impression plus long (plusieurs heures).

Pour finir, ce projet nous a permis de travailler en équipe et d'utiliser les forces de chacun.e et de pallier nos lacunes à travers cette expérience enrichissante aussi bien du point de vue des compétences et de connaissances.

# Projet ROB 3 : Mehdy ABDELKAMEL - Nacim TALAOUBRID

### **Informations**

<table border="1" id="bkmrk-mehdy-abdelkamel-meh" style="border-collapse: collapse; width: 100%; height: 76px;"><colgroup><col style="width: 27.6436%;"></col><col style="width: 56.7633%;"></col><col style="width: 15.5663%;"></col></colgroup><tbody><tr style="height: 29.6px;"><td style="height: 29.6px;">**Mehdy ABDELKAMEL**</td><td style="height: 29.6px;">mehdy.abdelkamel@etu.sorbonne-universite.fr</td><td style="height: 29.6px;">ROB3</td></tr><tr style="height: 46.4px;"><td style="height: 46.4px;">**Nacim TALAOUBRID**</td><td style="height: 46.4px;">nacim.talaoubrid@etu.sorbonne-universite.fr</td><td style="height: 46.4px;">ROB3</td></tr></tbody></table>

*Date de début de Projet :*  **14 Février 2024**

*Date de fin du Projet :*  **23 Mai 2024**

Projet **M.A.J.I.N**, c'est un robot **M**écanisé, **A**rticulé avec un **J**oystick **I**nteractif et **N**ovateur.

**GANTT ci-joint dans *"Attachments"***

#### **Contexte**

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

#### **Objectifs**

L’objectif principal de ce projet est de concevoir et réaliser un système robotique, c’est-à-dire sa partie mécanique, sa motorisation, sa commande et son interface de pilotage. Le cahier des charges fourni précise les fonctions que doit réaliser le système et les contraintes qu’il doit respecter.

Pour les étudiants, l’objectif est au moins autant d’apprendre par la pratique les bases de la gestion d’un projet (c’est-à-dire la façon de s’organiser en équipe pour atteindre un objectif donné avec des moyens donnés) que d’aboutir à un prototype fonctionnel.

##### **Fonctions à réaliser**

 Il doit être capable de réaliser deux exercices :

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

 a. Une ligne de 5cm de long,

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

 c. Un cercle de 2.5cm de rayon,

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

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

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

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

<div _mstaria-label="381381" aria-label="Page Section Options" class="pointer-container" id="bkmrk-%C2%A0" refs="pointer@pointer" tabindex="-1"><div class="pointer flex-container-row items-center justify-space-between p-s anim is-page-editable"><div class="flex-container-row items-center gap-s" refs="pointer@mode-section"><button class="text-button icon px-xs" title="Permalink mode, Press to show include tag"><svg class="svg-icon" data-icon="link" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button><div class="input-group"> <button class="button outline icon" title="Copy Link" type="button"><svg class="svg-icon" data-icon="copy" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button></div></div><svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></div></div>- **Être capable de modifier la vitesse de déplacement du robot via l’interface.**

<p class="callout info">Source : [Le sujet du projet | Wiki FablabSU (sorbonne-universite.fr)](https://wiki.fablab.sorbonne-universite.fr/BookStack/books/projets-due-2023-2024/page/le-sujet-du-projet)</p>

**Afin de concevoir au mieux ce robot, nous allons procéder en plusieurs étapes :**

## <span style="background-color: rgb(53, 152, 219);">**1. CONCEPTION PRÉLIMINAIRE :** </span>

**Pour commencer**, nous devons choisir le **<span style="color: rgb(53, 152, 219);">type de robot</span>** que nous allons faire. Pour cela, nous allons **<span style="color: rgb(230, 126, 35);">établir et analyser</span>** les **<span style="color: rgb(22, 145, 121);">avantages</span>** et **<span style="color: rgb(224, 62, 45);">inconvénients</span>** de chacune de nos idées.

##### **Idée n°1 : robot basé sur le fonctionnement d'une imprimante 3D :** 

Ce robot serait inspiré du système de guidage des imprimante 3D. Nous aurons 2 axes (X et Y), ainsi qu'un bloc à la jonction des 2 axes. Cela permettrait de guider notre stylo facilement.[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/Hwkimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/Hwkimage.png)

<p class="callout success"><span style="color: rgb(45, 194, 107);">***Avantages :*** </span></p>

- pas beaucoup de contrainte sur le plan mécanique ou électronique

<p class="callout danger">***<span style="color: rgb(224, 62, 45);">Inconvénients :</span>***</p>

- demande beaucoup de ressources
- pas très précis
- est encombrant

##### **Idée n°2 : robot écrivain sur une base mobile :**

**On aurait** une petite base mobile doté de quelques roues avec un stylo en dessous du robot.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/mWtimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/mWtimage.png)

<p class="callout success"><span style="color: rgb(45, 194, 107);">***Avantages :***</span></p>

- facile à monter
- compact

<p class="callout danger"><span style="color: rgb(224, 62, 45);">***Inconvénients :***</span></p>

- mauvaise précision (odométrie)
- difficulté à bien se déplacer

##### **Idée n°3 : robot inspiré du modèle du FANUC :**

Ce robot serait un bras mécanique à 2 degrés dé liberté avec un stylo a son extrémité.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/EMgimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/EMgimage.png)

<p class="callout success">***<span style="color: rgb(45, 194, 107);">Avantages : </span>***</p>

- bonne précision
- plutôt compact

<p class="callout danger"><span style="color: rgb(224, 62, 45);">***Inconvénients :***</span></p>

- calcul à faire

##### **Idée n°4 : robot mélangeant les idées de la base mobile et de l'imprimante 3D :**

Ce robot est une amélioration de l'idée de l'imprimante 3D. Nous utilisons ici des "piliers" mobile limitant ainsi les matériaux à utiliser et facilitant la construction.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/Tuwimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/Tuwimage.png)

<p class="callout success"><span style="color: rgb(45, 194, 107);">***Avantages :***</span></p>

- faciliter de production (2 fois le même module/tour)
- plutôt compact

<p class="callout danger"><span style="color: rgb(224, 62, 45);">***Inconvénients :*** </span></p>

- pas du tout précis (il manque le guidage linéaire)

##### **Idée n°5 : robot à 2 bras opposés :**

Ce robot est inspiré du bras mécanique, le FANUC. Ici nous séparons les 2 servomoteurs présent dans l'unique bras en 2 bras mécanique. Cela permettra de faciliter les calculs de mécanique des bras mais également de faciliter la construction du robot.

[![Robot.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/KRZrobot.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/KRZrobot.jpg)

<p class="callout success"><span style="color: rgb(45, 194, 107);">***Avantages :***</span></p>

- Bonne précision
- Original
- Léger en ressource

<p class="callout danger"><span style="color: rgb(224, 62, 45);">***Inconvénients :*** </span></p>

- Calcul à faire

## <span style="background-color: rgb(53, 152, 219);">**2. CONCEPTION DÉTAILLÉ :**</span>

 Après avoir choisi le modèle de notre robot, nous devons maintenant le concevoir en profondeur en plusieurs autres étapes. Pour cela, nous avons cherché plusieurs inspirations sur internet. La vidéo qui a retenu notre attention est la vidéo youtube de

#####  1. Conception des différentes pièces : 

Dans un premier temps notre objectif premier était de modéliser sur le logiciel Solidworks un premier modèle de notre robot qui se rapproche au plus du croquis initial.

[![Capture d'écran 2024-03-10 153053.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-10-153053.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-10-153053.png)

Nous avons donc réaliser ce premier modèle. Cependant nous faisons face a plusieurs problème. Premièrement le bâti dans ce modèle-ci ne peut être réaliser qu'avec une imprimante 3d, la pièce aurait donc pris plusieurs heures pour être réaliser et donc nous ne n'aurons pas pu effectuer des changements de dernières minutes sur les dimensions. De plus, la liaison entre la patte du moteur et le moteur n'est pas une liaison d'encastrement.

 ***Conception finale***

***Le bâti*** ***:*** Nous avons donc pris la décision de séparer les différentes parties du bâti afin de pourvoir réaliser la moitié de celui-ci avec la découpeuse laser. Il se compose de 3 parties : la première, qui sera réaliser avec l'imprimante 3d, (partie rouge) permettra de tenir la feuille d'écriture (partie bleu) et permettre la descente de la feuille grâce a une liaison pivot, la parti avec la feuille d'écriture sera aussi réaliser avec une imprimante 3d. Enfin nous avons la partie qui tiendra les moteurs, elles seront réaliser avec la découpeuse laser et elles seront attaché au la partie rouge grâce a un système vis/écrous.

[![Capture d'écran 2024-03-10 150749.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-10-150749.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-10-150749.png)[![Capture d'écran 2024-03-10 150920.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-10-150920.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-10-150920.png)

***Les pattes :*** Nous avons décider de rajouter sur la patte du moteur une nouvelle pièce de même dimension avec uniquement un trou en son centre qui permettra de maintenir en position la pièce et le moteur. De plus pour avoir une liaisons pivot d'axe verticale entre les différents pattes nous utiliserons juste un seul roulement bille, un axe et une rondelle entre les deux pattes.

[![Capture d'écran 2024-03-10 151139.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-10-151139.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-10-151139.png)[![Capture d'écran 2024-03-10 151212.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-10-151212.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-10-151212.png)

Voici l'assemblage finale de notre robot (et en pièce jointe le fichier Solidworks correspondant)

[![Capture d'écran 2024-03-10 150346.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-10-150346.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-10-150346.png)[![Capture d'écran 2024-03-10 150434.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-10-150434.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-10-150434.png)

A présent nos seuls craintes reste les incertitudes sur les dimensions des différentes machines mais aussi la stabilité du robot (possibilité de basculer vers l'avant).

Après plusieurs réflexions et conseils de nos professeurs nous avons pris la décision de modifier le bâti rouge. Les objectif sont de minimiser le nombre d’éléments en impression 3D et de solidifier le support du petit moteur.

Nous obtenons donc la modélisation sur SolidWorks suivante : et le robot réel suivant :

[![Capture d'écran 2024-05-22 215435.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-215435.png) ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-22-215435.png)[![IMG_7056.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/img-7056.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/img-7056.jpg)

#####  2. Schéma électrique : 

Pour concevoir le schéma électrique, nous devons savoir ce que notre robot doit faire, et le matériel a notre disposition.

<p class="callout info">**Matériels à dispositions :** </p>

- *3 Servomoteurs*
- *Boutons*
- *Arduino UNO*
- *Joystick*
- *Câbles*
- *(LEDs)*

<p class="callout info">**Fonctionnalités du robots :** </p>

- *Dessiner un cercle de rayon 2.5cm*
- *Dessiner une ligne de 5cm*
- *Dessiner ces figures en pointillés*
- *Dessiner avec un joystick*
- *Dessiner avec un joystick en pointillés*

D'après ces différentes informations, nous avons le schéma électrique suivant :

[![Capture d'écran 2024-03-10 210430.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-10-210430.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-10-210430.png)

- ***Bouton Jaune :*** Trace un cercle
- ***Bouton Bleu :*** Trace une ligne
- ***Bouton Gris :*** Active le mode pointillé
- ***Bouton Rouge :*** Active le mode Joystick

#####  3. Calculs mécanique : 

Pour les calculs mécaniques, nous reprenons les calculs vu en cours. Ils seront bien simplifié car ici nous voulons seulement un seul angle au lieu de 2. De plus, nous avons seulement à reprendre le calcul fait pour le premier servomoteur et déplacé le repère d'environ 14cm (distance qui sépare les 2 servomoteur) et ajouter 180° à l'angle obtenu.

Nous sommes ensuite rendu compte que nous avions besoin d'un autre modèle mécanique car celui-ci était incomplet. Nous nous sommes donc inspirées du modèle géométrique inverse du groupe F.O.D. [![modelgeom.PNG](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/modelgeom.PNG)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/modelgeom.PNG)

Néanmoins sur notre robot nous avons rajoute une petite bielle en plus afin d'accueillir le stylo, nous avons donc légèrement modifié les calculs afin d'obtenir le modèle géométrique finale !

[![IMG_7037.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/img-7037.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/img-7037.jpg)

#####  4. Organigramme du code :

Voici l'organigramme de notre programme, il n'est pas totalement conforme à ce que nous avons fait, c'était seulement pour avoir un ordre d'idée de la structure de notre programme.

##### [![Sans-titre-2024-03-10-1559.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/sans-titre-2024-03-10-1559.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/sans-titre-2024-03-10-1559.png)

#####  5. Code détaillé :

Le principe de notre code, est de placer des points sur notre repère qui seront visité par notre stylo.

Pour cela, la première chose à faire avant de programmer les différentes fonctions de notre code, est de programmer notre calcul mécanique. Une fois, cette fonction achevé, nous pourrons faire appel à elle afin d'obtenir les coordonnées des points de passages.

Nous avons donc cette fonction représentant notre calcul mécanique sur Arduino :

[![Calcul modèle GEOM arduino.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/calcul-modele-geom-arduino.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/calcul-modele-geom-arduino.png)

Maintenant, nous devons décider du nombre de points de passage pour notre robot et demander a notre fonction de les faire décrire une figure particulière, soit un cercle, soit une ligne.

Nous avons donc les 2 fonctions suivantes :

[![Arduino Ligne.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/arduino-ligne.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/arduino-ligne.png)[![Arduino Cercle.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/arduino-cercle.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/arduino-cercle.png)

Pour dessiner ces formes en pointillé, nous avons juste à combiner le mouvement de notre plateforme, possible grâce à notre petit servomoteur en définissant 2 niveau (Haut et Bas), et pour accéder à cette fonction, nous ajoutons une condition de plus.

Nous obtenons ces fonctions :

[![Arduino Ligne pointillé.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/arduino-ligne-pointille.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/arduino-ligne-pointille.png)[![Arduino Cercle poitnillé 1.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/arduino-cercle-poitnille-1.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/arduino-cercle-poitnille-1.png)[![Arduino Cercle poitnillé 2.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/arduino-cercle-poitnille-2.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/arduino-cercle-poitnille-2.png)

Enfin pour la fonction de déplacement avec le joystick, il suffit de récupérer les valeurs du joystick selon x et y, de les convertir afin d'obtenir une plage de valeur entre -0.1 et 0.1. Ensuite nous initialisons deux variables posx et posy a 0 et nous incrémentons ces deux variables par les valeurs que nous donne le joystick. Enfin à chaque tour de boucle nous demandons au stylo d'aller aux coordonnées posx et posy.

Voici la fonction :

[![Arduino Joystick.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/arduino-joystick.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/arduino-joystick.png)

Enfin, toutes les déclarations d'initialiser des différentes variables sont détaillé dans le code se trouvant dans "Attachments"

#####  6. Tests :

Durant nos tests, nous avons remarqué que nous avons fait plusieurs erreurs de conceptions.

1. <p class="callout info">Tout d'abord, nous avons fait un trou de 3mm de diamètre sur notre pièce imprimé en 3D, mais a cause de l'incertitude d'impression, notre axe de 3mm ne convenait à notre pièce, nous avons donc utilisé la force pour le placé.</p>
2. <p class="callout info"> Ensuite, nous avions un problème de stabilité dans notre robot. En effet, le robot ne tenait pas droit. Nous avons donc imaginé des support afin de stabiliser au mieux notre robot.</p>
3. <p class="callout info">Puis, nous avions un problème lié a notre servomoteur, que l'on peut contrôler qu'à l'aide de vitesse. Ce servomoteur permet de contrôler l'état de la plateforme de notre papier, ce qui était très contraignant car nous n'arrivions pas à bien le régler ce qui compromettait la qualité de nos dessins.</p>
4. <p class="callout info">Enfin, nous avions eu un problème de fonctions. Les dessins imaginé n'était absolument pas conforme à la réalité. Ce qui s'explique par le très petit nombre de point de passage que nous avions mis au départ. Il suffisait d'augmenter le nombre de point de passage afin d'améliorer la qualité de nos dessins.</p>

<p class="callout success">Finalement, nous avons réussi a nous adapter au mieux à toutes les contraintes et voici les vidéos de nos dessins : </p>

(TOUTES LES VIDEOS !!)

### **Journal de bord**

*Avancée du projet à chaque étape, difficultés rencontrées, modifications et adaptations (facultatif pour les petits projets)*

##### ***14/02/2024***

> Ce premier jour a été une journée de "brainstorming", nous avons rassemblé toutes nos idées et nous les avons confrontés afin de choisir le robot le plus adapté aux contrainte donnée.
> 
> La décision finale est de construire sur<span style="text-decoration: underline;"> **le robot à 2 bras opposé**</span>. Il répond aux mieux a ce qui est demandé.

##### ***21/02/2024***

> Ce deuxième jour était tourné vers la réflexion de notre conception détaillé. Nous nous sommes également familiarisé avec certaines machines du FABLAB. Nous avons fait quelques tests sur découpeuse laser afin de voir si le robot était possible sur le plan mécanique.
> 
> Enfin, les différentes tâches ont été répartis, Nacim a commencé la modélisation sur Solid Works et Mehdy a commencé le schéma électrique.

##### ***05/03/2024***

> Ce troisième jour a permis de vérifier nos travaux préparés en amont. Nous avons vérifié avec Mr Carillet le modèle 3D de notre robot. Nous avons également testé un début de code avec notre schéma électrique.
> 
> Finalement, nous avons juste continué d'améliorer et peaufiner nos travaux.

##### 18/04/2022

Maecenas interdum turpis sit amet rutrum elementum. Aenean eget accumsan ligula. Phasellus et scelerisque lectus. Cras vel venenatis nulla. Integer tristique non diam et molestie. Pellentesque condimentum enim arcu, in commodo nunc commodo vel. Integer vitae neque facilisis, mattis elit sit amet, gravida turpis. Maecenas lectus mauris, fringilla ut lectus eu, condimentum finibus tortor 🤩🤩🤩D D

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

### <span style="color: rgb(0, 0, 0);"><span style="text-decoration: underline;">**I ) Préaumbule :**</span> </span>

#### <span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;">1) </span><span style="color: rgb(0, 0, 0); text-decoration: underline;">Membres de l'équipe</span> :</span>

<table border="1" id="bkmrk-identit%C3%A9-contacte-fo" style="border-collapse: collapse; width: 100%; height: 152px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><tbody><tr style="height: 29.6px;"><td style="height: 29.6px;">Identité</td><td style="height: 29.6px;">Contacte</td><td style="height: 29.6px;">Formation</td></tr><tr style="height: 46.4px;"><td style="height: 46.4px;">Mohamed El Oualid BOUDEMAGH</td><td style="height: 46.4px;">mohamed\_el\_oualid.boudemagh@etu.sorbonne-universite.fr</td><td style="height: 46.4px;">Polytech-Sorbonne ( ROB3 )</td></tr><tr style="height: 29.6px;"><td style="height: 29.6px;">Fatah MSAID</td><td style="height: 29.6px;">fatah.msaid@etu.sorbonne-universite.fr</td><td style="height: 29.6px;">Polytech-Sorbonne ( ROB3 )</td></tr><tr style="height: 46.4px;"><td style="height: 46.4px;">Dounia BAKALEM</td><td style="height: 46.4px;">dounia.bakalem@etu.sorbonne-universite.fr</td><td style="height: 46.4px;">Polytech-Sorbonne ( ROB3 )</td></tr></tbody></table>

#### <span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;">Période du projet</span></span><span style="color: rgb(0, 0, 0);"> : 14/02/2024 au 23/05/2024</span>

#### <span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;">2) </span><span style="color: rgb(0, 0, 0); text-decoration: underline;">Indroduction, cadre et objectifs de la réalisation</span> :</span>

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

[![Capture d'écran 2025-02-23 210137.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/scaled-1680-/capture-decran-2025-02-23-210137.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/capture-decran-2025-02-23-210137.png)

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 mécanique, le système de commande, la motorisation, l'interface de pilotage et les différents codes informatiques pilotants.

Ainsi, nous mettrons en pratique les connaissance acquises en programmation (langage C), en modélisation (SolidWorks), en calculs cinématiques (Modèles 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 découpage laser.[assemblage\_FOD\_final.zip](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/766)

Enfin, nous nous engageons à prendre soin du 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.

#### <span style="text-decoration: underline;">3 ) Diagramme de Gantt (au 21/02/2024) et distribustion des rôles :</span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/H0Timage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/H0Timage.png)

### <span style="text-decoration: underline;">**II ) Cahier des charges :**</span>

<span style="color: rgb(0, 0, 0);">**( [https://wiki.fablab.sorbonne-universite.fr/BookStack/books/projets-due-2023-2024/page/le-sujet-du-projet](https://wiki.fablab.sorbonne-universite.fr/BookStack/books/projets-due-2023-2024/page/le-sujet-du-projet) )**</span>

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

##### 2.1 Fonctions à réaliser

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

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

a. Une ligne de 5cm de long,

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

c. Un cercle de 2.5cm de rayon,

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

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

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

[![Capture d'écran 2025-02-23 211054.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/scaled-1680-/capture-decran-2025-02-23-211054.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/capture-decran-2025-02-23-211054.png)

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

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

##### 2.2 Fonctions contraintes

<span style="background-color: rgb(255, 255, 255);">Les contraintes imposées sont :</span>

- <span style="background-color: rgb(255, 255, 255);">Respect des règles d’utilisation du FABLAB de Sorbonne Université au sein duquel vous travaillerez, en particulier la [charte des FabLab du MIT](https://fab.cba.mit.edu/about/charter/). Cela implique que vous travaillerez sur le [WIKI du FABLAB](https://wiki.fablab.sorbonne-universite.fr/BookStack/) pour documenter votre projet. Il y a une bonne documentation [ici](https://wiki.fablab.sorbonne-universite.fr/BookStack/books/utilisation-du-wiki-IRi) pour savoir comment utiliser le WIKI.</span>
- <span style="background-color: rgb(255, 255, 255);">Utilisation de composants (moteurs, contrôleurs, boutons, éléments de guidage, alimentation stabilisée, boutons, etc.) parmi un ensemble imposé. Une liste de composants utilisables est disponible au paragraphe 4. </span>
- <span style="background-color: rgb(255, 255, 255);">Fabrication des pièces grâce à :</span>
    - <span style="background-color: rgb(255, 255, 255);">Machine à découpe LASER.</span>
    - <span style="background-color: rgb(255, 255, 255);">Imprimantes RAISE 3D PRO2.</span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/scaled-1680-/mrYimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/mrYimage.png)[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/scaled-1680-/83Aimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/83Aimage.png)

<span style="background-color: rgb(255, 255, 255);">Ces [machines](https://wiki.fablab.sorbonne-universite.fr/BookStack/books/machines) du FABLAB de sont pas toutes accessibles tout le temps ni en même temps. C’est une contrainte qu’il vous faut intégrer dans la gestion de votre projet (par exemple, privilégier la découpe LASER qui est très rapide, lorsque c’est possible).</span>

<span style="background-color: rgb(255, 255, 255);">Un objectif est de minimiser la quantité de matière utilisée pour réaliser le projet.</span>

- <span style="background-color: rgb(255, 255, 255);">Programmation en C utilisant la chaîne de développement Arduino IDE</span>

<span style="background-color: rgb(255, 255, 255);">CE NE SONT PAS LES FONCTIONS CONTRAINTE DE L'OBJET, MAIS VOS CONTRAINTES DE REALISATION DU PROJET</span>

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

<div aria-label="Page Section Options" class="pointer-container" id="bkmrk-%C2%A0-2" refs="pointer@pointer" tabindex="-1"><div class="pointer flex-container-row items-center justify-space-between p-s anim is-page-editable"><div class="flex-container-row items-center gap-s" refs="pointer@mode-section"><button class="text-button icon px-xs" title="Permalink mode, Press to show include tag"><svg class="svg-icon" data-icon="link" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button><div class="input-group"> <button class="button outline icon" title="Copy Link" type="button"><svg class="svg-icon" data-icon="copy" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button></div></div><svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></div></div>- 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.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/scaled-1680-/RSuimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/RSuimage.png)[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/scaled-1680-/x9Uimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/x9Uimage.png)

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/scaled-1680-/HHTimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/HHTimage.png)[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/scaled-1680-/1x6image.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/1x6image.png)[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/scaled-1680-/MlPimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/MlPimage.png)

### <span style="text-decoration: underline;">**III ) Solutions Proposées :**</span> 

#### 1 ) <span style="text-decoration: underline;">Solution 1 : La voiture qui dessine</span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/scaled-1680-/rGpimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2025-02/rGpimage.png)

- L'une des idées explorées était de concevoir un robot sous forme de voiture capable d'écrire avec un stylo. Cependant, après avoir examiné les servomoteurs disponibles et les contraintes du projet, nous avons constaté que ces servomoteurs ne conviendraient pas pour tourner les roues de manière efficace en raison de leur limitation de rotation maximale à 180 degrés. De plus, les restrictions imposées, comme l'interdiction d'utiliser des outils externes tels qu'un hacheur pour la motorisation, et l'incapacité d'incorporer un système Bluetooth pour contrôler la voiture avec un joystick, ont été des obstacles significatifs.
    
    En raison de ces contraintes techniques et de conception, nous avons été contraints d'abandonner l'idée de la voiture robotique. Nous nous sommes plutôt concentrés sur des alternatives qui seraient réalisables dans le cadre des ressources et des contraintes du projet, tout en restant conformes au cahier des charges initial.

#### 2 ) <span style="text-decoration: underline;">Solution 2 : Robot à deux rails :</span>

<table border="1" id="bkmrk-%C2%A0-%C2%A0" style="border-collapse: collapse; width: 106.914%;"><colgroup><col style="width: 54.4983%;"></col><col style="width: 45.6006%;"></col></colgroup><tbody><tr><td>[![schema_sol_2.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/SPcschema-sol-2.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/SPcschema-sol-2.jpg)

</td><td>[![photo_sol_2.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/photo-sol-2.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/photo-sol-2.jpg)

</td></tr></tbody></table>

 <span style="text-decoration: underline;">Schéma non-contractuel du robot à deux rails</span> <span style="text-decoration: underline;">Source de la photo :</span> [(19) Technical Tushar - YouTube](https://www.youtube.com/@TechnicalTushar09)

- **Fonctionnement :** Le servomoteur 1 est collé sur le pignon 1 qui est lui même fixé sur la plateforme fixe. Ce premir système entraine la translation de la crémallière 1 selon x. Au bout de cette dernière, la plateforme mobile est fixé, cette plateforme se deplace donc selon x suivant la crémallière 1. Par ailleurs, le même mécanisme (servomoteur 2, pignon 2, crémallière 2) 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° dans un sens et 90° dans l'autre, les pignons sont dimensionnés en conséquence (ici r = 2.5cm) permettant au stylo d'agir sur une surface de 7cm \* 7cm.
- <span style="color: rgb(45, 194, 107);">**Avantages : -** </span><span style="color: rgb(45, 194, 107);">**Simplicité de conception, de réalisation et de calcul.** </span><span style="color: rgb(45, 194, 107);">**- Rigidité et solidité du système.** </span><span style="color: rgb(45, 194, 107);">**- Précision permettant au stylo de dessiner toute forme.** </span><span style="color: rgb(45, 194, 107);">**- Absence de singularité dans le cadre des 7 \* 7 cm. - Consommation assez raisonnable de ressources**</span>
- <span style="color: rgb(224, 62, 45);">**Limites :** </span>
- <span style="color: rgb(224, 62, 45);">**Une lubrification peut être envisageable.** </span>
- <span style="color: rgb(224, 62, 45);">**Frottements.** </span>
- <span style="color: rgb(224, 62, 45);">**La plateforme tenant le stylo peut se pencher vers le sol à cause de son poids.**</span>

#### 3 ) <span style="text-decoration: underline;">Solution 3: Robot à 3 rails :</span>

<table border="1" id="bkmrk-nous-avons-pris-cett" style="border-collapse: collapse; width: 100%; height: 194.938px;"><colgroup><col style="width: 53.7561%;"></col><col style="width: 46.3428%;"></col></colgroup><tbody><tr style="height: 194.938px;"><td style="height: 194.938px;">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/nBUimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/nBUimage.png)

</td><td style="height: 194.938px;">Nous avons pris cette photo afin d'illustrer nos explications dans **"Fonctionnement".**

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

</td></tr></tbody></table>

<span style="text-decoration: underline;">Source de la photo :</span> [Laser Engraver TT-5.5S Laser Wood Engraver - Two Trees (twotrees3d.com)](https://twotrees3d.com/product/laser-engraver/)

- **Fonctionnement :**Le fonctionnement demeure fondamentalement inchangé par rapport à la solution précédente. Simplement, ici le mécanisme servomoteur-pignon-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 réalise le guidage permettant au rail 3 de toujours être perpendiculaire aux rails 1 et 2. De plus, un autre mecanisme servomoteur-pignon-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.
- <span style="color: rgb(45, 194, 107);">**Avantages :** </span><span style="color: rgb(45, 194, 107);">**- Absence de singularité dans le cadre des 7 \* 7 cm.** </span><span style="color: rgb(45, 194, 107);">**- Calculs théoriques assez simples.**</span>
- <span style="color: rgb(186, 55, 42); background-color: rgb(255, 255, 255);">**Limites :** </span>
- <span style="color: rgb(186, 55, 42); background-color: rgb(255, 255, 255);">**Le guidage n'est pas optimal ce qui peut engendrer la diagonalisation du rail 3.** </span>
- <span style="color: rgb(186, 55, 42); background-color: rgb(255, 255, 255);">**Trop de ressources utilisées.** </span>
- <span style="color: rgb(186, 55, 42); background-color: rgb(255, 255, 255);">**Conception, réalisation et montage assez fastidieux .** </span>
- <span style="color: rgb(186, 55, 42); background-color: rgb(255, 255, 255);">**Nécéssité absolue de lubrification (notamment le roulement).**</span>

#### 4 ) <span style="text-decoration: underline;">Solution 4 : (Solution retenue ) : Robot a articulations :</span>

Pour la 3ème idée nous avons 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é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 réaliser cela , nous reliant un repaire pour chaque bout de bras et à l'aide des matrices de DH on pourra donner directement les coordonnées articulaires pour la taches voulue et le microcontroleur calculera les angles nécessaire a faire pour le réaliser , cette solution est plus précise par rapport au 2 autres car on pourra atteindre n'importe quel point à l'aide de calcules

##### Problèmes : 

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

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

#### ![IMG_0332.JPG](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/img-0332.JPG)  


  **Exemple de la solution**

[![Capture d’écran 2024-02-21 à 10.51.33 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/capture-decran-2024-02-21-a-10-51-33-pm.png)](https://youtu.be/s5AP7tbfueg?si=4rI_xpIn0oyd4i4m)

 <span style="color: rgb(0, 0, 0);"> [source de la photo : https://youtu.be/s5AP7tbfueg](https://youtu.be/s5AP7tbfueg?si=4rI_xpIn0oyd4i4m)</span>


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

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

### <span style="text-decoration: underline;">**IV ). conception détaillée :**</span>

#### <span style="text-decoration: underline;">1)Schéma électrique et modèle géométrique : </span>

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

Les coordonnées articulaires sont nécéssaire pour qu'on puissent attendre les positions voulue par notre robot , et pour les trouver on a du calculer le modèle géométrique inverse de notre robot et nous avons ainsi trouver les équations qui relie les coordonnées articulaires aux paramètres de notre robot et aux 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ées voulue en fonction des angles articulaires
- Regrouper tout en équations
- Enfin après avoir dérivés les équations et les avoir résolue nous obtenons les relations suivantes pour chaque coordonnées articulaire :

[![Capture d’écran 2024-02-29 à 11.56.30 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/capture-decran-2024-02-29-a-11-56-30-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/capture-decran-2024-02-29-a-11-56-30-pm.png)

[![Capture d’écran 2024-03-10 à 12.33.40 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-10-a-12-33-40-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-10-a-12-33-40-pm.png)![Capture d’écran 2024-03-10 à 12.32.02 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-10-a-12-32-02-pm.png)

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

<p class="callout info">Remarque : ici l3=0</p>

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

#####   
![Capture d’écran 2024-02-29 à 11.37.18 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-02/scaled-1680-/capture-decran-2024-02-29-a-11-37-18-pm.png)

##### <span style="color: rgb(0, 0, 0);">Code de la fonction utilisée pour le calcule du modèle géométrique inverse </span>

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

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

<p class="callout success">À l'aide de Monsieur Carillet, nous avons élaboré un nouveau modèle, plus complet. Ce nouveau modèle prend en compte les mouvements des deux bras en parallèle. Le schéma ci-dessous illustre ce modèle géométrique amélioré, qui calcule les angles nécessaires pour les deux bras en fonction des coordonnées (x, y) et des longueurs des bras (l1, l2, l3, l4 et l5).</p>

<div class="w-full pt-2 md:pt-0 dark:border-white/20 md:border-transparent md:dark:border-transparent md:w-[calc(100%-.5rem)]" id="bkmrk-sch%C3%A9ma-du-mod%C3%A8le-uti"><form class="stretch mx-2 flex flex-row gap-3 last:mb-2 md:mx-4 md:last:mb-6 lg:mx-auto lg:max-w-2xl xl:max-w-3xl"><div class="relative flex h-full flex-1 flex-col"><div class="flex w-full items-center">![Capture d’écran 2024-03-10 à 12.37.00 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-10-a-12-37-00-pm.png)</div><div class="flex w-full items-center align-center">  
</div><div class="flex w-full items-center align-center">  
</div><div class="flex w-full items-center align-center">Schéma du modèle utilisée </div><div class="flex w-full items-center align-left">  
</div><div class="flex w-full items-center align-left">**Détails du calcule** : </div></div><div class="relative flex h-full flex-1 flex-col">  
</div>[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/VZUimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/VZUimage.png)

</form></div>
#### <span style="color: rgb(0, 0, 0);">2 ) . Schéma électrique :</span>

##### [![Capture d’écran 2024-05-19 à 10.39.02 AM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/sTWcapture-decran-2024-05-19-a-10-39-02-am.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/sTWcapture-decran-2024-05-19-a-10-39-02-am.png)

##### <span style="color: rgb(0, 0, 0);">![Grand Krunk_page-0001.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/grand-krunk-page-0001.jpg)</span><span style="color: rgb(0, 0, 0);">Schéma électrique du FOD</span><span style="color: rgb(0, 0, 0);"> </span>

<table border="1" id="bkmrk-composant%C2%A0-pin-bouto" style="border-collapse: collapse; width: 104.321%; height: 327.766px;"><colgroup><col style="width: 49.6847%;"></col><col style="width: 50.3153%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Composant </td><td style="height: 29.7969px;">Pin</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Bouton gris</td><td style="height: 29.7969px;">2</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Bouton bleu</td><td style="height: 29.7969px;">3</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Bouton noir</td><td class="align-left" style="height: 29.7969px;">4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Bouton vert </td><td style="height: 29.7969px;">7</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Joystick </td><td style="height: 29.7969px;">X: A0 , Y : A1 , SW : 10</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Servo droit </td><td style="height: 29.7969px;">5</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Servo gauche </td><td style="height: 29.7969px;">6</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Servo haut </td><td style="height: 29.7969px;">9</td></tr><tr><td>SDA</td><td>A4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">SCL</td><td style="height: 29.7969px;">A5</td></tr></tbody></table>


#### <span style="color: rgb(0, 0, 0);">3 ). Code : </span>

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

Descriptif du code :

<div class="w-full pt-2 md:pt-0 dark:border-white/20 md:border-transparent md:dark:border-transparent md:w-[calc(100%-.5rem)]" id="bkmrk-nous-avons-utilis%C3%A9-l"><form class="stretch mx-2 flex flex-row gap-3 last:mb-2 md:mx-4 md:last:mb-6 lg:mx-auto lg:max-w-2xl xl:max-w-3xl"><div class="relative flex h-full flex-1 flex-col"><div class="flex w-full items-center" style="text-align: justify;">Nous avons utilisé l'état de nos quatre boutons-poussoirs comme entrée pour pouvoir utiliser leurs états comme conditions pour nos différents modes de fonctionnement. En attribuant des actions spécifiques à chaque combinaison d'états des boutons, nous avons pu créer un système polyvalent capable de basculer entre différents modes de fonctionnement en fonction des préférences de l'utilisateur. Par exemple, un appui sur un seul bouton pourrait activer ou désactiver un mode spécifique. Cette approche nous a permis d'ajouter une dimension interactive à notre projet, offrant ainsi une expérience utilisateur plus riche et plus adaptée à divers scénarios d'utilisation.</div><div class="flex w-full items-center">  
</div><div class="flex w-full items-center">[![Capture d’écran 2024-03-09 à 11.46.17 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-09-a-11-46-17-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-09-a-11-46-17-pm.png)</div></div><div class="flex w-full items-center">  
</div><div class="flex w-full items-center">  
</div><div class="flex w-full items-center"><table border="1" class="align-center" style="border-collapse: collapse; width: 84.0741%; height: 260px; border-width: 1px;"><tbody><tr><td>Bouton</td><td>mode </td></tr><tr><td>Bleu</td><td>Tracer une ligne continue </td></tr><tr><td>Vert</td><td>Tracer une ligne en discontinue </td></tr><tr><td>Rouge </td><td>Tracer un cercle en continue </td></tr><tr><td>Gris </td><td>Tracer un cercle discontinue </td></tr><tr><td>Rien </td><td>contrôle avec joystick</td></tr></tbody></table>

</div>##### Tableau récapitulatif des modes disponible 

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

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

 [![Capture d’écran 2024-03-10 à 10.30.03 AM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/capture-decran-2024-03-10-a-10-30-03-am.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/capture-decran-2024-03-10-a-10-30-03-am.png)

<div class="w-full pt-2 md:pt-0 dark:border-white/20 md:border-transparent md:dark:border-transparent md:w-[calc(100%-.5rem)]"><div class="relative flex h-full flex-1 flex-col"><div class="flex w-full items-center align-center">Code pour le tracé de la ligne continue </div></div></div></form></div><p class="callout danger">Cependant, lorsque nous avons introduit le joystick dans notre système, nous avons réalisé que cette méthode limitait notre flexibilité et rendait impossible l'utilisation du joystick.</p>

<p class="callout success">C'est pourquoi nous avons opté pour la deuxième méthode, où 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égration du joystick et offre une plus grande flexibilité dans le contrôle du système.</p>

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

[![Calcul modèle GEOM arduino.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/calcul-modele-geom-arduino.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/calcul-modele-geom-arduino.png)

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

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

<p class="callout info">Remarque : Pour la partie Joystick , elle est en cours de développement et doit être testée</p>

[![diagramme_programme (5).jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/diagramme-programme-5.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/diagramme-programme-5.jpeg)

#####  Organigramme du programme 

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

Le code comporte 5 partie :

##### 1) d-Dessin de la ligne continue de 5 cm : 

[![Capture d’écran 2024-05-22 à 10.22.04 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-a-10-22-04-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-22-a-10-22-04-pm.png)

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

[![Capture d’écran 2024-05-22 à 10.23.13 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-a-10-23-13-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-22-a-10-23-13-pm.png)

##### 3) Dessin du cercle de rayon 2.5 cm: 

[![Capture d’écran 2024-05-22 à 10.24.04 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-a-10-24-04-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-22-a-10-24-04-pm.png)

##### 4) Dessin du cercle discontinue de rayon 2.5 cm :

[![Capture d’écran 2024-05-22 à 10.26.38 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-a-10-26-38-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-22-a-10-26-38-pm.png)

[![Capture d’écran 2024-05-22 à 10.27.55 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-a-10-27-55-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-22-a-10-27-55-pm.png)

##### 5) Mode manuel (joystick) : 

[![Capture d’écran 2024-05-22 à 10.28.50 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-a-10-28-50-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-22-a-10-28-50-pm.png)[![Capture d’écran 2024-05-22 à 10.28.58 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-a-10-28-58-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-22-a-10-28-58-pm.png)

Pour le mode manuel, le travail a été réalisé en collaboration avec les membres du projet robot "Majin". Ensemble, nous avons réfléchi à la 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ès avoir finalisé le code, nous avons constaté qu'il manquait encore un élément essentiel à notre robot : une interface permettant de connaître en temps réel le mode de fonctionnement. Initialement, nous avions pensé utiliser des LED, mais cela encombrait notre montage et n'était pas intuitif pour une personne extérieure sans explications. C'est alors que nous avons eu l'idée d'ajouter un afficheur LCD.

[![Photo-Afficheur-1.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/photo-afficheur-1.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/photo-afficheur-1.png)

<p class="callout info">**Comment ça marche ?**</p>

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

<div class="flex-1 overflow-hidden" id="bkmrk-sda-%3A-se-connecte-%C3%A0-"><div class="react-scroll-to-bottom--css-ahjmn-79elbk h-full"><div class="react-scroll-to-bottom--css-ahjmn-1n7m0yu"><div><div class="flex flex-col text-sm pb-9"><div class="w-full text-token-text-primary" data-scroll-anchor="true" data-testid="conversation-turn-11" dir="auto"><div class="py-2 juice:py-[18px] px-3 text-base md:px-4 m-auto md:px-5 lg:px-1 xl:px-5"><div class="mx-auto flex flex-1 gap-3 text-base juice:gap-4 juice:md:gap-6 md:max-w-3xl lg:max-w-[40rem] xl:max-w-[48rem]"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col agent-turn"><div class="flex-col gap-1 md:gap-3"><div class="flex flex-grow flex-col max-w-full"><div class="min-h-[20px] text-message flex flex-col items-start whitespace-pre-wrap break-words [.text-message+&]:mt-5 juice:w-full juice:items-end overflow-x-auto gap-2" data-message-author-role="assistant" data-message-id="1664498d-3fa1-46ad-9561-80e1288ed907" dir="auto"><div class="flex w-full flex-col gap-1 juice:empty:hidden juice:first:pt-[3px]"><div class="markdown prose w-full break-words dark:prose-invert dark">- **SDA** : se connecte à la broche A4 de l'Arduino pour recevoir les 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.

</div></div></div></div></div></div></div></div></div></div></div></div></div></div>##### Version final du code : 

```c
#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ée Actuel selon x
float Ry;//Cordonnée Actuel selon y
float Rxx;//Cordonnée a atteindre selon x
float Ryy;//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);
        
      }
     
    }
  haut.write(60);
  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);
  }

  delay(10);

}
}
```

#### <span style="text-decoration: underline;">3) Conception CAO :</span>

Dans une optique de sobriété et de démarche éco-responsable, nous avons imaginer la CAO se sorte à avoir l'intégralité des pièces en découpe laser donc en bois. Cela nous a évité les imprimantes 3D et de ce fait l'utilisation du plastique qui est nocif pour l'environnement .

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

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

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

[![Capture d'écran 2024-05-22 225852.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-225852.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-22-225852.png)

##### image du robot final

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

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/O2Dimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/O2Dimage.png)[ ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/bYGimage.png)[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/BH8image.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/BH8image.png)

[![Capture d'écran 2024-05-22 230700.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-230700.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-22-230700.png)

##### le Support

##### <span style="text-decoration: underline;">Les liaisons entres les bielles :</span>

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

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/vInimage.png) ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/vInimage.png)[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/fpoimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/fpoimage.png)

##### Images qui illustrent les liaisons entres les bielles

##### <span style="text-decoration: underline;">Emplacement et Réglage du Stylo dans le Mécanisme du Robot :</span>

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

[![Capture d'écran 2024-05-22 225548.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-225548.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-22-225548.png)

##### bielle du stylo

- Le mécanisme pour lever le stylo consiste à fixer la bielle au moyen d'une vis sur l'hélice du servomoteur. Cette bielle est ensuite fixée sur une pièce émergeant du bâti. Les bâtis et la table sont ainsi reliés par deux liaisons pivot sur les côtés, comme illustré dans l'image. Pour réduire les frottements et faciliter le mouvement, nous prévoyons d'utiliser un morceau de cylindre inséré dans le trou de la table, lequel sera fixé à l'aide d'une vis et d'un écrou traversant le trou du bâti.
    
    ![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/scaled-1680-/YUMimage.png)
    
    [![Capture d'écran 2024-05-22 230302.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-230302.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/capture-decran-2024-05-22-230302.png)
    
    [ ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/omVimage.png)![Capture d'écran 2024-05-22 230420.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/capture-decran-2024-05-22-230420.png)[ ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-03/omVimage.png)
    
    ##### Mécanisme de Levage du Stylo : Illustration et Fonctionnement

##### Fichiers SolidWorks : [assemblage\_FOD\_final.zip](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/766)

### <span style="color: rgb(0, 0, 0);"><span style="text-decoration: underline;">**V ) Vidéos et photos démonstratives :**</span></span>

[![Ligne_continue.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/imb-ik7xwk.gif)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/imb-ik7xwk.gif) [![IMB_oVKYgp.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/imb-ovkygp.gif)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/imb-ovkygp.gif)

[![IMB_7Ze3gv.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/imb-7ze3gv.gif) ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/imb-7ze3gv.gif)[![IMB_A21KVv.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/imb-a21kvv.gif)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/imb-a21kvv.gif)[ ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/imb-7ze3gv.gif)

[![IMB_cDoTfr.gif](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/imb-cdotfr.gif)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/imb-cdotfr.gif)

[![fod3.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/fod3.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/fod3.jpg)

![fod2.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/fod2.jpg)

[![fod3.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/scaled-1680-/fod3.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2024-05/fod3.jpg)

<div class="w-full pt-2 md:pt-0 dark:border-white/20 md:border-transparent md:dark:border-transparent md:w-[calc(100%-.5rem)]" id="bkmrk--45"></div>