Différences entre versions de « Projets:Bionic mouse »

De wikilab
 
(49 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
[[File:Bionic mouse.jpg|400px]]
+
{{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 ==
Ligne 25 : 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 42 : Ligne 59 :
  
 
== Matériel nécessaire ==
 
== Matériel nécessaire ==
* Emboiture d'avant-bras avec capteur EMG (ElectroMyoGramme) avec poignet universel et porte outil éléctrifié
+
* 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
 
* 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])  
 
* 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])  
Ligne 68 : Ligne 85 :
 
* Imprimante 3D
 
* Imprimante 3D
 
* Pistolet à colle
 
* 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 ==
Ligne 89 : Ligne 114 :
 
'''<big>2 - Retrait du circuit imprimé</big>'''
 
'''<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.
+
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 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.  
Ligne 96 : Ligne 121 :
  
 
[[File:Circuit imprimé visible 2.jpg|350px]]
 
[[File:Circuit imprimé visible 2.jpg|350px]]
 
 
[[File:Circuit imprimé non déssoudé recto2.jpg|350px]]
 
[[File:Circuit imprimé non déssoudé recto2.jpg|350px]]
 
[[File:Circuit imprimé non déssoudé verso 2.jpg|350px]]
 
[[File:Circuit imprimé non déssoudé verso 2.jpg|350px]]
Ligne 113 : Ligne 137 :
 
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.
 
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 boutons poussoirs é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.
+
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:Circuit dessoudé.jpg|450px]]
Ligne 120 : Ligne 144 :
 
'''<big>4 - Choix et connexion de la carte Arduino</big>'''
 
'''<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.
+
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.  
  
Je recommande toutefois l'Arduino Nano car le code peut ê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'''
 
'''4.1 - Arduino Nano'''
Ligne 145 : Ligne 171 :
 
int V0 = 350;          // (1)** Max output value from the EMG captor for the upper part of the forearm
 
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 V1 = 350;          // (2)** Same but for the lower part of the forearm
int upDuration = 280;  // (3)** Duration in milliseconds of an "up" contraction of the user
+
int upDuration = 450;  // (3)** Duration in milliseconds of an "up" contraction of the user
int downDuration = 200; // (4)** Same but for a "down" contraction  
+
int downDuration = 450; // (4)** Same but for a "down" contraction  
 
int timerUp = 0;        // Timer for duration of the upper contraction
 
int timerUp = 0;        // Timer for duration of the upper contraction
 
int timerDown = 0;       
 
int timerDown = 0;       
Ligne 171 : Ligne 197 :
 
     timerDown += 10;
 
     timerDown += 10;
 
   }
 
   }
   if(timerUp>10 and timerUp<=upDuration){                // Simple left click
+
   if(timerUp>10 and timerUp<=upDuration){                // (7)* Simple left click
 
     digitalWrite(2,HIGH);
 
     digitalWrite(2,HIGH);
 
     delay(50);
 
     delay(50);
 
     digitalWrite(2,LOW);     
 
     digitalWrite(2,LOW);     
 
   }
 
   }
   else if(timerUp>upDuration and timerUp<=2*upDuration){ // Double click
+
   else if(timerUp>upDuration and timerUp<=2*upDuration){ // (8)* Double click
 
     digitalWrite(2,HIGH);
 
     digitalWrite(2,HIGH);
 
     delay(50);
 
     delay(50);
Ligne 185 : Ligne 211 :
 
     digitalWrite(2,LOW);   
 
     digitalWrite(2,LOW);   
 
   }
 
   }
   else if(timerUp>2*upDuration){                        // Triple click
+
   else if(timerUp>2*upDuration){                        // (9)* Triple click
 
     digitalWrite(2,HIGH);
 
     digitalWrite(2,HIGH);
 
     delay(50);
 
     delay(50);
Ligne 198 : Ligne 224 :
 
     digitalWrite(2,LOW);     
 
     digitalWrite(2,LOW);     
 
   }
 
   }
   if(timerDown>10 and timerDown<=downDuration){          // Right click
+
   if(timerDown>10 and timerDown<=downDuration){          // (10)* Right click
 
     digitalWrite(3,HIGH);
 
     digitalWrite(3,HIGH);
 
     delay(50);
 
     delay(50);
 
     digitalWrite(3,LOW);     
 
     digitalWrite(3,LOW);     
 
   }
 
   }
   else if(timerDown>downDuration){                      // Hold click
+
   else if(timerDown>downDuration){                      // (11)* Hold click
 
     do{
 
     do{
 
       digitalWrite(2,HIGH);
 
       digitalWrite(2,HIGH);
Ligne 217 : Ligne 243 :
 
bool upIsHold(){  // Function to determine at the moment of the call whether there is a high contraction or not  
 
bool upIsHold(){  // Function to determine at the moment of the call whether there is a high contraction or not  
 
   bool upIsHold = 0;
 
   bool upIsHold = 0;
   if((analogRead(A0)>0.6*V0)and(analogRead(A1)<0.6*V1)) upIsHold = 1;  // (7)* Threshold value for detecting high contraction,
+
   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
 
   return upIsHold;                                                      //      here set at 60% of the max contraction value V0
 
}
 
}
Ligne 223 : Ligne 249 :
 
bool downIsHold(){ // Same for a low contraction
 
bool downIsHold(){ // Same for a low contraction
 
   bool downIsHold = 0;
 
   bool downIsHold = 0;
   if((analogRead(A1)>0.6*V1)and(analogRead(A0)<0.6*V0)) downIsHold = 1; // (8)*
+
   if((analogRead(A1)>0.7*V1)and(analogRead(A0)<0.6*V0)) downIsHold = 1; // (13)*
   return downIsHold
+
   return downIsHold;
 
} </pre>
 
} </pre>
  
Ligne 230 : Ligne 256 :
  
 
Lisez attentivement les commentaires du code et repérez les endroits où les valeurs devront changer. Ces endroits sont repérés par '''*''' ou '''**'''.
 
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 necessairement 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.
+
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 :'''  
 
'''Déclenchement des différents clics :'''  
Ligne 238 : Ligne 264 :
 
* ''Double clic '': il faut que la contraction haute dure entre ''upDuration'' et 2 fois ''upDuration''.
 
* ''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''.  
 
* ''Triple clic '': il faut que la contraction haute dure entre 2*''upDuration'' et 4*''upDuration''.  
* ''Clic gauche'' : il suffit de contracter la partie ingfé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 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 relacher le clic, il faut contracter de façon brève la partie haute de l'avant-bras. Faites attention à contracter brievement pour garder la sélection si jamais vous faites une sélection de texte avec le clic maintenu.  
+
* ''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 '''**'''.
 
Intéressons nous maintenant aux valeurs notées '''**'''.
Ligne 245 : Ligne 271 :
 
'''(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.
 
'''(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 (300-400 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.
+
'''(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.
 
'''(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 Aller plus loin.
+
Le détail des valeurs notées '''*''' est à retrouver à l'étape '''11 - Pour aller plus loin'''.
  
  
Ligne 265 : Ligne 291 :
 
[[File:Lecture EMG Nano 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. Vérifiez bien qu'il n'y a pas d'erreur dans le code en cliquant sur l'icône en haut à gauche.
+
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>
 
<pre>
Ligne 302 : Ligne 328 :
 
De retour sur ce code, vous pouvez désormais remplacez les constantes '''V0''' et '''V1''' par les valeurs déterminées à l'étape 6.
 
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 mettre toutes les deux à 450 <u>pour l'instant</u>.
+
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.
 
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.
Ligne 310 : Ligne 336 :
 
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.
 
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 sur 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.
+
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 !
 
Maintenant place à l'électronique !
Ligne 331 : Ligne 357 :
 
[[File:nano + diode ps.jpg|400px]]
 
[[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>'''
 
'''<big>9 - Trous et fixation souris/porte-outil</big>'''
  
Avant de rentrer le circuit dans le boitier de la souris, il faut percer quelques trous.
+
Avant de fixer le circuit dans le boîtier de la souris, il faut percer quelques trous.
  
Un premier trou sur le coté du boitier 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.  
+
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]]
 
[[File:Trou mini usb.jpg|400px|Trou pour le connecteur mini USB]]
  
Le deuxième trou, situé à l'arrière du boitier, servira à faire passer les 4 fils de sortie à connecter aux 4 fils du porte-outil.
+
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.
 
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.
Ligne 347 : Ligne 382 :
 
[[File:Trous cable + fixation ps.jpg|400px]]  
 
[[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 faire 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 !  
+
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 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é au boitier 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 boitier 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éliser sous Fusion 360. Au final, j'ai réalisé la deuxième pièce ''Fixation Inner part.stl'' que j'ai imprimé.  
+
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 non assemblée.jpg|400px|Fixation non assemblée]]
Ligne 358 : Ligne 393 :
 
A gauche la pièce ''Outter part'' avec le roulement à billes. A droite la pièce ''Inner part''.
 
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 boitier de la souris, j'ai assemblé le tout.
+
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éja à l'échelle pour convenir au roulement à billes donc faites attention à ne pas changer la taille des solides.
+
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'''
 
'''Fichiers'''
Ligne 366 : Ligne 401 :
 
* [[:File:Fixation Inner part.stl]]
 
* [[:File:Fixation Inner part.stl]]
 
* [[:File:Fixation Bionic mouse.zip]]
 
* [[: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

Bionic mouse.jpg

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)

 : 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

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

Souris non démontée.jpg

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.

Circuit imprimé visible 2.jpg Circuit imprimé non déssoudé recto2.jpg Circuit imprimé non déssoudé verso 2.jpg

Prisme à ne pas perdre!

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.

Circuit imprimé non déssoudé recto entouré.jpg Circuit imprimé non déssoudé verso entouré.jpg

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.

Circuit dessoudé.jpg Bouton poussoir entouré.jpg

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.

Câble USB-mini USB Nano branchée 2.jpg

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.

Adaptateur Mini branchée 2.jpg

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.

Lecture EMG Uno 2.jpg Lecture EMG Nano 2.jpg

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);
  }

Icone de vérification, raccourci clavier : Ctrl + R 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.

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.

Circuit final Nano v5.jpg

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.

Transistor avant.jpg Transistor arrière.jpg

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 !

Nano + diode ps.jpg

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.

Circuit souris+fils.jpg

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.

Circuit sorti.jpg Circuit mis dessus2.jpg

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.

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.

Trous cable + fixation ps.jpg

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

Fixation non assemblée 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

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!

Bionic mouse.jpg

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.

Circuit final mini 2.jpg

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