Différences entre versions de « Projets:Magic Control 2022 »
Ligne 141 : | Ligne 141 : | ||
** <code>css</code>, <code>js</code>, <code>img</code>, <code>fonts</code>, <code>svg_icons</code>: ressources statiques | ** <code>css</code>, <code>js</code>, <code>img</code>, <code>fonts</code>, <code>svg_icons</code>: ressources statiques | ||
** <code>templates</code>: templates html | ** <code>templates</code>: templates html | ||
− | ** <code> | + | ** <code>resources</code>: API Restfull |
+ | Dans le cadre de cette factorisation, les ressources, c'est-à-dire les points d'entrée de l'API Restfull, sont désormais définies dans le dossier <code>resources</code>. | ||
L'interface web est fonctionnelle, ainsi que l'apprentissage et la lecture de trames infrarouge. Les commandes et l'affichage de l'état du fauteuil n'ont cependant pas été testées. | L'interface web est fonctionnelle, ainsi que l'apprentissage et la lecture de trames infrarouge. Les commandes et l'affichage de l'état du fauteuil n'ont cependant pas été testées. | ||
− | ==== IR ==== | + | ==== Ressources IR dans l'interface ==== |
<span style="color:#FFFFFF; background:#ff6600; padding:5px">En cours</span> | <span style="color:#FFFFFF; background:#ff6600; padding:5px">En cours</span> | ||
Ligne 156 : | Ligne 157 : | ||
Il reste à passer les commandes de la TV dans ce nouveau format. | Il reste à passer les commandes de la TV dans ce nouveau format. | ||
− | === | + | === Enregistrement et lecture des trames avec le Raspberry Pi === |
− | |||
− | |||
==== Principe Raspberry pi / ir-ctl ==== | ==== Principe Raspberry pi / ir-ctl ==== | ||
+ | <span style="color:#FFFFFF; background:#ff6600; padding:5px">En cours</span> | ||
Ligne 184 : | Ligne 184 : | ||
On peut utiliser <code>--one-shot</code> pour ne pas avoir à ajouter une temporisation. Dans ce cas le processus d'enregistrement s'arrête dès qu'il identifie la fin d'une trame. | On peut utiliser <code>--one-shot</code> pour ne pas avoir à ajouter une temporisation. Dans ce cas le processus d'enregistrement s'arrête dès qu'il identifie la fin d'une trame. | ||
+ | <pre> | ||
+ | # Commande bash pour enregistrer une trame dans le fichier cmd.txt | ||
+ | ir-ctl -r -d /dev/lirc1 --mode2 --one-shot cmd.txt | ||
+ | |||
+ | # Commande bash pour lire une trame | ||
+ | sudo ir-ctl -d /dev/lirc0 -s cmd.txt | ||
+ | </pre> | ||
+ | |||
+ | Ces commandes sont exécutées à partir des ressources IR et TV qui sont définies dans le dossier <code>bin/IR</code> | ||
− | |||
==== Circuit électronique ==== | ==== Circuit électronique ==== | ||
+ | <span style="color:#FFFFFF; background:#ff6600; padding:5px">En cours</span> | ||
+ | |||
+ | Un circuit électronique sur stripboard permet d'ajouter un capteur et un émetteur infrarouge. | ||
+ | |||
+ | [[File:Magic_Control_2022_IR_photo.jpg|900px]] | ||
+ | |||
+ | Dès les premiers essais, il nous semble cependant que le circuit d'émission ne fonctionne pas très bien : la portée est très réduite et il faut viser avec beaucoup de précision. | ||
+ | |||
+ | |||
+ | Des modifications ont du être apportées à ce circuit : | ||
+ | |||
+ | * ajout d'un circuit de découplage pour le capteur tel que préconisé par le datasheet du capeur TSOP21. | ||
+ | * Les LEDS étaient alimentée par une broche GPIO, ce qui pose problème car il est nécessaire de l'activer (dans le script python IR) et elle ne peut pas fournir assez de courant. | ||
+ | * La resistance de charge des led infrarouge n'etait pas correctement dimensionnée. | ||
+ | |||
+ | |||
+ | Le nouveau circuit électronique est le suivant : | ||
+ | |||
+ | [[File:Magic_Control_2022_IR_elec.png|900px]] | ||
+ | |||
+ | |||
+ | Le calcul de la nouvelle valeur de la résistance est détaillé ci-après : | ||
− | + | [[File:Magic_Control_2022_IR_calcul_R.jpg|400px]] | |
− | |||
− | |||
− | |||
− | + | Après ces modifications, le circuit d'émission fonctionne mieux mais pas aussi bien qu'on peut l'espérer... | |
+ | |||
=== Interface === | === Interface === | ||
Ligne 206 : | Ligne 234 : | ||
<span style="color:#FFFFFF; background:#00C000; padding:5px"> Testé et fonctionnel</span> | <span style="color:#FFFFFF; background:#00C000; padding:5px"> Testé et fonctionnel</span> | ||
− | + | Un des problème que rencontre Jonathan dans l'utilisation de son téléphone est l'éblouissement du au soleil. Pour y remédier, Kristi a modélisé une casquette adaptée à ce téléphone | |
+ | |||
+ | [[File:Magic_Control_2022_casquette_modele.png|900px]] | ||
+ | |||
+ | [[File:Magic_Control_2022_casquette.jpg|900px]] | ||
==== Boîtier M5Stack ==== | ==== Boîtier M5Stack ==== | ||
+ | |||
+ | Une idée possible est de disposer le M5Stack de contrôle du fauteuil de façon à ce qu'il soit accessible par Jonathan et d'utiliser l'écran comme un retour d'information sans passer par le téléphone. Dans cette optique, Kristi a modélisé un boitier pour le M5Stack qu'il est possible d'attacher sur un bras flexible. | ||
+ | |||
+ | [[File:Magic_Control_2022_boitier_M5Stack.png|900px]] | ||
== Cahier des charges == | == Cahier des charges == |
Version du 6 décembre 2022 à 17:45
Magic Control 2022
400pxLa propriété « A image principale » (comme le type de page) avec la valeur d’entrée « File: » contient des caractères non valides ou est incomplète, et donc peut provoquer des résultats inattendus lors d’une requête ou d’un processus d’annotation. | |
---|---|
Informations | |
Description | Développement du Magic Control pendant le Fabrikarium 2022 |
Catégorie | Mobilité Motricité |
Etat d'avancement | En cours |
Techniques | |
Durée de fabrication | |
Coût matériel | |
Niveau | |
Licence | by-sa |
Date de création | 2022-10-18 |
Équipe | |
Porteur de projet | Jonathan |
Contributeurs | Delphine, LaurentM |
Animateur | Delphine |
Fabmanager | Delphine |
Référent documentation | LaurentM |
Nom humanlab | Humanlab_MHK |
Documentation | |
Statut de la documentation | Partielle |
Relecture de la documentation | Non vérifiée |
Description du projet
Historique
Rappel des épisodes précédents en quelques mots
- Can2RNET (Fabrikarium 2019) Commande d'un fauteuil roulant par l'intérmédiaire de son bus CAN
- Magic Joystick (Fabrikarium 2019) Fabrication d'un joystick faible pression pour contrôler le fauteuil
- Magic Joystick 2020 (Fabrikarium 2020)
- Magic Control 2021 (Fabrikarium 2021) Ajout de l'interface
- Magic Control V2 (Stages INRIA de Brice et Roxanne)
- Fokus Magic Control 2022
Chantiers pour ce Fabrikarium
Utilisation de M5Stack
Objectif : Se passer de raspberry pi pour économiser de la batterie
Amélioration de l'interface
- Revoir la page d'accueil
Intégration de la domotique
- Apprentissage de trames infrarouge pour remplacer des télécommandes (Contrôle de la télé, ouverture des portes)
État précédent
Schéma de principe
- Schéma de principe électronique
- Architecture logicielle
Raspberry pi
- Installation -> setup.sh
- Gestion des tâchessupervisord
- Gestion du réseau + idée d'amélioration tethering
Interface
Documentation server http / api rest / mqtt
- L'interface web est fournie par un serveur http qui utilise le microframework python
flask
. - Le serveur fourni une API REST à l'aide de la bibliothèque
flask-RESTful
. - Cette api est reliée au système de message MQTT.
Chantier du Fabrikarium
R-NET CTRL de Raspberry Pi à M5Stack
En cours
Pourquoi ?
Utiliser la raspberry pi pour faire l'interface entre le magic-joystick et le fauteuil pose quelques problèmes :
- le fauteuil doit être déconnecté du JSM d'origine du fauteuil
- le raspberry pi doit être allumé en permanence même si on utilise le JSM
Or il est aussi possible de se connecter au fauteuil en tant que second JSM, ce qui permet de conserver la connexion du JSM d'origine. Par contre, cela complique l'apprentissage des séquences d'initialisation qu'il est nécessaire de reproduire pour émuler un joystick à partir du microcontrôleur.
Pour rappel, pour se connecter avec le BUS CAN au contrôleur du fauteuil, il faut "rejouer" une trame afin de se faire identifier comme un JSM.
Il y a aussi une limite dans l'utilisation du raspberry pi comme interface car il doit décoder et recoder les trames du JSM, et n'a parfois pas la vélocité pour faire tout ce qu'on veut.
Apprentissage
On a besoin d'un module supplémentaire COMMU pour le bus CAN, ainsi que deux interfaces CAN.
Composants utilisés :
Module Bus CAN x 2
En période d'apprentissage, au lieu de se faire passer pour le JSM d'origine du fauteuil, on utilise un second JSM (JSM_1) qui n'est utilisé que pour l'apprentissage.
On a alors besoin d'enregistrer deux séquences d'initialisation :
- Celle qui est émise par
JSM_1
(le deuxième JSM: celui qu'on veut émuler plus tard) lorqsue c'est lui qui démarre le fauteuil. - Celle qui est émise par
JSM_1
lorsque le fauteuil est démarré parJSM_0
.
À noter que seul le JSM qui a démarré le fauteuil peut prendre la main sur le déplacement du fauteuil.
On en profite pour enregister deux autres séquences, les séquences "sablier", qui sont émise par le JSM_1
en cas de panne. Encore une fois, ces séquences sont différentes si le fauteuil a été allumé par JSM_0
(dicSablierJSM.bin
) ou JSM_1
(dictSablierLocal.bin
)
Pour cela, il faut simuler la déconnection du JSM_0
pour faire "planter" le système, puis enregister la séquence sablier émise.
Le système complet pour enregistrer les séquences (Arduino + M5Stack/COMMU + tranceiver CAN) est indépendant du système installé sur le fauteuil. Les séquences enregistrées sont écrites dans des fichiers sur une carte SD qui peut doit être insérée dans le M5Stack qui est sur le fauteuil.
TODO: Mettre à jour le schéma de principe tel qu'il va évoluer avec M5Stack / Sans MQTT ?
Serveur WEB interface
Serveur statique
En cours
Un script python permet de télécharger une version statique toutes les pages html produites par flask dans une liste définie.
Une option a été ajoutée dans le serveur flask pour choisir le mode de chargement des ressources statiques.
Factorisation
- Création d'une arborescence : les fichiers web qui étaient tous dans un dossier
html
sont répartis dans des dossiers :css
,js
,img
,fonts
,svg_icons
: ressources statiquestemplates
: templates htmlresources
: API Restfull
Dans le cadre de cette factorisation, les ressources, c'est-à-dire les points d'entrée de l'API Restfull, sont désormais définies dans le dossier resources
.
L'interface web est fonctionnelle, ainsi que l'apprentissage et la lecture de trames infrarouge. Les commandes et l'affichage de l'état du fauteuil n'ont cependant pas été testées.
Ressources IR dans l'interface
En cours
Pour l'instant, des ressources sont définies séparément pour l'enregistrement et la lecture infrarouge et sont spécifiques à l'utilisation d'une télécommande de TV.
Une nouveau point d'entrée de l'API défini désormais une ressource générique IR
, qui prend en charge l'enregistrement et la lecture.
Il reste à passer les commandes de la TV dans ce nouveau format.
Enregistrement et lecture des trames avec le Raspberry Pi
Principe Raspberry pi / ir-ctl
En cours
Sur la version raspberry pi, on utilise un capteur et des leds infrarouges directement reliées au GPIO.
L'utilitaire en ligne de commande ir-ctl
pour enregistrer des trames infrarouges dans des fichiers et les relire. Il s'installe à partir du paquet v4l-utils
.
Il est nécessaire de configurer les deux broches GPIO dans le fichier boot/config.txt
.
# MagicJoy IR config starts ========= # Uncomment this to enable the infrared module #for receiver, enable to receive IR signals dtoverlay=gpio-ir,gpio_pin=18,rc-map-name=ir-keytable #for transmitter, enable to send IR signals dtoverlay=gpio-ir-tx,gpio_pin=17 # MagicJoy IR config stops ==========
On peut utiliser --one-shot
pour ne pas avoir à ajouter une temporisation. Dans ce cas le processus d'enregistrement s'arrête dès qu'il identifie la fin d'une trame.
# Commande bash pour enregistrer une trame dans le fichier cmd.txt ir-ctl -r -d /dev/lirc1 --mode2 --one-shot cmd.txt # Commande bash pour lire une trame sudo ir-ctl -d /dev/lirc0 -s cmd.txt
Ces commandes sont exécutées à partir des ressources IR et TV qui sont définies dans le dossier bin/IR
Circuit électronique
En cours
Un circuit électronique sur stripboard permet d'ajouter un capteur et un émetteur infrarouge.
Dès les premiers essais, il nous semble cependant que le circuit d'émission ne fonctionne pas très bien : la portée est très réduite et il faut viser avec beaucoup de précision.
Des modifications ont du être apportées à ce circuit :
- ajout d'un circuit de découplage pour le capteur tel que préconisé par le datasheet du capeur TSOP21.
- Les LEDS étaient alimentée par une broche GPIO, ce qui pose problème car il est nécessaire de l'activer (dans le script python IR) et elle ne peut pas fournir assez de courant.
- La resistance de charge des led infrarouge n'etait pas correctement dimensionnée.
Le nouveau circuit électronique est le suivant :
Le calcul de la nouvelle valeur de la résistance est détaillé ci-après :
Après ces modifications, le circuit d'émission fonctionne mieux mais pas aussi bien qu'on peut l'espérer...
Interface
Nouvelle couleur 31 73 125
Modélisation
Casquette téléphone
Testé et fonctionnel
Un des problème que rencontre Jonathan dans l'utilisation de son téléphone est l'éblouissement du au soleil. Pour y remédier, Kristi a modélisé une casquette adaptée à ce téléphone
Boîtier M5Stack
Une idée possible est de disposer le M5Stack de contrôle du fauteuil de façon à ce qu'il soit accessible par Jonathan et d'utiliser l'écran comme un retour d'information sans passer par le téléphone. Dans cette optique, Kristi a modélisé un boitier pour le M5Stack qu'il est possible d'attacher sur un bras flexible.