# Projet Final - Rééducation Ludique

## <span style="color: rgb(0, 0, 0);">**FlexMouv - Dispositif Robotisé de Rééducation des Membres Supérieurs**</span>

##### **Équipe projet**

- <span style="color: rgb(0, 0, 0);"> ATASHIAN Irine</span>
- <span style="color: rgb(0, 0, 0);"> BAIG Seema</span>
- <span style="color: rgb(0, 0, 0);"> Wang Elisa </span>

<span style="color: rgb(0, 0, 0);">FlexMouv est un dispositif robotisé conçu dans le cadre de l'UE MU5MN045. </span>

<span style="color: rgb(0, 0, 0);">Il vise à accompagner la rééducation des membres supérieurs, poignet, avant‑bras, coude et bras, grâce à un système interactif où le patient pilote un petit véhicule via une télécommande.  
Le mouvement du véhicule dans un parcours dédié sollicite différents axes de mobilité, permettant une rééducation progressive, ludique, sécurisée et accessible.</span>

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

<span style="color: rgb(0, 0, 0);">La rééducation des membres supérieurs est essentielle pour les patients souffrant de :</span>

- <span style="color: rgb(0, 0, 0);">**Arthrose** (dégradation articulaire limitant les amplitudes)</span>
- <span style="color: rgb(0, 0, 0);">**Polyarthrite rhumatoïde** (inflammation chronique des articulations)</span>
- <span style="color: rgb(0, 0, 0);">**Tendinites chroniques** (épicondylite, tendinite du poignet)</span>
- <span style="color: rgb(0, 0, 0);">**Séquelles d’AVC** (perte de mobilité fine)</span>
- <span style="color: rgb(0, 0, 0);">**Traumatismes** (fractures, entorses, immobilisation prolongée)</span>
- <span style="color: rgb(0, 0, 0);">**Maladies neuromusculaires** (Parkinson, myopathies)</span>

<span style="color: rgb(0, 0, 0);">Les dispositifs actuels sont souvent :</span>

- <span style="color: rgb(0, 0, 0);">coûteux,</span>
- <span style="color: rgb(0, 0, 0);">peu ludiques,</span>
- <span style="color: rgb(0, 0, 0);">non modulables,</span>
- <span style="color: rgb(0, 0, 0);">ou nécessitent une supervision constante.</span>

<span style="color: rgb(0, 0, 0);">**FlexMouv** répond à ces limites en proposant un système robotisé simple, motivant et adaptable.</span>

##### <span style="color: rgb(0, 0, 0);">**Réflexion sur la problématique &amp; veille sur l’existant**</span>

<span style="color: rgb(0, 0, 0);">La rééducation du membre supérieur repose sur un ensemble d’exercices destinés à restaurer la mobilité, la force et la coordination après une pathologie ou un traumatisme. Pourtant, malgré l’importance de ces séances, de nombreux patients peinent à maintenir une pratique régulière : les exercices sont souvent répétitifs, peu stimulants, et parfois douloureux. Cette réalité crée un véritable enjeu pour les kinésithérapeutes, qui cherchent des outils capables de soutenir l’engagement du patient tout en garantissant une progression sécurisée.</span>

<span style="color: rgb(0, 0, 0);">Dans ce contexte, nous avons étudié différents dispositifs existants afin de comprendre leurs apports, leurs limites et les raisons pour lesquelles un système comme **FlexMouv** peut trouver sa place.</span>

##### <span style="color: rgb(0, 0, 0);">**Les exosquelettes et dispositifs robotisés lourds**</span>

<span style="color: rgb(0, 0, 0);">Les exosquelettes de rééducation (Armeo®, HAL®, ReWalk®, etc.) représentent aujourd’hui l’une des solutions les plus avancées technologiquement. Ils permettent un accompagnement motorisé très précis, une mesure fine des mouvements et une adaptation au niveau du patient. Cependant, ces systèmes présentent plusieurs limites majeures :</span>

- <span style="color: rgb(0, 0, 0);">un coût très élevé, très coûtant pour la majorité des cabinets ou structures de petite taille ;</span>
- <span style="color: rgb(0, 0, 0);">une installation complexe, nécessitant du personnel formé ;</span>
- <span style="color: rgb(0, 0, 0);">une utilisation fatigante pour certains patients, notamment les personnes âgées ;</span>
- <span style="color: rgb(0, 0, 0);">une faible dimension ludique, alors que la motivation est un facteur clé de réussite.</span>

<span style="color: rgb(0, 0, 0);">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/t0nimage.png) ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/t0nimage.png)<span style="text-decoration: underline;">*Dispositif Armeo*</span></span>

<span style="color: rgb(0, 0, 0);">Ces dispositifs sont donc performants, mais peu adaptés à une utilisation simple, régulière et accessible. FlexMouv se positionne volontairement à l’opposé : un outil léger, peu coûteux, facile à mettre en place et utilisable dans des séances courtes.</span>

##### <span style="color: rgb(0, 0, 0);">**Les dispositifs mécaniques traditionnels**</span>

<span style="color: rgb(0, 0, 0);">Les outils classiques de rééducation — roues de mobilisation, poignées, balles, élastiques, tables de mobilisation — sont largement utilisés car ils sont simples, robustes et économiques. Ils permettent de travailler efficacement certaines amplitudes, mais ils souffrent de plusieurs limites :</span>

- <span style="color: rgb(0, 0, 0);">des exercices souvent répétitifs et monotones, qui réduisent l’adhésion du patient ;</span>
- <span style="color: rgb(0, 0, 0);">une mobilisation parfois trop ciblée, ne sollicitant pas la coordination globale bras‑main ;</span>
- <span style="color: rgb(0, 0, 0);">une absence de retour ludique, ce qui peut décourager les patients souffrant de douleurs chroniques.</span>

<span style="color: rgb(0, 0, 0);">FlexMouv apporte ici une réponse intéressante : il transforme un exercice mécanique en une activité engageante, où le patient se concentre sur un objectif (piloter un véhicule) plutôt que sur la douleur ou la difficulté du mouvement.</span>

##### <span style="color: rgb(0, 0, 0);">**Les jeux thérapeutiques et dispositifs ludiques**</span>

<span style="color: rgb(0, 0, 0);">Ces dernières années, plusieurs approches ludiques ont émergé : jeux vidéo adaptés, réalité virtuelle, parcours moteurs, plateformes interactives. Elles ont démontré leur capacité à augmenter la motivation et la répétition des mouvements, deux éléments essentiels en rééducation.</span>

<span style="color: rgb(0, 0, 0);">Cependant, ces solutions présentent elles aussi des limites :</span>

- <span style="color: rgb(0, 0, 0);">un coût matériel important (casques VR, consoles, capteurs) ;</span>
- <span style="color: rgb(0, 0, 0);">des mouvements parfois trop globaux, peu adaptés à un travail fin du poignet ou de l’avant‑bras ;</span>
- <span style="color: rgb(0, 0, 0);">une complexité d’installation dans un cabinet de kinésithérapie classique ;</span>
- <span style="color: rgb(0, 0, 0);">une fatigue visuelle ou cognitive pour certains patients.</span>

<span style="color: rgb(0, 0, 0);">FlexMouv reprend l’idée de jeu , mais dans une version beaucoup plus simple, accessible et centrée sur les articulations du membre supérieur.</span>

##### <span style="color: rgb(0, 0, 0);">**Le modèle de référence étudié**</span>

<span style="color: rgb(0, 0, 0);">Le dispositif présenté dans la vidéo de référence ([https://www.youtube.com/watch?v=Pz2hE\_\_z57c](https://www.youtube.com/watch?v=Pz2hE__z57c)) propose un concept intéressant : un petit véhicule piloté par le patient, évoluant dans un parcours. Ce modèle met en avant :</span>

- <span style="color: rgb(0, 0, 0);">la dimension ludique,</span>
- <span style="color: rgb(0, 0, 0);">la mobilisation naturelle du bras,</span>
- <span style="color: rgb(0, 0, 0);">la possibilité de varier les parcours.</span>

<span style="color: rgb(0, 0, 0);">Cependant, il reste limité sur plusieurs aspects :</span>

- <span style="color: rgb(0, 0, 0);">la télécommande n’est pas pensée pour la rééducation du poignet ;</span>
- <span style="color: rgb(0, 0, 0);">les mouvements sollicités sont peu variés ;</span>
- <span style="color: rgb(0, 0, 0);">la difficulté n’est pas modulable ;</span>
- <span style="color: rgb(0, 0, 0);">aucun capteur ne permet de suivre la posture ou l’inclinaison.</span>

<span style="color: rgb(0, 0, 0);">**FlexMouv** reprend cette idée, mais l’adapte à un cadre thérapeutique : télécommande ergonomique, parcours modulable, sollicitation de plusieurs articulations, possibilité d’intégrer des capteurs, et approche plus sécurisée.</span>

##### <span style="color: rgb(0, 0, 0);">**Conclusion de la veille**</span>

<span style="color: rgb(0, 0, 0);">L’analyse des dispositifs existants montre un paysage contrasté : d’un côté, des solutions très avancées mais coûteuses et complexes ; de l’autre, des outils simples mais peu engageants. FlexMouv se situe volontairement entre ces deux extrêmes. Il propose :</span>

- <span style="color: rgb(0, 0, 0);">une solution accessible,</span>
- <span style="color: rgb(0, 0, 0);">simple à utiliser,</span>
- <span style="color: rgb(0, 0, 0);">ludique,</span>
- <span style="color: rgb(0, 0, 0);">adaptée à différents profils de patients,</span>
- <span style="color: rgb(0, 0, 0);">et capable de solliciter plusieurs articulations du membre supérieur.</span>

<span style="color: rgb(0, 0, 0);">C’est précisément cette combinaison de simplicité et d'efficacité qui fait l’originalité et la pertinence du projet.</span>

#### <span style="color: rgb(0, 0, 0);">**<span style="text-decoration: underline;">Description du dispositif</span>** </span>

<span style="color: rgb(0, 0, 0);">Le dispositif repose sur un principe simple : le patient tient une télécommande et dirige un petit véhicule dans un parcours, ce qui l’amène à mobiliser différentes articulations selon les mouvements nécessaires.   
</span>

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

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

- <span style="color: rgb(0, 0, 0);">améliorer la mobilité du poignet (flexion, extension, pronation, supination)</span>
- <span style="color: rgb(0, 0, 0);">renforcer les muscles de l’avant‑bras</span>
- <span style="color: rgb(0, 0, 0);">encourager la coordination bras‑main</span>
- <span style="color: rgb(0, 0, 0);">proposer une rééducation progressive et sécurisée</span>
- <span style="color: rgb(0, 0, 0);">offrir un appareil peu coûteux, robuste et accessible</span>

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

<span style="color: rgb(0, 0, 0);">Le concept s’inspire de dispositifs ludiques de rééducation, notamment le modèle présenté dans la vidéo suivante : https://www.youtube.com/watch?v=Pz2hE\_\_z57c . Nous reprenons l’idée du parcours et du contrôle manuel, mais en l’intégrant dans un système robotisé plus complet.</span>

##### **<span style="color: rgb(0, 0, 0);">Définition du projet</span>**

<span style="color: rgb(0, 0, 0);">La conception de FlexMouv part d’un constat simple : la rééducation du membre supérieur nécessite des exercices réguliers, variés et adaptés, mais les outils disponibles sont souvent soit trop basiques, soit trop coûteux, soit trop peu engageants pour maintenir la motivation du patient. Notre projet vise donc à proposer un dispositif robotisé accessible, ludique et suffisamment polyvalent pour être utilisé dans différents contextes thérapeutiques.</span>

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

<span style="color: rgb(0, 0, 0);">a) Les patients en rééducation (atteints d’arthrose, de tendinites, de séquelles d’AVC ou de maladies neuromusculaires) ont besoin :</span>

- <span style="color: rgb(0, 0, 0);">d’un outil simple à prendre en main, même en cas de faiblesse musculaire ;</span>
- <span style="color: rgb(0, 0, 0);">d’exercices progressifs, qui respectent leurs limites ;</span>
- <span style="color: rgb(0, 0, 0);">d’un dispositif motivant, qui détourne l’attention de la douleur ;</span>
- <span style="color: rgb(0, 0, 0);">d’un environnement sécurisé, sans risque de chute ou de surcharge articulaire.</span>

<span style="color: rgb(0, 0, 0);">b) Kinésithérapeutes, les professionnels recherchent : </span>

- <span style="color: rgb(0, 0, 0);">un outil **polyvalent**, capable de solliciter plusieurs articulations ;</span>
- <span style="color: rgb(0, 0, 0);">un dispositif **rapide à installer**, utilisable en séance courte ;</span>
- <span style="color: rgb(0, 0, 0);">un support permettant d’**observer la qualité du mouvement** (fluidité, amplitude, précision) ;</span>
- <span style="color: rgb(0, 0, 0);">un matériel **fiable et robuste**, facile à intégrer dans une séance classique.</span>

<span style="color: rgb(0, 0, 0);">c) Centres de rééducation --&gt; les structures ont besoin :</span>

- <span style="color: rgb(0, 0, 0);">d’un dispositif peu coûteux, compatible avec des budgets limités ;</span>
- <span style="color: rgb(0, 0, 0);">d’un matériel transportable, utilisable dans différentes salles ;</span>
- <span style="color: rgb(0, 0, 0);">d’un système modulable, adaptable à différents profils de patients ;</span>
- <span style="color: rgb(0, 0, 0);">d’un outil sans maintenance complexe, contrairement aux exosquelettes ou systèmes motorisés lourds.</span>

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

<span style="color: rgb(0, 0, 0);">**MVP (Minimum Viable Product) :** Le robot avance, recule et tourne en réponse à l'inclinaison de la main, via une communication sans fil et avec support pour la main et un parcours.</span>

Ce dispositif permet de travailler :

<div id="bkmrk-articulation-mouveme"><div><div aria-label="Table défilante" role="region" tabindex="0"><table><thead><tr><th><span style="color: rgb(0, 0, 0);">Articulation</span></th><th><span style="color: rgb(0, 0, 0);">Mouvement sollicité</span></th></tr></thead><tbody><tr><td><span style="color: rgb(0, 0, 0);">Poignet</span></td><td><span style="color: rgb(0, 0, 0);">Flexion / extension</span></td></tr><tr><td><span style="color: rgb(0, 0, 0);">Poignet</span></td><td><span style="color: rgb(0, 0, 0);">Pronation / supination</span></td></tr><tr><td><span style="color: rgb(0, 0, 0);">Coude</span></td><td><span style="color: rgb(0, 0, 0);">Flexion</span></td></tr><tr><td><span style="color: rgb(0, 0, 0);">Épaule</span></td><td><span style="color: rgb(0, 0, 0);">Élévation du bras</span></td></tr><tr><td><span style="color: rgb(0, 0, 0);">Avant‑bras</span></td><td><span style="color: rgb(0, 0, 0);">Travail des tendons et muscles stabilisateurs</span></td></tr></tbody></table>

</div></div></div><span style="color: rgb(0, 0, 0);">**Contraintes Techniques** </span>

- <span style="color: rgb(0, 0, 0);">sécurité du patient</span>
- <span style="color: rgb(0, 0, 0);">ergonomie de la prise en main</span>
- <span style="color: rgb(0, 0, 0);">résistance mécanique</span>
- <span style="color: rgb(0, 0, 0);">coût réduit</span>
- <span style="color: rgb(0, 0, 0);">facilité de nettoyage</span>
- <span style="color: rgb(0, 0, 0);">modularité du parcours</span>

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

<div class="overflow-x-auto w-full px-2 mb-6" id="bkmrk-composant-choix-rete"><table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal" style="width: 100%; height: 460.422px;"><thead class="text-left"><tr style="height: 29.7969px;"><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col" style="width: 28.4203%; height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Composant</span></th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col" style="width: 24.2209%; height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Choix retenu</span></th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col" style="width: 47.2278%; height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Justification</span></th></tr></thead><tbody><tr style="height: 46.25px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 28.4203%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Microcontrôleur télécommande</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 24.2209%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Adafruit Feather ESP32-S2</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 47.2278%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Compact, WiFi intégré, compatible accéléromètre Grove</span></td></tr><tr style="height: 46.25px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 28.4203%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Microcontrôleur robot</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 24.2209%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Arduino Uno</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 47.2278%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Compatible direct avec le shield moteur, fiable</span></td></tr><tr style="height: 46.25px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 28.4203%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Accéléromètre</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 24.2209%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Grove ADXL345 ±16g</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 47.2278%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Interface I2C simple, plage suffisante, librairie disponible</span></td></tr><tr style="height: 46.5938px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 28.4203%; height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Communication sans fil</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 24.2209%; height: 46.5938px;"><span style="color: rgb(0, 0, 0);">nRF24L01+ GT020</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 47.2278%; height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Portée 50m, faible coût, simple d'utilisation, Fréquence 2.4GHz</span></td></tr><tr style="height: 46.5938px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 28.4203%; height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Driver moteur</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 24.2209%; height: 46.5938px;"><span style="color: rgb(0, 0, 0);">DFRobot DRI0009 (puce L298P)</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 47.2278%; height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Emboîtement direct sur l'Uno, pas de câblage complexe</span></td></tr><tr style="height: 46.25px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 28.4203%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Châssis</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 24.2209%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">DG007</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 47.2278%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Compact, 2 roues motrices + roue libre, stable</span></td></tr><tr style="height: 46.5938px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 28.4203%; height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Parcours</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 24.2209%; height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Découpe laser Peuplier 6mm</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 47.2278%; height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Modulaire, rapide à modifier, léger</span></td></tr><tr style="height: 46.25px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 28.4203%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Support main</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 24.2209%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Impression 3D PLA </span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 47.2278%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Forme ergonomique personnalisable</span></td></tr></tbody></table>

</div>#### **Cas d'usage**  


<span style="color: rgb(0, 0, 0);">Mme L., 62 ans, est suivie en kinésithérapie pour une **arthrose sévère du poignet droit**, aggravée par plusieurs années de douleurs chroniques et une perte progressive de mobilité. Elle présente :</span>

- <span style="color: rgb(0, 0, 0);">raideur matinale importante</span>
- <span style="color: rgb(0, 0, 0);">douleur à la flexion et à l’extension</span>
- <span style="color: rgb(0, 0, 0);">faiblesse musculaire de l’avant‑bras</span>
- <span style="color: rgb(0, 0, 0);">difficulté à effectuer des gestes du quotidien (ouvrir un bocal, tourner une clé, porter un sac)</span>

<span style="color: rgb(0, 0, 0);">Son kinésithérapeute souhaite introduire un outil **ludique**, **progressif** et **sécurisé** pour compléter les exercices classiques.</span>

#### <span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;">**Scénario d'utilisation**</span></span>

- La patiente s’installe.
- Le kiné choisit un **parcours simple**, avec quelques virages et une petite rampe.
- Elle saisit la télécommande, et dirige le véhicule : 
    - tourner → pronation / supination
    - avancer → extension du bras
    - franchir un obstacle → flexion du poignet
- Pour une séance de 20 min, 5 min de jeu sont suffisants.
- Le thérapeute observe la fluidité, l’amplitude et la précision des mouvements.
- Le patient repose la télécommande à la fin de l'exercice.

#### <span style="text-decoration: underline;">**Analyse du modèle de référence**</span>

Le modèle de la vidéo propose un parcours simple avec un véhicule contrôlé manuellement. Nous reprenons :

- l’aspect ludique
- la stimulation motrice par le pilotage
- la modularité du parcours

Nous améliorons :

- l’ergonomie de la télécommande
- la variété des mouvements sollicités
- la possibilité d’adapter la difficulté
- la sécurité et la stabilité du bras

#### <span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;">**Gestion de projet**</span></span>

<span style="color: rgb(0, 0, 0);">**Répartition des rôles :**</span>

<div class="overflow-x-auto w-full px-2 mb-6" id="bkmrk-membre-r%C3%B4le-principa"><table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal"><thead class="text-left"><tr><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col"><span style="color: rgb(0, 0, 0);">Membre</span></th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col"><span style="color: rgb(0, 0, 0);">Rôle principal</span></th></tr></thead><tbody><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><span style="color: rgb(0, 0, 0);">Elisa Wang</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><span style="color: rgb(0, 0, 0);">Électronique &amp; code</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><span style="color: rgb(0, 0, 0);">Irine Atashian</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><span style="color: rgb(0, 0, 0);">Modélisation 3D</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><span style="color: rgb(0, 0, 0);">Seema Baig</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><span style="color: rgb(0, 0, 0);">Découpe laser</span></td></tr></tbody></table>

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

<div class="overflow-x-auto w-full px-2 mb-6" id="bkmrk-semaine-t%C3%A2che-respon"><table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal" style="width: 63.4568%; height: 344.167px;"><thead class="text-left"><tr style="height: 29.7917px;"><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col" style="width: 17.3389%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Semaine</span></th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col" style="width: 63.1156%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Tâche</span></th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col" style="width: 19.6753%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Responsable</span></th></tr></thead><tbody><tr style="height: 29.7917px;"><td style="width: 17.3389%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">S1</span></td><td style="width: 63.1156%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Assemblage châssis</span></td><td style="width: 19.6753%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Tous</span></td></tr><tr style="height: 29.7917px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 17.3389%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">S2</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 63.1156%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Test accéléromètre + vérification des données</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 19.6753%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Elisa</span></td></tr><tr style="height: 29.7917px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 17.3389%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">S3</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 63.1156%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Code communication sans fil émetteur</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 19.6753%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Elisa</span></td></tr><tr style="height: 29.7917px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 17.3389%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">S3</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 63.1156%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Code communication sans fil récepteur</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 19.6753%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Elisa</span></td></tr><tr style="height: 29.7917px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 17.3389%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">S4</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 63.1156%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Test moteurs + ajustement du prototype</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 19.6753%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Elisa</span></td></tr><tr style="height: 29.7917px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 17.3389%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">S4</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 63.1156%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Modélisation 3D support main</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 19.6753%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Irine</span></td></tr><tr style="height: 29.7917px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 17.3389%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">S4</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 63.1156%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Fichiers découpe laser parcours</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 19.6753%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Seema</span></td></tr><tr style="height: 46.25px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 17.3389%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">S5</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 63.1156%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Impression 3D + découpe laser</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 19.6753%; height: 46.25px;"><span style="color: rgb(0, 0, 0);">Irine +Seema</span></td></tr><tr style="height: 29.7917px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 17.3389%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">S5</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 63.1156%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Intégration complète + tests</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 19.6753%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Tous</span></td></tr><tr style="height: 29.7917px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 17.3389%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">S5</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 63.1156%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Documentation + photos/vidéos</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 19.6753%; height: 29.7917px;"><span style="color: rgb(0, 0, 0);">Tous</span></td></tr></tbody></table>

</div>#### <span style="text-decoration: underline;">**Electronique**</span>

<span style="color: rgb(0, 0, 0);">**Liste du matériel avec coût :**</span>

<table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal" id="bkmrk-composant-quantit%C3%A9-r" style="width: 77.5309%;"><thead class="text-left"><tr><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">Composant</span></th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">Quantité</span></th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Rôle</span></th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">Coût estimé</span></th></tr></thead><tbody><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">Adafruit Feather ESP32-S2</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">1</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Microcontrôleur télécommande</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">~20€</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">Arduino Uno</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">1</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Microcontrôleur robot</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">~10€</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">Grove ADXL345 ±16g</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">1</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Accéléromètre (détection inclinaison)</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">~8€</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">Module nRF24L01+ GT020</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">2</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Communication sans fil 2.4GHz</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">~3€ x2</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">DFRobot DRI0009 Shield</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">1</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Driver moteur</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">~17€</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">Châssis DG007</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">1</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Base mobile du robot</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">~10€</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">Moteurs DC</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">2</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Propulsion</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">inclus châssis</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">Batterie LiPo 3.7V</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">1</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Alimentation Feather</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">~5€</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">Piles AA x4</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">4</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Alimentation moteurs</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">~2€</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">Peuplier 6mm</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">~50x80cm</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Parcours découpe laser</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">~3€</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">Filament PLA</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">~50g</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Support main (3D)</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">~2€</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">Fils Dupont</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"><span style="color: rgb(0, 0, 0);">~20</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"><span style="color: rgb(0, 0, 0);">Connexions</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">~1€</span></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.8516%;"><span style="color: rgb(0, 0, 0);">**TOTAL**</span></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 13.359%;"> </td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 40.5717%;"> </td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 16.1627%;"><span style="color: rgb(0, 0, 0);">**~84€**</span></td></tr></tbody></table>

##### <span style="color: rgb(224, 62, 45);">**<span style="color: rgb(0, 0, 0);">  
Montage</span>**</span>

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

##### <span style="color: rgb(224, 62, 45);">**<span style="color: rgb(0, 0, 0);">Code </span>**</span>

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

```c++
#include <SPI.h>
#include <RF24.h>
#include <Wire.h>
#include <ADXL345.h>

#define PIN_I2C_POWER 6
RF24 radio(9, 10);
const byte address[6] = "00001";

ADXL345 adxl;
#define SEUIL    0.25
#define DEADZONE 0.10
#define NB_SAMPLES 8
float ax_buf[NB_SAMPLES] = {0};
float ay_buf[NB_SAMPLES] = {0};
float ax_offset = 0;
float ay_offset = 0;
int buf_index = 0;
String lastCommand = "";

float moyenne(float* buf) {
  float sum = 0;
  for (int i = 0; i < NB_SAMPLES; i++) sum += buf[i];
  return sum / NB_SAMPLES;
}

String getCommand(float ax, float ay) {
  if (abs(ax) < DEADZONE && abs(ay) < DEADZONE) return "STOP";
  if (abs(ax) >= abs(ay)) {
    if (ax < -SEUIL) return "AVANCE";
    if (ax >  SEUIL) return "RECULE";
  } else {
    if (ay >  SEUIL) return "DROITE";
    if (ay < -SEUIL) return "GAUCHE";
  }
  return "STOP";
}

void setup() {
  Serial.begin(115200);
  pinMode(PIN_I2C_POWER, OUTPUT);
  digitalWrite(PIN_I2C_POWER, HIGH);
  delay(300);
  Wire.begin();
  adxl.powerOn();
  adxl.setRangeSetting(4);
  adxl.setSpiBit(0);
  if (!radio.begin()) {
    Serial.println("❌ nRF24L01 non détecté !");
    while(1);
  }
  radio.setChannel(108);
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_LOW);
  radio.stopListening();
  Serial.println("✅ Émetteur nRF24 prêt !");
  // Calibration : moyenne sur 50 échantillons au repos
  Serial.println("Calibration en cours, ne bougez pas...");
  float sum_x = 0, sum_y = 0;
  for (int i = 0; i < 50; i++) {
    double xyz[3];
    adxl.getAcceleration(xyz);
    sum_x += (float)xyz[0];
    sum_y += (float)xyz[1];
    delay(20);
  }
  ax_offset = sum_x / 50.0;
  ay_offset = sum_y / 50.0;
  Serial.print("Offset ax="); Serial.print(ax_offset);
  Serial.print(" ay="); Serial.println(ay_offset);
  Serial.println("✅ Calibration terminée !");
}

void loop() {
  double xyz[3];
  adxl.getAcceleration(xyz);
  ax_buf[buf_index] = (float)xyz[0] - ax_offset;
  ay_buf[buf_index] = (float)xyz[1] - ay_offset;
  float ax = moyenne(ax_buf);
  float ay = moyenne(ay_buf);
  String cmd = getCommand(ax, ay);
  if (cmd != lastCommand) {
    char msg[10];
    memset(msg, 0, sizeof(msg));
    cmd.toCharArray(msg, sizeof(msg));
    bool ok = radio.write(msg, sizeof(msg));
    Serial.println("→ Envoyé : " + cmd + (ok ? " ✅" : " ❌"));
    lastCommand = cmd;
  }
  delay(20);
}
```

<span style="color: rgb(224, 62, 45);">**<span style="color: rgb(0, 0, 0);">Récepteur   
</span>**</span>

```c++
#include <SPI.h>
#include <RF24.h>

RF24 radio(9, 10);
const byte address[6] = "00001";

#define E1 5
#define M1 4
#define E2 6
#define M2 7

String lastCommand = "";

void stopAll() {
  analogWrite(E1, 0); analogWrite(E2, 0);
  digitalWrite(M1, LOW); digitalWrite(M2, LOW);
}
void avance() {
  digitalWrite(M1, LOW);  digitalWrite(M2, LOW);
  analogWrite(E1, 200); analogWrite(E2, 205);
}
void recule() {
  digitalWrite(M1, HIGH); digitalWrite(M2, HIGH);
  analogWrite(E1, 200); analogWrite(E2, 205);
}
void tourne_droite() {
  digitalWrite(M1, LOW);  digitalWrite(M2, HIGH);
  analogWrite(E1, 130); analogWrite(E2, 130);
}
void tourne_gauche() {
  digitalWrite(M1, HIGH); digitalWrite(M2, LOW);
  analogWrite(E1, 130); analogWrite(E2, 130);
}

void setup() {
  Serial.begin(9600);
  pinMode(E1, OUTPUT); pinMode(M1, OUTPUT);
  pinMode(E2, OUTPUT); pinMode(M2, OUTPUT);
  stopAll();
// Tentatives multiples de démarrage
  int tentatives = 0;
  while (!radio.begin()) {
    Serial.println("Tentative " + String(++tentatives) + "...");
    delay(500);
    if (tentatives > 10) {
      Serial.println("❌ nRF24L01 non détecté !");
      while(1);
    }
  }

  radio.setChannel(108);
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening();
  Serial.println("✅ Récepteur nRF24 prêt !");
}

void loop() {
  if (radio.available()) {
    char msg[10] = "";
    radio.read(&msg, sizeof(msg));
    String cmd = String(msg);
    cmd.trim();
    if (cmd.length() == 0) return; 
    if (cmd != lastCommand) {
      Serial.println("← Reçu : " + cmd);
      if      (cmd == "AVANCE") avance();
      else if (cmd == "RECULE") recule();
      else if (cmd == "DROITE") tourne_droite();
      else if (cmd == "GAUCHE") tourne_gauche();
      else if (cmd == "STOP")   stopAll();
      lastCommand = cmd;
    }
  }
}
```

#### <span style="text-decoration: underline;">**Impression 3D**</span>

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

<span style="color: rgb(0, 0, 0);">Logiciels utilisés : Fusion 360 + PrusaSlicer</span>

<span style="color: rgb(0, 0, 0);">Boîte pour les composants suivants : batterie et microcontrôleurs esp32 s2 et nRF24L01  
Dimension : largeur 10cm, hauteur 5cm, profondeur 3cm  
Fentes sur les côtés pour faire passer les sangles qui permettent le maintient de la boîte sur l'avant bras  
Trou à l'avant pour faire passer les câbles qui se connectent au capteur</span>

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

Plaque simple pour positionner de manière stable le capteur sur le dos de la main. Fentes des deux côtés pour fixation.

[![plaque.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/plaque.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/plaque.png)[![IMG_9364.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/img-9364.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/img-9364.jpg)

<span style="color: rgb(0, 0, 0);">PrusaSlicer : sans support, remplissage à 10%, filament : generic PLA</span>

<span style="color: rgb(0, 0, 0);">L'ensemble des composants sont fixés à l'aide d'un ruban adhésif double face. </span>



#### <span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;">**Problèmes rencontrés et solutions apportées**</span></span>

<span style="color: rgb(0, 0, 0);">**Problème 1 - ESP32-S2 défectueux (port I2C inutilisable)**</span>

<span style="color: rgb(0, 0, 0);">Lors des premiers tests, le scanner I2C ne détectait pas l'accéléromètre ADXL345 malgré un câblage correct. Après de nombreux essais de pins et de configurations, nous avons remplacé la carte par un autre Feather ESP32-S2, à ce moment là, l'accéléromètre a été immédiatement détecté. La première carte avait le port I2C interne défaillant (une branche du port I2C manquait).</span>

<span style="color: rgb(0, 0, 0);">**Problème 2 - Bluetooth inexistant sur l'ESP32-S2** </span>

<span style="color: rgb(0, 0, 0);">Notre première approche utilisait deux Feather ESP32-S2, un pour l'émetteur et un pour le récepteur, avec une communication Bluetooth. Nous avons découvert que l'ESP32-S2 ne dispose d'aucun Bluetooth (ni Classic ni BLE). Nous avons d'abord basculé sur WiFi UDP entre les deux ESP32-S2, solution qui fonctionnait correctement.</span>

<span style="color: rgb(0, 0, 0);">**Problème 3 - Incompatibilité entre l'ESP32-S2 et le Shield**</span>

<span style="color: rgb(0, 0, 0);">L'ESP32-S2 prévu pour le récepteur s'est révélé incompatible avec le shield DFRobot L298P, même après de nombreuses tentatives, les moteurs ne répondaient pas. Nous avons donc remplacé l'ESP32-S2 récepteur par un Arduino Uno sur lequel le shield s'emboîte directement, et adopté 2 nRF24L01 pour la communication sans fil entre les deux cartes.</span>

<span style="color: rgb(0, 0, 0);">**Problème 4 - Valeurs accéléromètre incorrectes au repos**</span>

<span style="color: rgb(0, 0, 0);">L'accéléromètre présentait un offset (ax = -0.35 au repos au lieu de 0). Solution : calibration automatique au démarrage sur 50 échantillons, calcul d'offset soustrait en temps réel.</span>

<span style="color: rgb(0, 0, 0);">**Problème 5 - nRF24L01 récepteur non fonctionnel en 3.3V**</span>

<span style="color: rgb(0, 0, 0);">Malgré les caractéristiques du module indiquant une alimentation de 3.3V, le module côté récepteur ne fonctionnait pas de façon stable à cette tension sur l'Arduino Uno. En branchant le VCC sur le 5V de l'Arduino Uno, le module a fonctionné correctement. Explication probable : le régulateur 3.3V de l'Arduino Uno ne fournit pas suffisamment de courant lors des pics de transmission radio, ce qui entraîne des chutes de tension et des dysfonctionnements.</span>

<span style="color: rgb(0, 0, 0);">**Problèmes 6 - Problème d'impression**</span>

<span style="color: rgb(0, 0, 0);">Manque d'adhérence à la surface de l'imprimante, problème de filament. Problèmes réglés en diminuant un peu la taille de la boîte et en retirant les supports.</span>

#### <span style="text-decoration: underline;">**Prototype final**</span>

[Vidéo test prototype](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1772)

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

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

#### **<span style="text-decoration: underline;">Analyse critique du prototype</span>** 

##### **Limites du dispositif**

- Absence de retour de force (pas de résistance réelle)
- Pas de suivi des performances
- Précision dépendante de la stabilité du capteur ADXL345

##### **Pistes d’amélioration**

- Utilisation d’un capteur IMU (gyro + accéléromètre) comme le MPU6050, pour améliorer la précision et la stabilité des mouvements
- Ajouter une résistance physique à la télécommande (exemple élastique)
- Parcours gamifié avec en plusieurs niveaux de difficulté progressif et un système de score
- Application mobile simple de pour visualiser les progrès avec l'historique des séances

#### <span style="text-decoration: underline;">**Sources &amp; ressources**</span>

- Vidéo d'inspiration : [https://www.youtube.com/watch?v=Pz2hE\_\_z57c](https://www.youtube.com/watch?v=Pz2hE__z57c)
- Documentation Adafruit Feather ESP32-S2 : [https://learn.adafruit.com/adafruit-esp32-s2-feather](https://learn.adafruit.com/adafruit-esp32-s2-feather)
- Librairie ADXL345 Seeed Studio : [https://github.com/Seeed-Studio/Accelerometer\_ADXL345](https://github.com/Seeed-Studio/Accelerometer_ADXL345)
- Librairie RF24 : [https://docs.arduino.cc/libraries/rf24/](https://docs.arduino.cc/libraries/rf24/)
- Documentation DFRobot L298P Shield : [https://www.alldatasheet.fr/html-pdf/2214539/DFROBOT/DRI0009/342/1/DRI0009.html](https://www.alldatasheet.fr/html-pdf/2214539/DFROBOT/DRI0009/342/1/DRI0009.html)