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

De wikilab
Ligne 130 : Ligne 130 :
 
   void loop()
 
   void loop()
 
   {
 
   {
     Ext = analogRead(A1); // Signal reçu de l'EMG de l'extension du poignet
+
     Ext = analogRead(A1);                       // Signal reçu de l'EMG de l'extension du poignet
     Flex = analogRead(A0); // Signal reçu de l'EMG de la flexion du poignet
+
     Flex = analogRead(A0);                       // Signal reçu de l'EMG de la flexion du poignet
     digitalWrite(2, LOW); // On initialise les pins 2 et 3 à 0V  
+
     digitalWrite(2, LOW);                       // On initialise les pins 2 et 3 à 0V  
     digitalWrite(3, LOW); // pour ne pas déclencher un clic involontairement  
+
     digitalWrite(3, LOW);                       // pour ne pas déclencher un clic involontairement  
     if ((Ext>0.9*V1max)and(Flex<0.6*V2max)){ // Condition à modifier en fonction de ce qu'on reçoit de l'EMG,  
+
     if ((Ext>0.9*V1max)and(Flex<0.6*V2max)){     // Condition à modifier en fonction de ce qu'on reçoit de l'EMG,  
       digitalWrite(3, HIGH);                 // les valeurs seuils peuvent varier en fonction des personnes
+
       digitalWrite(3, HIGH);                     // les valeurs seuils peuvent varier en fonction des personnes
       delay(100); // Délai de 100 ms ce qui correspond environ à la durée d'un clic classique de souris
+
       delay(100);                               // Délai de 100 ms ce qui correspond environ à la durée d'un clic classique de souris
 
       digitalWrite(3, LOW);
 
       digitalWrite(3, LOW);
       delay(500); // Temps minimum de 500 ms entre deux extensions distinctes, pour pas  
+
       delay(500);                               // Temps minimum de 500 ms entre deux extensions distinctes, pour pas  
     }             // qu'une seule contraction amène à plusieurs clics, à régler en fonction des personnes
+
     }                                           // qu'une seule contraction amène à plusieurs clics, à régler en fonction des personnes
 
     else if((Flex>0.9*V2max)and(Ext<0.6*V1max)){ // Boucle similaire pour l'autre clic
 
     else if((Flex>0.9*V2max)and(Ext<0.6*V1max)){ // Boucle similaire pour l'autre clic
 
       digitalWrite(2, HIGH);
 
       digitalWrite(2, HIGH);
Ligne 168 : Ligne 168 :
  
 
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. 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);
 +
    pinMode(A1, INPUT);
 +
    Serial.begin(9600);
 +
  }
 +
  void loop() {
 +
    Serial.print(analogRead(A0));
 +
    Serial.print("    ");
 +
    Serial.println(analogRead(A1));
 +
    delay(200);
 +
  }
  
 
'''(screen icône)'''
 
'''(screen icône)'''
Ligne 177 : Ligne 189 :
 
Si tout s'est bien passé, vous devriez voir défiler deux colonnes de valeurs : ce sont les valeurs des capteurs EMG transmises par le poignet. L'idée est de reproduire la levée ou la baisse de la main et de repérer les changements de valeurs.  
 
Si tout s'est bien passé, vous devriez voir défiler deux colonnes de valeurs : ce sont les valeurs des capteurs EMG transmises par le poignet. L'idée est de reproduire la levée ou la baisse de la main et de repérer les changements de valeurs.  
  
Au repos, les valeurs affichées ne varient pas et tournent autour d'une valeur moyenne au repos '''Vo'''.
+
Au repos, les valeurs affichées ne varient pas et tournent autour d'une valeur moyenne au repos '''V0'''.
  
 
Maintenant, si vous simulez une levée de la main, les valeurs affichées augmentent pour une des deux colonnes, jusqu'à une valeur max '''V1max'''. Pour être sûr de bien déterminer V1max, 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 '''V1max'''.
 
Maintenant, si vous simulez une levée de la main, les valeurs affichées augmentent pour une des deux colonnes, jusqu'à une valeur max '''V1max'''. Pour être sûr de bien déterminer V1max, 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 '''V1max'''.

Version du 12 juillet 2021 à 13:52

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.

Fonctions :

  • Déplacement du curseur sur l'écran
  • Clic gauche
  • Clic droit

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 :

 : 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

Outils nécessaires

  • Tournevis de précision
  • Fer à souder
  • Pompe à dessouder
  • Pince à dénuder
  • Ordinateur avec le logiciel Arduino
  • Carte Arduino Uno ou Nano
  • Cable USB-Mini USB
  • Imprimante 3D
  • Clef allen

Coût

Délai estimé

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 si ce n'est toutes!

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.

(photo de la souris non démontée)

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'ils tiennent 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é retiré) (photo du prisme)

3 - Dessoudage (ou dessoudure?) des boutons poussoirs des clics de la souris

Repérez les boutons poussoirs correspondants aux clics gauche et droit de la souris.

(photo du circuit avec les boutons poussoirs entourés)

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

(photo du circuit sans les boutons poussoirs avec les endroits dessoudés entourés) (photo des boutons poussoirs avec les pattes utiles entourées)

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.

4.1 - Arduino Nano

La carte Arduino Nano se connecte à l'ordinateur via un câble USB-Mini USB.

(photo du câble) (photo de la nano branchée à l'ordi par le cable)

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.

(photo de l'adaptateur) (photo de la connexion Arduino/adaptateur/ordi)

5 - Explication du code Arduino

Récuperez le code Arduino ci-dessous.

 float Flex = 0;
 float Ext = 0;
 void setup()
 {
   pinMode(A0, INPUT);
   pinMode(A1, INPUT);
   pinMode(2, OUTPUT);  
   pinMode(3, OUTPUT);
 }
 void loop()
 {
   Ext = analogRead(A1);                        // Signal reçu de l'EMG de l'extension du poignet
   Flex = analogRead(A0);                       // Signal reçu de l'EMG de la flexion du poignet
   digitalWrite(2, LOW);                        // On initialise les pins 2 et 3 à 0V 
   digitalWrite(3, LOW);                        // pour ne pas déclencher un clic involontairement 
   if ((Ext>0.9*V1max)and(Flex<0.6*V2max)){     // Condition à modifier en fonction de ce qu'on reçoit de l'EMG, 
     digitalWrite(3, HIGH);                     // les valeurs seuils peuvent varier en fonction des personnes
     delay(100);                                // Délai de 100 ms ce qui correspond environ à la durée d'un clic classique de souris
     digitalWrite(3, LOW);
     delay(500);                                // Temps minimum de 500 ms entre deux extensions distinctes, pour pas 
    }                                           // qu'une seule contraction amène à plusieurs clics, à régler en fonction des personnes
   else if((Flex>0.9*V2max)and(Ext<0.6*V1max)){ // Boucle similaire pour l'autre clic
     digitalWrite(2, HIGH);
     delay(100); 
     digitalWrite(2, LOW);
     delay(500);
    }
 }
 

(mettre code projet bionic mouse)

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, en particulier les valeurs de V1max et de V2max.


6 - Détermination des valeurs seuils

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.

(schéma UNO lecture EMG)

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.

 void setup() {
   pinMode(A0, INPUT);
   pinMode(A1, INPUT);
   Serial.begin(9600);
 }
 void loop() {
   Serial.print(analogRead(A0));
   Serial.print("     ");
   Serial.println(analogRead(A1));
   delay(200);
 }

(screen icône)

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.

Si tout s'est bien passé, vous devriez voir défiler deux colonnes de valeurs : ce sont les valeurs des capteurs EMG transmises par le poignet. L'idée est de reproduire la levée ou la baisse de la main et de repérer les changements de valeurs.

Au repos, les valeurs affichées ne varient pas et tournent autour d'une valeur moyenne au repos V0.

Maintenant, si vous simulez une levée de la main, les valeurs affichées augmentent pour une des deux colonnes, jusqu'à une valeur max V1max. Pour être sûr de bien déterminer V1max, 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 V1max.

De la même manière, déterminez la valeur V2max avec cette fois un mouvement de baisse de la main.

7 - Modification du code Arduino de l'étape 5

De retour sur ce code, vous pouvez désormais remplacez les constantes V1max et V2max par les valeurs déterminées à l'étape 6.

Exemple : lorsque j'ai réalisé mes tests, les valeurs V1max et V2max que j'ai déterminé étaient sensiblement les mêmes et tournaient autour de 175-180. Ainsi, mes conditions des boucles if étaient : (Ext>160 and Flex<100) et (Flex>160 and Ext<100). Cependant, ces valeurs peuvent être très différentes et dépendent des utilisateurs.


Ensuite, la valeur de délai entre 2 clics peut varier en fonction des utilisateurs. Si vous mettez environ 1 seconde entre deux contractions, il faut changer la valeur de 500 ms et la passer à 1000. A l'inverse, si vous pouvez distinguer deux contractions plus rapidement, vous pouvez baisser cette valeur. L'avantage de baisser cette valeur est de pouvoir effectuer deux clics plus rapidement, et ainsi de naviguer plus rapidement sur votre ordinateur.

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 - Alimentation de la carte Arduino

Durée de fabrication du prototype final