Projets:Magic Joystick 2020
Equipe
Porteur de projet : Jonathan (MyHumanKit), accompagné par Laetitia et Romane.
Contribut/eur/rice/s : Alexandre (ArianeGroup), Christian (MyHumanKit), Fred (MuHumanKit), Jean-Jacques (MyHumanKit), Olivier (ArianeGroup), Théo (ArianeGroup), Violette (ArianeGroup).
Fabmanageuse référente : Delphine (MyHumanKit).
Documentation : Pierre (Flossmanuals FR).
Description du projet
Réaliser un joystick à faible force, qui puisse être manipulé avec une mobilité très réduite et interfacé avec un fauteuil électrique.
Génèse du projet
Ce projet a démarré au Fabrikarium 2019, organisé avec ArianeGroup sur le site des Mureaux. Cette première étape a permis de développer des premiers prototypes de joystick à faible force et de mettre au point la communication avec le fauteuil par le protocole R-net. A la fin de ce premier fabrikarium, une manette xbox était reliée au système du fauteuil, avec succès!
État technique
Le joystick à faible force existe sous forme de prototype fonctionnel, mais il va être amélioré dans cette deuxième étape.
L'interface CAN/R-net a été testée avec un matériel industriel, il reste à la faire fonctionner sur une carte raspberry pi.
Documentation de l'étape précédente sur le wiki :
- https://wikilab.myhumankit.org/index.php?title=Projets:Can2RNET
- https://wikilab.myhumankit.org/index.php?title=Projets:Magic_Joystick
Objectifs de cette 2e étape
Améliorer le fonctionnement du joystick et la détection.
Mettre au point la communication entre le capteur angulaire et la carte Raspberry Pi.
Traitement des données et calibration.
Mettre au point la communication avec le fauteuil par R-net en utilisant une carte PiCAN2 et une carte Raspberry Pi.
Fusionner les 2 fonctions pour qu'elles soient utilisables sur la même carte Raspberry Pi
Trouver une solution permettant l'alimentation électrique de l'ensemble.
Réalisation
TL;DR
Cette page décrit un système de commande pour fauteuil électrique par joystick faible force.
Les différents éléments du système sont décrits avec les plans, schémas et les fichier de fabrication. Un protocole d'analyse pour brancher ce système sur le bus R-net d'un fauteuil existant est aussi expliqué en détail.
Schéma général
Matériel et outils nécessaires
fer à souder
imprimante 3D
découpe laser (pour le boîtier)
- pièces en impression 3D
- boîtier en contreplaqué découpé au laser
- 12 aimants néodyme 3x3mm N52
- vis de pression sans tête miniature (2.5mm)
- tige en laiton, diamètre 0.8mm
- lubrifiant silicone liquide (1 goutte!)
- capteur de positionnement MLX90333
- écran OLED 0.96 128x64 pixels
- convertisseur 12bits analogique/numérique ADS1015
- Raspberry Pi 3 + carte SD avec système Raspbian 10 «Buster» et configuration spécifique
- carte PiCAN2 pour Raspberry Pi
- résistances : 2 x 1k8, 2 x 3k3
- interrupteur double «normally closed» (pour arrêt d'urgence)
- cables de connection R-net
- cable en Y pour capture des trames r-net
Configuration du Raspberry Pi
OS : Raspbian 10 «Buster»
Configuration pour utiliser la carte PiCAN2 : https://www.skptechnology.co.uk/pican2-software-installation/
Configuration additionnelle (extrait de l'historique des commandes du Rpi)
sudo apt-get update sudo apt-get install git sudo apt-get install can-utils # https://github.com/linux-can/can-utils : candump, etc. sudo apt-get install build-essential python-dev python-smbus sudo git clone https://github.com/redragonx/can2RNET sudo git clone https://github.com/myhumankit/MHK-can2RNET # Bibliothèque pour le convertisseur A-N d'Adafruit git clone https://github.com/adafruit/Adafruit_Python_ADS1x15.git cd Adafruit_Python_ADS1x15/ sudo python setup.py install sudo pip install adafruit-ads1x15 # Bib. pour le contrôle des GPIO sur Rpi sudo pip3 install RPi.GPIO sudo apt-get install python-imaging # Manipulation d'images en python sudo apt-get install python-pil # Manipulation d'images en python # Bib. pour l'écran OLED 128x64 n&b git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git cd Adafruit_Python_SSD1306 sudo python3 setup.py install
À toute fin utile, historique complet à télécharger : historique d'installation complet
L'installation des scripts spécifiques au projet (scripts d'analyse r-net, client joystick, serveur r-net) est décrite ci-dessous.
Captation
Un aimant est fixé sur une housse de silicone portée en bout d'index. Le capteur est fixé sur le fauteuil par une tige articulée. Des légers mouvement du doigt, au dessus, sont relevés par le capteur magnétique et transmis au Raspberry Pi.
2 pistes différents sont suivies en parallèle pour la captation du mouvement
- un joystick magnétique composé uniquement d'un aimant et du capteur à effet Hall MLX90333
- un joystick «traditionnel» à faible force, le joystick dépalce un aimant au dessus du capteur à effet Hall MLX90333
Joystick magnétique
Voir schéma électronique plus bas
Moulage
Afin de créer un contrôleur adapté, moulage du doigt en plusieurs étapes. l'aimant est mixé sur le moulage.
La pâte utilisée pour le moulage est de type bi-composant, elle est travaillée directement sur le doigt et sèche en 5 minutes environ.
Pâte RTV 3535 vendue par Rougié & Plé : silicone RTV 3535 300G
Le joystick magnétique est fixé sur le fauteuil, sous la main gauche. Le «dé à coudre» qui intègre l'aimant est enfilé sur l'index, au-dessus du capteur.
Joystick faible force
Vue de l'avant dernier prototype, voir ci-dessous pour la version définitive
Communication
Premiers tests avec un système Raspberry Pi + PiCAN2
Il est nécessaire d'identifier les trames R-net utilisées pour un fauteuil particulier, on ne peut pas présumer qu'il existe une même nomenclature utilisée par tous les fabricants....
Méthode pour analyser les trames r-net
En plusieurs étapes :
- fabrication d'un cable en Y venant s'intercaler entre le JSM et le distributeur R-net du fauteuil,
- mise en place du système de test (Raspberry Pi + PiCAN2 + cable en Y),
- branchement du cable en Y sur le bus CAN du fauteuil,
- une fois ce système connecté, on peut enregistrer les captures des trames échangées.
- les captures sont ensuite analysées avec un ensemble de scripts logiciels créés pour l'occasion
Fabrication du cable en Y
Captures
Les captures de 15 secondes maximum, sont faites avec candump, important : nommer les fichiers en fonction de ce qu'on capture :
candump can0 -L > fichier.dmp #remplacer fichier.dmp par un nom explicite!
Dans l'ordre, nous avons effectué les captures suivantes, en envoyant chaque commande au moins 2 fois :
- capture à vide,
- capture en mode conduite sans activité,
- capture en mode conduite avant,
- capture en mode conduite arrière,
- capture en mode conduite droite,
- capture en mode conduite gauche,
- capture contact 1,
- capture contact 2,
- capture avec le JSM en mode tierce, à vide,
- capture avec le JSM en mode tierce, avant,
- capture avec le JSM en mode tierce, arrière,
- capture avec le JSM en mode tierce, droite,
- capture avec le JSM en mode tierce, gauche
- capture avec le JSM en mode tierce, test bouton MODE,
- capture avec le JSM en mode tierce, test bouton PROFILE,
- capture avec le JSM en mode tierce, test clignotant droit,
- capture avec le JSM en mode tierce, test clignotant gauche,
- capture avec le JSM en mode tierce, test vitesse FAST,
- capture avec le JSM en mode tierce, test vitesse SLOW.
Exemple d'un fichier de capture :
(1603287705.769805) can0 00E#250A000001100201 (1603287705.790874) can0 03C30F0F#87878787878787 (1603287705.819742) can0 00E#250A000001100201 (1603287705.843765) can0 140C0201#0000 (1603287705.844898) can0 1C300204#3D5B250078030000 (1603287705.869672) can0 00E#250A000001100201 (1603287705.876313) can0 0C140300#02 (1603287705.883663) can0 0C140200#C0 (1603287705.890744) can0 03C30F0F#87878787878787 (1603287705.911250) can0 0DE00501#000000 (1603287705.919616) can0 00E#250A000001100201 (1603287705.963705) can0 14300200#0000 (1603287705.969560) can0 00E#250A000001100201
La colonne 1 indique l'instant de capture de la trame.
La colonne 2 indique le bus CAN écouté.
La colonne 3 contient les données : deux nombres héxadécimaux séparés par un croisillon, le premier identifie l'identification du message, le second définit le contenu transmis. Il existe 2 formats différents pour l'identificateur de message : 11 ou 29 bits.
On obtient donc un dossier contenant tous ces fichiers de capture qu'il faut maintenant analyser
A toute fin utile : le dossier contenant toutes les captures de test : dump trames r-net
Analyse des captures
Une commande simple pour identifier toutes les trames différentes présentes dans un fichier dump :
awk ' { print $3 } ' fichier.dmp | sort -u
L'analyse complète des captures est faite avec un script python qui permet :
- de traiter un ou plusieurs fichiers de dump
- pour lister les identificateurs et leurs occurrences
- pour lister les messages complet
Le but de cette analyse est de trouver l'identificateur du message de joystick (le formatage de la trame se fait ensuite avec CAN2Rnet)
Script à télécharger : File:analyse_statistique_rnet_py.txt (à renommer)
Le script procure des résultats d'analyse au format JSON, ainsi que sous forme graphique. Exemple d'une analyse avec les graphiques ci-dessous, cette analyse concerne les trames R-net enregistrées lors de l'avance du fauteuil :
Une analyse d'un enregistrement sans activité particulière permet de constituer la signature des messages à retirer lors de l'analyse des autres enregistrements.
Pour produire ce fichier JSON de la blacklist :
stats.py view --output_messages vide_message.json --output_identifiers vide_identifier.json vide_aucun_mode.dmp
L'analyse de l'enregistrement effectué lors d'une avance du fauteuil, une fois retirés les messages produits "à vide", a produit les graphiques ci-dessus :
- la première figure indique le nombre de messages ayant le même "identifier", c'est à dire la même fonction. Clairement les identificateurs 02000000 et 00E sont les plus marquants.
- le second graphique indique le nombre de contenus différents pour un même identificateur. On retrouve là encore l'identificateur 02000000.
- le troisième indique la moyenne et l'écart-type pour chacun des octets du message pour l'identificateur ayant le plus grand nombre de contenus différents (02000000). Dans notre cas, le premier octet (indice 0) a une moyenne de -1 et un écart_type de quelques unités. Le second octet a une moyenne d'environ 7 mais un écart type beaucoup plus important : c'est vraisemblablement lui qui transporte le paramètre qui a varié lors de l'enregistrement.
Pour produire l'analyse visuelle :
stats.py view --blacklist vide_message.json aux_avant_tierce.dmp
De cette analyse, il est possible de faire des essais d'injection de trames sur le bus R-net ayant pour identificateur 02000000 et pour contenu 2 octets, le second représentant la marche avant.
Cette première analyse visuelle n'est que la première étape permettant soit une analyse plus fine, soit la confirmation d'un comportement identique à un modèle déjà analysé.
Architecture logicielle sur le Raspberry Pi
Un serveur assure la communication sur le bus CAN du fauteuil en envoyant les trames r-net adaptées. Un second serveur assure l'affichage des informations sur l'écran OLED
Reliés aux capteurs, des clients (pour l'instant uniquement le client joystick) se connectent aux serveurs et transmettent les données. Les mêmes données sont transmises aux deux serveurs.
code client / serveur
Dernières versions du code disponibles : https://github.com/myhumankit/MagicJoystick2020
Système électronique
Schéma au format pdf : schéma électronique magic joystick
Dossier du projet kicad : dossier kicad
L'alimentation du système électronique (Raspberry Pi et capteur) se fait à partir de la batterie du fauteuil (24V), convertie en 5V, les capteurs sont alimentés en 5V ou 3V3 par le Raspberry Pi.
Fabrication du système électronique
Boîtiers : les boîtiers sont réalisés d'après un fichier svg et découpés au laser.
Fichiers de fabrication (.dxf) :
- boitier principal : File:boitier-raspberry.dxf
- boitier arrêt d'urgence File:boitier-arret.dxf
Cable de liaison au fauteuil (CAN/R-net) + bouton d'arrêt d'urgence
Le bouton d'arrêt d'urgence est de type «interrupteur double normalement fermé», il se place entre chacun des deux brins des signaux CAN (CAN HIgh, CAN Low), quand on appuie : le signal est interrompu.
Montage du joystick à faible force
Sur la vue 4, on peut voir les 4 vis réglables (en noir), elles permettent de fixer la position centrale du joystick ainsi que la force de résistance.
Sur la vue 3, le passage de l'axe en laiton est visible.
Montage par étape :
Les axes utilisés sont en laiton
1 : pour le passage de l'axe : perçage à 0.7mm, lissé à 0.8 (en montant un morceau de tige de laiton sur la perceuse). Il est nécessaire de plier les fils hors du montage, pour que les axes restent bien horizontaux, et de placer un tout petit point de silicone liquide sur l'axe pour faciliter la rotation sans frottement.
2 : fixer les deux morceaux de l'autre axe mobile, percer et lisser pour le passage
3 : placer les aimants et les fixer avec les vis sans têtes
4 : visser l'ensemble
((INSERER FICHIERS STEP + STL))
Support circuit capteur magnétique
Le circuit du capteur est placé sous le joystick, il intègre sur deux faces : le capteur, le convertisseur analogique/numérique, 4 résistances et un connecteur.
((INSERER FICHIERS STEP + STL))
Montage du joystick magnétique
Fixation pour l'écran OLED
Cette pièce s'enclenche sur le support de smartphone du fauteuil.
Fichier de fabrication : ((AJOUTER STL/STEP FIXATION))
Composants utilisés
Capteur de positionnement MLX90333
datasheet du capteur angulaire MLX90333
Module équipé d'un circuit intégré MLX90333 de Melexis, avec la capacité de capter la position 3D d'un aimant (effet Hall). Ce circuit peut communiquer de différentes manières : analogique, PWM ou série SPI. Sur cette carte, il est configuré par défaut pour une double sortie analogique, et donne les valeurs alpha et beta (cf. point 14.1 de la page 19 de la datasheet). NB : Nous n'avons pas trouvé comment configurer ce capteur pour qu'il renvoie les données x,y,z sans utiliser de programmateur hardware et le logiciel propriétaire vendus par le fabricant (cf. datasheet).
carte PiCAN2
Carte additionnelle pour Raspberry Pi, fabriquée par SK Pang Electronics permettant de mettre en oeuvre un bus CAN (nécessite l'installation d'un driver sur le système du Raspberry Pi).
Documentation de la carte PiCAN2 (à télécharger sur le site de SK Pang Electronics)
écran OLED 0.96" avec contrôleur SSD1306
Module d'écran noir et blanc 128x64 pixels avec communication par I2C
datasheet du contrôleur SSD1306
tutoriel d'utilisation avec Raspberry Pi
convertisseur analogique-numérique 12bits ADS1015
Convertisseur analogique numérique à 4 entrées avec communication par I2C
datasheet du composant ADS1015
tutoriel d'utilisation avec Raspberry Pi
Annexe - lexique
aimant néodyme N52 : la lettre N indique la température maximale d'utilisation (80°c), 52 correspond au taux énergétique maximum de l'aimant (en MGOe, Mega-Gauss Oersteds), ce qui est élevé pour ce type d'aimant. https://fr.wikipedia.org/wiki/Aimant_au_n%C3%A9odyme
CAN (Controller Area Network) : Bus de communication série utilisé en électronique, particulièrement dans l'industrie automobile. Il fonctionne sur le principe du multiplexage ou chaque équipement connecté communique avec tous les autres. https://fr.wikipedia.org/wiki/Bus_de_donn%C3%A9es_CAN
Dump : enregistrement de données dans un fichier.
Effet Hall : https://fr.wikipedia.org/wiki/Effet_Hall
ISM (Intelligent Seating/lighting Module) : (module électronique d'un fauteuil) assise «intelligente» et éclairage.
JSM (Joystick Module) (module électronique d'un fauteuil) joystick d'assistance à l'arrière du fauteuil, prioritaire sur le contrôle du déplacement.
PM (Power Module) : (module électronique d'un fauteuil) bloc moteur, module d’alimentation (unité de commande)
R-net : Le protocole R-net définit des commandes qui passent sur un bus CAN. Il a été mis au point en 2011 par PGDT (PG Drives Technology) pour le contrôle des fauteuils électriques. Il s'agit d'un protocole propriétaire, en 2016 des informations sur ce protocole ont été trouvées par Stephen Chavez par ingénierie inverse pour le projet https://github.com/redragonx/can2RNET.
SPI (Serial Peripheral Interface) : Bus de communication série utilisé en électronique. «Les circuits communiquent selon un schéma maître-esclave, où le maître contrôle la communication. Plusieurs esclaves peuvent coexister sur un même bus, dans ce cas, la sélection du destinataire se fait par une ligne dédiée entre le maître et l'esclave appelée « Slave Select (SS) ». https://fr.wikipedia.org/wiki/Serial_Peripheral_Interface
Idées pour la suite
Pendant les quelques jours du Fabrikarium, de nouvelles pistes ont émergé :
Pour la captation et le contrôle du déplacement :
- utiliser un capteur 9-DOF ? (accéléromètre/gyroscope/magnétomètre, chacun sur 3 axes)
- utiliser un mini-trackball ? ( https://shop.pimoroni.com/products/trackball-breakout )
- manipulation du joystick par le menton
- utiliser un capteur MLX90393 qui permette une récupération des axes x,y,z, voir par exemple chez adafruit https://www.adafruit.com/product/4022 , ou chez sparkfun : https://learn.sparkfun.com/tutorials/qwiic-magnetometer-mlx90393-hookup-guide
Pour la sécurité du fonctionnement
- Utiliser le Raspberry Pi en Read-only : pour éviter qu'une coupure d'alimentation impromptue vienne endommager le système du Rpi sur carte SD, des modifications du système pourraient être faites pour empêcher les écritures sur la carte µSD. cf. http://lesporteslogiques.net/wiki/openatelier/projet/raspberry_read-only
Pour la réplication du projet :
- proposer une image du système sur carte SD