Projets:Magic Joystick 2020

De wikilab
Schema global definitif.png

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

Lien vers l'album Flickr

https://www.flickr.com/photos/140910832@N06/albums/72157717050176586

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 :

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

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 Automatique du Raspberry Pi

OS : Raspbian 10 «Buster»

Les commandes suivantes permettent d'installer automatiquement toutes les dépendances logicielles nécessaires (PiCan, Joystick, Rnet...)

sudo apt-get install git
git clone https://github.com/myhumankit/MagicJoystick2020
cd MagicJoystick2020
sudo ./setup.sh

Configuration Manuelle du Raspberry Pi

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

caption 6 étapes pour le moulage du doigt

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.

fixation du joystick magnétique

Joystick faible force

Vue de l'avant dernier prototype, voir ci-dessous pour la version définitive

caption joystick faible force

Communication

Premiers tests avec un système Raspberry Pi + PiCAN2

caption brochage du connecteur R-net

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

caption insertion 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 :

caption analyse statistique des trames Rnet

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

caption architecture logicielle

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

principe du système électronique

caption système électronique


Schéma au format pdf : schéma électronique magic joystick (pdf)

Dossier du projet kicad : dossier kicad

Dossier du projet kicad 2021 (complet avec pdf et png des schémas : Fichier:Joystick CF.zip


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.

caption Vue des boîtiers

Fichiers de fabrication (.dxf) :


Cable de liaison au fauteuil (CAN/R-net) + bouton d'arrêt d'urgence

caption Cable en Y et 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

caption joystick faible force

caption joystick faible force, partie mécanique

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 :

caption montage du joystick

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


Télécharger les fichiers STEP et STL du joystick à faible force


Support circuit capteur magnétique

caption 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

caption montage et fixation du joystick magnétique

Fixation pour l'écran OLED

Cette pièce s'enclenche sur le support de smartphone du fauteuil.

caption pièce de fixation de l'écran

Fichier de fabrication : ((AJOUTER STL/STEP FIXATION))

Composants utilisés

Capteur de positionnement MLX90333

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

caption valeurs mesurées par le capteur MLX90333

carte PiCAN2

caption 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

caption écran OLED

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

Pour la sécurité du fonctionnement

Pour la réplication du projet :

  • proposer une image du système sur carte SD