Projets:Declic

De wikilab

Présentation

Objectif

Utiliser une souris sans la main.

Contexte

Nico fait de la CAO mais il lui manque une main pour faire des combinaisons de touches (par exemple ctrl+clic gauche pour faire tourner un objet dans la vue 3d). Il souhaiterait disposer d'un dispositif faisant office de souris qui ne nécessiterait aucune configuration.

L'équipe

Declic groupe.JPG

Declic groupe2.jpeg

  • Nico, MHK
  • Julien, MHK
  • Pauline, MHK
  • Fabrice, Ariane Group
  • Mickaël, Ariane Group
  • Antony, Ariane Group
  • Jamila, Ariane Group
  • Fred, Ariane Groupe
  • Laurent, FLOSSManual

Ressources

Les fichiers et sources produites pendant les trois jours sont disponibles sur un dépot git qui contient également les images et les sources des schémas utilisées dans cette page.

Cahier des charges

Fonctions

  • déplacement du curseur sur l'écran
  • clic gauche
  • clic droit

Contraintes

  • facilité/simplicité d'utilisation,
    • pas de configuration, compatibilité (windows, linux, android...),
    • simple pour s'équiper,
  • robustesse,
  • fonctionnel (au moins) avec une seul main valide,
  • pas de calibration ou calibration simple,
  • pas perturbé par l'environnement (EMC, champ magnétique, température),
  • outils, matériaux et composants disponibles dans les fablabs,
  • prix accessible.


Scénarios

Scénarios
Scénario Handicap Solution Interface
S1 main manquante joystick potentiomètres filaire
S2 Avant bras manquant Détection de mouvement sans fil (étape avec fil)
J1 Avec Prothèse de main Adaptation ergonomique joystick filaire
J2 Avec moignon Support à partir d'existant filaire

Scénario S1 : joystick

Afin de se familiariser avec Arduino et son utilisation comme un périphérique USB, nous décidons de commencer par l'idée la plus simple et qui permettrait d'avoir un démonstrateur le plus rapidement possible. Il s'agit d'utiliser un joystick de contrôleur de jeu vidéo (thumbstick), avec un arduino connecté en USB et directement reconnu comme une souris.

Le thumbstick est un joystick analogique (composé de deux potentiomètres) et qui fait également office de bouton poussoir.

Declic joy.JPG Declic joy pcb.JPG

Arduino reconnu comme un périphérique USB : le HID

Nous souhaitons que notre arduino soit reconnu comme un périphérique HID. Le HID (pour Human Interface Device) est une spécification qui permet à un periphérique d'être reconnu directement comme une souris ou un clavier, ce qui évite d'avoir recours à un driver, c'est à dire un logiciel spécifique installé sur l'ordinateur. Seule les arduinos utilisant le microcontrôleur 32u4 peuvent être reconnu comme HID. C'est le cas notamment des arduino DUE, Leonardo et Mini mais pas du Uno (le plus courant) ni du micro (le deuxième plus courant et le moins cher).

Nous utilisons une plateforme de prototypage existante qui permet de relier plusieurs capteurs analogiques ou des interupteurs sur une carte Arduino Leonardo. Nous avons un certain nombre de modules à disposition dont le fameux thumbstick, des joysticks "tout ou rien" (type borne d'arcade), des potentiomètres et des boutons d'arcade.

Le module de prototypage

Les entrailles du module de prototypage

Un premier version fonctionnelle permettant de déplacer le curseur et de faire un clic gauche est assez rapidement développé à partir de l'exemple JoystickMouseControl

Le déplacement est effectué avec la fonction Mouse.move(x, y, wheel) qui permet d'effectuer un déplacement relatif du pointeur en pixels. Nous trouvons des valeurs raisonnable de déplacement relatif de 5 à 10 pixels.

Un potentiomètre est ajouté pour permettre de régler la sensibilité du déplacement de la souris, qu'il faut adapter en fonction de l'utilisateur et de l'évolution de son niveau de maîtrise.

Test du premier prototype

Clic !

L'utilisation du bouton poussoir pour contrôler la souris consiste à détecter les changements d'état du bouton : appui ou relachement. Nous utilisons pour cela l'objet bouton de la librairie Arduino MHK.

La librairie Mouse d'Arduino permet de réaliser différentes actions : - "press" : la souris est appuyée, - "release" : la souris est relachée, - "clic" : la souris est appuyée et relachée instantanément.

Clic droit

La principale amélioration consiste à ajouter un clic droit et un clic gauche maintenu, ceci à partir du seul bouton du thumbstick.

  • si le bouton est relaché avant 0,5 secondes, alors c'est un clic gauche simple ("press" au clic, puis "release" au relâchement)
  • si le bouton est relaché entre 0,5 et 1,5 secondes, c'est un clic droit ("clic droit" au relachement = "press" + "release" instantané).
  • si le bouton est relaché après 1,5 secondes, le "press" est maintenu est ne sera relaché qu'au prochain clic, ce qui permet de réaliser un "cliquer-glisser" pour par exemple déplacer une fenêtre ou orbiter dans une vue 3D.

https://github.com/myhumankit/declic

Une fois le prototype fonctionnel, nous souhaitons réaliser une version intégrée, avec une carte Arduino plus compacte (micro) dans un boîtier dédié.

Code

La version finale du code de ce prototype est accessible sur le dépot git du projet dans le dossier code/arduino/declic_joystick

Électronique

Declic schema S1.png

Boîtier

Modélisation de la boîte du joystick

Première version

Mickaël a d'abord modélisé un boitier inspiré de celui existant de forme hegagonal, avec un emplacement pour l'arduino micro ainsi qu'un trou pour le potentiomètre de réglage de sensibilité.

Première version de la boîte du joystick

Seconde version

Après avoir passé un peu de temps avec le joystick original, Nico se rend compte qu'il est trop haut et risque de fatiguer rapidement le bras. Il souhaiterait pouvoir poser le coude comme avec une souris normale. Un nouveau boitier est donc conçu avec le joystick le plus près possible de la table et légèrement incliné vers le bras.


Modèle de boîte avec le thumbstick incliné

Prototype final

Scénario S2

Ce scénario consiste à utiliser un module accéléromètre/gyroscope permettant de contrôler la souris à partir de l'orientation du bras.

Dans un second temps, il s'agit d'ajouter une liaison sans fil par l'intermédiaire de deux modules bluetooth.

Traitement du signal du capteur gyroscopique

Ce type de module est composé de capteurs (acceléromètre MEMS et gyroscope MEMS) dont le signal est traité par un microcontrôleur embarqué et communiqué à l'aduino via un bus i2c.

Code

Les informations brutes de la carte sont récupérées par un sketch arduino trouvé ici.

Elles nécessitent ensuite d'être combinées puis filtrées afin de récupérer directement des valeurs d'angles dans l'espace correspondant au tangage, au roulis et à l'azimuth. Nous utilisons pour cela la bibliothèque Arduino MadgwickAHRS.

Traitement des angles obtenus

Avec les librairies utilisées, nous pouvons directement récupérer les angles d'Euler décrivant l'orientation dans l'espace de noter capteur.

Ils sont donnés en degrés entre -180 et 180. Une des difficultés consiste à centrer ces angles par rapport à la position du capteur au repos.

En position de repos, le roulis est de 180°. S'il dépasse cette valeur, il y a un effet de seuil (le cadran fait un tour) et l'angle reviens à -180°. Pour center les valeurs, il faut donc

  • retrancher 180° à l'angle renvoyé au départ,
  • une fois ce traitement effectué, ajouter 360° (un tour) aux valeurs inférieures à -180°

Declic traitement signal.png

Les mouvements sont transformé de la manière suivante :

Utilisation du mouvement
Déplacement Mousement de la souris angle
droite/gauche X roulis (roll)
avant/arrière Y tangage (pitch)

Le mouvement de rotation bras autour de son axe (angle d'azimuth, rotation autour d'un axe vertical) semble lui dur à exploiter car il ne fonctionne bien que quand le bras est à la vertical et il subit de plus une déviation continu dûe à l'absence de bousole

Fixation et test

La position du capteur sur le bras est cruciale pour que les angles de rotation correspondent aux déplacements souhaité.

Afin de réaliser des tests sur le bras de Nico, nous réalisons une fixation temporaire en carton/scotch/agraffes/scratch qui permet de fixer l'arduino et de capteur dans la bonne position.

Declic test gyro1.JPG Declic test gyro2.JPG

Liaison bluetooth

Nous suivons ce tutoriel pour faire communiquer deux arduino par l'intermédiaire de deux cartes bluetooth.

Il faut dans un premier temps configurer les cartes bluetooth pour en configurer une en maître et l'autre en esclave.

Une fois les cartes bluetooth configurées, l'une d'elle va être relié à l'arduino du bras relié aux capteurs et l'autre à la carte arduino faisant office de "dongle" relié à l'ordinateur.

Nous mettons en place un protocole entre ces deux arduinos. Pour des raisons de simplicité et parce que le temps commence à manquer, le protocole est composé uniquement de message de une lettre tel que décrit ci-dessous :

// DICTIONARY
// 'a' = nothing
// 'b' = up
// 'c' = upleft
// 'd' = upright
// 'e' = down
// 'f' = downleft
// 'g' = downright
// 'h' = left
// 'i' = right
// 'j' = clickleft
// 'k' = clickright
// 'l' = longclickstart
// 'm' = longclickstop

En pratique il serait bien d'ajouter le passage d'un ou plusieurs paramètres pour retrouver la sensibilité que l'on avait avant de passer par le bluetooth. Le valeur du déplacement envoyé à la souris dépendait alors de la position du capteur, alors qu'elle réagit maintenant par impulsion de 10 pixels.

Clic avec capteur myo

Jamila et Fred s'occupe d'utiliser le capteur myo "industriel" pour faire le clic souris. Ce capteur renvoie un signal analogique contrairement au bouton qui est digital. Ils utilisent donc l'objet virtualButton de la librairie MHK arduino.

Voici un exemple de code minimal pour utiliser le bouton virtuel de la librairie MHK

#include <MHK_Button.h>

VirtualButton bouton(LOW);

void setup(){
  // configure Button object
  bouton.setHoldTime(500);   // duration in ms: 0 to 65535 (default: 1000)
  bouton.setIdleTime(3000);   // duration in ms: 0 to  65535 (default: 1000)
  bouton.setMultiTime(255);   // duration in ms: 0 to 255 (default: 127)
}
 
void loop(){
  int contraction = analogRead(A5);
  if (contraction > contraction_seuil) {
    bouton.set (1);
  } else {
    bouton.set (0);
  }
}


Declic test myo.JPG

Code

La version finale du code de ce prototype est accessible sur le dépot git du projet dans le dossier code/arduino.

On y trouve deux sketchs lié à ce prototype:

  • declic_gyro_arm pour la partie capteur fixée sur le bras
  • declic_gyro_dongle pour la partie dongle reliée à l'ordinateur

Électronique

Voici le schéma avec le câblage de la liaison bluetooth et des deux capteurs (gyro et myo)

Schéma de câblage S2

Version finale

Declic proto final.JPG

Declic proto final 3.JPG

Scénario J1

Modélisation d'une poignée de joystick adapté à la prise en main par la prothèse.

Nico s'attele à modéliser dans freecad une poignée qu'on peut fixer à la place de la boule du joystick.

La poignée de joystick adapté à la prothèse monté sur un joystick d'arcade

Scénario J2

Mickaël modélise un support ergnonomique en forme de U, adapté au moignon de Nico et qui s'adapte directement sur un joystick de fauteuil roulant.

Modèle de poignée de joystick adapté au moignon

La poignée de joystick adapté au moignon

Ce prototype parait bien meilleur à l'usage grâce à la fois au support ergonomique (confort) et à la meilleure résolution du joystick (précision, rapidité).

Ce joystick n'a pas de clic cependant. Nous cablons donc le capteur myo à cette fin et le résultat semble bien fonctionner.

Declic test fourche.JPG

Tous les prototypes

Declic proto tous.JPG


Déroulé

Pour souvenir, le déroulé détaillé de ces trois jours palpilants

Mercredi matin

  • Introduction et tour de table
  • Brainstorming objectifs, contraintes, scénarios, déroulé
  • Des idées en vrac :
    • tapis tactile
    • différents type de joystick avec poignée adaptée.
    • bracelet avec détecteur de mouvement pour le déplacement et pour le clic (rotation du bras pour le clic ?)
    • bracelet avec détecteur de mouvement pour le déplacement et capteur myo pour le clic.
  • initiation Arduino : Présentation de la lecture d'une entrée analogique (potentiomètre, joystick)

Mercredi après midi

  • initiation arduino : utilisation de la librairie buton_MHK
  • initiation arduino : HID
  • réalisation du prototype/scénario S1
  • modélisation des différentes poignées de joystick
  • prise en main du capteur gyroscopique

Jeudi matin

  • point et définition des objectifs du jour
  • modélisation de la deuxième version du boîtier pour le thumbstick
  • modélisation du bracelet pour le capteur gyroscopique
  • traitement du signal du capteur gyroscopique

Jeudi après midi

  • point d'avancement et objectifs de l'après midi
  • modélisation du bracelet pour le capteur gyroscopique (suite)
  • traitement du signal du capteur gyroscopique (suite)
  • autocalibration du capteur
  • test de la liaison bluetooth
  • cablage du capteur myo pour le clic
  • test du joystick ergonomique combiné avec le capteur myo
  • bracelet prototype pour le capteur et test de déplacement de la souris avec le capteur gyroscopique

Vendredi matin

  • point d'avancement
  • connectivité bluetooth: configuration des maîtres/esclaves et appairage
  • intégration boîtier joystick: câblage
  • affinage du contrôle de la souris avec le gyro

Vendredi après-midi

  • point point point
  • préparation du roman photo
  • connectivité bluetooth: protocole série
  • fin de l'intégration boîtier joystick
  • ajout du bluetooth et du capteur myo sur le prototype gyro
  • montage du bracelet boîtier