Différences entre versions de « Projets:Magic Joystick 2020 »

De wikilab
Ligne 215 : Ligne 215 :
 
==  Architecture logicielle sur le Raspberry Pi ==
 
==  Architecture logicielle sur le Raspberry Pi ==
  
[[File:schema_architecture_logicielle.png|400px|caption architecture logicielle]]
+
[[File:schema_architecture_logicielle.png|800px|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
 
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

Version du 22 octobre 2020 à 15:11

 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 :

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

caption schéma global simplifié

(schéma du mardi 21 oct, 10h)

Matériel nécessaire

imprimante 3D

  • pièces en impression 3D
  • aimants néodyme 3x3mm
  • 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
  • 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

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

Voir schéma électronique plus bas

Prototype modifié :

caption joystick faible force

((AJOUTER FICHIERS .STEP + .STL))

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.

Fabrication du cable en Y

caption insertion du cable en Y

((AJOUTER SCHEMA))

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

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/mnct/Magic_Joystick_2020

 Système électronique

caption 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

((A COMPLETER))

Alimentation

L'alimentation du système électronique (Raspberry Pi et capteur) se fait à partir de la batterie du fauteuil (24V)

((EN COURS / A COMPLETER))

Raspberry Pi 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 sont faites pour empêcher les écritures sur la carte µSD.

((EN COURS / A COMPLETER))

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

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