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
((A COMPLETER))
Schéma général
(schéma du mardi 21 oct, 10h)
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
- tiges 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, A COMPLETER à récupérer depuis github
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
Voir schéma électronique plus bas
Prototype modifié :
((AJOUTER FICHIERS .STEP + .STL))
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.
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 le type de trame, le second définit le contenu transmis.
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 identifieurs et leurs occurrences
- pour lister les messages complet
Le but de cette analyse est de trouver l'identifieur du message de joystick (le formatage de la trame se fait ensuite avec CAN2Rnet)
Script à télécharger : https://github.com/mnct/Magic_Joystick_2020
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/mnct/Magic_Joystick_2020
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) : ((A COMPLETER))
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 :
((INSERER PLANCHE PHOTO))
((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
((A COMPLETER))
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
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