# Base de Chevet Roulante

Auteurs : Thindeka MOCUMBI TOMÀS, Alexandre GUILLET-RICONDA &amp; Jihen DAGHARI

Mention : M1 MeDH \[Mechatronic Design for Health\]

UE : UM4RBM21 - Mini Projet d'Ingénierie

Date : 1 Mai 2026

Lieu : Fablab Sorbonne Université

<p class="callout success">Objectif : <span data-path-to-node="10,0">Concevoir une **table de chevet roulante autonome**, commandée à distance</span><span data-path-to-node="10,2">. Ce dispositif médical à domicile est destinée à </span><span data-path-to-node="10,2">amener automatiquement la table avec le matériel de sondage à l'utilisateur grâce à un système de navigation intelligent.</span></p>

#### Architecture Générale

Le système repose sur une chaîne de commande intégrée :

- <span data-path-to-node="13,0,0,0">Interface : Communication à distance (cmd : "viens", "repart", "ouvre/ferme tiroir")</span><span data-path-to-node="13,0,0,2">.</span>
- <span data-path-to-node="13,2,0,0">Cerveau : Microcontrôleur</span><span data-path-to-node="13,2,0,0"> Arduino MEGA 2560 </span>
- <span data-path-to-node="13,3,0,0">Navigation : Évitement d'obstacles par 4 capteurs ultrasons HC-SR04 et suivi du lit par 2 capteurs ToF VL53L0X pour le parallélisme</span><span data-path-to-node="13,3,0,2">.</span>
- <span data-path-to-node="13,4,0,0">Motorisation : 4 moteurs à courant continu avec encodeurs, pilotés par deux drivers MDD3A (2x3 A).</span>

#### Liste du Matériel (BOM)

<div class="horizontal-scroll-wrapper" id="bkmrk-composant-mod%C3%A8le-%2F-r" style="text-align: justify;"><table data-path-to-node="28" style="height: 432.823px; width: 96.2145%;"><thead><tr style="height: 29.4583px;"><th style="width: 33.3333%; height: 29.4583px;"><span data-path-to-node="28,0,0,0">Composant</span></th><th style="width: 52.7126%; height: 29.4583px;"><span data-path-to-node="28,0,1,0">Modèle / Référence</span></th><th style="width: 13.9541%; height: 29.4583px;"><span data-path-to-node="28,0,2,0">Quantité</span></th></tr></thead><tbody><tr style="height: 35.0625px;"><td style="width: 33.3333%; height: 35.0625px;"><span data-path-to-node="28,1,0,0">**Contrôleur**</span></td><td style="width: 52.7126%; height: 35.0625px;"><span data-path-to-node="28,1,1,0">Arduino Mega 2560</span></td><td style="width: 13.9541%; height: 35.0625px;"><span data-path-to-node="28,1,2,0,0">1</span>

</td></tr><tr style="height: 45px;"><td style="width: 33.333333%; height: 45px;"><span data-path-to-node="28,2,0,0">**Moteurs**</span></td><td style="width: 52.71259%; height: 45px;"><span data-path-to-node="28,2,1,0">Motoréducteurs + encodeurs FIT 0521 (6 Vcc)</span></td><td style="width: 13.954077%; height: 45px;">4</td></tr><tr style="height: 46.4479px;"><td style="width: 33.3333%; height: 46.4479px;"><span data-path-to-node="28,2,0,0">**Supports Moteurs**</span></td><td style="width: 52.7126%; height: 46.4479px;"><span data-path-to-node="28,2,1,0">Paire de supports moteurs 2676</span></td><td style="width: 13.9541%; height: 46.4479px;">2</td></tr><tr style="height: 45px;"><td style="width: 33.333333%; height: 45px;"><span data-path-to-node="28,3,0,0">**Roues**</span></td><td style="width: 52.71259%; height: 45px;"><span data-path-to-node="28,3,1,0">Mecanum Ø65 mm (2 Droites / 2 Gauches)</span></td><td style="width: 13.954077%; height: 45px;"><span data-path-to-node="28,3,2,0,0">4</span>

</td></tr><tr style="height: 45px;"><td style="width: 33.333333%; height: 45px;"><span data-path-to-node="28,4,0,0">**Drivers**</span></td><td style="width: 52.71259%; height: 45px;"><span data-path-to-node="28,4,1,0">Commande moteur CC 2x3 A MDD3A</span></td><td style="width: 13.954077%; height: 45px;">2</td></tr><tr style="height: 45px;"><td style="width: 33.333333%; height: 45px;"><span data-path-to-node="28,5,0,0">**Distance (Ultrason)**</span></td><td style="width: 52.71259%; height: 45px;"><span data-path-to-node="28,5,1,0">Capteurs Ultrasons HC-SR04</span></td><td style="width: 13.954077%; height: 45px;">4</td></tr><tr style="height: 45px;"><td style="width: 33.333333%; height: 45px;"><span data-path-to-node="28,6,0,0">**Distance (Laser)**</span></td><td style="width: 52.71259%; height: 45px;"><span data-path-to-node="28,6,1,0">Capteurs ToF VL53L3CX (Fermion)</span></td><td style="width: 13.954077%; height: 45px;">2</td></tr><tr style="height: 45px;"><td style="width: 33.333333%; height: 45px;"><span data-path-to-node="28,7,0,0">**Force**</span></td><td style="width: 52.71259%; height: 45px;"><span data-path-to-node="28,7,1,0">Jauge de contrainte + Module HX711</span></td><td style="width: 13.954077%; height: 45px;">1</td></tr><tr style="height: 51.8542px;"><td style="width: 33.3333%; height: 51.8542px;"><span data-path-to-node="28,8,0,0">**Contact**</span></td><td style="width: 52.7126%; height: 51.8542px;"><span data-path-to-node="28,8,1,0">Microrupteurs SPS75GL à roulette</span></td><td style="width: 13.9541%; height: 51.8542px;"><span data-path-to-node="28,8,2,0,0">8</span>

<div _ngcontent-ng-c900847660="" class="source-inline-chip-container ng-star-inserted">  
</div></td></tr></tbody></table>

</div>
#### Guide de Montage

##### Modélisation 

<span data-path-to-node="19,0">Pour rendre la base adaptable à n'importe quelle table de chevet, nous avons conçu un système de boîtes empilables </span><span data-path-to-node="19,0" 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;">via *boxes.py*</span><span data-path-to-node="19,2" 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><span data-path-to-node="19,0">découpées au laser au Fablab. Nous avons opter, après plusieurs recherches et benchmarking, pour du bois MDF de 6 mm pour la rigidité et le poids que la table devrait supporter. </span>

<span data-path-to-node="19,0">Au départ l'idée était de partir sur un système de fixation par tenon mortaise avec verrouillage par clavette permettant d'ajuster la hauteur en empilant des modules de 10 à 50 cm.</span>

<span data-path-to-node="32,0,0,0">De nombreuses propositions ont été faites avant, durant et après les découpes avant d'arriver au résultat le plus optimal.</span>

##### Génération des structures (Boxes.py)

Nous avons segmenté la table en trois fichiers distincts, correspondant aux trois étages de la table (Box 1, 2 et 3). La Box 1 (Base technique - fichier universal box) où sera déposé l'électronique de puissance (drivers, Arduino MEGA) et les Box 2 &amp; 3 (Stockage - fichier sliding drawer) qui sont dédiées aux tiroirs : un conteneur poubelle et un pour le matériel de sondage.

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

##### Post-traitement (Inkscape)

Les fichiers SVG générés ont été importés dans Inkscape, logiciel de dessin, pour ajouter des fonctionnalités non présentes dans le générateur de boîtes qui nous permettra d'empiler chaque étages. Nous avons ajouté manuellement les emplacements pour la liaison base-boîte.

<p class="callout info">Ce logiciel est le meilleur éditeur de graphisme pour procéder à certains emboitement non proposé sur Boxes.py </p>

Les cercles sur le bottom de la box 1 ont été dessinés pour correspondre au chassis en plexiglas (décris plus bas) où seront fixés les moteurs et roues. Le cercle central servira à faire passer les cables des moteurs et encodeurs et les 4 autres à faire passer les vis qui seront fixer à la boite en plexiglas.

Enfin, nous avons ajouté des ouvertures sur les côtés pour les 2 TOF et quatre Ultrasons.

Dans cette boxe, l'ensemble de l'électronique sera regroupé, on retrouve les 2 drivers, l'arduino MEGA et la breadboard.

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

##### Découpe Laser

Pour peaufiner le tout les fichiers ont été redistribués sur Trotec (logiciel/machine laser du Fablab) pour passer à la découpe. Nous avons tout de même arranger le jeu pour l'emboîtement, 0,09 mm pour les structures fixes et 0,15 mm pour les parties mobiles en amont, créant un jeu pour que les tiroirs coulissent sans forcer.

<p class="callout info">Le logiciel utilise un code couleur pour chaque actions. Les lignes de découpe sont en rouge, tandis que les lignes de gravure pour le marquage de surface sont en noir.</p>

Rappel étape d'utilisation de la découpe Laser

1. Préparation : Positionnement de la plaque de MDF sur la grille de découpe.
2. Lancement : Lancement de l'impression après ajustement des paramètres.
3. Découpe : La machine effectue les découpes (contours des pièces).
4. Assemblage : Une fois les pièces refroidies, nous avons procédé à l'assemblage.

#### Guide d'assemblage

##### Création du châssis (Solidworks)

<span data-path-to-node="26,0">La base a été dimensionnée pour être en adéquation avec l'espace de vie de l'utilisateur (chambre) et d</span><span data-path-to-node="27,0,0,0">es mesures précises ont été prise pour le perçage des 16 trous des supports moteurs. </span><span data-path-to-node="27,1,0,0">Les trous ont été percés légèrement plus petits que la vis pour un taraudage optimal</span><span data-path-to-node="27,1,0,2">. On a ajouté à cela un trou central qui servira à faire passer les fils des moteurs et encodeurs.</span>

<span data-path-to-node="27,1,0,2">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/3nrimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/3nrimage.png)</span>

<span data-path-to-node="27,1,0,2">Les 4 troues pour fixer la box1 à notre chassis ont été fait dans un deuxième temps après avoir bien dimensionner la boxe directement sur Inkscape, mais aurait pu être fait directement dans notre premier fichier Solidworks. Pour ce qui est de la taille des troues pour le taraudage, le principe est décrit ci-dessous avec comme exemple les 4 troues pour fixer le chassis à la box1 :</span><span data-path-to-node="27,1,0,2"> </span>

<span data-path-to-node="27,1,0,2">on va choisir un diamètre légèrement inférieur à 8 mm (pour des vis M8) afin de permettre un taraudage dans le plexiglass. L'idée est d'avoir la boite avec 4 trou reparti de 8 mm, le plexi avec un trou de 6,8 mm pour procéder à un taraudage de 1,2 mm pour qu'elle se visse. Autrement-dit, pour une vis M8, le trou de perçage standard est de 6,8 même : on fait `Ø` vis - Pas de vis, soit <span class="math-inline" data-index-in-node="116" data-math="8 - 1,25 = 6,75"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord">8 </span><span class="mbin">− </span></span><span class="base"><span class="mord">1</span><span class="mpunct">,</span><span class="mord">2 </span><span class="mrel">= </span></span><span class="base"><span class="mord">6</span><span class="mpunct">,8 mm</span></span></span></span></span>.</span>

##### Fixation des composants

On fixe les supports moteurs en dessous de la base avec 4 vis M3 à tête plate de 8 même de chaque coté de la base, soit 16 vis M3, à l’aide des troues taraudés précédemment (le côté du support doit correspondre au côté de la base). on effectue cela par le dessous pour que les têtes de vis se posent sur le support et le bloque.

On fixe ensuite les moteurs aux support avec à chaque fois 2 des vis fournies avec les moteurs.

<p class="callout warning">Faire attention à bien mettre les fils de tels sortent qu’il regarde le rond central.</p>


Après, on enfonce les roues jusqu’à 1 ou 2 mm du support et on prend une vis M4 qui l’on visse à au niveau de la partie plate de la tige au bout du moteur. On doit sentir en faisant tourner la roue qu'elle est connectée au moteur.

[![PHOTO-2026-04-10-15-34-36.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/photo-2026-04-10-15-34-36.jpg) ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/photo-2026-04-10-15-34-36.jpg)[![IMG_7387.PNG](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/img-7387.PNG)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/img-7387.PNG)

<p class="callout info"><span data-path-to-node="29,2,0,0">Note : Vérifier le sens des roues (X-pattern) selon la Datasheet pour permettre les mouvements latéraux</span><span data-path-to-node="29,2,0,2">.</span></p>

On fixe ensuite la première boite en faisant correspondre les troues de cette boite et de la base avec des plus grosses vis (cette fois par au dessus pour que les têtes de vis bloque la boite). Explication donnée dans le guide de montage.

[![PHOTO-2026-05-02-18-31-55.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/photo-2026-05-02-18-31-55.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/photo-2026-05-02-18-31-55.jpg)

#### Retour d'expérience et bonnes pratiques

##### BP GUIDE DE MONTAGE 

L'épaisseur du trait de coupe laser varie selon le matériau, et pour un emboîtement dessiné pile à 6 même pour du MDF de 6 même sera trop lâche.

<p class="callout success">Solution : tester le "burn sur une pièce témoin. Nous avons validé 0,09 même pour que le système tienne sans forcer.</p>

Lors de l'ajout des trous de taraudage et des ouvertures capteurs, risque d'alignement.

<p class="callout success">Solution : utiliser l'outil Inkscape pour mesurer et mettre à même hauteur les trous et les découper avant les contours pour éviter que la pièce ne bouge et ne décale le tout.</p>

##### BP GUIDE D'ASSEMBLAGE 

<div _ngcontent-ng-c71297836="" class="source-inline-chip-container ng-star-inserted" id="bkmrk-lors-du-montage-d%27un" style="text-align: justify;"><div _ngcontent-ng-c900847660="" class="source-inline-chip-container ng-star-inserted">Lors du montage d'une roue à un moteur, certains pas de vis ont été endommagés. </div></div><p class="callout success">Solution : nouveau perçage suivi d'un taraudage à une taille supérieure et utilisation d'un système vis/boulon sur le Plexiglas le traversant.</p>

Des fils qui se détachent et sont trop court à manipuler.

<p class="callout success">Solution : utilisation d'un kit connector dupont pour transformer et rassembler les fils des encodeurs afin d'améliorer leur manipulation.</p>

#### Fonctionnement des mécanismes

##### Roues mecanum

Le déplacement de la base repose sur quatre roues Mecanum pilotées indépendamment par des moteurs à courant continu équipés d'encodeurs.

##### La "Règle de Trois" Odométrie

Pour que le robot sache où il est, il compte les impulsions (tics) générées par les encodeurs à chaque rotation moteur. Chaque rotation complète d'une roue de <span class="math-inline" data-index-in-node="59" data-math="65\text{ mm}"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord">65</span><span class="mord text"><span class="mord"> mm</span></span></span></span></span></span> correspond à un déplacement linéaire de <span class="math-inline" data-index-in-node="112" data-math="204,2\text{ mm}"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord">204</span><span class="mpunct">,</span><span class="mord">2</span><span class="mord text"><span class="mord"> même</span></span></span></span></span></span>. Avec <span class="math-inline" data-index-in-node="17" data-math="341,2"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord">341</span><span class="mpunct">,</span><span class="mord">2</span></span></span></span></span> impulsions par tour, chaque "tic" représente environ <span class="math-inline" data-index-in-node="76" data-math="0,6\text{ mm}"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord">0</span><span class="mpunct">,</span><span class="mord">6</span><span class="mord text"><span class="mord"> mm</span></span></span></span></span></span> (<span class="math-inline" data-index-in-node="91" data-math="204,2 / 341,2"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord">204</span><span class="mpunct">,</span><span class="mord">2/341</span><span class="mpunct">,</span><span class="mord">2</span></span></span></span></span>). C'est cette précision qui permet au robot de s'arrêter pile à la bonne distance.

##### Modes de Pilotage

Le mode "Aveugle" - distance connue :

On utilise ce mode pour les trajets prédéfinis (ex: sortir de son rangement de <span class="math-inline" data-index-in-node="79" data-math="1\text{ mètre}"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord">1</span><span class="mord text"><span class="mord"> mè</span><span class="mord">tre</span></span></span></span></span></span>). On convertit la distance cible en tics (ex: <span class="math-inline" data-index-in-node="53" data-math="1\text{ m} = 1668\text{ tics}"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord">1</span><span class="mord text"><span class="mord"> m</span></span><span class="mrel">=</span></span><span class="base"><span class="mord">1668</span><span class="mord text"><span class="mord"> tics</span></span></span></span></span></span>). L'Arduino envoie un signal aux moteurs ( analogWrite(pinM1A\_FL, vitesseMoteur); digitalWrite(pinM1B\_FL, LOW); ) et le programme compare en temps réel la valeur des encodeurs à la cible. Une fois les <span class="math-inline" data-index-in-node="99" data-math="1668"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord">1668</span></span></span></span></span> tics atteints, les moteurs sont coupés ( digitalWrite(pinM1A\_FL, LOW); digitalWrite(pinM1B\_FL, LOW); ).

Le Mode "Réactif" - distance inconnue :

On utilise ce mode pour l'interaction avec l'utilisateur ou l'évitement d'obstacles (ex: le capteur de force ou le TOF). Le robot commence à bouger dans la direction demandée. Le mouvement continue TANT QUE une condition externe est vraie.

*Exemple :* "Avancer tant que la valeur du capteur de force est <span class="math-inline" data-index-in-node="62" data-math="> 200\text{ g}"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mrel">&gt;</span></span><span class="base"><span class="mord">200</span><span class="mord text"><span class="mord"> g</span></span></span></span></span></span>" ou "Aller à gauche tant que le capteur TOF mesure <span class="math-inline" data-index-in-node="128" data-math="> 10\text{ cm}"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mrel">&gt;</span></span><span class="base"><span class="mord">10</span><span class="mord text"><span class="mord"> cm</span></span></span></span></span></span>".

Dès que la condition n'est plus respectée (on lâche la poignée ou on approche d'un mur), le robot s'arrête instantanément.

#### Intelligence et sécurité

##### Système de déplacement : Base Holonome

<span data-path-to-node="16,0">Nous avons opté pour une configuration à 4 roues Mecanum (65 mm) permettant des déplacements omnidirectionnels, c'est-à-dire des translations selon 2 axes différents et des rotations. </span>

Mouvement avant/arrière

[![Screenshot 2026-05-10 at 4.08.31 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/screenshot-2026-05-10-at-4-08-31-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/screenshot-2026-05-10-at-4-08-31-pm.png)

Mouvement gauche/droite

[![Screenshot 2026-05-10 at 4.10.53 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/screenshot-2026-05-10-at-4-10-53-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/screenshot-2026-05-10-at-4-10-53-pm.png)

Rotations

[![Screenshot 2026-05-10 at 4.11.31 PM.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/screenshot-2026-05-10-at-4-11-31-pm.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/screenshot-2026-05-10-at-4-11-31-pm.png)

Le contrôle de la base holonome repose sur le mixage des vitesses des 4 moteurs. Pour une translation latérale, les moteurs d'une même diagonale tournent en sens inverse des deux autres. L'Arduino MEGA calcule en temps réel les impulsions des encodeurs pour s'assurer que les quatre roues tournent à la même vitesse. Il garantit une trajectoire parfaitement droite malgré les frottements du sol et convertit les commandes "viens/repart" en vecteurs de vitesse pour chaque roue. En cas de dérive, ce sont les capteur ToF qui ajustent la vitesse différentielle des moteurs pour maintenir la table parallèle au lit.

##### Système d'ouverture et sécurité

<p class="callout info">**Flux des informations** </p>

`Entrée (Capteur de force)` -&gt; `HX711` -&gt; `Arduino` -&gt; `Consigne de vitesse négative` -&gt; `Recul de la base`

L'idée est d'implémenter la logique inverse pour dégager l'espace : Lorsque l'utilisateur tire la poignée, la base recule automatiquement pour accompagner le mouvement d'ouverture. Nous avons utilisé un capteur de force, un système semi-passif, comme une jauge de déformation (avec module HX711) sur la poignée.

##### Principe

Pour que le capteur fonctionne, il doit subir une flexion. Quand tu tires la poignée : La poignée tire sur le côté droit du capteur. Le côté gauche du capteur ne bouge pas (il est vissé au tiroir). La barre en métal se tord (flexion) entre les deux. L'Arduino détecte cette torsion et dit au robot : "Recule !"

Le capteur est monté en façade, en interface entre la poignée et le tiroir. Le côté 'fixe' est boulonné à la structure du tiroir via des cales de <span class="math-inline" data-index-in-node="147" data-math="6\text{ mm}"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord">6</span><span class="mord text"><span class="mord"> mm</span></span></span></span></span></span>. Le côté 'mobile' supporte uniquement la poignée. La force de traction de l'utilisateur devient une déformation mécanique mesurable par le module HX711, tout en gardant une butée physique (le bois du tiroir) pour protéger le capteur d'une traction supérieure à <span class="math-inline" data-index-in-node="448" data-math="1\text{ kg}"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord">1</span><span class="mord text"><span class="mord"> kg.</span></span></span></span></span></span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/u2vimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/u2vimage.png) [![IMG_1596.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/img-1596.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/img-1596.jpg)

##### Guide d'assemblage 

L'assemblage utilise un montage dit en "porte-à-faux" pour permettre la flexion de la jauge.

<span class="katex-display"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord text"><span class="mord">`Façade` &lt;- `Entretoise (cale)` </span></span></span></span></span></span><span class="katex-display"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord text"><span class="mord">&lt;- `Capteurs` &lt;-</span></span></span></span></span></span><span class="katex-display"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord text"><span class="mord"> `Poignée`</span></span></span></span></span></span>

Côté Réaction (tiroir) : fixation par 2 vis M4 traversant la façade et deux entretoises en MDF de 6 mm chacune. Ce déport de 12 mm crée l'espace de déformation nécessaire.

Côté Action (utilisateur) : une plaque de MDF (poignée) est fixée à l'autre extrémité du capteur via les perçages M5.

Côté Utilisation (fonctionnement) : Lorsque l'utilisateur tire sur la plaque mobile, la barre de 80 mm subit une contrainte de traction transmise au pont de Wheasthone.

<p class="callout success">Percer un trou de 10 mm dans la façade du tiroir pour faire passer les fils à l'intérieur.</p>

Les vis M4 (25 mm) traversent tout (façade + cales + capteur) et les vis M5 (- 20 mm) fixent ta poignée (1<span class="math-inline" data-index-in-node="40" data-math="100 \text{ mm}"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mord">00</span><span class="mord text"><span class="mord"> mm)</span></span></span></span></span></span> au capteur.

Sens de vissage :

- Liaison Châssis-Capteur (M4) : Insertion par l'intérieur. L'ordre est : *Tête de vis &gt; Façade &gt; Cales &gt; Capteur.*
- Liaison Capteur-Poignée (M5) : Insertion par l'extérieur. L'ordre est : *Tête de vis &gt; Poignée &gt; Capteur*.

<p class="callout warning">Assurez-vous que ces vis ne soient pas trop longues pour ne pas venir buter contre la façade du tiroir derrière. Elles ne doivent toucher que la poignée et le capteur.</p>

##### Logique et Asservissement

Le module HX711 amplifie ce signal pour l'Arduino MEGA.

Option A (Seuil fixe) : Si la force &gt; 200g, la base recule à vitesse constante.

Sécurité de fin de course : Pour éviter que la base ne continue de reculer une fois le tiroir totalement ouvert, nous avons ajouté un microrupteur en fin de glissière. S'il est activé, il coupe immédiatement le recul des moteurs, même si une force est toujours détectée sur la poignée.

Par ailleurs, la sécurité est primordiale pour un dispositif médical à domicile. Pour assurer la sécurité de l'utilisateur des capteurs de choc physiques (bumpers) ont été intégré. Ces 8 microrupteurs à roulette (SPS75GL) ont été intégrés à l'avant et à l'arrière de la base.

S'ajoute à cela, quatre capteurs ultrasons répartis de chaque côté de la base déclenchant l'arrêt immédiat en cas d'obstacle détecté à proximité.

#### Schéma de Câblage 

????????

#### Software to Hardware

##### Pipeline Global

Le système fonctionne comme une boucle fermée où l'information circule de l'utilisateur vers la mécanique :

Entrée Utilisateur : Interaction physique via les Boutons ou le Capteur de force.

Acquisition (Arduino) : Lecture instantanée des Encodeurs, des capteurs Ultrasons et du ToF.

Traitement (Prise de décision) : L'Arduino analyse si le chemin est libre et calcule la puissance nécessaire pour chaque roue.

Actionnement : Envoi des signaux PWM aux Drivers moteurs qui font tourner la Base roulante.

Supervision (Python) : En parallèle, l'Arduino envoie les données via le port Série vers un ordinateur/interface Python pour le diagnostic.

<div class="horizontal-scroll-wrapper" id="bkmrk-%C3%89l%C3%A9ment-r%C3%B4le-princip"><div class="table-block-component"><div _ngcontent-ng-c4235860644="" class="table-block has-export-button new-table-style is-at-scroll-start is-at-scroll-end"><div _ngcontent-ng-c4235860644="" class="table-content" data-hveid="0" data-ved="0CAAQ3ecQahcKEwi4ppau7qGUAxUAAAAAHQAAAAAQRA" decode-data-ved="1" jslog="275421;track:impression,attention" not-end-of-paragraph=""><table data-path-to-node="8" style="width: 107.777778%;"><thead><tr><th style="width: 25.339926%;"><span data-path-to-node="8,0,0,0">Élément</span></th><th style="width: 24.967724%;"><span data-path-to-node="8,0,1,0">Rôle Principal</span></th><th style="width: 49.69235%;"><span data-path-to-node="8,0,2,0">Détails Techniques</span></th></tr></thead><tbody><tr><td style="width: 25.339926%;"><span data-path-to-node="8,1,0,0">Arduino (MEGA)</span></td><td style="width: 24.967724%;"><span data-path-to-node="8,1,1,0">Cerveau Temps Réel</span></td><td style="width: 49.69235%;"><span data-path-to-node="8,1,2,0">Gère les boucles de contrôle rapides (PID, lecture d'interruptions). </span></td></tr><tr><td style="width: 25.339926%;"><span data-path-to-node="8,2,0,0">Python (PC/Interface)</span></td><td style="width: 24.967724%;"><span data-path-to-node="8,2,1,0">Supervision </span></td><td style="width: 49.69235%;"><span data-path-to-node="8,2,2,0">Affiche l'état des capteurs sur écran. Permet de logger les erreurs ou d'envoyer des commandes de réglage.</span></td></tr><tr><td style="width: 25.339926%;"><span data-path-to-node="8,3,0,0">Encodeurs</span></td><td style="width: 24.967724%;"><span data-path-to-node="8,3,1,0">Odométrie</span></td><td style="width: 49.69235%;"><span data-path-to-node="8,3,2,0">Mesurent la rotation exacte des moteurs pour calculer la distance parcourue (en tics).</span></td></tr><tr><td style="width: 25.339926%;"><span data-path-to-node="8,4,0,0">Capteurs Ultrasons</span></td><td style="width: 24.967724%;"><span data-path-to-node="8,4,1,0">Sécurité Anti-collision</span></td><td style="width: 49.69235%;"><span data-path-to-node="8,4,2,0">Détectent les obstacles imprévus (pied de chaise, personne) et forcent l'arrêt d'urgence.</span></td></tr><tr><td style="width: 25.339926%;"><span data-path-to-node="8,5,0,0">Capteur ToF (Laser)</span></td><td style="width: 24.967724%;"><span data-path-to-node="8,5,1,0">Maintien d'Orientation</span></td><td style="width: 49.69235%;"><span data-path-to-node="8,5,2,0">Mesure la distance précise par rapport au lit pour s'assurer que le robot reste bien parallèle ou à la bonne distance du meuble fixe.</span></td></tr><tr><td style="width: 25.339926%;"><span data-path-to-node="8,6,0,0">Boutons / Capteur de force</span></td><td style="width: 24.967724%;"><span data-path-to-node="8,6,1,0">Interface Homme-Machine</span></td><td style="width: 49.69235%;"><span data-path-to-node="8,6,2,0">Déclenchent les scénarios : "Sortir du lit", "Ranger le tiroir" ou "Assistance au tirage".</span></td></tr><tr><td style="width: 25.339926%;"><span data-path-to-node="8,7,0,0">Drivers Moteurs</span></td><td style="width: 24.967724%;"><span data-path-to-node="8,7,1,0">Puissance</span></td><td style="width: 49.69235%;"><span data-path-to-node="8,7,2,0">Reçoivent les signaux logiques de l'Arduino et convertissent l'énergie de la batterie en courant pour les moteurs.</span></td></tr></tbody></table>

</div></div></div></div>##### Logique de Décision 

Pour un mouvement type "Avancer", l'Arduino suit cette priorité :

L'Ultrason voit-il un obstacle à moins de 20 cm ? Si oui <span class="math-inline" data-index-in-node="75" data-math="\rightarrow"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mrel">→</span></span></span></span></span> STOP.

Le ToF indique-t-il que nous dérivons par rapport au lit ? Si oui <span class="math-inline" data-index-in-node="87" data-math="\rightarrow"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mrel">→</span></span></span></span></span> Correction de l'angle des roues Mecanum.

Les Encodeurs ont-ils atteint le nombre de tics calculé ? Si non <span class="math-inline" data-index-in-node="80" data-math="\rightarrow"><span class="katex"><span aria-hidden="true" class="katex-html"><span class="base"><span class="mrel">→</span></span></span></span></span> Continuer PWM.&lt;code&gt;

<div id="bkmrk-const-int-trigavant-"></div>#### Pipeline du code arduino


##### 1. Objectif général du programme

Le programme pilote une base mobile équipée de :

- 4 moteurs avec encodeurs ;
- 4 capteurs ultrasons pour détecter les obstacles ;
- 2 capteurs ToF VL53L3CX pour s’aligner parallèlement au lit ;
- 1 capteur de force HX711 pour déclencher un déplacement latéral.

Le test s’exécute une seule fois au démarrage dans setup(). La fonction loop() est vide.

##### 2. Pipeline globale du programme

---