Skip to main content

Base roulante


DOCUMENTATION

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

Mention : M1 parcours MeDH [Mechatronic design for health]

UE : UM4RBM21 - Mini Projet d'IngéIngénierie

Date : 1 Mai 2026

Lieu : Fablab Sorbonne UniversitéUniversité 

Objectif : Concevoir une table de chevet roulante autonome, commandécommandée àà distance. Ce dispositif dical àà domicile est destinédestinée àà amener automatiquement la table avec le matématériel de sondage àà l'utilisateur grâgrâce àà un systèsystème de navigation intelligent.

Architecture GénéGénérale

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

  • Interface : Communication àà distance (cmd : "viens", "repart", "ouvre/ferme tiroir").

  • Cerveau : MicrocontrôMicrocontrôleur Arduino MEGA 2560 

  • Navigation : ÉÉvitement d'obstacles par 4 capteurs ultrasons HC-SR04 et suivi du lit par 2 capteurs ToF VL53L0X pour le paralléparallélisme.

  • Motorisation : 4 moteurs àà courant continu avec encodeurs, pilotépilotés par deux drivers MDD3A (2x3 A).

Liste du MatéMatériel (BOM)

Composant ModèModèle / RéféRéférence QuantitéQuantité
ContrôContrôleur Arduino Mega 2560

1

Moteurs MotoréMotoréducteurs + encodeurs FIT 0521 (6 Vcc) 4
Supports Moteurs Paire de supports moteurs 2676 2
Roues Mecanum ØØ65 mm (2 Droites / 2 Gauches)

4

Drivers Commande moteur CC 2x3 A MDD3A 2
Distance (Ultrason) Capteurs Ultrasons HC-SR04 4
Distance (Laser) Capteurs ToF VL53L3CX (Fermion) 2
Force Jauge de contrainte + Module HX711 1
Contact Microrupteurs SPS75GL àà roulette

8


Guide de Montage

ModéModélisation 

Pour rendre la base adaptable àà n'importe quelle table de chevet, nous avons conçconçu un systèsystème de boîboîtes empilables via boxes.py découpédécoupées au laser au Fablab. Nous avons opter, aprèaprès plusieurs recherches et benchmarking, pour du bois MDF de 6 mm pour la rigiditérigidité et le poids que la table devrait supporter. 

Au part l'idéidée éétait de partir sur un systèsystème de fixation par tenon mortaise avec verrouillage par clavette permettant d'ajuster la hauteur en empilant des modules de 10 àà 50 cm.

De nombreuses propositions ont étéété faites avant, durant et aprèaprès les coupes avant d'arriver au sultat le plus optimal.

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

Nous avons segmenté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) sera déposédéposé l'éélectronique de puissance (drivers, Arduino MEGA) et les Box 2 & 3 (Stockage - fichier sliding drawer) qui sont dédiédédiées aux tiroirs : un conteneur poubelle et un pour le matématériel de sondage.

image.png   image.png  image.png

Post-traitement (Inkscape)

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

Ce logiciel est le meilleur ééditeur de graphisme pour procéprocéder àà certains emboitement non proposéproposé sur Boxes.py 

Les cercles sur le bottom de la box 1 ont étéété dessinédessinés pour correspondre au chassis en plexiglas (cris plus bas) seront fixé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éajouté des ouvertures sur les côtécôtés pour les 2 TOF et quatre Ultrasons.

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

image.png 

coupe Laser

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

Le logiciel utilise un code couleur pour chaque actions. Les lignes de coupe sont en rouge, tandis que les lignes de gravure pour le marquage de surface sont en noir.

Rappel éétape d'utilisation de la coupe Laser

  1. PréPréparation : Positionnement de la plaque de MDF sur la grille de coupe.

  2. Lancement : Lancement de l'impression aprèaprès ajustement des paramèparamètres.

  3. coupe : La machine effectue les coupes (contours des pièpièces).

  4. Assemblage : Une fois les pièpièces refroidies, nous avons procédéprocédé àà l'assemblage. 

Guide d'assemblage

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

La base a étéété dimensionnédimensionnée pour êêtre en adéadéquation avec l'espace de vie de l'utilisateur (chambre) et des mesures préprécises ont étéété prise pour le perçperçage des 16 trous des supports moteurs. Les trous ont étéété percépercés légèlégèrement plus petits que la vis pour un taraudage optimal. On a ajoutéajouté àà cela un trou central qui servira àà faire passer les fils des moteurs et encodeurs.

image.png

Les 4 troues pour fixer la box1 àà notre chassis ont étéété fait dans un deuxièdeuxième temps aprè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 crit ci-dessous avec comme exemple les 4 troues pour fixer le chassis àà la box1 : 

on va choisir un diamèdiamètre légèlégèrement inféinférieur àà 8 mm (pour des vis M8) afin de permettre un taraudage dans le plexiglass. L'idé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éprocéder àà un taraudage de 1,2 mm pour qu'elle se visse. Autrement-dit, pour une vis M8, le trou de perçperçage standard est de 6,8 me : on fait ØØ vis - Pas de vis, soit .

Fixation des composants

On fixe les supports moteurs en dessous de la base avec 4 vis M3 àà te plate de 8 me de chaque cotécoté de la base, soit 16 vis M3, àà l’l’aide des troues taraudétaraudés précéprécédemment (le côtécôté du support doit correspondre au côtécôté de la base). on effectue cela par le dessous pour que les 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. 

Faire attention àà bien mettre les fils de tels sortent qu’qu’il regarde le rond central.

    Retour d'expéexpérience et bonnes pratiques

    BP GUIDE DE MONTAGE 

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

    Solution : tester le "burn sur une pièpièce moin. Nous avons validévalidé 0,09 me pour que le systèsystème tienne sans forcer.

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

    Solution : utiliser l'outil Inkscape pour mesurer et mettre àà me hauteur les trous et les couper avant les contours pour ééviter que la pièpièce ne bouge et ne cale le tout.

    BP GUIDE D'ASSEMBLAGE 
    Lors du montage d'une roue àà un moteur, certains pas de vis ont étéété endommagéendommagés. 

    Solution : nouveau perçperçage suivi d'un taraudage àà une taille supésupérieure et utilisation d'un systèsystème vis/boulon sur le Plexiglas le traversant.

    Fonctionnement des canismes

    Roues mecanum

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

    La "gle de Trois" OdoméOdométrie

    Pour que le robot sache il est, il compte les impulsions (tics) générégénérées par les encodeurs àà chaque rotation moteur. Chaque rotation complècomplète d'une roue de correspond àà un placement linélinéaire de . Avec impulsions par tour, chaque "tic" repréreprésente environ (). C'est cette préprécision qui permet au robot de s'arrêarrêter pile àà la bonne distance.

    Modes de Pilotage

    Le mode "Aveugle" - distance connue : 

    On utilise ce mode pour les trajets prédéprédéfinis (ex: sortir de son rangement de ). On convertit la distance cible en tics (ex: ). L'Arduino envoie un signal aux moteurs ( analogWrite(pinM1A_FL, vitesseMoteur); digitalWrite(pinM1B_FL, LOW); ) et le programme compare en temps el la valeur des encodeurs àà la cible. Une fois les tics atteints, les moteurs sont coupécoupés ( digitalWrite(pinM1A_FL, LOW); digitalWrite(pinM1B_FL, LOW); ).

    Le Mode "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édemandée. Le mouvement continue TANT QUE une condition externe est vraie.

    Exemple : "Avancer tant que la valeur du capteur de force est " ou "Aller àà gauche tant que le capteur TOF mesure ".

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

    SystèSystème de placement : Base Holonome

    Nous avons optéopté pour une configuration àà 4 roues Mecanum (65 mm) permettant des placements omnidirectionnels, c'est-àà-dire des translations selon 2 axes diffédifférents et des rotations. 

    Mouvement avant/arrièarrière

    Screenshot 2026-05-10 at 4.08.31 PM.png

    Mouvement gauche/droite

    Screenshot 2026-05-10 at 4.11.31 PM.png

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

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

    Flux des informations 

    EntréEntrée (Capteur de force) -> HX711 -> Arduino -> Consigne de vitesse gative -> Recul de la base

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

    Principe

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

    Le capteur est montémonté en façfaçade, en interface entre la poignépoignée et le tiroir. Le côtécôté 'fixe' est boulonnéboulonné àà la structure du tiroir via des cales de . Le côtécôté 'mobile' supporte uniquement la poignépoignée. La force de traction de l'utilisateur devient une formation canique mesurable par le module HX711, tout en gardant une butébutée physique (le bois du tiroir) pour protéprotéger le capteur d'une traction supésupérieure àà

    image.png     IMG_1596.jpg

    Guide d'assemblage 

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

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

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

    Côté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. 

    Percer un trou de 10 mm dans la façfaçade du tiroir pour faire passer les fils àà l'intéintérieur.

    Les vis M4 (25 mm) traversent tout (façfaçade + cales + capteur) et les vis M5 (- 20 mm) fixent ta poignépoignée (1 au capteur. 

    Sens de vissage :

    • Liaison ChâChâssis-Capteur (M4) : Insertion par l'intéintérieur. L'ordre est : te de vis > FaçFaçade > Cales > Capteur.

    • Liaison Capteur-PoignéPoignée (M5) : Insertion par l'extéextérieur. L'ordre est : te de vis > PoignéPoignée > Capteur.

    Assurez-vous que ces vis ne soient pas trop longues pour ne pas venir buter contre la façfaçade du tiroir derrièderrière. Elles ne doivent toucher que la poignépoignée et le capteur.

    Logique et Asservissement

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

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

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

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

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

    SchéSchéma de blage 

    ????????

    Software to Hardware

    Pipeline Global

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

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

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

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

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

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

    ÉléÉlément le Principal tails Techniques
    Arduino (MEGA) Cerveau Temps el re les boucles de contrôcontrôle rapides (PID, lecture d'interruptions). 
    Python (PC/Interface) Supervision  Affiche l'éétat des capteurs sur éécran. Permet de logger les erreurs ou d'envoyer des commandes de glage.
    Encodeurs OdoméOdométrie Mesurent la rotation exacte des moteurs pour calculer la distance parcourue (en tics).
    Capteurs Ultrasons SécuritéSécurité Anti-collision tectent les obstacles impréimprévus (pied de chaise, personne) et forcent l'arrêarrêt d'urgence.
    Capteur ToF (Laser) Maintien d'Orientation Mesure la distance préprécise par rapport au lit pour s'assurer que le robot reste bien parallèparallèle ou àà la bonne distance du meuble fixe.
    Boutons / Capteur de force Interface Homme-Machine clenchent les scéscénarios : "Sortir du lit", "Ranger le tiroir" ou "Assistance au tirage".
    Drivers Moteurs Puissance ReçReçoivent les signaux logiques de l'Arduino et convertissent l'éénergie de la batterie en courant pour les moteurs.
    Logique de cision 

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

    L'Ultrason voit-il un obstacle àà moins de 20 cm ? Si oui  STOP.

    Le ToF indique-t-il que nous rivons par rapport au lit ? Si oui  Correction de l'angle des roues Mecanum.

    Les Encodeurs ont-ils atteint le nombre de tics calculécalculé ? Si non  Continuer PWM.

     

    <code>

    const int trigAvant = 30;
    const int echoAvant = 31;

    const int trigArriere = 32;
    const int echoArriere = 33;

    const int trigGauche = 34;
    const int echoGauche = 35;

    const int trigDroite = 36;
    const int echoDroite = 37;

    </code>