Différences entre versions de « Projets:Bionic mouse »
(136 versions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
+ | {{Infobox projet | ||
+ | |Image principale=Bionic mouse.jpg | ||
+ | |Description=Contrôler le déplacement du curseur et des clics droit et gauche d'une souris d'ordinateur par contractions musculaires. | ||
+ | |Porteur de projet=Bionico | ||
+ | |Contributeurs=Pierre M | ||
+ | |Fabmanager=Yo | ||
+ | |Référent documentation=Pierre M, Delphine | ||
+ | |Catégorie de handicap=Membre supérieur | ||
+ | |Etat d'avancement=Réalisés | ||
+ | |Statut de la documentation=Complète | ||
+ | |Relecture de la documentation=Non vérifiée | ||
+ | |Durée de fabrication=de 4 à 8 h | ||
+ | |Niveau=Facile | ||
+ | |Licence=by-sa | ||
+ | |Projet date=2020-03-10 | ||
+ | |Nom humanlab=Humanlab_MHK | ||
+ | }} | ||
+ | |||
+ | |||
== Description du projet == | == Description du projet == | ||
Le but de ce projet est de réaliser une prothèse permettant à des utilisateurs dépourvus d'une main valide de pouvoir se servir d’une souris d’ordinateur. | Le but de ce projet est de réaliser une prothèse permettant à des utilisateurs dépourvus d'une main valide de pouvoir se servir d’une souris d’ordinateur. | ||
− | Cette solution s'adapte | + | Cette solution s'adapte au [https://orthopus.com/poignet-universel/ poignet universel] commercialisé par l’entreprise Orthopus, et utilise les contractions musculaires de l’avant-bras comme de signaux de commande des clics de la souris. |
== Cahier des charges == | == Cahier des charges == | ||
− | '''Objectif''' : Contrôler le déplacement du curseur et des clics droit et gauche d'une souris d'ordinateur en utilisant les contractions musculaires de l'avant-bras comme signaux de commandes. | + | '''Objectif''' : Contrôler le déplacement du curseur et des clics droit et gauche d'une souris d'ordinateur en utilisant les contractions musculaires de l'avant-bras comme signaux de commandes. |
− | '''Pour qui''' : Pour toutes personnes désirant utiliser une souris d'ordinateur comme outil au bout d'un poignet universel recevant les signaux de contractions musculaires de l'avant-bras. | + | '''Pour qui''' : Pour toutes personnes désirant utiliser une souris d'ordinateur comme outil au bout d'un poignet universel recevant les signaux de contractions musculaires de l'avant-bras. Il faut au moins deux capteurs distincts, disposés de part et d'autre de l'avant-bras. Par la suite on parlera de la partie supérieure ou "haute", et de la partie inférieure ou "basse" de l'avant-bras. |
'''Fonctions''' : | '''Fonctions''' : | ||
* Déplacement du curseur sur l'écran | * Déplacement du curseur sur l'écran | ||
− | * Clic gauche | + | * Clic gauche simple |
− | * Clic droit | + | * Clic gauche double |
+ | * Clic gauche triple | ||
+ | * Clic gauche maintenu | ||
+ | * Clic droit simple | ||
+ | |||
'''Contraintes''' : | '''Contraintes''' : | ||
Ligne 19 : | Ligne 42 : | ||
* La solution n’est pas exclusive, elle doit pouvoir se répliquer sur un maximum de souris | * La solution n’est pas exclusive, elle doit pouvoir se répliquer sur un maximum de souris | ||
− | '''Combien''' : | + | '''Combien''' : ~25€ (sans compter le prix du porte-outil électrifié de chez Orthopus) |
'''Où''' : Au [https://myhumankit.org/le-humanlab/ Humanlab], ou dans un Fablab proche de chez vous : [https://www.makery.info/labs-map/ Carte des Fablabs par Makery] | '''Où''' : Au [https://myhumankit.org/le-humanlab/ Humanlab], ou dans un Fablab proche de chez vous : [https://www.makery.info/labs-map/ Carte des Fablabs par Makery] | ||
Ligne 36 : | Ligne 59 : | ||
== Matériel nécessaire == | == Matériel nécessaire == | ||
− | * Souris d'ordinateur, filaire ou non | + | * Emboiture d'avant-bras avec deux capteurs EMG (ElectroMyoGramme), un poignet universel et porte outil électrifié |
− | * | + | * Souris d'ordinateur démontable, filaire ou non, de taille moyenne à grosse pour pouvoir y faire tenir tout l'électronique |
+ | * Carte Arduino [https://fr.aliexpress.com/item/32341832857.html?spm=a2g0o.productlist.0.0.720a557dMyy3i6&algo_pvid=f7622d2b-15e8-44ee-946b-0f0b91662743&algo_exp_id=f7622d2b-15e8-44ee-946b-0f0b91662743-0 Nano] ou [https://fr.aliexpress.com/item/32821902128.html?spm=a2g0o.productlist.0.0.5f152c80XHGqvO&algo_pvid=75d2e7fe-8821-4f49-8f22-919d5f61bf1b&algo_exp_id=75d2e7fe-8821-4f49-8f22-919d5f61bf1b-1 Mini pro 5V] (et son [https://fr.aliexpress.com/item/32519490747.html?spm=a2g0o.productlist.0.0.7a37a86a74B3Qf&algo_pvid=05c340fa-835e-4de3-9fc1-997c0287c990&algo_exp_id=05c340fa-835e-4de3-9fc1-997c0287c990-0 adaptateur]) | ||
+ | * [https://fr.aliexpress.com/item/32997420752.html?spm=a2g0o.productlist.0.0.7716199dUjPdmV&algo_pvid=21fd6d3a-4368-4a74-a845-b2eddfb3c491&algo_exp_id=21fd6d3a-4368-4a74-a845-b2eddfb3c491-1 Transistor 2N2222] x2 | ||
+ | * [https://fr.aliexpress.com/item/1005001552094086.html?spm=a2g0o.productlist.0.0.685a56474RT2f5&algo_pvid=b8578487-e268-4366-b10e-acf788023664&algo_exp_id=b8578487-e268-4366-b10e-acf788023664-1 Diode 1N4007] x1 | ||
+ | * [https://fr.aliexpress.com/item/1005001437060077.html?spm=a2g0o.productlist.0.0.30ab1cdaXtRUh6&algo_pvid=be8702ee-3006-493e-ae95-336743db38f5&algo_exp_id=be8702ee-3006-493e-ae95-336743db38f5-1 Circuit imprimé universel], suffisamment petit pour rentrer dans le boitier de la souris | ||
+ | * Fil électrique (coloré de préférence pour s'y retrouver plus facilement) | ||
+ | * Etain | ||
+ | * [https://fr.aliexpress.com/item/4001198323975.html?spm=a2g0o.productlist.0.0.603678ad7Cf51k&algo_pvid=98c13317-12cd-43a8-9095-f11ef3ad6d2a&algo_exp_id=98c13317-12cd-43a8-9095-f11ef3ad6d2a-0 Roulement à billes 608zz] x1 | ||
+ | * Filament PLA ou ABS | ||
+ | * Colle forte | ||
== Outils nécessaires == | == Outils nécessaires == | ||
+ | * Tournevis de précision | ||
+ | * Fer à souder | ||
+ | * Pompe à dessouder | ||
+ | * Pince à dénuder | ||
+ | * Pince coupante | ||
+ | * Ordinateur avec le logiciel Arduino | ||
+ | * Carte Arduino Uno ou Nano | ||
+ | * Cable USB A-Mini USB (Nano et Mini) et USB A-USB B (Uno) | ||
+ | * Multimètre | ||
+ | * Dremel avec foret ~3mm | ||
+ | * Petite lime plate | ||
+ | * Imprimante 3D | ||
+ | * Pistolet à colle | ||
+ | * (Ordinateur avec le logiciel Fusion 360, ou autre logiciel de CAO) | ||
== Coût == | == Coût == | ||
+ | |||
+ | En comparant les différents prix et en achetant local pour éviter les frais de livraison pour certains composants, le total peut revenir à environ '''25€''', sans compter le prix du porte-outil électrifié de chez Orthopus. | ||
== Délai estimé == | == Délai estimé == | ||
+ | |||
+ | Il faut compter environ '''6h''' de réalisation (cf. le détail en bas de page). | ||
== Fichiers source == | == Fichiers source == | ||
+ | |||
+ | * Code arduino : [[:File:Code_Bionic_Mouse.zip]] | ||
+ | * Fichiers 3D : [[:File:Pièces 3D Bionic mouse.zip]] | ||
== Étapes de fabrication pas à pas == | == Étapes de fabrication pas à pas == | ||
+ | |||
+ | Pour cet exemple, on utilise une souris filaire NGS disponible [https://www.amazon.fr/Ngs-Souris-USB-Flame-Black/dp/B01618WO9O/ref=sr_1_5?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=souris+ngs&qid=1625823201&sr=8-5 ici], mais ces bidouilles sont reproductibles sur la plupart des souris. | ||
+ | |||
+ | '''<big>1 - Démontage de la souris </big>''' | ||
+ | |||
+ | La première étape est de repérer sur votre souris où est la petite vis qui maintient la souris entière. Elle peut être directement visible, cachée sous une étiquette, ou sous le capot des piles pour une souris bluetooth. | ||
+ | |||
+ | Cependant, il arrive que des souris ne soient pas démontables via une vis, je vous conseille donc de changer de souris pour vous éviter de forcer l'ouverture de la souris et de risquer de la casser. | ||
+ | |||
+ | [[File:Souris non démontée.jpg|400px]] | ||
+ | |||
+ | '''<big>2 - Retrait du circuit imprimé</big>''' | ||
+ | |||
+ | Une fois la souris ouverte, il vous faut retirer le circuit imprimé afin d'accéder aux soudures de celui-ci. | ||
+ | |||
+ | Faites attention à ne pas endommager les clips d'attache du circuit imprimé, par la suite on remettra le circuit à sa place et il faudra qu'il tienne en place pour que le système optique de la souris continue de fonctionner correctement. | ||
+ | |||
+ | Faites également attention à ne pas perdre le prisme en plastique en dessous de la souris. | ||
+ | |||
+ | [[File:Circuit imprimé visible 2.jpg|350px]] | ||
+ | [[File:Circuit imprimé non déssoudé recto2.jpg|350px]] | ||
+ | [[File:Circuit imprimé non déssoudé verso 2.jpg|350px]] | ||
+ | |||
+ | [[File:prisme 2.jpg|400px|Prisme à ne pas perdre!]] | ||
+ | |||
+ | '''<big>3 - Dessoudage (ou dessoudure?) des boutons poussoirs des clics de la souris</big>''' | ||
+ | |||
+ | Repérez les boutons poussoirs correspondants aux clics gauche (en bleu) et droit (en rose) de la souris. | ||
+ | |||
+ | [[File:Circuit imprimé non déssoudé recto entouré.jpg|400px]] | ||
+ | [[File:Circuit imprimé non déssoudé verso entouré.jpg|400px]] | ||
+ | |||
+ | A l'aide d'un fer à souder et d'une pompe à dessouder, retirez ces boutons poussoirs du circuit imprimé. | ||
+ | |||
+ | Repérez également quelles pattes du bouton poussoir étaient soudées au circuit imprimé. Ce sont à ces endroits que l'on soudera deux fils par clic plus tard. | ||
+ | |||
+ | Si jamais les trois pattes du bouton poussoir étaient soudées, vérifiez où se fait la fermeture du bouton poussoir à l'aide d'un multimètre réglé sur la fonction "bipeur". Demandez de l'aide à un fabmanager si vous ne savez pas comment faire. | ||
+ | |||
+ | [[File:Circuit dessoudé.jpg|450px]] | ||
+ | [[File:bouton poussoir entouré.jpg|200px]] | ||
+ | |||
+ | '''<big>4 - Choix et connexion de la carte Arduino</big>''' | ||
+ | |||
+ | Vous pouvez choisir une carte Arduino Nano ou une Mini pro. La différence majeure est que la Mini n'a pas de connecteur USB pour téléverser le code, il faut donc utiliser un adaptateur (cf. Matériel nécessaire), souvent disponible dans les Fablabs. En revanche, elle a l'avantage d'être plus petite et moins chère que la Nano. Le choix vous revient. Les soudures finales seront similaires. | ||
+ | |||
+ | Je recommande toutefois l''''Arduino Nano''' car le code va être amené à changer au cours de l'utilisation de la souris, notamment en ce qui concerne la vitesse de clic. Ainsi, avec une Nano, il est plus facile de modifier le code car il y a un connecteur USB alors que la manip sera plus difficile avec une Mini pro. | ||
+ | |||
+ | Vous pourrez utiliser une Mini pro pour une deuxième version de votre souris, une fois que vous serez sûr.e de vos valeurs. | ||
+ | |||
+ | '''4.1 - Arduino Nano''' | ||
+ | |||
+ | La carte Arduino Nano se connecte à l'ordinateur via un câble USB-Mini USB. | ||
+ | |||
+ | [[File:usb-mini usb 2.jpg|400px|Câble USB-mini USB]] | ||
+ | [[File:nano branchée 2.jpg|400px]] | ||
+ | |||
+ | '''4.2 - Arduino Mini Pro''' | ||
+ | |||
+ | La carte Arduino Mini Pro se connecte à l'ordinateur via un adaptateur lui même relié à l'ordinateur par un câble USB-Mini USB. | ||
+ | |||
+ | [[File:adaptateur2.jpg|400px|Adaptateur]] | ||
+ | [[File:mini branchée 2.jpg|400px]] | ||
+ | |||
+ | '''<big>5 - Explication du code Arduino</big>''' | ||
+ | |||
+ | Récupérez le code Arduino ci-dessous. | ||
+ | |||
+ | <pre> | ||
+ | int V0 = 350; // (1)** Max output value from the EMG captor for the upper part of the forearm | ||
+ | int V1 = 350; // (2)** Same but for the lower part of the forearm | ||
+ | int upDuration = 450; // (3)** Duration in milliseconds of an "up" contraction of the user | ||
+ | int downDuration = 450; // (4)** Same but for a "down" contraction | ||
+ | int timerUp = 0; // Timer for duration of the upper contraction | ||
+ | int timerDown = 0; | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(9600); | ||
+ | pinMode(A0, INPUT); // Input from the EMG captor for the upper part of the forearm | ||
+ | pinMode(A1, INPUT); // Input from the EMG captor for the lower part of the forearm | ||
+ | pinMode(2, OUTPUT); // Output signal towards the left click | ||
+ | pinMode(3, OUTPUT); // Output signal towards the right click | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | digitalWrite(2,LOW); // Initialize the output signals to 0 to avoid persistent clicks between two loops. | ||
+ | digitalWrite(3,LOW); | ||
+ | timerUp = 0; | ||
+ | timerDown = 0; | ||
+ | while(upIsHold() and timerUp<4*upDuration){ // (5)* As long as the high contraction is maintained for at most 4*upDuration, | ||
+ | delay(10); // the timer is incremented by 10 ms. | ||
+ | timerUp += 10; | ||
+ | } | ||
+ | while(downIsHold() and timerDown<3*downDuration){ // (6)* Same for the low contraction for a maximum of 3*upDuration | ||
+ | delay(10); | ||
+ | timerDown += 10; | ||
+ | } | ||
+ | if(timerUp>10 and timerUp<=upDuration){ // (7)* Simple left click | ||
+ | digitalWrite(2,HIGH); | ||
+ | delay(50); | ||
+ | digitalWrite(2,LOW); | ||
+ | } | ||
+ | else if(timerUp>upDuration and timerUp<=2*upDuration){ // (8)* Double click | ||
+ | digitalWrite(2,HIGH); | ||
+ | delay(50); | ||
+ | digitalWrite(2,LOW); | ||
+ | delay(50); | ||
+ | digitalWrite(2,HIGH); | ||
+ | delay(50); | ||
+ | digitalWrite(2,LOW); | ||
+ | } | ||
+ | else if(timerUp>2*upDuration){ // (9)* Triple click | ||
+ | digitalWrite(2,HIGH); | ||
+ | delay(50); | ||
+ | digitalWrite(2,LOW); | ||
+ | delay(50); | ||
+ | digitalWrite(2,HIGH); | ||
+ | delay(50); | ||
+ | digitalWrite(2,LOW); | ||
+ | delay(50); | ||
+ | digitalWrite(2,HIGH); | ||
+ | delay(50); | ||
+ | digitalWrite(2,LOW); | ||
+ | } | ||
+ | if(timerDown>10 and timerDown<=downDuration){ // (10)* Right click | ||
+ | digitalWrite(3,HIGH); | ||
+ | delay(50); | ||
+ | digitalWrite(3,LOW); | ||
+ | } | ||
+ | else if(timerDown>downDuration){ // (11)* Hold click | ||
+ | do{ | ||
+ | digitalWrite(2,HIGH); | ||
+ | }while(not(upIsHold())); | ||
+ | digitalWrite(2, LOW); | ||
+ | } | ||
+ | // Serial.print(timerDown); Commands to display the different contraction times, in order to adapt the code to each individual | ||
+ | // Serial.print(" "); | ||
+ | // Serial.println(timerUp); | ||
+ | // delay(80); | ||
+ | } | ||
+ | |||
+ | bool upIsHold(){ // Function to determine at the moment of the call whether there is a high contraction or not | ||
+ | bool upIsHold = 0; | ||
+ | if((analogRead(A0)>0.7*V0)and(analogRead(A1)<0.6*V1)) upIsHold = 1; // (12)* Threshold value for detecting high contraction, | ||
+ | return upIsHold; // here set at 60% of the max contraction value V0 | ||
+ | } | ||
+ | |||
+ | bool downIsHold(){ // Same for a low contraction | ||
+ | bool downIsHold = 0; | ||
+ | if((analogRead(A1)>0.7*V1)and(analogRead(A0)<0.6*V0)) downIsHold = 1; // (13)* | ||
+ | return downIsHold; | ||
+ | } </pre> | ||
+ | |||
+ | Ouvrez le fichier sur le logiciel Arduino de l'ordinateur. Si le logiciel n'est pas installé sur votre ordinateur, vous pouvez le télécharger [https://www.arduino.cc/en/software ici] et l'installer. (Le logiciel est gratuit rassurez vous (; ) | ||
+ | |||
+ | Lisez attentivement les commentaires du code et repérez les endroits où les valeurs devront changer. Ces endroits sont repérés par '''*''' ou '''**'''. | ||
+ | Les valeurs à changer nécessairement sont repérées par '''**''', celles notées '''*''' peuvent rester inchangées et relèvent d'un réglage encore plus fin des seuils de détection à modifier une fois la souris terminée. | ||
+ | |||
+ | '''Déclenchement des différents clics :''' | ||
+ | |||
+ | Avec ce code, on utilise les contractions des parties supérieures et inférieures de l'avant-bras et la durée de contraction pour réaliser les différents clics. | ||
+ | * ''Clic droit simple'' : il suffit de contracter la partie supérieure de l'avant-bras de façon brève, donc sans maintenir la contraction. Pour que la contraction soit reconnue comme un clic simple, il faut qu'elle dure au moins 10 ms (c'est très court rassurez vous) et moins de la valeur '''''upDuration''''' notée '''(3)''' (cf. plus loin). | ||
+ | * ''Double clic '': il faut que la contraction haute dure entre ''upDuration'' et 2 fois ''upDuration''. | ||
+ | * ''Triple clic '': il faut que la contraction haute dure entre 2*''upDuration'' et 4*''upDuration''. | ||
+ | * ''Clic gauche'' : il suffit de contracter la partie inférieure de l'avant-bras de façon brève. La contraction doit durer au moins 10 ms et au plus la valeur '''''downDuration'''''. | ||
+ | * ''Clic droit maintenu '': il faut que la contraction basse dure entre ''downDuration'' et 3*''downDuration''. Pour relâcher le clic, il faut contracter de façon brève la partie haute de l'avant-bras. Faites attention à contracter brièvement pour garder la sélection si jamais vous faites une sélection de texte avec le clic maintenu. | ||
+ | |||
+ | Intéressons nous maintenant aux valeurs notées '''**'''. | ||
+ | |||
+ | '''(1)''' et '''(2)''' sont les valeurs maximales atteintes par les signaux des EMG. La méthode de détermination de ces valeurs est détaillée à l'étape suivante. | ||
+ | |||
+ | '''(3)''' : C'est la durée d'une contraction de la partie haute de l'avant bras et elle dépend de chaque utilisateur. Plus cette valeur sera grande, plus il faudra maintenir la contraction longtemps pour déclencher les clics double et triple. Je vous conseille de mettre une valeur assez grande au début (400-500 ms) le temps de vous habituer aux déclenchements des clics. Une fois que vous êtes à l'aise avec les différentes durées de contraction, vous pourrez diminuer cette valeur jusqu'à 200-250 voire 150 ms. Cela vous permettra de gagner en rapidité. A noter que cette valeur n'influence que les clics double et triple, le clic gauche simple est déclenché dès qu'il y a une contraction haute. | ||
+ | |||
+ | '''(4)''' : C'est la même chose que (3) mais pour la partie inférieure de l'avant-bras. Les valeurs (3) et (4) ne sont pas forcément les mêmes et vous serez peut-être plus à l'aise avec l'une des deux contractions, c'est pour ça qu'il vous faut adapter ces valeurs à vos préférences. Idem, je vous conseille de commencer avec une valeur assez grande (300-400 ms) et de diminuer cette valeur quand vous serez à l'aise. | ||
+ | |||
+ | Le détail des valeurs notées '''*''' est à retrouver à l'étape '''11 - Pour aller plus loin'''. | ||
+ | |||
+ | |||
+ | '''<big>6 - Détermination des valeurs V0 et V1</big>''' | ||
+ | |||
+ | Les valeurs seuils peuvent changer d'un utilisateur à l'autre, il faut donc vérifier quelles valeurs sont transmises par vos capteurs EMG jusqu'au bout du poignet universel. Repérez ces 4 fils : | ||
+ | * Vbatt (fil rouge souvent) : c'est la tension d'alimentation de la batterie de vos capteurs EMG | ||
+ | * GND (pour Ground) (fil noir souvent) : c'est la masse de vos capteurs EMG | ||
+ | * Signal EMG 1 : c'est le signal de votre premier capteur EMG | ||
+ | * Signal EMG 2 : idem pour le deuxième capteur | ||
+ | |||
+ | Munissez vous d'une carte Arduino Uno ou Nano (il faut qu'elle puisse se connecter directement à l'ordinateur) et faites les branchements ci-dessous avec le poignet. A noter que pour ce circuit on ne se servira pas du fil Vbatt du poignet. | ||
+ | |||
+ | [[File:Lecture EMG Uno 2.jpg|500px]] | ||
+ | [[File:Lecture EMG Nano 2.jpg|500px]] | ||
+ | |||
+ | Branchez la carte Arduino à l'ordinateur puis recopiez le code ci-dessous dans le logiciel Arduino, ou récupérez le dans la partie '''Fichiers sources'''. Vérifiez bien qu'il n'y a pas d'erreur dans le code en cliquant sur l'icône en haut à gauche. | ||
+ | |||
+ | <pre> | ||
+ | void setup() { | ||
+ | pinMode(A0, INPUT); // Entrée du capteur de la contraction haute / High contraction sensor input | ||
+ | pinMode(A1, INPUT); // Entrée du capteur de la contraction basse / Low contraction sensor input | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | Serial.print(analogRead(A0)); // Colonne de gauche / Left column | ||
+ | Serial.print(" "); | ||
+ | Serial.println(analogRead(A1)); // Colonne de droite / Right column | ||
+ | delay(200); | ||
+ | }</pre> | ||
+ | |||
+ | [[File:Screeen icone.jpg|300px|Icone de vérification, raccourci clavier : Ctrl + R]] | ||
+ | [[File:Icone televersement.jpg|300px|Icone de téléversement, Ctrl + U]] | ||
+ | |||
+ | S'il n'y a pas d'erreur, allez dans Outils>Type de carte, et vérifiez que le type correspond bien à la carte branchée. Sélectionnez aussi le port de votre ordinateur correspondant et finalement, téléverser le code. | ||
+ | |||
+ | Ouvrez le moniteur série dans Outils>Moniteur Série (raccourci clavier Ctrl + Shift + M). | ||
+ | |||
+ | Si tout s'est bien passé, vous devriez voir défiler deux colonnes de valeurs : ce sont les valeurs des capteurs EMG transmises en direct par le poignet jusqu'à la carte Arduino. L'idée est de contracter la partie haute ou basse de l'avant-bras et de repérer les changements de valeurs. | ||
+ | |||
+ | Au repos, les valeurs affichées varient peu et tournent normalement autour de 0. | ||
+ | |||
+ | Maintenant, si vous simulez une levée de la main et contractez la partie haute de l'avant-bras (entrée A0), les valeurs affichées doivent augmenter pour la '''colonne de gauche''', jusqu'à une valeur max '''V0'''. Pour être sûr de bien déterminer V0, faites plusieurs mesures en reproduisant ce mouvement de levée de la main, et faites une moyenne des différents maximums. Ainsi, vous avez déterminé la valeur V0! Notez cette valeur, on en aura besoin plus tard. | ||
+ | |||
+ | '''Attention :''' Il est important de bien différencier les câbles des contractions haute et basse. Si ce sont bien les valeurs de la colonne de gauche qui varient pour une contraction de la partie haute de l'avant-bras, alors les branchements sont corrects et vous pouvez noter quel fil correspond à quelle contraction. Si en revanche ce sont les valeurs de la colonne de droite qui augmentent lors de la contraction de la partie haute de l'avant-bras, c'est tout simplement qu'il faut inverser les câbles d'entrées de l'Arduino : le câble branché en A0 doit en fait être branché sur A1, et inversement. Une fois le changement fait, notez que le fil branché en A0 correspond à la contraction haute. | ||
+ | |||
+ | De la même manière, déterminez la valeur '''V1''' avec cette fois une contraction de la partie basse de l'avant-bras. | ||
+ | |||
+ | '''<big>7 - Modification du code Arduino de l'étape 5</big>''' | ||
+ | |||
+ | De retour sur ce code, vous pouvez désormais remplacez les constantes '''V0''' et '''V1''' par les valeurs déterminées à l'étape 6. | ||
+ | |||
+ | Pour ce qui est des constantes '''''upDuration''''' et '''''downDuration''''', je vous conseille de les laisser toutes les deux à 450 <u>pour l'instant</u>. | ||
+ | |||
+ | Une fois toutes les modifications faites, vérifiez encore une fois qu'il n'y a pas d'erreur dans le code et finalement téléversez le sur votre carte Arduino Nano ou Mini. | ||
+ | |||
+ | '''<big>8 - Montage du circuit électronique</big>''' | ||
+ | |||
+ | Comme mentionné précédemment, je vous conseille d'utiliser une carte Arduino Nano pour votre première version de votre souris. En effet, les valeurs ''upDuration'' et ''downDuration'' ne sont pas fixées et il sera plus simple de téléverser un nouveau code dans la carte Arduino Nano que dans la Mini pro, en laissant le connecteur accessible une fois le montage fait. | ||
+ | |||
+ | Si vous êtes sûr.e de vos valeurs, vous pourrez finalement refaire une deuxième version de votre souris d'ordinateur avec une Mini pro, cette fois sans accès direct à la carte. | ||
+ | |||
+ | Maintenant place à l'électronique ! | ||
+ | |||
+ | Le but va être de réaliser le circuit électronique ci-dessous. | ||
+ | |||
+ | [[File:Circuit final Nano v5.jpg|800px]] | ||
+ | |||
+ | Faites attention à bien connecter le capteur EMG de la partie supérieure de l'avant-bras au pin A0 de la carte Arduino, comme pour le circuit de l'étape 6. De même, le capteur inférieur doit être connecté au pin A1 de la carte Arduino. | ||
+ | |||
+ | Ensuite, pour faire les connexions, utilisez les plaques de circuits imprimés. Essayez au maximum de réduire la taille de la plaque utilisée. Vous n'aurez besoin que de deux morceaux : un pour les deux transistors et un autre pour la diode. | ||
+ | |||
+ | Ci-dessous un exemple des soudures que j'ai réalisé pour les transistors. | ||
+ | |||
+ | [[File:Transistor avant.jpg|400px]] | ||
+ | [[File:transistor arrière.jpg|400px]] | ||
+ | |||
+ | Pour ce qui concerne les 4 fils du porte-outil électrifié, je vous conseille de prendre 4 nouveaux fils, d'une vingtaine de centimètres, que vous connectez à la carte Arduino Nano. Vous les souderez aux câbles du porte-outil à la fin, après avoir vérifié que tout fonctionne bien. Ci-dessous les soudures des 4 fils de sortie, ainsi que la diode. Faites attention au sens de la diode ! | ||
+ | |||
+ | [[File:nano + diode ps.jpg|400px]] | ||
+ | |||
+ | Prenez maintenant le circuit imprimé de la souris et soudez-y 4 fils, comme indiqué, 2 par bouton poussoir. Assurez-vous de bien souder là où se faisait la fermeture du bouton poussoir. J'ai aussi dessoudé la molette et son bouton poussoir pour gagner de la place pour pouvoir insérer tous les éléments par la suite. | ||
+ | |||
+ | [[File:circuit souris+fils.jpg|400px]] | ||
+ | |||
+ | Une fois que les différents éléments sont soudés, assemblez-les après avoir visualisé l'emplacement de chaque composant dans le boîtier de la souris et en essayant de réduire au maximum les longueurs de fils. Ci-dessous un exemple de disposition dans le boîtier et le circuit seul. | ||
+ | |||
+ | [[File:Circuit sorti.jpg|400px]] | ||
+ | [[File:Circuit mis dessus2.jpg|440px]] | ||
+ | |||
+ | Ne fixez pas tout de suite les composants dans le boîtier, il va d'abord falloir y faire quelques modifications. | ||
+ | |||
+ | '''<big>9 - Trous et fixation souris/porte-outil</big>''' | ||
+ | |||
+ | Avant de fixer le circuit dans le boîtier de la souris, il faut percer quelques trous. | ||
+ | |||
+ | Un premier trou sur le côté du boîtier servira à accéder au connecteur mini USB de la carte Arduino Nano. Il vous faut donc marquer l'endroit où vous comptez placer la carte et y percer un trou de la taille du connecteur, à l'aide d'une Dremel et d'un petit foret. | ||
+ | |||
+ | [[File:Trou mini usb.jpg|400px|Trou pour le connecteur mini USB]] | ||
+ | |||
+ | Le deuxième trou, situé à l'arrière du boîtier, servira à faire passer les 4 fils de sortie à connecter aux 4 fils du porte-outil. | ||
+ | |||
+ | Le dernier trou m'a servi pour la fixation au porte-outil et dépend donc de la méthode que vous choisissez pour cette fixation. | ||
+ | |||
+ | [[File:Trous cable + fixation ps.jpg|400px]] | ||
+ | |||
+ | Pour ce qui est de la fixation entre la souris et le porte-outil du poignet universel, l'idée est de la concevoir en deux parties reliées par un roulement à billes. Pourquoi utiliser un roulement à billes ? Parce que dans la pratique, sans roulement, il sera difficile de bouger l'avant-bras sans en même temps lever la souris de la table ! | ||
+ | |||
+ | La première partie viendra recevoir le roulement à billes et devra être fixée sur le porte-outil électrifié du poignet universel. Pour la fixer, vous pourrez soit percer le porte-outil et visser la pièce, soit coller la pièce sur le porte-outil avec de la colle forte, en vous assurant que la pièce tienne bien. C'est le fichier ''Fixation Outter part.stl''. | ||
+ | |||
+ | La deuxième partie sera à clipser dans le roulement et devra être fixée au boîtier de la souris. Cela dépendra donc de votre souris et de comment vous préférez fixer la pièce. Pour vous donner un exemple, j'ai choisi de percer le boîtier de la souris sur 15 mm de large et 4 mm de haut, afin d'y glisser la deuxième pièce que j'aurai modélisée sous Fusion 360. Au final, j'ai réalisé la deuxième pièce ''Fixation Inner part.stl'' que j'ai imprimé. | ||
+ | |||
+ | [[File:Fixation non assemblée.jpg|400px|Fixation non assemblée]] | ||
+ | [[File:Fixation assemblée.jpg|400px|Fixation assemblée]] | ||
+ | |||
+ | A gauche la pièce ''Outter part'' avec le roulement à billes. A droite la pièce ''Inner part''. | ||
+ | |||
+ | Après avoir vérifié que la pièce ''Inner part'' rentrait bien dans le trou percé du boîtier de la souris, j'ai assemblé le tout. | ||
+ | |||
+ | Vous pouvez choisir la même méthode de fixation ou trouver un autre moyen, quoiqu'il en soit le fichier Fusion 360 est à votre disposition dans le dossier compressé ''Fixation Bionic mouse.zip''. Les fichiers sont déjà à l'échelle pour convenir au roulement à billes donc faites attention à ne pas changer la taille des solides. | ||
+ | |||
+ | '''Fichiers''' | ||
+ | * [[:File:Fixation Outter part.stl]] | ||
+ | * [[:File:Fixation Inner part.stl]] | ||
+ | * [[:File:Fixation Bionic mouse.zip]] | ||
+ | |||
+ | Une fois les trous percés et la fixation collée/vissée/clouée/tout ce que vous voulez au boîtier, on arrive au montage final! | ||
+ | |||
+ | '''<big>10 - Montage final</big>''' | ||
+ | |||
+ | Il ne reste maintenant plus qu'à remettre le circuit dans le boîtier de la souris (sans oublier de remettre le prisme comme il était!) et de maintenir le tout. Il est surtout important de maintenir le connecteur de la carte Arduino pour qu'il reste en place. Pour cela j'ai utilisé un pistolet à colle chaude, ce n'est pas très esthétique mais ça a le mérite de tenir. | ||
+ | |||
+ | Passez ensuite les 4 fils restants par le trou arrière du boîtier. | ||
+ | |||
+ | Enfin, il ne reste plus qu'à remettre le capot du boîtier ainsi que la vis qui le maintenait en place et TADAAA! | ||
+ | |||
+ | [[File:Bionic mouse.jpg|600px]] | ||
+ | |||
+ | Vous pouvez maintenant l'essayer, avec des pinces croco d'abord pour connecter les fils de la souris et ceux de votre emboiture. Si tout s'est bien passé vous devriez pouvoir vous servir de votre souris bionique! | ||
+ | |||
+ | '''<big>11 - Pour aller plus loin</big>''' | ||
+ | |||
+ | Une fois que la souris fonctionne bien et que vous vous êtes habitué.e aux durées de contractions des différents clics, vous pouvez maintenant changer les valeurs '''3''' et '''4''' pour gagner en rapidité. | ||
+ | |||
+ | Pour ce faire, enlevez les '''//''' devant les 4 lignes de commandes d'affichage des durées de contractions. Pensez à rajouter des '''//''' devant le commentaire après le ''';'''. Branchez la carte Arduino Nano et téléverser le code. Affichez le moniteur série et vous devriez voir deux colonnes de 0 défiler. | ||
+ | |||
+ | Ces colonnes sont les valeurs de ''timerDown'' à gauche et ''timerUp'' à droite, à chaque itération du code. Si vous contractez votre avant-bras, vous verrez que des valeurs non nulles apparaissent ; ce sont les durées des contractions de votre avant-bras. | ||
+ | |||
+ | Maintenant contractez la partie haute de votre avant-bras pour une durée qui vous paraît idéale pour un double clic. Décochez le défilement automatique pour avoir la valeur du ''timerUp''. Retirez 20 à cette valeur (pour avoir un peu de marge) et ce que vous obtenez sera votre nouvelle valeur ''upDuration''. | ||
+ | |||
+ | Procédez de la même manière avec une contraction basse pour avoir la nouvelle valeur de ''downDuration''. | ||
+ | |||
+ | Intéressons nous maintenant aux valeurs notées '''*'''. | ||
+ | |||
+ | '''5''' et '''6''' : ce sont des conditions sur les timers, elles permettent de ne pas déclencher de triple clic ou de clic maintenu si la contraction dépasse les valeurs respectives ''4*upDuration'' et ''3*downDuration''. Libre à vous de modifier cette condition pour déclencher des triple clic et clic maintenu pour des durées de contraction plus longues. | ||
+ | |||
+ | '''7''' à '''11''' : ce sont les conditions de déclenchement des différents types de clics. Encore une fois, libre à vous de modifier ces valeurs comme bon vous semble. Si vous souhaitez ne déclencher le triple clic qu'au bout de ''3*upDuration'' il vous suffit de changer la valeur de la condition 9. Pensez à aussi changer la valeur de la condition 8 du double clic pour vous assurer que toutes les durées de contractions soient traitées. | ||
+ | |||
+ | '''12''' et '''13''' : ce sont les seuils de détection des contractions. Si vous souhaitez réduire la valeur seuil et ainsi moins vous fatiguer, vous pouvez changer la première condition, celle avec le '''>'''. Par exemple passer de ''0.7*V0'' à ''0.6*V0'' voire ''0.5*V0''. De même pour la valeur V1. A vous de trouver le bon compromis en essayant par vous même. Attention, si vous baissez trop la valeur, la détection de contraction sera peut-être trop sensible et risque de se déclencher sans que vous le vouliez. Ne changez pas les valeurs de des conditions avec les '''<''' car elles servent à s'assurer de ne pas détecter des contractions involontaires. | ||
+ | |||
+ | Une fois vos valeurs trouvées, et si vous êtes motivé.e, vous pouvez changer de microcontrôleur et choisir la carte Arduino Mini pro. Vous gagnerez en compacité et il n'y aura plus besoin de se préoccuper d'un trou pour le connecteur. | ||
+ | |||
+ | Ci-dessous le schéma du circuit pour une Mini pro si besoin. | ||
+ | |||
+ | [[File:Circuit final mini 2.jpg|800px]] | ||
+ | |||
+ | Voilà vous savez maintenant tout ce qu'il faut savoir pour adapter cette souris bionique à vos besoins, pour la réparer en cas de problème et pour aider d'autres personnes dans la même situation! | ||
+ | |||
+ | Vous pouvez être fier.e de vous, bravo! | ||
== Durée de fabrication du prototype final == | == Durée de fabrication du prototype final == | ||
+ | Une fois tous les composants à disposition, il faut comptez environ '''6h''' : | ||
+ | * 3h de dessoudures/soudures/montage du circuit électronique | ||
+ | * 1h d'impression (que vous pouvez lancer en parallèle d'autre chose bien sûr) | ||
+ | * 1h de tests pour déterminer les valeurs V0 et V1 | ||
+ | * 1h de tests complémentaires de la souris bionique pour adapter les valeurs du code | ||
+ | * (1h de modification éventuelle du fichier 3D pour l'adapter à votre souris) | ||
+ | Ces durées sont à titre indicatif et peuvent varier d'une personne à l'autre. Prenez votre temps s'il le faut pour avoir une souris qui fonctionne bien à la fin et ne pas vous décourager, il m'a fallu beaucoup plus de temps que ça pour la faire. '''(;''' | ||
[[Category:Projets]] | [[Category:Projets]] |
Version actuelle datée du 6 juillet 2022 à 10:19
Bionic mouse | |
---|---|
Informations | |
Description | Contrôler le déplacement du curseur et des clics droit et gauche d'une souris d'ordinateur par contractions musculaires. |
Catégorie | Membre supérieur |
Etat d'avancement | Réalisés |
Techniques | |
Durée de fabrication | de 4 à 8 h |
Coût matériel | |
Niveau | Facile |
Licence | by-sa |
Date de création | 2020-03-10 |
Équipe | |
Porteur de projet | Bionico |
Contributeurs | Pierre M |
Fabmanager | Yo |
Référent documentation | Pierre M, Delphine |
Nom humanlab | Humanlab_MHK |
Documentation | |
Statut de la documentation | Complète |
Relecture de la documentation | Non vérifiée |
Description du projet
Le but de ce projet est de réaliser une prothèse permettant à des utilisateurs dépourvus d'une main valide de pouvoir se servir d’une souris d’ordinateur.
Cette solution s'adapte au poignet universel commercialisé par l’entreprise Orthopus, et utilise les contractions musculaires de l’avant-bras comme de signaux de commande des clics de la souris.
Cahier des charges
Objectif : Contrôler le déplacement du curseur et des clics droit et gauche d'une souris d'ordinateur en utilisant les contractions musculaires de l'avant-bras comme signaux de commandes.
Pour qui : Pour toutes personnes désirant utiliser une souris d'ordinateur comme outil au bout d'un poignet universel recevant les signaux de contractions musculaires de l'avant-bras. Il faut au moins deux capteurs distincts, disposés de part et d'autre de l'avant-bras. Par la suite on parlera de la partie supérieure ou "haute", et de la partie inférieure ou "basse" de l'avant-bras.
Fonctions :
- Déplacement du curseur sur l'écran
- Clic gauche simple
- Clic gauche double
- Clic gauche triple
- Clic gauche maintenu
- Clic droit simple
Contraintes :
- Réalisable dans un FabLab
- La solution développée s’adapte sur le poignet universel
- La solution n’est pas exclusive, elle doit pouvoir se répliquer sur un maximum de souris
Combien : ~25€ (sans compter le prix du porte-outil électrifié de chez Orthopus)
Où : Au Humanlab, ou dans un Fablab proche de chez vous : Carte des Fablabs par Makery
Analyse de l'existant
Un projet similaire réalisé au Humanlab permet de contrôler un curseur d'ordinateur et de déclencher les clics de la souris à l'aide d'un joystick : le projet Dé'clic.
La différence est que le projet Dé'clic utilise un module HID (pour Human Interface Device) qui vient remplacer complètement la souris par le joystick alors que le projet Bionic Mouse transforme une souris classique d'ordinateur.
Equipe (Porteur de projet et contributeurs)
- Porteur de projet : Nico
- Contributeurs : Pierre M
- Animateur (coordinateur du projet)
- Fabmanager référent : Yo
- Responsable de documentation : Pierre M
Matériel nécessaire
- Emboiture d'avant-bras avec deux capteurs EMG (ElectroMyoGramme), un poignet universel et porte outil électrifié
- Souris d'ordinateur démontable, filaire ou non, de taille moyenne à grosse pour pouvoir y faire tenir tout l'électronique
- Carte Arduino Nano ou Mini pro 5V (et son adaptateur)
- Transistor 2N2222 x2
- Diode 1N4007 x1
- Circuit imprimé universel, suffisamment petit pour rentrer dans le boitier de la souris
- Fil électrique (coloré de préférence pour s'y retrouver plus facilement)
- Etain
- Roulement à billes 608zz x1
- Filament PLA ou ABS
- Colle forte
Outils nécessaires
- Tournevis de précision
- Fer à souder
- Pompe à dessouder
- Pince à dénuder
- Pince coupante
- Ordinateur avec le logiciel Arduino
- Carte Arduino Uno ou Nano
- Cable USB A-Mini USB (Nano et Mini) et USB A-USB B (Uno)
- Multimètre
- Dremel avec foret ~3mm
- Petite lime plate
- Imprimante 3D
- Pistolet à colle
- (Ordinateur avec le logiciel Fusion 360, ou autre logiciel de CAO)
Coût
En comparant les différents prix et en achetant local pour éviter les frais de livraison pour certains composants, le total peut revenir à environ 25€, sans compter le prix du porte-outil électrifié de chez Orthopus.
Délai estimé
Il faut compter environ 6h de réalisation (cf. le détail en bas de page).
Fichiers source
- Code arduino : File:Code_Bionic_Mouse.zip
- Fichiers 3D : File:Pièces 3D Bionic mouse.zip
Étapes de fabrication pas à pas
Pour cet exemple, on utilise une souris filaire NGS disponible ici, mais ces bidouilles sont reproductibles sur la plupart des souris.
1 - Démontage de la souris
La première étape est de repérer sur votre souris où est la petite vis qui maintient la souris entière. Elle peut être directement visible, cachée sous une étiquette, ou sous le capot des piles pour une souris bluetooth.
Cependant, il arrive que des souris ne soient pas démontables via une vis, je vous conseille donc de changer de souris pour vous éviter de forcer l'ouverture de la souris et de risquer de la casser.
2 - Retrait du circuit imprimé
Une fois la souris ouverte, il vous faut retirer le circuit imprimé afin d'accéder aux soudures de celui-ci.
Faites attention à ne pas endommager les clips d'attache du circuit imprimé, par la suite on remettra le circuit à sa place et il faudra qu'il tienne en place pour que le système optique de la souris continue de fonctionner correctement.
Faites également attention à ne pas perdre le prisme en plastique en dessous de la souris.
3 - Dessoudage (ou dessoudure?) des boutons poussoirs des clics de la souris
Repérez les boutons poussoirs correspondants aux clics gauche (en bleu) et droit (en rose) de la souris.
A l'aide d'un fer à souder et d'une pompe à dessouder, retirez ces boutons poussoirs du circuit imprimé.
Repérez également quelles pattes du bouton poussoir étaient soudées au circuit imprimé. Ce sont à ces endroits que l'on soudera deux fils par clic plus tard.
Si jamais les trois pattes du bouton poussoir étaient soudées, vérifiez où se fait la fermeture du bouton poussoir à l'aide d'un multimètre réglé sur la fonction "bipeur". Demandez de l'aide à un fabmanager si vous ne savez pas comment faire.
4 - Choix et connexion de la carte Arduino
Vous pouvez choisir une carte Arduino Nano ou une Mini pro. La différence majeure est que la Mini n'a pas de connecteur USB pour téléverser le code, il faut donc utiliser un adaptateur (cf. Matériel nécessaire), souvent disponible dans les Fablabs. En revanche, elle a l'avantage d'être plus petite et moins chère que la Nano. Le choix vous revient. Les soudures finales seront similaires.
Je recommande toutefois l'Arduino Nano car le code va être amené à changer au cours de l'utilisation de la souris, notamment en ce qui concerne la vitesse de clic. Ainsi, avec une Nano, il est plus facile de modifier le code car il y a un connecteur USB alors que la manip sera plus difficile avec une Mini pro.
Vous pourrez utiliser une Mini pro pour une deuxième version de votre souris, une fois que vous serez sûr.e de vos valeurs.
4.1 - Arduino Nano
La carte Arduino Nano se connecte à l'ordinateur via un câble USB-Mini USB.
4.2 - Arduino Mini Pro
La carte Arduino Mini Pro se connecte à l'ordinateur via un adaptateur lui même relié à l'ordinateur par un câble USB-Mini USB.
5 - Explication du code Arduino
Récupérez le code Arduino ci-dessous.
int V0 = 350; // (1)** Max output value from the EMG captor for the upper part of the forearm int V1 = 350; // (2)** Same but for the lower part of the forearm int upDuration = 450; // (3)** Duration in milliseconds of an "up" contraction of the user int downDuration = 450; // (4)** Same but for a "down" contraction int timerUp = 0; // Timer for duration of the upper contraction int timerDown = 0; void setup() { Serial.begin(9600); pinMode(A0, INPUT); // Input from the EMG captor for the upper part of the forearm pinMode(A1, INPUT); // Input from the EMG captor for the lower part of the forearm pinMode(2, OUTPUT); // Output signal towards the left click pinMode(3, OUTPUT); // Output signal towards the right click } void loop() { digitalWrite(2,LOW); // Initialize the output signals to 0 to avoid persistent clicks between two loops. digitalWrite(3,LOW); timerUp = 0; timerDown = 0; while(upIsHold() and timerUp<4*upDuration){ // (5)* As long as the high contraction is maintained for at most 4*upDuration, delay(10); // the timer is incremented by 10 ms. timerUp += 10; } while(downIsHold() and timerDown<3*downDuration){ // (6)* Same for the low contraction for a maximum of 3*upDuration delay(10); timerDown += 10; } if(timerUp>10 and timerUp<=upDuration){ // (7)* Simple left click digitalWrite(2,HIGH); delay(50); digitalWrite(2,LOW); } else if(timerUp>upDuration and timerUp<=2*upDuration){ // (8)* Double click digitalWrite(2,HIGH); delay(50); digitalWrite(2,LOW); delay(50); digitalWrite(2,HIGH); delay(50); digitalWrite(2,LOW); } else if(timerUp>2*upDuration){ // (9)* Triple click digitalWrite(2,HIGH); delay(50); digitalWrite(2,LOW); delay(50); digitalWrite(2,HIGH); delay(50); digitalWrite(2,LOW); delay(50); digitalWrite(2,HIGH); delay(50); digitalWrite(2,LOW); } if(timerDown>10 and timerDown<=downDuration){ // (10)* Right click digitalWrite(3,HIGH); delay(50); digitalWrite(3,LOW); } else if(timerDown>downDuration){ // (11)* Hold click do{ digitalWrite(2,HIGH); }while(not(upIsHold())); digitalWrite(2, LOW); } // Serial.print(timerDown); Commands to display the different contraction times, in order to adapt the code to each individual // Serial.print(" "); // Serial.println(timerUp); // delay(80); } bool upIsHold(){ // Function to determine at the moment of the call whether there is a high contraction or not bool upIsHold = 0; if((analogRead(A0)>0.7*V0)and(analogRead(A1)<0.6*V1)) upIsHold = 1; // (12)* Threshold value for detecting high contraction, return upIsHold; // here set at 60% of the max contraction value V0 } bool downIsHold(){ // Same for a low contraction bool downIsHold = 0; if((analogRead(A1)>0.7*V1)and(analogRead(A0)<0.6*V0)) downIsHold = 1; // (13)* return downIsHold; }
Ouvrez le fichier sur le logiciel Arduino de l'ordinateur. Si le logiciel n'est pas installé sur votre ordinateur, vous pouvez le télécharger ici et l'installer. (Le logiciel est gratuit rassurez vous (; )
Lisez attentivement les commentaires du code et repérez les endroits où les valeurs devront changer. Ces endroits sont repérés par * ou **. Les valeurs à changer nécessairement sont repérées par **, celles notées * peuvent rester inchangées et relèvent d'un réglage encore plus fin des seuils de détection à modifier une fois la souris terminée.
Déclenchement des différents clics :
Avec ce code, on utilise les contractions des parties supérieures et inférieures de l'avant-bras et la durée de contraction pour réaliser les différents clics.
- Clic droit simple : il suffit de contracter la partie supérieure de l'avant-bras de façon brève, donc sans maintenir la contraction. Pour que la contraction soit reconnue comme un clic simple, il faut qu'elle dure au moins 10 ms (c'est très court rassurez vous) et moins de la valeur upDuration notée (3) (cf. plus loin).
- Double clic : il faut que la contraction haute dure entre upDuration et 2 fois upDuration.
- Triple clic : il faut que la contraction haute dure entre 2*upDuration et 4*upDuration.
- Clic gauche : il suffit de contracter la partie inférieure de l'avant-bras de façon brève. La contraction doit durer au moins 10 ms et au plus la valeur downDuration.
- Clic droit maintenu : il faut que la contraction basse dure entre downDuration et 3*downDuration. Pour relâcher le clic, il faut contracter de façon brève la partie haute de l'avant-bras. Faites attention à contracter brièvement pour garder la sélection si jamais vous faites une sélection de texte avec le clic maintenu.
Intéressons nous maintenant aux valeurs notées **.
(1) et (2) sont les valeurs maximales atteintes par les signaux des EMG. La méthode de détermination de ces valeurs est détaillée à l'étape suivante.
(3) : C'est la durée d'une contraction de la partie haute de l'avant bras et elle dépend de chaque utilisateur. Plus cette valeur sera grande, plus il faudra maintenir la contraction longtemps pour déclencher les clics double et triple. Je vous conseille de mettre une valeur assez grande au début (400-500 ms) le temps de vous habituer aux déclenchements des clics. Une fois que vous êtes à l'aise avec les différentes durées de contraction, vous pourrez diminuer cette valeur jusqu'à 200-250 voire 150 ms. Cela vous permettra de gagner en rapidité. A noter que cette valeur n'influence que les clics double et triple, le clic gauche simple est déclenché dès qu'il y a une contraction haute.
(4) : C'est la même chose que (3) mais pour la partie inférieure de l'avant-bras. Les valeurs (3) et (4) ne sont pas forcément les mêmes et vous serez peut-être plus à l'aise avec l'une des deux contractions, c'est pour ça qu'il vous faut adapter ces valeurs à vos préférences. Idem, je vous conseille de commencer avec une valeur assez grande (300-400 ms) et de diminuer cette valeur quand vous serez à l'aise.
Le détail des valeurs notées * est à retrouver à l'étape 11 - Pour aller plus loin.
6 - Détermination des valeurs V0 et V1
Les valeurs seuils peuvent changer d'un utilisateur à l'autre, il faut donc vérifier quelles valeurs sont transmises par vos capteurs EMG jusqu'au bout du poignet universel. Repérez ces 4 fils :
- Vbatt (fil rouge souvent) : c'est la tension d'alimentation de la batterie de vos capteurs EMG
- GND (pour Ground) (fil noir souvent) : c'est la masse de vos capteurs EMG
- Signal EMG 1 : c'est le signal de votre premier capteur EMG
- Signal EMG 2 : idem pour le deuxième capteur
Munissez vous d'une carte Arduino Uno ou Nano (il faut qu'elle puisse se connecter directement à l'ordinateur) et faites les branchements ci-dessous avec le poignet. A noter que pour ce circuit on ne se servira pas du fil Vbatt du poignet.
Branchez la carte Arduino à l'ordinateur puis recopiez le code ci-dessous dans le logiciel Arduino, ou récupérez le dans la partie Fichiers sources. Vérifiez bien qu'il n'y a pas d'erreur dans le code en cliquant sur l'icône en haut à gauche.
void setup() { pinMode(A0, INPUT); // Entrée du capteur de la contraction haute / High contraction sensor input pinMode(A1, INPUT); // Entrée du capteur de la contraction basse / Low contraction sensor input Serial.begin(9600); } void loop() { Serial.print(analogRead(A0)); // Colonne de gauche / Left column Serial.print(" "); Serial.println(analogRead(A1)); // Colonne de droite / Right column delay(200); }
S'il n'y a pas d'erreur, allez dans Outils>Type de carte, et vérifiez que le type correspond bien à la carte branchée. Sélectionnez aussi le port de votre ordinateur correspondant et finalement, téléverser le code.
Ouvrez le moniteur série dans Outils>Moniteur Série (raccourci clavier Ctrl + Shift + M).
Si tout s'est bien passé, vous devriez voir défiler deux colonnes de valeurs : ce sont les valeurs des capteurs EMG transmises en direct par le poignet jusqu'à la carte Arduino. L'idée est de contracter la partie haute ou basse de l'avant-bras et de repérer les changements de valeurs.
Au repos, les valeurs affichées varient peu et tournent normalement autour de 0.
Maintenant, si vous simulez une levée de la main et contractez la partie haute de l'avant-bras (entrée A0), les valeurs affichées doivent augmenter pour la colonne de gauche, jusqu'à une valeur max V0. Pour être sûr de bien déterminer V0, faites plusieurs mesures en reproduisant ce mouvement de levée de la main, et faites une moyenne des différents maximums. Ainsi, vous avez déterminé la valeur V0! Notez cette valeur, on en aura besoin plus tard.
Attention : Il est important de bien différencier les câbles des contractions haute et basse. Si ce sont bien les valeurs de la colonne de gauche qui varient pour une contraction de la partie haute de l'avant-bras, alors les branchements sont corrects et vous pouvez noter quel fil correspond à quelle contraction. Si en revanche ce sont les valeurs de la colonne de droite qui augmentent lors de la contraction de la partie haute de l'avant-bras, c'est tout simplement qu'il faut inverser les câbles d'entrées de l'Arduino : le câble branché en A0 doit en fait être branché sur A1, et inversement. Une fois le changement fait, notez que le fil branché en A0 correspond à la contraction haute.
De la même manière, déterminez la valeur V1 avec cette fois une contraction de la partie basse de l'avant-bras.
7 - Modification du code Arduino de l'étape 5
De retour sur ce code, vous pouvez désormais remplacez les constantes V0 et V1 par les valeurs déterminées à l'étape 6.
Pour ce qui est des constantes upDuration et downDuration, je vous conseille de les laisser toutes les deux à 450 pour l'instant.
Une fois toutes les modifications faites, vérifiez encore une fois qu'il n'y a pas d'erreur dans le code et finalement téléversez le sur votre carte Arduino Nano ou Mini.
8 - Montage du circuit électronique
Comme mentionné précédemment, je vous conseille d'utiliser une carte Arduino Nano pour votre première version de votre souris. En effet, les valeurs upDuration et downDuration ne sont pas fixées et il sera plus simple de téléverser un nouveau code dans la carte Arduino Nano que dans la Mini pro, en laissant le connecteur accessible une fois le montage fait.
Si vous êtes sûr.e de vos valeurs, vous pourrez finalement refaire une deuxième version de votre souris d'ordinateur avec une Mini pro, cette fois sans accès direct à la carte.
Maintenant place à l'électronique !
Le but va être de réaliser le circuit électronique ci-dessous.
Faites attention à bien connecter le capteur EMG de la partie supérieure de l'avant-bras au pin A0 de la carte Arduino, comme pour le circuit de l'étape 6. De même, le capteur inférieur doit être connecté au pin A1 de la carte Arduino.
Ensuite, pour faire les connexions, utilisez les plaques de circuits imprimés. Essayez au maximum de réduire la taille de la plaque utilisée. Vous n'aurez besoin que de deux morceaux : un pour les deux transistors et un autre pour la diode.
Ci-dessous un exemple des soudures que j'ai réalisé pour les transistors.
Pour ce qui concerne les 4 fils du porte-outil électrifié, je vous conseille de prendre 4 nouveaux fils, d'une vingtaine de centimètres, que vous connectez à la carte Arduino Nano. Vous les souderez aux câbles du porte-outil à la fin, après avoir vérifié que tout fonctionne bien. Ci-dessous les soudures des 4 fils de sortie, ainsi que la diode. Faites attention au sens de la diode !
Prenez maintenant le circuit imprimé de la souris et soudez-y 4 fils, comme indiqué, 2 par bouton poussoir. Assurez-vous de bien souder là où se faisait la fermeture du bouton poussoir. J'ai aussi dessoudé la molette et son bouton poussoir pour gagner de la place pour pouvoir insérer tous les éléments par la suite.
Une fois que les différents éléments sont soudés, assemblez-les après avoir visualisé l'emplacement de chaque composant dans le boîtier de la souris et en essayant de réduire au maximum les longueurs de fils. Ci-dessous un exemple de disposition dans le boîtier et le circuit seul.
Ne fixez pas tout de suite les composants dans le boîtier, il va d'abord falloir y faire quelques modifications.
9 - Trous et fixation souris/porte-outil
Avant de fixer le circuit dans le boîtier de la souris, il faut percer quelques trous.
Un premier trou sur le côté du boîtier servira à accéder au connecteur mini USB de la carte Arduino Nano. Il vous faut donc marquer l'endroit où vous comptez placer la carte et y percer un trou de la taille du connecteur, à l'aide d'une Dremel et d'un petit foret.
Le deuxième trou, situé à l'arrière du boîtier, servira à faire passer les 4 fils de sortie à connecter aux 4 fils du porte-outil.
Le dernier trou m'a servi pour la fixation au porte-outil et dépend donc de la méthode que vous choisissez pour cette fixation.
Pour ce qui est de la fixation entre la souris et le porte-outil du poignet universel, l'idée est de la concevoir en deux parties reliées par un roulement à billes. Pourquoi utiliser un roulement à billes ? Parce que dans la pratique, sans roulement, il sera difficile de bouger l'avant-bras sans en même temps lever la souris de la table !
La première partie viendra recevoir le roulement à billes et devra être fixée sur le porte-outil électrifié du poignet universel. Pour la fixer, vous pourrez soit percer le porte-outil et visser la pièce, soit coller la pièce sur le porte-outil avec de la colle forte, en vous assurant que la pièce tienne bien. C'est le fichier Fixation Outter part.stl.
La deuxième partie sera à clipser dans le roulement et devra être fixée au boîtier de la souris. Cela dépendra donc de votre souris et de comment vous préférez fixer la pièce. Pour vous donner un exemple, j'ai choisi de percer le boîtier de la souris sur 15 mm de large et 4 mm de haut, afin d'y glisser la deuxième pièce que j'aurai modélisée sous Fusion 360. Au final, j'ai réalisé la deuxième pièce Fixation Inner part.stl que j'ai imprimé.
A gauche la pièce Outter part avec le roulement à billes. A droite la pièce Inner part.
Après avoir vérifié que la pièce Inner part rentrait bien dans le trou percé du boîtier de la souris, j'ai assemblé le tout.
Vous pouvez choisir la même méthode de fixation ou trouver un autre moyen, quoiqu'il en soit le fichier Fusion 360 est à votre disposition dans le dossier compressé Fixation Bionic mouse.zip. Les fichiers sont déjà à l'échelle pour convenir au roulement à billes donc faites attention à ne pas changer la taille des solides.
Fichiers
Une fois les trous percés et la fixation collée/vissée/clouée/tout ce que vous voulez au boîtier, on arrive au montage final!
10 - Montage final
Il ne reste maintenant plus qu'à remettre le circuit dans le boîtier de la souris (sans oublier de remettre le prisme comme il était!) et de maintenir le tout. Il est surtout important de maintenir le connecteur de la carte Arduino pour qu'il reste en place. Pour cela j'ai utilisé un pistolet à colle chaude, ce n'est pas très esthétique mais ça a le mérite de tenir.
Passez ensuite les 4 fils restants par le trou arrière du boîtier.
Enfin, il ne reste plus qu'à remettre le capot du boîtier ainsi que la vis qui le maintenait en place et TADAAA!
Vous pouvez maintenant l'essayer, avec des pinces croco d'abord pour connecter les fils de la souris et ceux de votre emboiture. Si tout s'est bien passé vous devriez pouvoir vous servir de votre souris bionique!
11 - Pour aller plus loin
Une fois que la souris fonctionne bien et que vous vous êtes habitué.e aux durées de contractions des différents clics, vous pouvez maintenant changer les valeurs 3 et 4 pour gagner en rapidité.
Pour ce faire, enlevez les // devant les 4 lignes de commandes d'affichage des durées de contractions. Pensez à rajouter des // devant le commentaire après le ;. Branchez la carte Arduino Nano et téléverser le code. Affichez le moniteur série et vous devriez voir deux colonnes de 0 défiler.
Ces colonnes sont les valeurs de timerDown à gauche et timerUp à droite, à chaque itération du code. Si vous contractez votre avant-bras, vous verrez que des valeurs non nulles apparaissent ; ce sont les durées des contractions de votre avant-bras.
Maintenant contractez la partie haute de votre avant-bras pour une durée qui vous paraît idéale pour un double clic. Décochez le défilement automatique pour avoir la valeur du timerUp. Retirez 20 à cette valeur (pour avoir un peu de marge) et ce que vous obtenez sera votre nouvelle valeur upDuration.
Procédez de la même manière avec une contraction basse pour avoir la nouvelle valeur de downDuration.
Intéressons nous maintenant aux valeurs notées *.
5 et 6 : ce sont des conditions sur les timers, elles permettent de ne pas déclencher de triple clic ou de clic maintenu si la contraction dépasse les valeurs respectives 4*upDuration et 3*downDuration. Libre à vous de modifier cette condition pour déclencher des triple clic et clic maintenu pour des durées de contraction plus longues.
7 à 11 : ce sont les conditions de déclenchement des différents types de clics. Encore une fois, libre à vous de modifier ces valeurs comme bon vous semble. Si vous souhaitez ne déclencher le triple clic qu'au bout de 3*upDuration il vous suffit de changer la valeur de la condition 9. Pensez à aussi changer la valeur de la condition 8 du double clic pour vous assurer que toutes les durées de contractions soient traitées.
12 et 13 : ce sont les seuils de détection des contractions. Si vous souhaitez réduire la valeur seuil et ainsi moins vous fatiguer, vous pouvez changer la première condition, celle avec le >. Par exemple passer de 0.7*V0 à 0.6*V0 voire 0.5*V0. De même pour la valeur V1. A vous de trouver le bon compromis en essayant par vous même. Attention, si vous baissez trop la valeur, la détection de contraction sera peut-être trop sensible et risque de se déclencher sans que vous le vouliez. Ne changez pas les valeurs de des conditions avec les < car elles servent à s'assurer de ne pas détecter des contractions involontaires.
Une fois vos valeurs trouvées, et si vous êtes motivé.e, vous pouvez changer de microcontrôleur et choisir la carte Arduino Mini pro. Vous gagnerez en compacité et il n'y aura plus besoin de se préoccuper d'un trou pour le connecteur.
Ci-dessous le schéma du circuit pour une Mini pro si besoin.
Voilà vous savez maintenant tout ce qu'il faut savoir pour adapter cette souris bionique à vos besoins, pour la réparer en cas de problème et pour aider d'autres personnes dans la même situation!
Vous pouvez être fier.e de vous, bravo!
Durée de fabrication du prototype final
Une fois tous les composants à disposition, il faut comptez environ 6h :
- 3h de dessoudures/soudures/montage du circuit électronique
- 1h d'impression (que vous pouvez lancer en parallèle d'autre chose bien sûr)
- 1h de tests pour déterminer les valeurs V0 et V1
- 1h de tests complémentaires de la souris bionique pour adapter les valeurs du code
- (1h de modification éventuelle du fichier 3D pour l'adapter à votre souris)
Ces durées sont à titre indicatif et peuvent varier d'une personne à l'autre. Prenez votre temps s'il le faut pour avoir une souris qui fonctionne bien à la fin et ne pas vous décourager, il m'a fallu beaucoup plus de temps que ça pour la faire. (;