﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://bacasable.arpitania.eu//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alexandre+Oriol</id>
	<title>Learning Lab Environnements Connectés - Contributions de l’utilisateur [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://bacasable.arpitania.eu//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alexandre+Oriol"/>
	<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Sp%C3%A9cial:Contributions/Alexandre_Oriol"/>
	<updated>2026-04-05T21:20:18Z</updated>
	<subtitle>Contributions de l’utilisateur</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11807</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11807"/>
		<updated>2022-05-05T12:08:07Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots pompiers==&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et Esclaves) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elle est connectée au PCB à l'aide du connecteur d'alimentation situé dans l'angle inférieur gauche.&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner la carte ESP32&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino via ce [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
&lt;br /&gt;
==Déplacement du robot==&lt;br /&gt;
&lt;br /&gt;
* Pour gérer le déplacement via le terminal on a utilisé le [https://mootse.telecom-st-etienne.fr/mod/resource/view.php?id=13653 code pour une plateforme holonome 4 moteurs]. &lt;br /&gt;
* Procédure de test de la chaine d'alimentation, contrôle et asservissement :&lt;br /&gt;
# Téléverser ce [https://bacasable.arpitania.eu/index.php?title=Fichier:TeensyVSL298AsservissementVitesse4X_V2_0.zip code fourni] sur la carte Teensy. La pleine vitesse citée plus tard est définie par paramVitesse dans les paramètres globaux en début de code.&lt;br /&gt;
# Téléverser un programme vide dans l'ESP32&lt;br /&gt;
# Connecter la broche Rx de la Teensy sur le pin Tx de l'ESP32, inversement pour Tx. En effet, les deux cartes sont branchées en parallèle, la carte ESP32 étant logiquement transparente, elle nous permet simplement d'envoyer des commandes série sur la Teensy&lt;br /&gt;
# Connecter un PC à la carte ESP32 via le port micro USB&lt;br /&gt;
# Ouvrir une console série (par exemple la série arduino) sur le port concerné et tester les moteurs avec les commandes suivantes :&lt;br /&gt;
#:- &amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse, (resp. ''av2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse, (resp. ''am2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
# Tester les mouvements entiers :&lt;br /&gt;
#:* Robot 4 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;av&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à pleine vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens horaire de 30 degrés&lt;br /&gt;
#::- &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens trigo de 30 degrés&lt;br /&gt;
#::- &amp;lt;code&amp;gt;dt&amp;lt;/code&amp;gt; pour faire un demi tour&lt;br /&gt;
#::- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper le robot&lt;br /&gt;
#:* Robot 3 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amXXX&amp;lt;/code&amp;gt; pour définir la direction ''XXX'' (en degrés) de déplacement du robot&lt;br /&gt;
#::- &amp;lt;code&amp;gt;ho3&amp;lt;/code&amp;gt; pour avancer dans la direction définie précédemment&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer à la Teensy via l'UART :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant&lt;br /&gt;
 | &amp;lt;code&amp;gt;av&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite 30 degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 30 degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi-tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;dt&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Odométrie==&lt;br /&gt;
&lt;br /&gt;
On utilise deux informations couplées : calcul de la position depuis les codeurs magnétiques des moteurs et en parallèle un accéléromètre et un gyroscope contenus dans la centrale inertielle. &lt;br /&gt;
&lt;br /&gt;
Utilisation d'une centrale à inertie pour le calcul du déplacement effectué par le robot maître : MPU9250 10dof. Cette centrale à inertie est composée d'un gyroscope, d'un accéléromètre, d'un magnétomètre et d'un baromètre. La communication se fait via un bus I²C.&lt;br /&gt;
&lt;br /&gt;
Le reste de la documentation est disponible sur https://cdn.sparkfun.com/assets/learn_tutorials/5/5/0/MPU-9250-Register-Map.pdf.&lt;br /&gt;
&lt;br /&gt;
===Robot maître===&lt;br /&gt;
&lt;br /&gt;
La documentation pour les capteurs des moteurs du robot maitre étant absente, nous avons mesuré le nombre d'incrémentations pour un tour de roue : 720.&lt;br /&gt;
&lt;br /&gt;
Nous avons également mesuré le périmètre d'une roue : &lt;br /&gt;
&lt;br /&gt;
===Robots esclaves===&lt;br /&gt;
&lt;br /&gt;
=Programmation carte Raspberry Pi 3=&lt;br /&gt;
&lt;br /&gt;
====Installation d'un système d'exploitation====&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balena Etcher pour flasher l’image sur la carte SD&lt;br /&gt;
&lt;br /&gt;
On aurait aussi pu passer par l'utilitaire Raspberry Pi Imager, qui se charge de télécharger automatiquement l'OS et de flasher la carte SD. &lt;br /&gt;
&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale &lt;br /&gt;
&lt;br /&gt;
====Utilisation de la caméra====&lt;br /&gt;
# Si la liaison de la Raspberry avec un écran en HDMI ne se fait pas, il faut modifier le fichier config.txt (hdmi_group et hdmi_mode) de la carte micro SD de la Raspberry, pour forcer l'envoi sur le port HDMI même si rien n'est détecté à l'autre bout du câble.&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Dans le terminal, lancer &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt; et activer la caméra dans le menu Interfaces. Redémarrer ensuite la Raspberry. &lt;br /&gt;
# Premiers tests en local avec : &amp;lt;code&amp;gt;raspistill -o photo.jpg&amp;lt;/code&amp;gt; (enregistrement d’une photo avec retardateur de 5sec), puis &amp;lt;code&amp;gt;raspivid -o video.h264&amp;lt;/code&amp;gt; vidéo)&lt;br /&gt;
# Premier stream avec : &amp;lt;code&amp;gt;raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264&amp;lt;/code&amp;gt; sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : &amp;lt;code&amp;gt;rtsp://@IPpi:8080/&amp;lt;/code&amp;gt; [[Fichier:StreamCam.png|500px|thumb|right|streaming de la caméra sur un PC connecté au même réseau Wifi (partage de connexion dans notre cas)]]&lt;br /&gt;
# Installation de Mjpg-Streamer :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~&lt;br /&gt;
sudo apt-get install libjpeg9-dev&lt;br /&gt;
git clone https://github.com/jacksonliam/mjpg-streamer.git&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install cmake&lt;br /&gt;
CFLAGS+=&amp;quot;-Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s&amp;quot; make&lt;br /&gt;
sudo make install&lt;br /&gt;
cd ~/mjpg-streamer/mjpg-streamer-experimental./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Lancement du serveur Mjpg Streamer sur le port 8080&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Utilisation du port série====&lt;br /&gt;
Il est nécessaire d'activer et d'accorder les droits d'accès au port série :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;raspi-config &amp;gt; Interface options &amp;gt; Serial Port &amp;gt; Enable&lt;br /&gt;
sudo chmod 666 /dev/ttyS0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Choix de l'environnement serveur====&lt;br /&gt;
&lt;br /&gt;
Pour la gestion back sur le Raspberry, nous avons d'abord pensé utiliser un programme C++ proche du matériel et de la série. Cependant, la gestion web était alors largement compliquée.&lt;br /&gt;
Nous avons retenu d'utilisation d'un serveur node.js pour servir la page web et transmettre les commandes d'avancement comme les remontées d'alertes.&lt;br /&gt;
&lt;br /&gt;
=Interface Web=&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Afin de télépiloter le robot maître, nous utilisons une interface homme-machine via une page web.&lt;br /&gt;
Le serveur et le client communiquent à l’aide d’une connexion socket.&lt;br /&gt;
&lt;br /&gt;
Le flux vidéo est fourni par un serveur &amp;lt;code&amp;gt;mjpg streamer&amp;lt;/code&amp;gt;, indépendant du serveur &amp;lt;code&amp;gt;NodeJS&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Front===&lt;br /&gt;
La page web servie est en HTML, et contient un script JS.&lt;br /&gt;
D’une part, le retour caméra est incrusté à l’aide de la simple ligne suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;img width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; src=&amp;quot;http://192.168.246.107:8080/?action=stream&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au clic d’un bouton, il émet un évènement sur le socket.&lt;br /&gt;
S'il reçoit un message d'alerte sur le socket, il modifie en conséquence la couleur de l'alerte correspondante&lt;br /&gt;
&lt;br /&gt;
===Back===&lt;br /&gt;
Le serveur web est en NodeJS.&lt;br /&gt;
Outre servir la page web aux clients qui se connecte, il reçoit les évènements par le socket ouvert avec chacun d’eux. Il les transmet sur le port série.&lt;br /&gt;
Lorsqu'il commence à recevoir des données d'alerte sur le port série, il envoie un message pour afficher l'alerte sur le client.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas, des timers sont déclenchés pour stopper le robot ou le déclanchement des alertes en cas de déconnexion WiFi.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé la bibliothèque NodeJS &amp;lt;code&amp;gt;SerialPort&amp;lt;/code&amp;gt; pour la gestion des entrées/sorties sur le port série.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo apt install nodejs&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installation du serveur==&lt;br /&gt;
Dans un terminal du Raspberry, exécuter à l’emplacement des fichiers du serveur :&lt;br /&gt;
&amp;lt;code&amp;gt; npm i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lancement des serveurs au démarage==&lt;br /&gt;
Pour la mise en route des serveurs automatiquement lors du boot de la carte, nous avons modifié le fichier /etc/rc.local pour y placer juste avant la ligne &amp;lt;code&amp;gt;exit 0&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo ./home/pi/Documents/script&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script contient :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; #!/bin/bash&lt;br /&gt;
cd /home/pi/mjpg-streamer/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot; &amp;amp;&lt;br /&gt;
cd /home/pi/Desktop/Server&lt;br /&gt;
sudo node server.js&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tests serveur==&lt;br /&gt;
On peut ensuite tester l'envoi et la réception de trames UART depuis la Raspberry :&lt;br /&gt;
#Ouvrir un terminal, lancer mjpg streamer et le serveur &lt;br /&gt;
#Vérifier que l'appui sur des boutons du serveur côté client engendre l'envoie de trames depuis la broche Tx de la carte à l'aide d'un oscilloscope&lt;br /&gt;
#Vérifier que des données sont bien reçues, via l'interface graphique du serveur ou via le terminal en observant les données reçues provenant d'une carte ESP 32 Thing avec un code adapté pour le test&lt;br /&gt;
[[Fichier:raspbberry_av.PNG|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
==Capteur de température==&lt;br /&gt;
===Étude de la diffusion de la température en cas d'incendie===&lt;br /&gt;
Lors d'un incendie, le rayonnement est la principale source de transmission de la chaleur.&lt;br /&gt;
Un tableau fournit par le ministère permet d'estimer la densité de flux thermique radiatif en fonction de la distance à la flamme:&lt;br /&gt;
[[Fichier:Fnap.png|500px|thumb|center]]&lt;br /&gt;
On utilise ensuite la loi de Stéphan afin de déterminer la température:&lt;br /&gt;
[[Fichier:StephanLoi.png|500px|thumb|center]]&lt;br /&gt;
A l'aide d'Excel, on obtient les résultats suivants:&lt;br /&gt;
[[Fichier:Flamme_gaz.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Flamme_hydrocarbure.JPG|1000px|thumb|center]]&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur AOSONG AM2302 qui permet de mesurer la température ainsi que le taux d'humidité de l'air, fonction dont on ne servira pas.&lt;br /&gt;
Ce capteur permet de mesurer des températures de -40°C à 80°C.&lt;br /&gt;
&lt;br /&gt;
D'après le modèle :&lt;br /&gt;
&lt;br /&gt;
On n’a que 4 points donc on est peu précis mais on obtient un ordre de grandeur de l’ordre de 23m -27m pour ressentir 80°C en cas d’incendie, le choix d’un capteur mesurant jusqu’à une température de 80°C est donc cohérent avec le cas d’étude. Détecter un incendie environ 25m avant de l’atteindre dans un bâtiment est acceptable pour un robot, sachant qu’on a en plus des capteurs pour le gaz et la fumée (MQ9 et MQ135). On a une température de 60°C à 30m du feu environ (ça chute vite). On placera un seuil d'alerte à 60°C pour détecter les potentiels feux (le robot serait à une distance théorique de 30m du feu ce qui semble correct et réaliste).&lt;br /&gt;
&lt;br /&gt;
ATTENTION : On ne prend pas en compte la convexion et la conduction, on a seulement le rayonnement dans ce modèle simplifié. On aura donc une température un peu plus élevée dans la réalité.&lt;br /&gt;
==Capteur UV==&lt;br /&gt;
Pour mesurer l'indice UV, nous avons considéré le capteur SI1145 qui fonctionne par I²C, nous l'avions testé et était fonctionnel. Malheureusement lors d'un autre essai, son alimentation et sa masse ont été malencontreusement inversés ce qui a rendu le capteur hors service.&lt;br /&gt;
Nous avons donc redirigé notre choix vers les UV sensor Grove v1.1 qui ne fonctionnent pas en I²C mais à l'aide de 3 fils (GND, VCC, Signal). Il fournit des valeurs d'UV cohérentes lors de nos tests (indice UV entre 2 et 3). Nous placerons le seuil d'alerte à 6 pour prévenir d'un risque élevé.&lt;br /&gt;
[[Fichier:IndiceUv.jpg|400px|thumb|center]]&lt;br /&gt;
==Capteur de gaz toxiques==&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur MQ9 qui est un capteur coûtant peu cher et offrant une performance acceptable à condition de l'avoir calibré correctement avant utilisation. Il permet de mesurer la concentration en CO (Monoxyde de carbone) afin de permettre au robot maître de prévenir un danger d'intoxication au gaz carbonique. Il permet également de mesurer la concentration en CH4 afin de pouvoir détecter de potentielles fuites de gaz.&lt;br /&gt;
&lt;br /&gt;
Il fonctionne à l'aide de 3 fils (GND, VCC, Signal).&lt;br /&gt;
&lt;br /&gt;
La concentration en CH4 devient dangereuse à partir de 50 000 ppm (limite d’explosivité), mais une concentration au-delà de 1000 ppm (500 fois supérieure à ce que l'on trouve pour un air pur) ne laisse aucun doute quand à une fuite de gaz. On placera donc la limite à 1000 ppm.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SeuilCO.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Codanger.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Pour le CO, on placera la limite à 200 ppm, stade à partir duquel une exposition de deux ou trois heures provoque des maux de têtes (--&amp;gt; besoin de vigilance).&lt;br /&gt;
Le capteur MQ9 permet de mesurer le CO de 10 ppm à 1000 ppm, et le CH4 de 100 ppm à 10 000 ppm donc il convient pour notre projet.&lt;br /&gt;
===Étalonnage du capteur===&lt;br /&gt;
La datasheet permet d'étalonner le capteur, à l'aide d'Excel on détermine une courbe de tendance à utiliser pour obtenir nos valeurs.&lt;br /&gt;
[[Fichier:EtalonMQ9.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Note: Rs est la valeur renvoyée par le capteur, R0 est déterminée grâce à la datasheet, et les courbes d'étalonnage fournies servent à retrouver les concentrations en ppm des différents gaz.&lt;br /&gt;
==Capteur de CO2==&lt;br /&gt;
Le CO2 présente également des dangers pour les personnes, on équipe ainsi le robot d'un capteur de CO2. Les seuils de danger du CO2 sont les suivants:&lt;br /&gt;
[[Fichier:SeuilCO2.JPG|1000px|thumb|center]]&lt;br /&gt;
On va donc placer une alerte à 2000 ppm pour le CO2.&lt;br /&gt;
Nous avions initialement choisi le capteur XENSIV PAS CO2 qui correspondait à ces critères (mesure le CO2 entre 0 ppm et 32 000 ppm), mais son prix a soudainement grimpé pour des raisons d'approvisionnement. Nous nous sommes donc rabattus sur un autre modèle: le CCS811 qui permet de mesurer le taux de CO2 pour des valeurs comprises en 400 ppm et 8192 ppm (il donne pour résultat 400 ppm par défaut pour les valeurs inférieures ou égales à 400 ppm).&lt;br /&gt;
==Télémètres==&lt;br /&gt;
Le robot maître étant dirigé par caméra, on ne l'équipera que d'un télémètre pour assister le pilote lors de la détection d'obstacles frontaux. Les robots esclaves eux vont être équipés de télémètres pour pouvoir détecter les obstacles dans leur direction de mouvement. Pour le robot maître, on met une alerte en place pour un obstacle détecté à 20 cm du robot et on bloque le robot si il se trouve à 10 cm de l'obstacle et qu'il souhaite se déplacer vers l'obstacle. Pour le robot esclave, on force le robot esclave à changer de trajectoire 15 cm avant l'obstacle afin de lui laisser le temps d'éviter la collision.&lt;br /&gt;
===SRF===&lt;br /&gt;
Dans la série des télémètres SRF, nous disposons des modèles SRF08, SRF10 et SRF04. Les modèles SRF08 et SRF10 fonctionnent à l'aide de l'I²C, le modèle SRF04 lui fonctionne par voie analogique à l'aide de 4 fils (echo, trigger, GND, supply). SRF08 peut détecter les objets jusqu'à 6m avec un angle de détection de 55°, le SRF10 peut détecter les objets jusqu'à 6m avec un angle de détection de 72°, le SRF04 peut détecter jusqu'à 3m avec un angle de détection de 30°. La distance minimale de détection des 3 capteurs est de 3 cm. Ces 3 capteurs conviennent à notre utilisation.&lt;br /&gt;
&lt;br /&gt;
===US-020===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, GND, Alim), son angle de détection est de 15°, il permet de mesurer les obstacles entre 2cm et 7m. L'angle de détection est plutôt faible mais il pourrait servir sur les robots esclaves pour surveiller les angles du robot.&lt;br /&gt;
===VMA360===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, GND, Alim), il a un angle de détection de 15°, il permet de mesurer les obstacles entre 2cm et 4,5m. L'angle de détection est plutôt faible mais il pourrait servir sur les esclaves pour surveiller les angles du robot.&lt;br /&gt;
==Tableau récapitulatif==&lt;br /&gt;
[[Fichier:Capteurs_pompier.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
On estime possible d'alimenter tous ces capteurs avec les batteries prévues au vu des courants d'alimentation qu'elles fournissent.&lt;br /&gt;
==Librairies Arduino==&lt;br /&gt;
Nous avons dû installer des librairies Arduino pour faire fonctionner les capteurs :&lt;br /&gt;
&amp;quot;DFRobot_CCS811&amp;quot; pour le capteur de CO2 CCS811;&lt;br /&gt;
&amp;quot;DHT Sensor Library&amp;quot; pour le capteur de température;&lt;br /&gt;
&amp;quot;Adafruit Circuit Playground&amp;quot; et &amp;quot;Adafruit Unified Sensor&amp;quot; pour les capteurs d'Adafruit.&lt;br /&gt;
&lt;br /&gt;
Il faut également avoir installé une librairie dans le gestionnaire de cartes pour pouvoir utiliser l'ESP32 Thing (carte utilisée pour acquérir les données des capteurs et pilote la Teensy). Lien du site officiel pour réaliser cette manipulation: https://learn.sparkfun.com/tutorials/esp32-thing-hookup-guide.&lt;br /&gt;
&lt;br /&gt;
=Code informatique=&lt;br /&gt;
==Robot maître==&lt;br /&gt;
&lt;br /&gt;
===Communication entre la Raspberry et l'ESP32===&lt;br /&gt;
====Dans le sens Raspberry vers ESP32====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer&lt;br /&gt;
 | &amp;lt;code&amp;gt;av&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;dt&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Dans le sens ESP32 vers Raspberry====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer les alertes de l'ESP32 vers la Raspberry :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Alerte&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO&lt;br /&gt;
 | &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO2&lt;br /&gt;
 | &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CH4&lt;br /&gt;
 | &amp;lt;code&amp;gt;C4&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Température Haute&lt;br /&gt;
 | &amp;lt;code&amp;gt;TH&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | UV&lt;br /&gt;
 | &amp;lt;code&amp;gt;UV&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Distance à l'avant du robot&lt;br /&gt;
 | &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Erreur : en cas de commande av non exécutée car distance avant trop faible&lt;br /&gt;
 | &amp;lt;code&amp;gt;er&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Communication vers le robot esclave===&lt;br /&gt;
====ESP32 Maître vers ESP32 Esclave====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |- &lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer d'une distance de XXX centimètres&lt;br /&gt;
 | &amp;lt;code&amp;gt;avXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rdXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rgXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Pour faire demi-tour, on envoie un rd180.&lt;br /&gt;
&lt;br /&gt;
==Schéma récapitulatif des différentes communications==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Communications_pompier.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
===Robots esclaves===&lt;br /&gt;
&lt;br /&gt;
=Notes tableaux J101=&lt;br /&gt;
Sauvegarde des notes des tableaux de la J101 le 7 avril 2022.&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_5.jpg|500px|thumb|left|Tableau 5]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_4.jpg|500px|thumb|left|Tableau 4]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_3.jpg|500px|thumb|left|Tableau 3]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_2.jpg|500px|thumb|left|Tableau 2]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_1.jpg|500px|thumb|left|Tableau 1]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11801</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11801"/>
		<updated>2022-05-05T11:48:13Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots pompiers==&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elle est connectée au PCB à l'aide du connecteur d'alimentation situé dans l'angle inférieur gauche.&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner la carte ESP32&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino via ce [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
&lt;br /&gt;
==Déplacement du robot==&lt;br /&gt;
&lt;br /&gt;
* Pour gérer le déplacement via le terminal on a utilisé le [https://mootse.telecom-st-etienne.fr/mod/resource/view.php?id=13653 code pour une plateforme holonome 4 moteurs]. &lt;br /&gt;
* Procédure de test de la chaine d'alimentation, contrôle et asservissement :&lt;br /&gt;
# Téléverser ce [https://bacasable.arpitania.eu/index.php?title=Fichier:TeensyVSL298AsservissementVitesse4X_V2_0.zip code fourni] sur la carte Teensy. La pleine vitesse citée plus tard est définie par paramVitesse dans les paramètres globaux en début de code.&lt;br /&gt;
# Téléverser un programme vide dans l'ESP32&lt;br /&gt;
# Connecter la broche Rx de la Teensy sur le pin Tx de l'ESP32, inversement pour Tx. En effet, les deux cartes sont branchées en parallèle, la carte ESP32 étant logiquement transparente, elle nous permet simplement d'envoyer des commandes série sur la Teensy&lt;br /&gt;
# Connecter un PC à la carte ESP32 via le port micro USB&lt;br /&gt;
# Ouvrir une console série (par exemple la série arduino) sur le port concerné et tester les moteurs avec les commandes suivantes :&lt;br /&gt;
#:- &amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse, (resp. ''av2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse, (resp. ''am2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
# Tester les mouvements entiers :&lt;br /&gt;
#:* Robot 4 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à pleine vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à demi vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;rXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens horaire d'un angle XX = {45,90,135}&lt;br /&gt;
#::- &amp;lt;code&amp;gt;gXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens trigo d'une angle XX = {45,90,135}&lt;br /&gt;
#:* Robot 3 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amXXX&amp;lt;/code&amp;gt; pour définir la direction ''XXX'' (en degrés) de déplacement du robot&lt;br /&gt;
#::- &amp;lt;code&amp;gt;ho3&amp;lt;/code&amp;gt; pour avancer dans la direction définie précédemment&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer à la Teensy via l'UART :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant&lt;br /&gt;
 | &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant à demi vitesse&lt;br /&gt;
 | &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;r45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;g45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi-tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;demit&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Odométrie robot maître==&lt;br /&gt;
On utilise deux informations couplées : calcul de la position depuis les codeurs magnétiques des moteurs et en parallèle un accéléromètre et un gyroscope contenus dans la centrale inertielle. &lt;br /&gt;
&lt;br /&gt;
Utilisation d'une centrale à inertie pour le calcul du déplacement effectué par le robot maître : MPU9250 10dof. Cette centrale à inertie est composée d'un gyroscope, d'un accéléromètre, d'un magnétomètre et d'un baromètre. La communication se fait via un bus I²C.&lt;br /&gt;
&lt;br /&gt;
Le reste de la documentation est disponible sur https://cdn.sparkfun.com/assets/learn_tutorials/5/5/0/MPU-9250-Register-Map.pdf.&lt;br /&gt;
&lt;br /&gt;
=Programmation carte Raspberry Pi 3=&lt;br /&gt;
&lt;br /&gt;
====Installation d'un système d'exploitation====&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balena Etcher pour flasher l’image sur la carte SD&lt;br /&gt;
&lt;br /&gt;
On aurait aussi pu passer par l'utilitaire Raspberry Pi Imager, qui se charge de télécharger automatiquement l'OS et de flasher la carte SD. &lt;br /&gt;
&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale &lt;br /&gt;
&lt;br /&gt;
====Utilisation de la caméra====&lt;br /&gt;
# Si la liaison de la Raspberry avec un écran en HDMI ne se fait pas, il faut modifier le fichier config.txt (hdmi_group et hdmi_mode) de la carte micro SD de la Raspberry, pour forcer l'envoi sur le port HDMI même si rien n'est détecté à l'autre bout du câble.&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Dans le terminal, lancer &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt; et activer la caméra dans le menu Interfaces. Redémarrer ensuite la Raspberry. &lt;br /&gt;
# Premiers tests en local avec : &amp;lt;code&amp;gt;raspistill -o photo.jpg&amp;lt;/code&amp;gt; (enregistrement d’une photo avec retardateur de 5sec), puis &amp;lt;code&amp;gt;raspivid -o video.h264&amp;lt;/code&amp;gt; vidéo)&lt;br /&gt;
# Premier stream avec : &amp;lt;code&amp;gt;raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264&amp;lt;/code&amp;gt; sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : &amp;lt;code&amp;gt;rtsp://@IPpi:8080/&amp;lt;/code&amp;gt; [[Fichier:StreamCam.png|500px|thumb|right|streaming de la caméra sur un PC connecté au même réseau Wifi (partage de connexion dans notre cas)]]&lt;br /&gt;
# Installation de Mjpg-Streamer :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~&lt;br /&gt;
sudo apt-get install libjpeg9-dev&lt;br /&gt;
git clone https://github.com/jacksonliam/mjpg-streamer.git&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install cmake&lt;br /&gt;
CFLAGS+=&amp;quot;-Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s&amp;quot; make&lt;br /&gt;
sudo make install&lt;br /&gt;
cd ~/mjpg-streamer/mjpg-streamer-experimental./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Lancement du serveur Mjpg Streamer sur le port 8080&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Utilisation du port série====&lt;br /&gt;
Il est nécessaire d'activer et d'accorder les droits d'accès au port série :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;raspi-config &amp;gt; Interface options &amp;gt; Serial Port &amp;gt; Enable&lt;br /&gt;
sudo chmod 666 /dev/ttyS0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Choix de l'environnement serveur====&lt;br /&gt;
&lt;br /&gt;
Pour la gestion back sur le Raspberry, nous avons d'abord pensé utiliser un programme C++ proche du matériel et de la série. Cependant, la gestion web était alors largement compliquée.&lt;br /&gt;
Nous avons retenu d'utilisation d'un serveur node.js pour servir la page web et transmettre les commandes d'avancement comme les remontées d'alertes.&lt;br /&gt;
&lt;br /&gt;
=Interface Web=&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Afin de télépiloter le robot maître, nous utilisons une interface homme-machine via une page web.&lt;br /&gt;
Le serveur et le client communiquent à l’aide d’une connexion socket.&lt;br /&gt;
&lt;br /&gt;
Le flux vidéo est fourni par un serveur &amp;lt;code&amp;gt;mjpg streamer&amp;lt;/code&amp;gt;, indépendant du serveur &amp;lt;code&amp;gt;NodeJS&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Front===&lt;br /&gt;
La page web servie est en HTML, et contient un script JS.&lt;br /&gt;
D’une part, le retour caméra est incrusté à l’aide de la simple ligne suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;img width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; src=&amp;quot;http://192.168.246.107:8080/?action=stream&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au clic d’un bouton, il émet un évènement sur le socket.&lt;br /&gt;
S'il reçoit un message d'alerte sur le socket, il modifie en conséquence la couleur de l'alerte correspondante&lt;br /&gt;
&lt;br /&gt;
===Back===&lt;br /&gt;
Le serveur web est en NodeJS.&lt;br /&gt;
Outre servir la page web aux clients qui se connecte, il reçoit les évènements par le socket ouvert avec chacun d’eux. Il les transmet sur le port série.&lt;br /&gt;
Lorsqu'il commence à recevoir des données d'alerte sur le port série, il envoie un message pour afficher l'alerte sur le client.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas, des timers sont déclenchés pour stopper le robot ou le déclanchement des alertes en cas de déconnexion WiFi.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé la bibliothèque NodeJS &amp;lt;code&amp;gt;SerialPort&amp;lt;/code&amp;gt; pour la gestion des entrées/sorties sur le port série.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo apt install nodejs&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installation du serveur==&lt;br /&gt;
Dans un terminal du Raspberry, exécuter à l’emplacement des fichiers du serveur :&lt;br /&gt;
&amp;lt;code&amp;gt; npm i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lancement des serveurs au démarage==&lt;br /&gt;
Pour la mise en route des serveurs automatiquement lors du boot de la carte, nous avons modifié le fichier /etc/rc.local pour y placer juste avant la ligne &amp;lt;code&amp;gt;exit 0&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo ./home/pi/Documents/script&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script contient :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; #!/bin/bash&lt;br /&gt;
cd /home/pi/mjpg-streamer/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot; &amp;amp;&lt;br /&gt;
cd /home/pi/Desktop/Server&lt;br /&gt;
sudo node server.js&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tests serveur==&lt;br /&gt;
On peut ensuite tester l'envoi et la réception de trames UART depuis la Raspberry :&lt;br /&gt;
#Ouvrir un terminal, lancer mjpg streamer et le serveur &lt;br /&gt;
#Vérifier que l'appui sur des boutons du serveur côté client engendre l'envoie de trames depuis la broche Tx de la carte à l'aide d'un oscilloscope&lt;br /&gt;
#Vérifier que des données sont bien reçues, via l'interface graphique du serveur ou via le terminal en observant les données reçues provenant d'une carte ESP 32 Thing avec un code adapté pour le test&lt;br /&gt;
[[Fichier:raspbberry_av.PNG|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
==Capteur de température==&lt;br /&gt;
===Étude de la diffusion de la température en cas d'incendie===&lt;br /&gt;
Lors d'un incendie, le rayonnement est la principale source de transmission de la chaleur.&lt;br /&gt;
Un tableau fournit par le ministère permet d'estimer la densité de flux thermique radiatif en fonction de la distance à la flamme:&lt;br /&gt;
[[Fichier:Fnap.png|500px|thumb|center]]&lt;br /&gt;
On utilise ensuite la loi de Stéphan afin de déterminer la température:&lt;br /&gt;
[[Fichier:StephanLoi.png|500px|thumb|center]]&lt;br /&gt;
A l'aide d'Excel, on obtient les résultats suivants:&lt;br /&gt;
[[Fichier:Flamme_gaz.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Flamme_hydrocarbure.JPG|1000px|thumb|center]]&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur AOSONG AM2302 qui permet de mesurer la température ainsi que le taux d'humidité de l'air, fonction dont on ne servira pas.&lt;br /&gt;
Ce capteur permet de mesurer des températures de -40°C à 80°C.&lt;br /&gt;
&lt;br /&gt;
D'après le modèle :&lt;br /&gt;
&lt;br /&gt;
On n’a que 4 points donc on est peu précis mais on obtient un ordre de grandeur de l’ordre de 23m -27m pour ressentir 80°C en cas d’incendie, le choix d’un capteur mesurant jusqu’à une température de 80°C est donc cohérent avec le cas d’étude. Détecter un incendie environ 25m avant de l’atteindre dans un bâtiment est acceptable pour un robot, sachant qu’on a en plus des capteurs pour le gaz et la fumée (MQ9 et MQ135). On a une température de 60°C à 30m du feu environ (ça chute vite). On placera un seuil d'alerte à 60°C pour détecter les potentiels feux (le robot serait à une distance théorique de 30m du feu ce qui semble correct et réaliste).&lt;br /&gt;
&lt;br /&gt;
ATTENTION : On ne prend pas en compte la convexion et la conduction, on a seulement le rayonnement dans ce modèle simplifié. On aura donc une température un peu plus élevée dans la réalité.&lt;br /&gt;
==Capteur UV==&lt;br /&gt;
Pour mesurer l'indice UV, nous avons considéré le capteur SI1145 qui fonctionne par I²C, nous l'avions testé et était fonctionnel. Malheureusement lors d'un autre essai, son alimentation et sa masse ont été malencontreusement inversés ce qui a rendu le capteur hors service.&lt;br /&gt;
Nous avons donc redirigé notre choix vers les UV sensor Grove v1.1 qui ne fonctionnent pas en I²C mais à l'aide de 3 fils (GND, VCC, Signal). Il fournit des valeurs d'UV cohérentes lors de nos tests (indice UV entre 2 et 3). Nous placerons le seuil d'alerte à 6 pour prévenir d'un risque élevé.&lt;br /&gt;
[[Fichier:IndiceUv.jpg|400px|thumb|center]]&lt;br /&gt;
==Capteur de gaz toxiques==&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur MQ9 qui est un capteur coûtant peu cher et offrant une performance acceptable à condition de l'avoir calibré correctement avant utilisation. Il permet de mesurer la concentration en CO (Monoxyde de carbone) afin de permettre au robot maître de prévenir un danger d'intoxication au gaz carbonique. Il permet également de mesurer la concentration en CH4 afin de pouvoir détecter de potentielles fuites de gaz.&lt;br /&gt;
&lt;br /&gt;
Il fonctionne à l'aide de 3 fils (GND, VCC, Signal).&lt;br /&gt;
&lt;br /&gt;
La concentration en CH4 devient dangereuse à partir de 50 000 ppm (limite d’explosivité), mais une concentration au-delà de 1000 ppm (500 fois supérieure à ce que l'on trouve pour un air pur) ne laisse aucun doute quand à une fuite de gaz. On placera donc la limite à 1000 ppm.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SeuilCO.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Codanger.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Pour le CO, on placera la limite à 200 ppm, stade à partir duquel une exposition de deux ou trois heures provoque des maux de têtes (--&amp;gt; besoin de vigilance).&lt;br /&gt;
Le capteur MQ9 permet de mesurer le CO de 10 ppm à 1000 ppm, et le CH4 de 100 ppm à 10 000 ppm donc il convient pour notre projet.&lt;br /&gt;
===Étalonnage du capteur===&lt;br /&gt;
La datasheet permet d'étalonner le capteur, à l'aide d'Excel on détermine une courbe de tendance à utiliser pour obtenir nos valeurs.&lt;br /&gt;
[[Fichier:EtalonMQ9.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Note: Rs est la valeur renvoyée par le capteur, R0 est déterminée grâce à la datasheet, et les courbes d'étalonnage fournies servent à retrouver les concentrations en ppm des différents gaz.&lt;br /&gt;
==Capteur de CO2==&lt;br /&gt;
Le CO2 présente également des dangers pour les personnes, on équipe ainsi le robot d'un capteur de CO2. Les seuils de danger du CO2 sont les suivants:&lt;br /&gt;
[[Fichier:SeuilCO2.JPG|1000px|thumb|center]]&lt;br /&gt;
On va donc placer une alerte à 2000 ppm pour le CO2.&lt;br /&gt;
Nous avions initialement choisi le capteur XENSIV PAS CO2 qui correspondait à ces critères (mesure le CO2 entre 0 ppm et 32 000 ppm), mais son prix a soudainement grimpé pour des raisons d'approvisionnement. Nous nous sommes donc rabattus sur un autre modèle: le CCS811 qui permet de mesurer le taux de CO2 pour des valeurs comprises en 400 ppm et 8192 ppm (il donne pour résultat 400 ppm par défaut pour les valeurs inférieures ou égales à 400 ppm).&lt;br /&gt;
==Télémètres==&lt;br /&gt;
Le robot maître étant dirigé par caméra, on ne l'équipera que d'un télémètre pour assister le pilote lors de la détection d'obstacles frontaux. Les robots esclaves eux vont être équipés de télémètres pour pouvoir détecter les obstacles dans leur direction de mouvement. Pour le robot maître, on met une alerte en place pour un obstacle détecté à 20 cm du robot et on bloque le robot si il se trouve à 10 cm de l'obstacle et qu'il souhaite se déplacer vers l'obstacle. Pour le robot esclave, on force le robot esclave à changer de trajectoire 15 cm avant l'obstacle afin de lui laisser le temps d'éviter la collision.&lt;br /&gt;
===SRF===&lt;br /&gt;
Dans la série des télémètres SRF, nous disposons des modèles SRF08, SRF10 et SRF04. Les modèles SRF08 et SRF10 fonctionnent à l'aide de l'I²C, le modèle SRF04 lui fonctionne par voie analogique à l'aide de 4 fils (echo, trigger, GND, supply). SRF08 peut détecter les objets jusqu'à 6m avec un angle de détection de 55°, le SRF10 peut détecter les objets jusqu'à 6m avec un angle de détection de 72°, le SRF04 peut détecter jusqu'à 3m avec un angle de détection de 30°. La distance minimale de détection des 3 capteurs est de 3 cm. Ces 3 capteurs conviennent à notre utilisation.&lt;br /&gt;
&lt;br /&gt;
===US-020===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, GND, Alim), son angle de détection est de 15°, il permet de mesurer les obstacles entre 2cm et 7m. L'angle de détection est plutôt faible mais il pourrait servir sur les robots esclaves pour surveiller les angles du robot.&lt;br /&gt;
===VMA360===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, GND, Alim), il a un angle de détection de 15°, il permet de mesurer les obstacles entre 2cm et 4,5m. L'angle de détection est plutôt faible mais il pourrait servir sur les esclaves pour surveiller les angles du robot.&lt;br /&gt;
==Tableau récapitulatif==&lt;br /&gt;
[[Fichier:Capteurs_pompier.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
On estime possible d'alimenter tous ces capteurs avec les batteries prévues au vu des courants d'alimentation qu'elles fournissent.&lt;br /&gt;
==Librairies Arduino==&lt;br /&gt;
Nous avons dû installer des librairies Arduino pour faire fonctionner les capteurs :&lt;br /&gt;
&amp;quot;DFRobot_CCS811&amp;quot; pour le capteur de CO2 CCS811;&lt;br /&gt;
&amp;quot;DHT Sensor Library&amp;quot; pour le capteur de température;&lt;br /&gt;
&amp;quot;Adafruit Circuit Playground&amp;quot; et &amp;quot;Adafruit Unified Sensor&amp;quot; pour les capteurs d'Adafruit.&lt;br /&gt;
&lt;br /&gt;
Il faut également avoir installé une librairie dans le gestionnaire de cartes pour pouvoir utiliser l'ESP32 Thing (carte utilisée pour acquérir les données des capteurs et pilote la Teensy). Lien du site officiel pour réaliser cette manipulation: https://learn.sparkfun.com/tutorials/esp32-thing-hookup-guide.&lt;br /&gt;
&lt;br /&gt;
=Code informatique=&lt;br /&gt;
==Robot maître==&lt;br /&gt;
&lt;br /&gt;
===Communication entre la Raspberry et l'ESP32===&lt;br /&gt;
====Dans le sens Raspberry vers ESP32====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer&lt;br /&gt;
 | &amp;lt;code&amp;gt;av&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;dt&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Dans le sens ESP32 vers Raspberry====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer les alertes de l'ESP32 vers la Raspberry :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Alerte&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO&lt;br /&gt;
 | &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO2&lt;br /&gt;
 | &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CH4&lt;br /&gt;
 | &amp;lt;code&amp;gt;C4&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Température Haute&lt;br /&gt;
 | &amp;lt;code&amp;gt;TH&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | UV&lt;br /&gt;
 | &amp;lt;code&amp;gt;UV&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Distance à l'avant du robot&lt;br /&gt;
 | &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Erreur : en cas de commande av non exécutée car distance avant trop faible&lt;br /&gt;
 | &amp;lt;code&amp;gt;er&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Communication vers le robot esclave===&lt;br /&gt;
====ESP32 Maître vers ESP32 Esclave====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |- &lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer d'une distance de XXX centimètres&lt;br /&gt;
 | &amp;lt;code&amp;gt;avXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rdXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rgXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Pour faire demi-tour, on envoie un rd180.&lt;br /&gt;
&lt;br /&gt;
==Schéma récapitulatif des différentes communications==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Communications_pompier.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
===Robots esclaves===&lt;br /&gt;
&lt;br /&gt;
=Notes tableaux J101=&lt;br /&gt;
Sauvegarde des notes des tableaux de la J101 le 7 avril 2022.&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_5.jpg|500px|thumb|left|Tableau 5]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_4.jpg|500px|thumb|left|Tableau 4]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_3.jpg|500px|thumb|left|Tableau 3]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_2.jpg|500px|thumb|left|Tableau 2]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_1.jpg|500px|thumb|left|Tableau 1]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11800</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11800"/>
		<updated>2022-05-05T11:46:13Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots pompiers==&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elle est connectée au PCB à l'aide du connecteur d'alimentation situé dans l'angle inférieur gauche.&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner la carte ESP32&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino via ce [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
&lt;br /&gt;
==Déplacement du robot==&lt;br /&gt;
&lt;br /&gt;
* Pour gérer le déplacement via le terminal on a utilisé le [https://mootse.telecom-st-etienne.fr/mod/resource/view.php?id=13653 code pour une plateforme holonome 4 moteurs]. &lt;br /&gt;
* Procédure de test de la chaine d'alimentation, contrôle et asservissement :&lt;br /&gt;
# Téléverser ce [https://bacasable.arpitania.eu/index.php?title=Fichier:TeensyVSL298AsservissementVitesse4X_V2_0.zip code fourni] sur la carte Teensy. La pleine vitesse citée plus tard est définie par paramVitesse dans les paramètres globaux en début de code.&lt;br /&gt;
# Téléverser un programme vide dans l'ESP32&lt;br /&gt;
# Connecter la broche Rx de la Teensy sur le pin Tx de l'ESP32, inversement pour Tx. En effet, les deux cartes sont branchées en parallèle, la carte ESP32 étant logiquement transparente, elle nous permet simplement d'envoyer des commandes série sur la Teensy&lt;br /&gt;
# Connecter un PC à la carte ESP32 via le port micro USB&lt;br /&gt;
# Ouvrir une console série (par exemple la série arduino) sur le port concerné et tester les moteurs avec les commandes suivantes :&lt;br /&gt;
#:- &amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse, (resp. ''av2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse, (resp. ''am2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
# Tester les mouvements entiers :&lt;br /&gt;
#:* Robot 4 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à pleine vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à demi vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;rXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens horaire d'un angle XX = {45,90,135}&lt;br /&gt;
#::- &amp;lt;code&amp;gt;gXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens trigo d'une angle XX = {45,90,135}&lt;br /&gt;
#:* Robot 3 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amXXX&amp;lt;/code&amp;gt; pour définir la direction ''XXX'' (en degrés) de déplacement du robot&lt;br /&gt;
#::- &amp;lt;code&amp;gt;ho3&amp;lt;/code&amp;gt; pour avancer dans la direction définie précédemment&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer à la Teensy via l'UART :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant&lt;br /&gt;
 | &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant à demi vitesse&lt;br /&gt;
 | &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;r45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;g45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi-tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;demit&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Odométrie robot maître==&lt;br /&gt;
On utilise deux informations couplées : calcul de la position depuis les codeurs magnétiques des moteurs et en parallèle un accéléromètre et un gyroscope contenus dans la centrale inertielle. &lt;br /&gt;
&lt;br /&gt;
Utilisation d'une centrale à inertie pour le calcul du déplacement effectué par le robot maître : MPU9250 10dof. Cette centrale à inertie est composée d'un gyroscope, d'un accéléromètre, d'un magnétomètre et d'un baromètre. La communication se fait via un bus I²C.&lt;br /&gt;
&lt;br /&gt;
Le reste de la documentation est disponible sur https://cdn.sparkfun.com/assets/learn_tutorials/5/5/0/MPU-9250-Register-Map.pdf.&lt;br /&gt;
&lt;br /&gt;
=Programmation carte Raspberry Pi 3=&lt;br /&gt;
&lt;br /&gt;
====Installation d'un système d'exploitation====&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balena Etcher pour flasher l’image sur la carte SD&lt;br /&gt;
&lt;br /&gt;
On aurait aussi pu passer par l'utilitaire Raspberry Pi Imager, qui se charge de télécharger automatiquement l'OS et de flasher la carte SD. &lt;br /&gt;
&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale &lt;br /&gt;
&lt;br /&gt;
====Utilisation de la caméra====&lt;br /&gt;
# Si la liaison de la Raspberry avec un écran en HDMI ne se fait pas, il faut modifier le fichier config.txt (hdmi_group et hdmi_mode) de la carte micro SD de la Raspberry, pour forcer l'envoi sur le port HDMI même si rien n'est détecté à l'autre bout du câble.&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Dans le terminal, lancer &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt; et activer la caméra dans le menu Interfaces. Redémarrer ensuite la Raspberry. &lt;br /&gt;
# Premiers tests en local avec : &amp;lt;code&amp;gt;raspistill -o photo.jpg&amp;lt;/code&amp;gt; (enregistrement d’une photo avec retardateur de 5sec), puis &amp;lt;code&amp;gt;raspivid -o video.h264&amp;lt;/code&amp;gt; vidéo)&lt;br /&gt;
# Premier stream avec : &amp;lt;code&amp;gt;raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264&amp;lt;/code&amp;gt; sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : &amp;lt;code&amp;gt;rtsp://@IPpi:8080/&amp;lt;/code&amp;gt; [[Fichier:StreamCam.png|500px|thumb|right|streaming de la caméra sur un PC connecté au même réseau Wifi (partage de connexion dans notre cas)]]&lt;br /&gt;
# Installation de Mjpg-Streamer :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~&lt;br /&gt;
sudo apt-get install libjpeg9-dev&lt;br /&gt;
git clone https://github.com/jacksonliam/mjpg-streamer.git&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install cmake&lt;br /&gt;
CFLAGS+=&amp;quot;-Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s&amp;quot; make&lt;br /&gt;
sudo make install&lt;br /&gt;
cd ~/mjpg-streamer/mjpg-streamer-experimental./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Lancement du serveur Mjpg Streamer sur le port 8080&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Utilisation du port série====&lt;br /&gt;
Il est nécessaire d'activer et d'accorder les droits d'accès au port série :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;raspi-config &amp;gt; Interface options &amp;gt; Serial Port &amp;gt; Enable&lt;br /&gt;
sudo chmod 666 /dev/ttyS0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Choix de l'environnement serveur====&lt;br /&gt;
&lt;br /&gt;
Pour la gestion back sur le Raspberry, nous avons d'abord pensé utiliser un programme C++ proche du matériel et de la série. Cependant, la gestion web était alors largement compliquée.&lt;br /&gt;
Nous avons retenu d'utilisation d'un serveur node.js pour servir la page web et transmettre les commandes d'avancement comme les remontées d'alertes.&lt;br /&gt;
&lt;br /&gt;
=Interface Web=&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Afin de télépiloter le robot maître, nous utilisons une interface homme-machine via une page web.&lt;br /&gt;
Le serveur et le client communiquent à l’aide d’une connexion socket.&lt;br /&gt;
&lt;br /&gt;
Le flux vidéo est fourni par un serveur &amp;lt;code&amp;gt;mjpg streamer&amp;lt;/code&amp;gt;, indépendant du serveur &amp;lt;code&amp;gt;NodeJS&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Front===&lt;br /&gt;
La page web servie est en HTML, et contient un script JS.&lt;br /&gt;
D’une part, le retour caméra est incrusté à l’aide de la simple ligne suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;img width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; src=&amp;quot;http://192.168.246.107:8080/?action=stream&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au clic d’un bouton, il émet un évènement sur le socket.&lt;br /&gt;
S'il reçoit un message d'alerte sur le socket, il modifie en conséquence la couleur de l'alerte correspondante&lt;br /&gt;
&lt;br /&gt;
===Back===&lt;br /&gt;
Le serveur web est en NodeJS.&lt;br /&gt;
Outre servir la page web aux clients qui se connecte, il reçoit les évènements par le socket ouvert avec chacun d’eux. Il les transmet sur le port série.&lt;br /&gt;
Lorsqu'il commence à recevoir des données d'alerte sur le port série, il envoie un message pour afficher l'alerte sur le client.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas, des timers sont déclenchés pour stopper le robot ou le déclanchement des alertes en cas de déconnexion WiFi.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé la bibliothèque NodeJS &amp;lt;code&amp;gt;SerialPort&amp;lt;/code&amp;gt; pour la gestion des entrées/sorties sur le port série.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo apt install nodejs&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installation du serveur==&lt;br /&gt;
Dans un terminal du Raspberry, exécuter à l’emplacement des fichiers du serveur :&lt;br /&gt;
&amp;lt;code&amp;gt; npm i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lancement des serveurs au démarage==&lt;br /&gt;
Pour la mise en route des serveurs automatiquement lors du boot de la carte, nous avons modifié le fichier /etc/rc.local pour y placer juste avant la ligne &amp;lt;code&amp;gt;exit 0&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo ./home/pi/Documents/script&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script contient :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; #!/bin/bash&lt;br /&gt;
cd /home/pi/mjpg-streamer/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot; &amp;amp;&lt;br /&gt;
cd /home/pi/Desktop/Server&lt;br /&gt;
sudo node server.js&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tests serveur==&lt;br /&gt;
On peut ensuite tester l'envoi et la réception de trames UART depuis la Raspberry :&lt;br /&gt;
#Ouvrir un terminal, lancer mjpg streamer et le serveur &lt;br /&gt;
#Vérifier que l'appui sur des boutons du serveur côté client engendre l'envoie de trames depuis la broche Tx de la carte à l'aide d'un oscilloscope&lt;br /&gt;
#Vérifier que des données sont bien reçues, via l'interface graphique du serveur ou via le terminal en observant les données reçues provenant d'une carte ESP 32 Thing avec un code adapté pour le test&lt;br /&gt;
[[Fichier:raspbberry_av.PNG|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
==Capteur de température==&lt;br /&gt;
===Étude de la diffusion de la température en cas d'incendie===&lt;br /&gt;
Lors d'un incendie, le rayonnement est la principale source de transmission de la chaleur.&lt;br /&gt;
Un tableau fournit par le ministère permet d'estimer la densité de flux thermique radiatif en fonction de la distance à la flamme:&lt;br /&gt;
[[Fichier:Fnap.png|500px|thumb|center]]&lt;br /&gt;
On utilise ensuite la loi de Stéphan afin de déterminer la température:&lt;br /&gt;
[[Fichier:StephanLoi.png|500px|thumb|center]]&lt;br /&gt;
A l'aide d'Excel, on obtient les résultats suivants:&lt;br /&gt;
[[Fichier:Flamme_gaz.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Flamme_hydrocarbure.JPG|1000px|thumb|center]]&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur AOSONG AM2302 qui permet de mesurer la température ainsi que le taux d'humidité de l'air, fonction dont on ne servira pas.&lt;br /&gt;
Ce capteur permet de mesurer des températures de -40°C à 80°C.&lt;br /&gt;
&lt;br /&gt;
D'après le modèle :&lt;br /&gt;
&lt;br /&gt;
On n’a que 4 points donc on est peu précis mais on obtient un ordre de grandeur de l’ordre de 23m -27m pour ressentir 80°C en cas d’incendie, le choix d’un capteur mesurant jusqu’à une température de 80°C est donc cohérent avec le cas d’étude. Détecter un incendie environ 25m avant de l’atteindre dans un bâtiment est acceptable pour un robot, sachant qu’on a en plus des capteurs pour le gaz et la fumée (MQ9 et MQ135). On a une température de 60°C à 30m du feu environ (ça chute vite). On placera un seuil d'alerte à 60°C pour détecter les potentiels feux (le robot serait à une distance théorique de 30m du feu ce qui semble correct et réaliste).&lt;br /&gt;
&lt;br /&gt;
ATTENTION : On ne prend pas en compte la convexion et la conduction, on a seulement le rayonnement dans ce modèle simplifié. On aura donc une température un peu plus élevée dans la réalité.&lt;br /&gt;
==Capteur UV==&lt;br /&gt;
Pour mesurer l'indice UV, nous avons considéré le capteur SI1145 qui fonctionne par I²C, nous l'avions testé et était fonctionnel. Malheureusement lors d'un autre essai, son alimentation et sa masse ont été malencontreusement inversés ce qui a rendu le capteur hors service.&lt;br /&gt;
Nous avons donc redirigé notre choix vers les UV sensor Grove v1.1 qui ne fonctionnent pas en I²C mais à l'aide de 3 fils (GND, VCC, Signal). Il fournit des valeurs d'UV cohérentes lors de nos tests (indice UV entre 2 et 3). Nous placerons le seuil d'alerte à 6 pour prévenir d'un risque élevé.&lt;br /&gt;
[[Fichier:IndiceUv.jpg|400px|thumb|center]]&lt;br /&gt;
==Capteur de gaz toxiques==&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur MQ9 qui est un capteur coûtant peu cher et offrant une performance acceptable à condition de l'avoir calibré correctement avant utilisation. Il permet de mesurer la concentration en CO (Monoxyde de carbone) afin de permettre au robot maître de prévenir un danger d'intoxication au gaz carbonique. Il permet également de mesurer la concentration en CH4 afin de pouvoir détecter de potentielles fuites de gaz.&lt;br /&gt;
&lt;br /&gt;
Il fonctionne à l'aide de 3 fils (GND, VCC, Signal).&lt;br /&gt;
&lt;br /&gt;
La concentration en CH4 devient dangereuse à partir de 50 000 ppm (limite d’explosivité), mais une concentration au-delà de 1000 ppm (500 fois supérieure à ce que l'on trouve pour un air pur) ne laisse aucun doute quand à une fuite de gaz. On placera donc la limite à 1000 ppm.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SeuilCO.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Codanger.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Pour le CO, on placera la limite à 200 ppm, stade à partir duquel une exposition de deux ou trois heures provoque des maux de têtes (--&amp;gt; besoin de vigilance).&lt;br /&gt;
Le capteur MQ9 permet de mesurer le CO de 10 ppm à 1000 ppm, et le CH4 de 100 ppm à 10 000 ppm donc il convient pour notre projet.&lt;br /&gt;
===Étalonnage du capteur===&lt;br /&gt;
La datasheet permet d'étalonner le capteur, à l'aide d'Excel on détermine une courbe de tendance à utiliser pour obtenir nos valeurs.&lt;br /&gt;
[[Fichier:EtalonMQ9.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Note: Rs est la valeur renvoyée par le capteur, R0 est déterminée grâce à la datasheet, et les courbes d'étalonnage fournies servent à retrouver les concentrations en ppm des différents gaz.&lt;br /&gt;
==Capteur de CO2==&lt;br /&gt;
Le CO2 présente également des dangers pour les personnes, on équipe ainsi le robot d'un capteur de CO2. Les seuils de danger du CO2 sont les suivants:&lt;br /&gt;
[[Fichier:SeuilCO2.JPG|1000px|thumb|center]]&lt;br /&gt;
On va donc placer une alerte à 2000 ppm pour le CO2.&lt;br /&gt;
Nous avions initialement choisi le capteur XENSIV PAS CO2 qui correspondait à ces critères (mesure le CO2 entre 0 ppm et 32 000 ppm), mais son prix a soudainement grimpé pour des raisons d'approvisionnement. Nous nous sommes donc rabattus sur un autre modèle: le CCS811 qui permet de mesurer le taux de CO2 pour des valeurs comprises en 400 ppm et 8192 ppm (il donne pour résultat 400 ppm par défaut pour les valeurs inférieures ou égales à 400 ppm).&lt;br /&gt;
==Télémètres==&lt;br /&gt;
Le robot maître étant dirigé par caméra, on ne l'équipera que d'un télémètre pour assister le pilote lors de la détection d'obstacles frontaux. Les robots esclaves eux vont être équipés de télémètres pour pouvoir détecter les obstacles dans leur direction de mouvement. Pour le robot maître, on met une alerte en place pour un obstacle détecté à 20 cm du robot et on bloque le robot si il se trouve à 10 cm de l'obstacle et qu'il souhaite se déplacer vers l'obstacle. Pour le robot esclave, on force le robot esclave à changer de trajectoire 15 cm avant l'obstacle afin de lui laisser le temps d'éviter la collision.&lt;br /&gt;
===SRF===&lt;br /&gt;
Dans la série des télémètres SRF, on a à notre disposition les modèles SRF08, SRF10 et SRF04. Les modèles SRF08 et SRF10 fonctionnent à l'aide de l'I²C, le modèle SRF04 lui fonctionne par voie analogique à l'aide de 4 fils (echo, trigger, GND, supply). SRF08 peut détecter les objets jusqu'à 6m avec un angle de détection de 55°, le SRF10 peut détecter les objets jusqu'à 6m avec un angle de détection de 72°, le SRF04 peut détecter les objets jusqu'à 3m avec un angle de détection de 30°. La distance minimale de détection des 3 capteurs est de 3 cm. Ces 3 capteurs conviennent à notre utilisation.&lt;br /&gt;
&lt;br /&gt;
===US-020===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), son angle de détection est de 15°, il permet de mesurer les obstacles entre 2cm et 7m. L'angle de détection est plutôt faible mais il pourrait servir sur les robots esclaves pour surveiller les angles du robot.&lt;br /&gt;
===VMA360===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), il a un angle de détection de 15°, il permet de mesurer les obstacles entre 2cm et 4,5m. L'angle de détection est plutôt faible mais il pourrait servir sur les esclaves pour surveiller les angles du robot.&lt;br /&gt;
==Tableau récapitulatif==&lt;br /&gt;
[[Fichier:Capteurs_pompier.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
On estime possible d'alimenter tous ces capteurs avec les batteries prévues au vu des courants d'alimentation qu'elles fournissent.&lt;br /&gt;
==Librairies Arduino==&lt;br /&gt;
Nous avons dû installer des librairies Arduino pour faire fonctionner les capteurs :&lt;br /&gt;
&amp;quot;DFRobot_CCS811&amp;quot; pour le capteur de CO2 CCS811;&lt;br /&gt;
&amp;quot;DHT Sensor Library&amp;quot; pour le capteur de température;&lt;br /&gt;
&amp;quot;Adafruit Circuit Playground&amp;quot; et &amp;quot;Adafruit Unified Sensor&amp;quot; pour les capteurs d'Adafruit.&lt;br /&gt;
&lt;br /&gt;
Il faut également avoir installé une librairie dans le gestionnaire de cartes pour pouvoir utiliser l'ESP32 Thing (carte utilisée pour acquérir les données des capteurs et pilote la Teensy). Lien du site officiel pour réaliser cette manipulation: https://learn.sparkfun.com/tutorials/esp32-thing-hookup-guide.&lt;br /&gt;
&lt;br /&gt;
=Code informatique=&lt;br /&gt;
==Robot maître==&lt;br /&gt;
&lt;br /&gt;
===Communication entre la Raspberry et l'ESP32===&lt;br /&gt;
====Dans le sens Raspberry vers ESP32====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer&lt;br /&gt;
 | &amp;lt;code&amp;gt;av&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;dt&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Dans le sens ESP32 vers Raspberry====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer les alertes de l'ESP32 vers la Raspberry :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Alerte&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO&lt;br /&gt;
 | &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO2&lt;br /&gt;
 | &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CH4&lt;br /&gt;
 | &amp;lt;code&amp;gt;C4&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Température Haute&lt;br /&gt;
 | &amp;lt;code&amp;gt;TH&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | UV&lt;br /&gt;
 | &amp;lt;code&amp;gt;UV&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Distance à l'avant du robot&lt;br /&gt;
 | &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Erreur : en cas de commande av non exécutée car distance avant trop faible&lt;br /&gt;
 | &amp;lt;code&amp;gt;er&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Communication vers le robot esclave===&lt;br /&gt;
====ESP32 Maître vers ESP32 Esclave====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |- &lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer d'une distance de XXX centimètres&lt;br /&gt;
 | &amp;lt;code&amp;gt;avXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rdXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rgXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Pour faire demi-tour, on envoie un rd180.&lt;br /&gt;
&lt;br /&gt;
==Schéma récapitulatif des différentes communications==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Communications_pompier.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
===Robots esclaves===&lt;br /&gt;
&lt;br /&gt;
=Notes tableaux J101=&lt;br /&gt;
Sauvegarde des notes des tableaux de la J101 le 7 avril 2022.&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_5.jpg|500px|thumb|left|Tableau 5]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_4.jpg|500px|thumb|left|Tableau 4]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_3.jpg|500px|thumb|left|Tableau 3]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_2.jpg|500px|thumb|left|Tableau 2]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_1.jpg|500px|thumb|left|Tableau 1]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11799</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11799"/>
		<updated>2022-05-05T11:43:28Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots pompiers==&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maitre :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elle est connectée au PCB à l'aide du connecteur d'alimentation situé dans l'angle inférieur gauche.&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner la carte ESP32&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino via ce [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
&lt;br /&gt;
==Déplacement du robot==&lt;br /&gt;
&lt;br /&gt;
* Pour gérer le déplacement via le terminal on a utilisé le [https://mootse.telecom-st-etienne.fr/mod/resource/view.php?id=13653 code pour une plateforme holonome 4 moteurs]. &lt;br /&gt;
* Procédure de test de la chaine d'alimentation, contrôle et asservissement :&lt;br /&gt;
# Téléverser ce [https://bacasable.arpitania.eu/index.php?title=Fichier:TeensyVSL298AsservissementVitesse4X_V2_0.zip code fourni] sur la carte Teensy. La pleine vitesse citée plus tard est définie par paramVitesse dans les paramètres globaux en début de code.&lt;br /&gt;
# Téléverser un programme vide dans l'ESP32&lt;br /&gt;
# Connecter la broche Rx de la Teensy sur le pin Tx de l'ESP32, inversement pour Tx. En effet, les deux cartes sont branchées en parallèle, la carte ESP32 étant logiquement transparente, elle nous permet simplement d'envoyer des commandes série sur la Teensy&lt;br /&gt;
# Connecter un PC à la carte ESP32 via le port micro USB&lt;br /&gt;
# Ouvrir une console série (par exemple la série arduino) sur le port concerné et tester les moteurs avec les commandes suivantes :&lt;br /&gt;
#:- &amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse, (resp. ''av2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse, (resp. ''am2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
# Tester les mouvements entiers :&lt;br /&gt;
#:* Robot 4 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à pleine vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à demi vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;rXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens horaire d'un angle XX = {45,90,135}&lt;br /&gt;
#::- &amp;lt;code&amp;gt;gXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens trigo d'une angle XX = {45,90,135}&lt;br /&gt;
#:* Robot 3 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amXXX&amp;lt;/code&amp;gt; pour définir la direction ''XXX'' (en degrés) de déplacement du robot&lt;br /&gt;
#::- &amp;lt;code&amp;gt;ho3&amp;lt;/code&amp;gt; pour avancer dans la direction définie précédemment&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer à la Teensy via l'UART :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant&lt;br /&gt;
 | &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant à demi vitesse&lt;br /&gt;
 | &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;r45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;g45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi-tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;demit&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Odométrie robot maître==&lt;br /&gt;
On utilise deux informations couplées : calcul de la position depuis les codeurs magnétiques des moteurs et en parallèle un accéléromètre et un gyroscope contenus dans la centrale inertielle. &lt;br /&gt;
&lt;br /&gt;
Utilisation d'une centrale à inertie pour le calcul du déplacement effectué par le robot maître : MPU9250 10dof. Cette centrale à inertie est composée d'un gyroscope, d'un accéléromètre, d'un magnétomètre et d'un baromètre. La communication se fait via un bus I²C.&lt;br /&gt;
&lt;br /&gt;
Le reste de la documentation est disponible sur https://cdn.sparkfun.com/assets/learn_tutorials/5/5/0/MPU-9250-Register-Map.pdf.&lt;br /&gt;
&lt;br /&gt;
=Programmation carte Raspberry Pi 3=&lt;br /&gt;
&lt;br /&gt;
====Installation d'un système d'exploitation====&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balena Etcher pour flasher l’image sur la carte SD&lt;br /&gt;
&lt;br /&gt;
On aurait aussi pu passer par l'utilitaire Raspberry Pi Imager, qui se charge de télécharger automatiquement l'OS et de flasher la carte SD. &lt;br /&gt;
&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale &lt;br /&gt;
&lt;br /&gt;
====Utilisation de la caméra====&lt;br /&gt;
# Si la liaison de la Raspberry avec un écran en HDMI ne se fait pas, il faut modifier le fichier config.txt (hdmi_group et hdmi_mode) de la carte micro SD de la Raspberry, pour forcer l'envoi sur le port HDMI même si rien n'est détecté à l'autre bout du câble.&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Dans le terminal, lancer &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt; et activer la caméra dans le menu Interfaces. Redémarrer ensuite la Raspberry. &lt;br /&gt;
# Premiers tests en local avec : &amp;lt;code&amp;gt;raspistill -o photo.jpg&amp;lt;/code&amp;gt; (enregistrement d’une photo avec retardateur de 5sec), puis &amp;lt;code&amp;gt;raspivid -o video.h264&amp;lt;/code&amp;gt; vidéo)&lt;br /&gt;
# Premier stream avec : &amp;lt;code&amp;gt;raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264&amp;lt;/code&amp;gt; sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : &amp;lt;code&amp;gt;rtsp://@IPpi:8080/&amp;lt;/code&amp;gt; [[Fichier:StreamCam.png|500px|thumb|right|streaming de la caméra sur un PC connecté au même réseau Wifi (partage de connexion dans notre cas)]]&lt;br /&gt;
# Installation de Mjpg-Streamer :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~&lt;br /&gt;
sudo apt-get install libjpeg9-dev&lt;br /&gt;
git clone https://github.com/jacksonliam/mjpg-streamer.git&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install cmake&lt;br /&gt;
CFLAGS+=&amp;quot;-Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s&amp;quot; make&lt;br /&gt;
sudo make install&lt;br /&gt;
cd ~/mjpg-streamer/mjpg-streamer-experimental./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Lancement du serveur Mjpg Streamer sur le port 8080&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Utilisation du port série====&lt;br /&gt;
Il est nécessaire d'activer et d'accorder les droits d'accès au port série :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;raspi-config &amp;gt; Interface options &amp;gt; Serial Port &amp;gt; Enable&lt;br /&gt;
sudo chmod 666 /dev/ttyS0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Choix de l'environnement serveur====&lt;br /&gt;
&lt;br /&gt;
Pour la gestion back sur le Raspberry, nous avons d'abord pensé utiliser un programme C++ proche du matériel et de la série. Cependant, la gestion web était alors largement compliquée.&lt;br /&gt;
Nous avons retenu d'utilisation d'un serveur node.js pour servir la page web et transmettre les commandes d'avancement comme les remontées d'alertes.&lt;br /&gt;
&lt;br /&gt;
=Interface Web=&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Afin de télépiloter le robot maître, nous utilisons une interface homme-machine via une page web.&lt;br /&gt;
Le serveur et le client communiquent à l’aide d’une connexion socket.&lt;br /&gt;
&lt;br /&gt;
Le flux vidéo est fourni par un serveur &amp;lt;code&amp;gt;mjpg streamer&amp;lt;/code&amp;gt;, indépendant du serveur &amp;lt;code&amp;gt;NodeJS&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Front===&lt;br /&gt;
La page web servie est en HTML, et contient un script JS.&lt;br /&gt;
D’une part, le retour caméra est incrusté à l’aide de la simple ligne suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;img width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; src=&amp;quot;http://192.168.246.107:8080/?action=stream&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au clic d’un bouton, il émet un évènement sur le socket.&lt;br /&gt;
S'il reçoit un message d'alerte sur le socket, il modifie en conséquence la couleur de l'alerte correspondante&lt;br /&gt;
&lt;br /&gt;
===Back===&lt;br /&gt;
Le serveur web est en NodeJS.&lt;br /&gt;
Outre servir la page web aux clients qui se connecte, il reçoit les évènements par le socket ouvert avec chacun d’eux. Il les transmet sur le port série.&lt;br /&gt;
Lorsqu'il commence à recevoir des données d'alerte sur le port série, il envoie un message pour afficher l'alerte sur le client.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas, des timers sont déclenchés pour stopper le robot ou le déclanchement des alertes en cas de déconnexion WiFi.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé la bibliothèque NodeJS &amp;lt;code&amp;gt;SerialPort&amp;lt;/code&amp;gt; pour la gestion des entrées/sorties sur le port série.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo apt install nodejs&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installation du serveur==&lt;br /&gt;
Dans un terminal du Raspberry, exécuter à l’emplacement des fichiers du serveur :&lt;br /&gt;
&amp;lt;code&amp;gt; npm i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lancement des serveurs au démarage==&lt;br /&gt;
Pour la mise en route des serveurs automatiquement lors du boot de la carte, nous avons modifié le fichier /etc/rc.local pour y placer juste avant la ligne &amp;lt;code&amp;gt;exit 0&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo ./home/pi/Documents/script&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script contient :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; #!/bin/bash&lt;br /&gt;
cd /home/pi/mjpg-streamer/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot; &amp;amp;&lt;br /&gt;
cd /home/pi/Desktop/Server&lt;br /&gt;
sudo node server.js&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tests serveur==&lt;br /&gt;
On peut ensuite tester l'envoi et la réception de trames UART depuis la Raspberry :&lt;br /&gt;
#Ouvrir un terminal, lancer mjpg streamer et le serveur &lt;br /&gt;
#Vérifier que l'appui sur des boutons du serveur côté client engendre l'envoie de trames depuis la broche Tx de la carte à l'aide d'un oscilloscope&lt;br /&gt;
#Vérifier que des données sont bien reçues, via l'interface graphique du serveur ou via le terminal en observant les données reçues provenant d'une carte ESP 32 Thing avec un code adapté pour le test&lt;br /&gt;
[[Fichier:raspbberry_av.PNG|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
==Capteur de température==&lt;br /&gt;
===Étude de la diffusion de la température en cas d'incendie===&lt;br /&gt;
Lors d'un incendie, le rayonnement est la principale source de transmission de la chaleur.&lt;br /&gt;
Un tableau fournit par le ministère permet d'estimer la densité de flux thermique radiatif en fonction de la distance à la flamme:&lt;br /&gt;
[[Fichier:Fnap.png|500px|thumb|center]]&lt;br /&gt;
On utilise ensuite la loi de Stéphan afin de déterminer la température:&lt;br /&gt;
[[Fichier:StephanLoi.png|500px|thumb|center]]&lt;br /&gt;
A l'aide d'Excel, on obtient les résultats suivants:&lt;br /&gt;
[[Fichier:Flamme_gaz.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Flamme_hydrocarbure.JPG|1000px|thumb|center]]&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur AOSONG AM2302 qui permet de mesurer la température ainsi que le taux d'humidité de l'air, fonction dont on ne servira pas.&lt;br /&gt;
Ce capteur permet de mesurer des températures de -40°C à 80°C.&lt;br /&gt;
&lt;br /&gt;
D'après le modèle :&lt;br /&gt;
&lt;br /&gt;
On n’a que 4 points donc on est peu précis mais on obtient un ordre de grandeur de l’ordre de 23m -27m pour ressentir 80°C en cas d’incendie, le choix d’un capteur mesurant jusqu’à une température de 80°C est donc cohérent avec le cas d’étude. Détecter un incendie environ 25m avant de l’atteindre dans un bâtiment est acceptable pour un robot, sachant qu’on a en plus des capteurs pour le gaz et la fumée (MQ9 et MQ135). On a une température de 60°C à 30m du feu environ (ça chute vite). On placera un seuil d'alerte à 60°C pour détecter les potentiels feux (le robot serait à une distance théorique de 30m du feu ce qui semble correct et réaliste).&lt;br /&gt;
&lt;br /&gt;
ATTENTION : On ne prend pas en compte la convexion et la conduction, on a seulement le rayonnement dans ce modèle simplifié. On aura donc une température un peu plus élevée dans la réalité.&lt;br /&gt;
==Capteur UV==&lt;br /&gt;
Pour mesurer l'indice UV, nous avons considéré le capteur SI1145 qui fonctionne par I²C, nous l'avions testé et était fonctionnel. Malheureusement lors d'un autre essai, son alimentation et sa masse ont été malencontreusement inversés ce qui a rendu le capteur hors service.&lt;br /&gt;
Nous avons donc redirigé notre choix vers les UV sensor Grove v1.1 qui ne fonctionnent pas en I²C mais à l'aide de 3 fils (GND, VCC, Signal). Il fournit des valeurs d'UV cohérentes lors de nos tests (indice UV entre 2 et 3). Nous placerons le seuil d'alerte à 6 pour prévenir d'un risque élevé.&lt;br /&gt;
[[Fichier:IndiceUv.jpg|400px|thumb|center]]&lt;br /&gt;
==Capteur de gaz toxiques==&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur MQ9 qui est un capteur coûtant peu cher et offrant une performance acceptable à condition de l'avoir préchauffé avant utilisation. Il permet de mesurer la concentration en CO (gaz carbonique) afin de permettre au robot maitre de prévenir un danger d'intoxication au gaz carbonique. Il permet également de mesurer la concentration en CH4 afin de pouvoir détecter de potentielles fuites de gaz.&lt;br /&gt;
&lt;br /&gt;
Il fonctionne à l'aide de 3 fils (GND, VCC, Signal).&lt;br /&gt;
&lt;br /&gt;
La concentration en CH4 devient dangereuse à partir de 50 000 ppm (limite d’explosivité), mais une concentration au-delà de 1000 ppm (500 fois supérieure à ce que l'on trouve pour un air pur) ne laisse aucun doute quand à une fuite de gaz. On placera donc la limite à 1000 ppm.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SeuilCO.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Codanger.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Pour le CO, on placera la limite à 200 ppm, stade à partir duquel une exposition de deux ou trois heures provoque des maux de têtes (--&amp;gt; besoin de vigilance).&lt;br /&gt;
Le capteur MQ9 permet de mesurer le CO de 10 ppm à 1000 ppm, et le CH4 de 100 ppm à 10 000 ppm donc il convient pour notre projet.&lt;br /&gt;
===Étalonnage du capteur===&lt;br /&gt;
La datasheet permet d'étalonner le capteur, à l'aide d'Excel on détermine une courbe de tendance à utiliser pour obtenir nos valeurs.&lt;br /&gt;
[[Fichier:EtalonMQ9.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Note: Rs est la valeur renvoyée par le capteur, R0 est déterminée grâce à la datasheet, et les courbes d'étalonnage fournies servent à retrouver les concentrations en ppm des différents gaz.&lt;br /&gt;
==Capteur de CO2==&lt;br /&gt;
Le CO2 présente également des dangers pour les personnes, on équipe ainsi le robot d'un capteur de CO2. Les seuils de danger du CO2 sont les suivants:&lt;br /&gt;
[[Fichier:SeuilCO2.JPG|1000px|thumb|center]]&lt;br /&gt;
On va donc placer une alerte à 2000 ppm pour le CO2.&lt;br /&gt;
Nous avions initialement choisi le capteur XENSIV PAS CO2 qui correspondait à ces critères (mesure le CO2 entre 0 ppm et 32 000 ppm), mais son prix a soudainement grimpé pour des raisons d'approvisionnement. Nous nous sommes donc rabattus sur un autre modèle: le CCS811 qui permet de mesurer le taux de CO2 pour des valeurs comprises en 400 ppm et 8192 ppm (il donne pour résultat 400 ppm par défaut pour les valeurs inférieures ou égales à 400 ppm).&lt;br /&gt;
==Télémètres==&lt;br /&gt;
Le robot maitre étant dirigé par caméra, on ne l'équipera que d'un télémètre pour assister le pilote lors de la détection d'obstacles frontaux. Les robots esclaves eux vont être équipés de télémètres pour pouvoir détecter les obstacles dans leur direction de mouvement. Pour le robot maitre, on met une alerte en place pour un obstacle détecté à 20 cm du robot et on bloque le robot si il se trouve à 10 cm de l'obstacle et qu'il souhaite se déplacer vers l'obstacle. Pour le robot esclave, on force le robot esclave à changer de trajectoire 15 cm avant l'obstacle afin de lui laisser le temps d'éviter la collision.&lt;br /&gt;
===SRF===&lt;br /&gt;
Dans la série des télémètres SRF, on a à notre disposition les modèles SRF08, SRF10 et SRF04. Les modèles SRF08 et SRF10 fonctionnent à l'aide de l'I²C, le modèle SRF04 lui fonctionne par voie analogique à l'aide de 4 fils (echo, trigger, GND, supply). SRF08 peut détecter les objets jusqu'à 6m avec un angle de détection de 55°, le SRF10 peut détecter les objets jusqu'à 6m avec un angle de détection de 72°, le SRF04 peut détecter les objets jusqu'à 3m avec un angle de détection de 30°. La distance minimale de détection des 3 capteurs est de 3 cm. Ces 3 capteurs conviennent à notre utilisation.&lt;br /&gt;
&lt;br /&gt;
===US-020===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), son angle de détection est de 15°, il permet de mesurer les obstacles entre 2cm et 7m. L'angle de détection est plutôt faible mais il pourrait servir sur les robots esclaves pour surveiller les angles du robot.&lt;br /&gt;
===VMA360===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), il a un angle de détection de 15°, il permet de mesurer les obstacles entre 2cm et 4,5m. L'angle de détection est plutôt faible mais il pourrait servir sur les esclaves pour surveiller les angles du robot.&lt;br /&gt;
==Tableau récapitulatif==&lt;br /&gt;
[[Fichier:Capteurs_pompier.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
On estime possible d'alimenter tous ces capteurs avec les batteries prévues au vu des courants d'alimentation qu'elles fournissent.&lt;br /&gt;
==Librairies Arduino==&lt;br /&gt;
Nous avons dû installer des librairies Arduino pour faire fonctionner les capteurs :&lt;br /&gt;
&amp;quot;DFRobot_CCS811&amp;quot; pour le capteur de CO2 CCS811;&lt;br /&gt;
&amp;quot;DHT Sensor Library&amp;quot; pour le capteur de température;&lt;br /&gt;
&amp;quot;Adafruit Circuit Playground&amp;quot; et &amp;quot;Adafruit Unified Sensor&amp;quot; pour les capteurs d'Adafruit.&lt;br /&gt;
&lt;br /&gt;
Il faut également avoir installé une librairie dans le gestionnaire de cartes pour pouvoir utiliser l'ESP32 Thing (carte utilisée pour acquérir les données des capteurs et pilote la Teensy). Lien du site officiel pour réaliser cette manipulation: https://learn.sparkfun.com/tutorials/esp32-thing-hookup-guide.&lt;br /&gt;
&lt;br /&gt;
=Code informatique=&lt;br /&gt;
==Robot maitre==&lt;br /&gt;
&lt;br /&gt;
===Communication entre la Raspberry et l'ESP32===&lt;br /&gt;
====Dans le sens Raspberry vers ESP32====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer&lt;br /&gt;
 | &amp;lt;code&amp;gt;av&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;dt&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Dans le sens ESP32 vers Raspberry====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer les alertes de l'ESP32 vers la Raspberry :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Alerte&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO&lt;br /&gt;
 | &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO2&lt;br /&gt;
 | &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CH4&lt;br /&gt;
 | &amp;lt;code&amp;gt;C4&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Température Haute&lt;br /&gt;
 | &amp;lt;code&amp;gt;TH&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | UV&lt;br /&gt;
 | &amp;lt;code&amp;gt;UV&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Distance à l'avant du robot&lt;br /&gt;
 | &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Erreur : en cas de commande av non exécutée car distance avant trop faible&lt;br /&gt;
 | &amp;lt;code&amp;gt;er&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Communication vers le robot esclave===&lt;br /&gt;
====ESP32 Maitre vers ESP32 Esclave====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |- &lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer d'une distance de XXX centimètres&lt;br /&gt;
 | &amp;lt;code&amp;gt;avXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rdXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rgXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Pour faire demi-tour, on envoie un rd180.&lt;br /&gt;
&lt;br /&gt;
==Schéma récapitulatif des différentes communications==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Communications_pompier.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
===Robots esclaves===&lt;br /&gt;
&lt;br /&gt;
=Notes tableaux J101=&lt;br /&gt;
Sauvegarde des notes des tableaux de la J101 le 7 avril 2022.&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_5.jpg|500px|thumb|left|Tableau 5]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_4.jpg|500px|thumb|left|Tableau 4]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_3.jpg|500px|thumb|left|Tableau 3]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_2.jpg|500px|thumb|left|Tableau 2]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_1.jpg|500px|thumb|left|Tableau 1]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11796</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11796"/>
		<updated>2022-05-05T10:29:04Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots pompiers==&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maitre :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elle est connectée au PCB à l'aide du connecteur d'alimentation situé dans l'angle inférieur gauche.&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner la carte ESP32&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino via ce [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
&lt;br /&gt;
==Déplacement du robot==&lt;br /&gt;
&lt;br /&gt;
* Pour gérer le déplacement via le terminal on a utilisé le [https://mootse.telecom-st-etienne.fr/mod/resource/view.php?id=13653 code pour une plateforme holonome 4 moteurs]. &lt;br /&gt;
* Procédure de test de la chaine d'alimentation, contrôle et asservissement :&lt;br /&gt;
# Téléverser ce [https://bacasable.arpitania.eu/index.php?title=Fichier:TeensyVSL298AsservissementVitesse4X_V2_0.zip code fourni] sur la carte teensy. La pleine vitesse citée plus tard est définie par paramVitesse dans les paramètres globaux en début de code.&lt;br /&gt;
# Téléverser un programme vide dans l'ESP32 thing&lt;br /&gt;
# Connecter les pin RX de la teensy sur le pin RX de l'ESP32, respectivement pour TX. En effet, les deux cartes sont branchées en parallèle, la carte ESP32 étant logiquement transparente, elle nous permet simplement d'envoyer des commandes série sur la teensy&lt;br /&gt;
# Connecter un pc à la carte ESP32 via le port micro USB&lt;br /&gt;
# Ouvrir une console série (par exemple la série arduino) sur le port concerné et tester les moteurs avec les commandes suivantes :&lt;br /&gt;
#:- &amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse, (resp. ''av2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse, (resp. ''am2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
# Tester les mouvements entiers :&lt;br /&gt;
#:* Robot 4 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à pleine vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à demi vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;rXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens horaire d'un angle XX = {45,90,135}&lt;br /&gt;
#::- &amp;lt;code&amp;gt;gXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens trigo d'une angle XX = {45,90,135}&lt;br /&gt;
#:* Robot 3 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amXXX&amp;lt;/code&amp;gt; pour définir la direction ''XXX'' (en degrés) de déplacement du robot&lt;br /&gt;
#::- &amp;lt;code&amp;gt;ho3&amp;lt;/code&amp;gt; pour avancer dans la direction définie précédemment&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer à la Teensy via l'UART :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant&lt;br /&gt;
 | &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant à demi vitesse&lt;br /&gt;
 | &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;r45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;g45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi-tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;demit&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Odométrie robot maître==&lt;br /&gt;
On utilise deux informations couplées : calcul de la position depuis les capteurs des moteurs et en parallèle un accéléromètre et un gyroscope contenus dans la centrale à inertie. &lt;br /&gt;
&lt;br /&gt;
Utilisation d'une centrale à inertie pour le calcul du déplacement effectué par le robot maître : MPU9250 10dof. Cette centrale à inertie est composée d'un gyroscope, d'un accéléromètre, d'un magnétomètre et d'un baromètre. La communication se fait en I²C.&lt;br /&gt;
&lt;br /&gt;
Le reste de la documentation est disponible sur https://cdn.sparkfun.com/assets/learn_tutorials/5/5/0/MPU-9250-Register-Map.pdf.&lt;br /&gt;
&lt;br /&gt;
=Programmation carte Raspberry Pi 3=&lt;br /&gt;
&lt;br /&gt;
====Installation d'un système d'exploitation====&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balena Etcher pour flasher l’image sur la carte SD&lt;br /&gt;
&lt;br /&gt;
On aurait aussi pu passer par l'utilitaire Raspberry Pi Imager, qui se charge de télécharger automatiquement l'OS et de flasher la carte SD. &lt;br /&gt;
&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale &lt;br /&gt;
&lt;br /&gt;
====Utilisation de la caméra====&lt;br /&gt;
# Si la liaison de la Raspberry avec un écran en HDMI ne se fait pas, il faut modifier le fichier config.txt (hdmi_group et hdmi_mode) de la carte micro SD de la Raspberry, pour forcer l'envoi sur le port HDMI même si rien n'est détecté à l'autre bout du câble.&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Dans le terminal, lancer &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt; et activer la caméra dans le menu Interfaces. Redémarrer ensuite la Raspberry. &lt;br /&gt;
# Premiers tests en local avec : &amp;lt;code&amp;gt;raspistill -o photo.jpg&amp;lt;/code&amp;gt; (enregistrement d’une photo avec retardateur de 5sec), puis &amp;lt;code&amp;gt;raspivid -o video.h264&amp;lt;/code&amp;gt; vidéo)&lt;br /&gt;
# Premier stream avec : &amp;lt;code&amp;gt;raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264&amp;lt;/code&amp;gt; sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : &amp;lt;code&amp;gt;rtsp://@IPpi:8080/&amp;lt;/code&amp;gt; [[Fichier:StreamCam.png|500px|thumb|right|streaming de la caméra sur un PC connecté au même réseau Wifi (partage de connexion dans notre cas)]]&lt;br /&gt;
# Installation de Mjpg-Streamer :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~&lt;br /&gt;
sudo apt-get install libjpeg9-dev&lt;br /&gt;
git clone https://github.com/jacksonliam/mjpg-streamer.git&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install cmake&lt;br /&gt;
CFLAGS+=&amp;quot;-Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s&amp;quot; make&lt;br /&gt;
sudo make install&lt;br /&gt;
cd ~/mjpg-streamer/mjpg-streamer-experimental./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Lancement du serveur Mjpg Streamer sur le port 8080&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Utilisation du port série====&lt;br /&gt;
Il est nécessaire d'activer et d'accorder les droits d'accès au port série :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;raspi-config &amp;gt; Interface options &amp;gt; Serial Port &amp;gt; Enable&lt;br /&gt;
sudo chmod 666 /dev/ttyS0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Choix de l'environnement serveur====&lt;br /&gt;
&lt;br /&gt;
Pour la gestion back sur le Raspberry, nous avons d'abord pensé utiliser un programme C++ proche du matériel et de la série. Cependant, la gestion web était alors largement compliquée.&lt;br /&gt;
Nous avons retenu d'utilisation d'un serveur node.js pour servir la page web et transmettre les commandes d'avancement comme les remontées d'alertes.&lt;br /&gt;
&lt;br /&gt;
=Interface Web=&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Afin de télépiloter le robot maître, nous utilisons une interface homme-machine via une page web.&lt;br /&gt;
Le serveur et le client communiquent à l’aide d’une connexion socket.&lt;br /&gt;
&lt;br /&gt;
Le flux vidéo est fourni par un serveur &amp;lt;code&amp;gt;mjpg streamer&amp;lt;/code&amp;gt;, indépendant du serveur &amp;lt;code&amp;gt;NodeJS&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Front===&lt;br /&gt;
La page web servie est en HTML, et contient un script JS.&lt;br /&gt;
D’une part, le retour caméra est incrusté à l’aide de la simple ligne suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;img width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; src=&amp;quot;http://192.168.246.107:8080/?action=stream&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au clic d’un bouton, il émet un évènement sur le socket.&lt;br /&gt;
S'il reçoit un message d'alerte sur le socket, il modifie en conséquence la couleur de l'alerte correspondante&lt;br /&gt;
&lt;br /&gt;
===Back===&lt;br /&gt;
Le serveur web est en NodeJS.&lt;br /&gt;
Outre servir la page web aux clients qui se connecte, il reçoit les évènements par le socket ouvert avec chacun d’eux. Il les transmet sur le port série.&lt;br /&gt;
Lorsqu'il commence à recevoir des données d'alerte sur le port série, il envoie un message pour afficher l'alerte sur le client.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas, des timers sont déclenchés pour stopper le robot ou le déclanchement des alertes en cas de déconnexion WiFi.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé la bibliothèque NodeJS &amp;lt;code&amp;gt;SerialPort&amp;lt;/code&amp;gt; pour la gestion des entrées/sorties sur le port série.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo apt install nodejs&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installation du serveur==&lt;br /&gt;
Dans un terminal du Raspberry, exécuter à l’emplacement des fichiers du serveur :&lt;br /&gt;
&amp;lt;code&amp;gt; npm i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lancement des serveurs au démarage==&lt;br /&gt;
Pour la mise en route des serveurs automatiquement lors du boot de la carte, nous avons modifié le fichier /etc/rc.local pour y placer juste avant la ligne &amp;lt;code&amp;gt;exit 0&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo ./home/pi/Documents/script&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script contient :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; #!/bin/bash&lt;br /&gt;
cd /home/pi/mjpg-streamer/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot; &amp;amp;&lt;br /&gt;
cd /home/pi/Desktop/Server&lt;br /&gt;
sudo node server.js&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tests serveur==&lt;br /&gt;
On peut ensuite tester l'envoi et la réception de trames UART depuis la Raspberry :&lt;br /&gt;
#Ouvrir un terminal, lancer mjpg streamer et le serveur &lt;br /&gt;
#Vérifier que l'appui sur des boutons du serveur côté client engendre l'envoie de trames depuis la broche Tx de la carte à l'aide d'un oscilloscope&lt;br /&gt;
#Vérifier que des données sont bien reçues, via l'interface graphique du serveur ou via le terminal en observant les données reçues provenant d'une carte ESP 32 Thing avec un code adapté pour le test&lt;br /&gt;
[[Fichier:raspbberry_av.PNG|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
==Capteur de température==&lt;br /&gt;
===Étude de la diffusion de la température en cas d'incendie===&lt;br /&gt;
Lors d'un incendie, le rayonnement est la principale source de transmission de la chaleur.&lt;br /&gt;
Un tableau fournit par le ministère permet d'estimer la densité de flux thermique radiatif en fonction de la distance à la flamme:&lt;br /&gt;
[[Fichier:Fnap.png|500px|thumb|center]]&lt;br /&gt;
On utilise ensuite la loi de Stéphan afin de déterminer la température:&lt;br /&gt;
[[Fichier:StephanLoi.png|500px|thumb|center]]&lt;br /&gt;
A l'aide d'Excel, on obtient les résultats suivants:&lt;br /&gt;
[[Fichier:Flamme_gaz.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Flamme_hydrocarbure.JPG|1000px|thumb|center]]&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur AOSONG AM2302 qui permet de mesurer la température ainsi que le taux d'humidité de l'air, fonction dont on ne servira pas.&lt;br /&gt;
Ce capteur permet de mesurer des températures de -40°C à 80°C.&lt;br /&gt;
&lt;br /&gt;
D'après le modèle :&lt;br /&gt;
&lt;br /&gt;
On n’a que 4 points donc on est peu précis mais on obtient un ordre de grandeur de l’ordre de 23m -27m pour ressentir 80°C en cas d’incendie, le choix d’un capteur mesurant jusqu’à une température de 80°C est donc cohérent avec le cas d’étude. Détecter un incendie environ 25m avant de l’atteindre dans un bâtiment est acceptable pour un robot, sachant qu’on a en plus des capteurs pour le gaz et la fumée (MQ9 et MQ135). On a une température de 60°C à 30m du feu environ (ça chute vite). On placera un seuil d'alerte à 60°C pour détecter les potentiels feux (le robot serait à une distance théorique de 30m du feu ce qui semble correct et réaliste).&lt;br /&gt;
&lt;br /&gt;
ATTENTION : On ne prend pas en compte la convexion et la conduction, on a seulement le rayonnement dans ce modèle simplifié. On aura donc une température un peu plus élevée dans la réalité.&lt;br /&gt;
==Capteur UV==&lt;br /&gt;
Pour mesurer l'indice UV, nous avons considéré le capteur SI1145 qui fonctionne par I²C, nous l'avions testé et était fonctionnel. Malheureusement lors d'un autre essai, son alimentation et sa masse ont été malencontreusement inversés ce qui a rendu le capteur hors service.&lt;br /&gt;
Nous avons donc redirigé notre choix vers les UV sensor Grove v1.1 qui ne fonctionnent pas en I²C mais à l'aide de 3 fils (GND, VCC, Signal). Il fournit des valeurs d'UV cohérentes lors de nos tests (indice UV entre 2 et 3). Nous placerons le seuil d'alerte à 6 pour prévenir d'un risque élevé.&lt;br /&gt;
[[Fichier:IndiceUv.jpg|400px|thumb|center]]&lt;br /&gt;
==Capteur de gaz toxiques==&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur MQ9 qui est un capteur coûtant peu cher et offrant une performance acceptable à condition de l'avoir préchauffé avant utilisation. Il permet de mesurer la concentration en CO (gaz carbonique) afin de permettre au robot maitre de prévenir un danger d'intoxication au gaz carbonique. Il permet également de mesurer la concentration en CH4 afin de pouvoir détecter de potentielles fuites de gaz.&lt;br /&gt;
&lt;br /&gt;
Il fonctionne à l'aide de 3 fils (GND, VCC, Signal).&lt;br /&gt;
&lt;br /&gt;
La concentration en CH4 devient dangereuse à partir de 50 000 ppm (limite d’explosivité), mais une concentration au-delà de 1000 ppm (500 fois supérieure à ce que l'on trouve pour un air pur) ne laisse aucun doute quand à une fuite de gaz. On placera donc la limite à 1000 ppm.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SeuilCO.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Codanger.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Pour le CO, on placera la limite à 200 ppm, stade à partir duquel une exposition de deux ou trois heures provoque des maux de têtes (--&amp;gt; besoin de vigilance).&lt;br /&gt;
Le capteur MQ9 permet de mesurer le CO de 10 ppm à 1000 ppm, et le CH4 de 100 ppm à 10 000 ppm donc il convient pour notre projet.&lt;br /&gt;
===Étalonnage du capteur===&lt;br /&gt;
La datasheet permet d'étalonner le capteur, à l'aide d'Excel on détermine une courbe de tendance à utiliser pour obtenir nos valeurs.&lt;br /&gt;
[[Fichier:EtalonMQ9.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Note: Rs est la valeur renvoyée par le capteur, R0 est déterminée grâce à la datasheet, et les courbes d'étalonnage fournies servent à retrouver les concentrations en ppm des différents gaz.&lt;br /&gt;
==Capteur de CO2==&lt;br /&gt;
Le CO2 présente également des dangers pour les personnes, on équipe ainsi le robot d'un capteur de CO2. Les seuils de danger du CO2 sont les suivants:&lt;br /&gt;
[[Fichier:SeuilCO2.JPG|1000px|thumb|center]]&lt;br /&gt;
On va donc placer une alerte à 2000 ppm pour le CO2.&lt;br /&gt;
Nous avions initialement choisi le capteur XENSIV PAS CO2 qui correspondait à ces critères (mesure le CO2 entre 0 ppm et 32 000 ppm), mais son prix a soudainement grimpé pour des raisons d'approvisionnement. Nous nous sommes donc rabattus sur un autre modèle: le CCS811 qui permet de mesurer le taux de CO2 pour des valeurs comprises en 400 ppm et 8192 ppm (il donne pour résultat 400 ppm par défaut pour les valeurs inférieures ou égales à 400 ppm).&lt;br /&gt;
==Télémètres==&lt;br /&gt;
Le robot maitre étant dirigé par caméra, on ne l'équipera que d'un télémètre pour assister le pilote lors de la détection d'obstacles frontaux. Les robots esclaves eux vont être équipés de télémètres pour pouvoir détecter les obstacles dans leur direction de mouvement. Pour le robot maitre, on met une alerte en place pour un obstacle détecté à 20 cm du robot et on bloque le robot si il se trouve à 10 cm de l'obstacle et qu'il souhaite se déplacer vers l'obstacle. Pour le robot esclave, on force le robot esclave à changer de trajectoire 15 cm avant l'obstacle afin de lui laisser le temps d'éviter la collision.&lt;br /&gt;
===SRF===&lt;br /&gt;
Dans la série des télémètres SRF, on a à notre disposition les modèles SRF08, SRF10 et SRF04. Les modèles SRF08 et SRF10 fonctionnent à l'aide de l'I²C, le modèle SRF04 lui fonctionne par voie analogique à l'aide de 4 fils (echo, trigger, GND, supply). SRF08 peut détecter les objets jusqu'à 6m avec un angle de détection de 55°, le SRF10 peut détecter les objets jusqu'à 6m avec un angle de détection de 72°, le SRF04 peut détecter les objets jusqu'à 3m avec un angle de détection de 30°. La distance minimale de détection des 3 capteurs est de 3 cm. Ces 3 capteurs conviennent à notre utilisation.&lt;br /&gt;
&lt;br /&gt;
===US-020===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), son angle de détection est de 15°, il permet de mesurer les obstacles entre 2cm et 7m. L'angle de détection est plutôt faible mais il pourrait servir sur les robots esclaves pour surveiller les angles du robot.&lt;br /&gt;
===VMA360===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), il a un angle de détection de 15°, il permet de mesurer les obstacles entre 2cm et 4,5m. L'angle de détection est plutôt faible mais il pourrait servir sur les esclaves pour surveiller les angles du robot.&lt;br /&gt;
==Tableau récapitulatif==&lt;br /&gt;
[[Fichier:Capteurs_pompier.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
On estime possible d'alimenter tous ces capteurs avec les batteries prévues au vu des courants d'alimentation qu'elles fournissent.&lt;br /&gt;
==Librairies Arduino==&lt;br /&gt;
Nous avons dû installer des librairies Arduino pour faire fonctionner les capteurs :&lt;br /&gt;
&amp;quot;DFRobot_CCS811&amp;quot; pour le capteur de CO2 CCS811;&lt;br /&gt;
&amp;quot;DHT Sensor Library&amp;quot; pour le capteur de température;&lt;br /&gt;
&amp;quot;Adafruit Circuit Playground&amp;quot; et &amp;quot;Adafruit Unified Sensor&amp;quot; pour les capteurs d'Adafruit.&lt;br /&gt;
&lt;br /&gt;
Il faut également avoir installé une librairie dans le gestionnaire de cartes pour pouvoir utiliser l'ESP32 Thing (carte utilisée pour acquérir les données des capteurs et pilote la Teensy). Lien du site officiel pour réaliser cette manipulation: https://learn.sparkfun.com/tutorials/esp32-thing-hookup-guide.&lt;br /&gt;
&lt;br /&gt;
=Code informatique=&lt;br /&gt;
==Robot maitre==&lt;br /&gt;
&lt;br /&gt;
===Communication entre la Raspberry et l'ESP32===&lt;br /&gt;
====Dans le sens Raspberry vers ESP32====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer&lt;br /&gt;
 | &amp;lt;code&amp;gt;av&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;dt&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Dans le sens ESP32 vers Raspberry====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer les alertes de l'ESP32 vers la Raspberry :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Alerte&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO&lt;br /&gt;
 | &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO2&lt;br /&gt;
 | &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CH4&lt;br /&gt;
 | &amp;lt;code&amp;gt;C4&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Température Haute&lt;br /&gt;
 | &amp;lt;code&amp;gt;TH&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | UV&lt;br /&gt;
 | &amp;lt;code&amp;gt;UV&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Distance à l'avant du robot&lt;br /&gt;
 | &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Erreur : en cas de commande av non exécutée car distance avant trop faible&lt;br /&gt;
 | &amp;lt;code&amp;gt;er&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Communication vers le robot esclave===&lt;br /&gt;
====ESP32 Maitre vers ESP32 Esclave====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |- &lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer d'une distance de XXX centimètres&lt;br /&gt;
 | &amp;lt;code&amp;gt;avXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rdXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rgXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi-tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd180&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Schéma récapitulatif des différentes communications==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Communications_pompier.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
===Robots esclaves===&lt;br /&gt;
&lt;br /&gt;
=Notes tableaux J101=&lt;br /&gt;
Sauvegarde des notes des tableaux de la J101 le 7 avril 2022.&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_5.jpg|500px|thumb|left|Tableau 5]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_4.jpg|500px|thumb|left|Tableau 4]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_3.jpg|500px|thumb|left|Tableau 3]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_2.jpg|500px|thumb|left|Tableau 2]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_1.jpg|500px|thumb|left|Tableau 1]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11795</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11795"/>
		<updated>2022-05-05T10:28:43Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots pompiers==&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maitre :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elle est connectée au PCB à l'aide du connecteur d'alimentation situé dans l'angle inférieur gauche.&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner la carte ESP32&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino via ce [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
&lt;br /&gt;
==Déplacement du robot==&lt;br /&gt;
&lt;br /&gt;
* Pour gérer le déplacement via le terminal on a utilisé le [https://mootse.telecom-st-etienne.fr/mod/resource/view.php?id=13653 code pour une plateforme holonome 4 moteurs]. &lt;br /&gt;
* Procédure de test de la chaine d'alimentation, contrôle et asservissement :&lt;br /&gt;
# Téléverser ce [https://bacasable.arpitania.eu/index.php?title=Fichier:TeensyVSL298AsservissementVitesse4X_V2_0.zip code fourni] sur la carte teensy. La pleine vitesse citée plus tard est définie par paramVitesse dans les paramètres globaux en début de code.&lt;br /&gt;
# Téléverser un programme vide dans l'ESP32 thing&lt;br /&gt;
# Connecter les pin RX de la teensy sur le pin RX de l'ESP32, respectivement pour TX. En effet, les deux cartes sont branchées en parallèle, la carte ESP32 étant logiquement transparente, elle nous permet simplement d'envoyer des commandes série sur la teensy&lt;br /&gt;
# Connecter un pc à la carte ESP32 via le port micro USB&lt;br /&gt;
# Ouvrir une console série (par exemple la série arduino) sur le port concerné et tester les moteurs avec les commandes suivantes :&lt;br /&gt;
#:- &amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse, (resp. ''av2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse, (resp. ''am2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
# Tester les mouvements entiers :&lt;br /&gt;
#:* Robot 4 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à pleine vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à demi vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;rXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens horaire d'un angle XX = {45,90,135}&lt;br /&gt;
#::- &amp;lt;code&amp;gt;gXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens trigo d'une angle XX = {45,90,135}&lt;br /&gt;
#:* Robot 3 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amXXX&amp;lt;/code&amp;gt; pour définir la direction ''XXX'' (en degrés) de déplacement du robot&lt;br /&gt;
#::- &amp;lt;code&amp;gt;ho3&amp;lt;/code&amp;gt; pour avancer dans la direction définie précédemment&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer à la Teensy via l'UART :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant&lt;br /&gt;
 | &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant à demi vitesse&lt;br /&gt;
 | &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;r45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;g45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi-tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;demit&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Odométrie robot maître==&lt;br /&gt;
On utilise deux informations couplées : calcul de la position depuis les capteurs des moteurs et en parallèle un accéléromètre et un gyroscope contenus dans la centrale à inertie. &lt;br /&gt;
&lt;br /&gt;
Utilisation d'une centrale à inertie pour le calcul du déplacement effectué par le robot maître : MPU9250 10dof. Cette centrale à inertie est composée d'un gyroscope, d'un accéléromètre, d'un magnétomètre et d'un baromètre. La communication se fait en I²C.&lt;br /&gt;
&lt;br /&gt;
Le reste de la documentation est disponible sur https://cdn.sparkfun.com/assets/learn_tutorials/5/5/0/MPU-9250-Register-Map.pdf.&lt;br /&gt;
&lt;br /&gt;
=Programmation carte Raspberry Pi 3=&lt;br /&gt;
&lt;br /&gt;
====Installation d'un système d'exploitation====&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balena Etcher pour flasher l’image sur la carte SD&lt;br /&gt;
&lt;br /&gt;
On aurait aussi pu passer par l'utilitaire Raspberry Pi Imager, qui se charge de télécharger automatiquement l'OS et de flasher la carte SD. &lt;br /&gt;
&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale &lt;br /&gt;
&lt;br /&gt;
====Utilisation de la caméra====&lt;br /&gt;
# Si la liaison de la Raspberry avec un écran en HDMI ne se fait pas, il faut modifier le fichier config.txt (hdmi_group et hdmi_mode) de la carte micro SD de la Raspberry, pour forcer l'envoi sur le port HDMI même si rien n'est détecté à l'autre bout du câble.&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Dans le terminal, lancer &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt; et activer la caméra dans le menu Interfaces. Redémarrer ensuite la Raspberry. &lt;br /&gt;
# Premiers tests en local avec : &amp;lt;code&amp;gt;raspistill -o photo.jpg&amp;lt;/code&amp;gt; (enregistrement d’une photo avec retardateur de 5sec), puis &amp;lt;code&amp;gt;raspivid -o video.h264&amp;lt;/code&amp;gt; vidéo)&lt;br /&gt;
# Premier stream avec : &amp;lt;code&amp;gt;raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264&amp;lt;/code&amp;gt; sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : &amp;lt;code&amp;gt;rtsp://@IPpi:8080/&amp;lt;/code&amp;gt; [[Fichier:StreamCam.png|500px|thumb|right|streaming de la caméra sur un PC connecté au même réseau Wifi (partage de connexion dans notre cas)]]&lt;br /&gt;
# Installation de Mjpg-Streamer :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~&lt;br /&gt;
sudo apt-get install libjpeg9-dev&lt;br /&gt;
git clone https://github.com/jacksonliam/mjpg-streamer.git&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install cmake&lt;br /&gt;
CFLAGS+=&amp;quot;-Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s&amp;quot; make&lt;br /&gt;
sudo make install&lt;br /&gt;
cd ~/mjpg-streamer/mjpg-streamer-experimental./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Lancement du serveur Mjpg Streamer sur le port 8080&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Utilisation du port série====&lt;br /&gt;
Il est nécessaire d'activer et d'accorder les droits d'accès au port série :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;raspi-config &amp;gt; Interface options &amp;gt; Serial Port &amp;gt; Enable&lt;br /&gt;
sudo chmod 666 /dev/ttyS0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Choix de l'environnement serveur====&lt;br /&gt;
&lt;br /&gt;
Pour la gestion back sur le Raspberry, nous avons d'abord pensé utiliser un programme C++ proche du matériel et de la série. Cependant, la gestion web était alors largement compliquée.&lt;br /&gt;
Nous avons retenu d'utilisation d'un serveur node.js pour servir la page web et transmettre les commandes d'avancement comme les remontées d'alertes.&lt;br /&gt;
&lt;br /&gt;
=Interface Web=&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Afin de télépiloter le robot maître, nous utilisons une interface homme-machine via une page web.&lt;br /&gt;
Le serveur et le client communiquent à l’aide d’une connexion socket.&lt;br /&gt;
&lt;br /&gt;
Le flux vidéo est fourni par un serveur &amp;lt;code&amp;gt;mjpg streamer&amp;lt;/code&amp;gt;, indépendant du serveur &amp;lt;code&amp;gt;NodeJS&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Front===&lt;br /&gt;
La page web servie est en HTML, et contient un script JS.&lt;br /&gt;
D’une part, le retour caméra est incrusté à l’aide de la simple ligne suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;img width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; src=&amp;quot;http://192.168.246.107:8080/?action=stream&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au clic d’un bouton, il émet un évènement sur le socket.&lt;br /&gt;
S'il reçoit un message d'alerte sur le socket, il modifie en conséquence la couleur de l'alerte correspondante&lt;br /&gt;
&lt;br /&gt;
===Back===&lt;br /&gt;
Le serveur web est en NodeJS.&lt;br /&gt;
Outre servir la page web aux clients qui se connecte, il reçoit les évènements par le socket ouvert avec chacun d’eux. Il les transmet sur le port série.&lt;br /&gt;
Lorsqu'il commence à recevoir des données d'alerte sur le port série, il envoie un message pour afficher l'alerte sur le client.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas, des timers sont déclenchés pour stopper le robot ou le déclanchement des alertes en cas de déconnexion WiFi.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé la bibliothèque NodeJS &amp;lt;code&amp;gt;SerialPort&amp;lt;/code&amp;gt; pour la gestion des entrées/sorties sur le port série.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo apt install nodejs&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installation du serveur==&lt;br /&gt;
Dans un terminal du Raspberry, exécuter à l’emplacement des fichiers du serveur :&lt;br /&gt;
&amp;lt;code&amp;gt; npm i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lancement des serveurs au démarage==&lt;br /&gt;
Pour la mise en route des serveurs automatiquement lors du boot de la carte, nous avons modifié le fichier /etc/rc.local pour y placer juste avant la ligne &amp;lt;code&amp;gt;exit 0&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo ./home/pi/Documents/script&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script contient :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; #!/bin/bash&lt;br /&gt;
cd /home/pi/mjpg-streamer/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot; &amp;amp;&lt;br /&gt;
cd /home/pi/Desktop/Server&lt;br /&gt;
sudo node server.js&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tests serveur==&lt;br /&gt;
On peut ensuite tester l'envoi et la réception de trames UART depuis la Raspberry :&lt;br /&gt;
#Ouvrir un terminal, lancer mjpg streamer et le serveur &lt;br /&gt;
#Vérifier que l'appui sur des boutons du serveur côté client engendre l'envoie de trames depuis la broche Tx de la carte à l'aide d'un oscilloscope&lt;br /&gt;
#Vérifier que des données sont bien reçues, via l'interface graphique du serveur ou via le terminal en observant les données reçues provenant d'une carte ESP 32 Thing avec un code adapté pour le test&lt;br /&gt;
[[Fichier:raspbberry_av.PNG|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
==Capteur de température==&lt;br /&gt;
===Étude de la diffusion de la température en cas d'incendie===&lt;br /&gt;
Lors d'un incendie, le rayonnement est la principale source de transmission de la chaleur.&lt;br /&gt;
Un tableau fournit par le ministère permet d'estimer la densité de flux thermique radiatif en fonction de la distance à la flamme:&lt;br /&gt;
[[Fichier:Fnap.png|500px|thumb|center]]&lt;br /&gt;
On utilise ensuite la loi de Stéphan afin de déterminer la température:&lt;br /&gt;
[[Fichier:StephanLoi.png|500px|thumb|center]]&lt;br /&gt;
A l'aide d'Excel, on obtient les résultats suivants:&lt;br /&gt;
[[Fichier:Flamme_gaz.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Flamme_hydrocarbure.JPG|1000px|thumb|center]]&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur AOSONG AM2302 qui permet de mesurer la température ainsi que le taux d'humidité de l'air, fonction dont on ne servira pas.&lt;br /&gt;
Ce capteur permet de mesurer des températures de -40°C à 80°C.&lt;br /&gt;
&lt;br /&gt;
D'après le modèle :&lt;br /&gt;
&lt;br /&gt;
On n’a que 4 points donc on est peu précis mais on obtient un ordre de grandeur de l’ordre de 23m -27m pour ressentir 80°C en cas d’incendie, le choix d’un capteur mesurant jusqu’à une température de 80°C est donc cohérent avec le cas d’étude. Détecter un incendie environ 25m avant de l’atteindre dans un bâtiment est acceptable pour un robot, sachant qu’on a en plus des capteurs pour le gaz et la fumée (MQ9 et MQ135). On a une température de 60°C à 30m du feu environ (ça chute vite). On placera un seuil d'alerte à 60°C pour détecter les potentiels feux (le robot serait à une distance théorique de 30m du feu ce qui semble correct et réaliste).&lt;br /&gt;
&lt;br /&gt;
ATTENTION : On ne prend pas en compte la convexion et la conduction, on a seulement le rayonnement dans ce modèle simplifié. On aura donc une température un peu plus élevée dans la réalité.&lt;br /&gt;
==Capteur UV==&lt;br /&gt;
Pour mesurer l'indice UV, nous avons considéré le capteur SI1145 qui fonctionne par I²C, nous l'avions testé et était fonctionnel. Malheureusement lors d'un autre essai, son alimentation et sa masse ont été malencontreusement inversés ce qui a rendu le capteur hors service.&lt;br /&gt;
Nous avons donc redirigé notre choix vers les UV sensor Grove v1.1 qui ne fonctionnent pas en I²C mais à l'aide de 3 fils (GND, VCC, Signal). Il fournit des valeurs d'UV cohérentes lors de nos tests (indice UV entre 2 et 3). Nous placerons le seuil d'alerte à 6 pour prévenir d'un risque élevé.&lt;br /&gt;
[[Fichier:IndiceUv.jpg|400px|thumb|center]]&lt;br /&gt;
==Capteur de gaz toxiques==&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur MQ9 qui est un capteur coûtant peu cher et offrant une performance acceptable à condition de l'avoir préchauffé avant utilisation. Il permet de mesurer la concentration en CO (gaz carbonique) afin de permettre au robot maitre de prévenir un danger d'intoxication au gaz carbonique. Il permet également de mesurer la concentration en CH4 afin de pouvoir détecter de potentielles fuites de gaz.&lt;br /&gt;
&lt;br /&gt;
Il fonctionne à l'aide de 3 fils (GND, VCC, Signal).&lt;br /&gt;
&lt;br /&gt;
La concentration en CH4 devient dangereuse à partir de 50 000 ppm (limite d’explosivité), mais une concentration au-delà de 1000 ppm (500 fois supérieure à ce que l'on trouve pour un air pur) ne laisse aucun doute quand à une fuite de gaz. On placera donc la limite à 1000 ppm.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SeuilCO.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Codanger.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Pour le CO, on placera la limite à 200 ppm, stade à partir duquel une exposition de deux ou trois heures provoque des maux de têtes (--&amp;gt; besoin de vigilance).&lt;br /&gt;
Le capteur MQ9 permet de mesurer le CO de 10 ppm à 1000 ppm, et le CH4 de 100 ppm à 10 000 ppm donc il convient pour notre projet.&lt;br /&gt;
===Étalonnage du capteur===&lt;br /&gt;
La datasheet permet d'étalonner le capteur, à l'aide d'Excel on détermine une courbe de tendance à utiliser pour obtenir nos valeurs.&lt;br /&gt;
[[Fichier:EtalonMQ9.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Note: Rs est la valeur renvoyée par le capteur, R0 est déterminée grâce à la datasheet, et les courbes d'étalonnage fournies servent à retrouver les concentrations en ppm des différents gaz.&lt;br /&gt;
==Capteur de CO2==&lt;br /&gt;
Le CO2 présente également des dangers pour les personnes, on équipe ainsi le robot d'un capteur de CO2. Les seuils de danger du CO2 sont les suivants:&lt;br /&gt;
[[Fichier:SeuilCO2.JPG|1000px|thumb|center]]&lt;br /&gt;
On va donc placer une alerte à 2000 ppm pour le CO2.&lt;br /&gt;
Nous avions initialement choisi le capteur XENSIV PAS CO2 qui correspondait à ces critères (mesure le CO2 entre 0 ppm et 32 000 ppm), mais son prix a soudainement grimpé pour des raisons d'approvisionnement. Nous nous sommes donc rabattus sur un autre modèle: le CCS811 qui permet de mesurer le taux de CO2 pour des valeurs comprises en 400 ppm et 8192 ppm (il donne pour résultat 400 ppm par défaut pour les valeurs inférieures ou égales à 400 ppm).&lt;br /&gt;
==Télémètres==&lt;br /&gt;
Le robot maitre étant dirigé par caméra, on ne l'équipera que d'un télémètre pour assister le pilote lors de la détection d'obstacles frontaux. Les robots esclaves eux vont être équipés de télémètres pour pouvoir détecter les obstacles dans leur direction de mouvement. Pour le robot maitre, on met une alerte en place pour un obstacle détecté à 20 cm du robot et on bloque le robot si il se trouve à 10 cm de l'obstacle et qu'il souhaite se déplacer vers l'obstacle. Pour le robot esclave, on force le robot esclave à changer de trajectoire 15 cm avant l'obstacle afin de lui laisser le temps d'éviter la collision.&lt;br /&gt;
===SRF===&lt;br /&gt;
Dans la série des télémètres SRF, on a à notre disposition les modèles SRF08, SRF10 et SRF04. Les modèles SRF08 et SRF10 fonctionnent à l'aide de l'I²C, le modèle SRF04 lui fonctionne par voie analogique à l'aide de 4 fils (echo, trigger, GND, supply). SRF08 peut détecter les objets jusqu'à 6m avec un angle de détection de 55°, le SRF10 peut détecter les objets jusqu'à 6m avec un angle de détection de 72°, le SRF04 peut détecter les objets jusqu'à 3m avec un angle de détection de 30°. La distance minimale de détection des 3 capteurs est de 3 cm. Ces 3 capteurs conviennent à notre utilisation.&lt;br /&gt;
&lt;br /&gt;
===US-020===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), son angle de détection est de 15°, il permet de mesurer les obstacles entre 2cm et 7m. L'angle de détection est plutôt faible mais il pourrait servir sur les robots esclaves pour surveiller les angles du robot.&lt;br /&gt;
===VMA360===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), il a un angle de détection de 15°, il permet de mesurer les obstacles entre 2cm et 4,5m. L'angle de détection est plutôt faible mais il pourrait servir sur les esclaves pour surveiller les angles du robot.&lt;br /&gt;
==Tableau récapitulatif==&lt;br /&gt;
[[Fichier:Capteurs_pompier.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
On estime possible d'alimenter tous ces capteurs avec les batteries prévues au vu des courants d'alimentation qu'elles fournissent.&lt;br /&gt;
==Librairies Arduino==&lt;br /&gt;
Nous avons dû installer des librairies Arduino pour faire fonctionner les capteurs :&lt;br /&gt;
&amp;quot;DFRobot_CCS811&amp;quot; pour le capteur de CO2 CCS811;&lt;br /&gt;
&amp;quot;DHT Sensor Library&amp;quot; pour le capteur de température;&lt;br /&gt;
&amp;quot;Adafruit Circuit Playground&amp;quot; et &amp;quot;Adafruit Unified Sensor&amp;quot; pour les capteurs d'Adafruit.&lt;br /&gt;
&lt;br /&gt;
Il faut également avoir installé une librairie dans le gestionnaire de cartes pour pouvoir utiliser l'ESP32 Thing (carte utilisée pour acquérir les données des capteurs et pilote la Teensy). Lien du site officiel pour réaliser cette manipulation: https://learn.sparkfun.com/tutorials/esp32-thing-hookup-guide.&lt;br /&gt;
&lt;br /&gt;
=Code informatique=&lt;br /&gt;
==Robot maitre==&lt;br /&gt;
&lt;br /&gt;
===Communication entre la Raspberry et l'ESP32===&lt;br /&gt;
====Dans le sens Raspberry vers ESP32====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer&lt;br /&gt;
 | &amp;lt;code&amp;gt;av&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;dt&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Dans le sens ESP32 vers Raspberry====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer les alertes de l'ESP32 vers la Raspberry :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Alerte&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO&lt;br /&gt;
 | &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO2&lt;br /&gt;
 | &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CH4&lt;br /&gt;
 | &amp;lt;code&amp;gt;C4&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Température Haute&lt;br /&gt;
 | &amp;lt;code&amp;gt;TH&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | UV&lt;br /&gt;
 | &amp;lt;code&amp;gt;UV&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Distance à l'avant du robot&lt;br /&gt;
 | &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Erreur : en cas de commande av non exécutée car distance avant trop faible&lt;br /&gt;
 | &amp;lt;code&amp;gt;er&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Communication vers le robot esclave===&lt;br /&gt;
====ESP32 Maitre vers ESP32 Esclave====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |- &lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer d'une distance de XXX centimètres&lt;br /&gt;
 | &amp;lt;code&amp;gt;avXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rdXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rgXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi-tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd180&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Schéma récapitulatif des différentes communications==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Communications_pompier.png|500px|thumb]]&lt;br /&gt;
&lt;br /&gt;
===Robots esclaves===&lt;br /&gt;
&lt;br /&gt;
=Notes tableaux J101=&lt;br /&gt;
Sauvegarde des notes des tableaux de la J101 le 7 avril 2022.&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_5.jpg|500px|thumb|left|Tableau 5]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_4.jpg|500px|thumb|left|Tableau 4]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_3.jpg|500px|thumb|left|Tableau 3]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_2.jpg|500px|thumb|left|Tableau 2]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_1.jpg|500px|thumb|left|Tableau 1]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11793</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11793"/>
		<updated>2022-05-05T10:28:25Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots pompiers==&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maitre :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elle est connectée au PCB à l'aide du connecteur d'alimentation situé dans l'angle inférieur gauche.&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner la carte ESP32&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino via ce [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
&lt;br /&gt;
==Déplacement du robot==&lt;br /&gt;
&lt;br /&gt;
* Pour gérer le déplacement via le terminal on a utilisé le [https://mootse.telecom-st-etienne.fr/mod/resource/view.php?id=13653 code pour une plateforme holonome 4 moteurs]. &lt;br /&gt;
* Procédure de test de la chaine d'alimentation, contrôle et asservissement :&lt;br /&gt;
# Téléverser ce [https://bacasable.arpitania.eu/index.php?title=Fichier:TeensyVSL298AsservissementVitesse4X_V2_0.zip code fourni] sur la carte teensy. La pleine vitesse citée plus tard est définie par paramVitesse dans les paramètres globaux en début de code.&lt;br /&gt;
# Téléverser un programme vide dans l'ESP32 thing&lt;br /&gt;
# Connecter les pin RX de la teensy sur le pin RX de l'ESP32, respectivement pour TX. En effet, les deux cartes sont branchées en parallèle, la carte ESP32 étant logiquement transparente, elle nous permet simplement d'envoyer des commandes série sur la teensy&lt;br /&gt;
# Connecter un pc à la carte ESP32 via le port micro USB&lt;br /&gt;
# Ouvrir une console série (par exemple la série arduino) sur le port concerné et tester les moteurs avec les commandes suivantes :&lt;br /&gt;
#:- &amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse, (resp. ''av2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse, (resp. ''am2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
# Tester les mouvements entiers :&lt;br /&gt;
#:* Robot 4 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à pleine vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à demi vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;rXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens horaire d'un angle XX = {45,90,135}&lt;br /&gt;
#::- &amp;lt;code&amp;gt;gXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens trigo d'une angle XX = {45,90,135}&lt;br /&gt;
#:* Robot 3 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amXXX&amp;lt;/code&amp;gt; pour définir la direction ''XXX'' (en degrés) de déplacement du robot&lt;br /&gt;
#::- &amp;lt;code&amp;gt;ho3&amp;lt;/code&amp;gt; pour avancer dans la direction définie précédemment&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer à la Teensy via l'UART :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant&lt;br /&gt;
 | &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant à demi vitesse&lt;br /&gt;
 | &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;r45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;g45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi-tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;demit&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Odométrie robot maître==&lt;br /&gt;
On utilise deux informations couplées : calcul de la position depuis les capteurs des moteurs et en parallèle un accéléromètre et un gyroscope contenus dans la centrale à inertie. &lt;br /&gt;
&lt;br /&gt;
Utilisation d'une centrale à inertie pour le calcul du déplacement effectué par le robot maître : MPU9250 10dof. Cette centrale à inertie est composée d'un gyroscope, d'un accéléromètre, d'un magnétomètre et d'un baromètre. La communication se fait en I²C.&lt;br /&gt;
&lt;br /&gt;
Le reste de la documentation est disponible sur https://cdn.sparkfun.com/assets/learn_tutorials/5/5/0/MPU-9250-Register-Map.pdf.&lt;br /&gt;
&lt;br /&gt;
=Programmation carte Raspberry Pi 3=&lt;br /&gt;
&lt;br /&gt;
====Installation d'un système d'exploitation====&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balena Etcher pour flasher l’image sur la carte SD&lt;br /&gt;
&lt;br /&gt;
On aurait aussi pu passer par l'utilitaire Raspberry Pi Imager, qui se charge de télécharger automatiquement l'OS et de flasher la carte SD. &lt;br /&gt;
&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale &lt;br /&gt;
&lt;br /&gt;
====Utilisation de la caméra====&lt;br /&gt;
# Si la liaison de la Raspberry avec un écran en HDMI ne se fait pas, il faut modifier le fichier config.txt (hdmi_group et hdmi_mode) de la carte micro SD de la Raspberry, pour forcer l'envoi sur le port HDMI même si rien n'est détecté à l'autre bout du câble.&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Dans le terminal, lancer &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt; et activer la caméra dans le menu Interfaces. Redémarrer ensuite la Raspberry. &lt;br /&gt;
# Premiers tests en local avec : &amp;lt;code&amp;gt;raspistill -o photo.jpg&amp;lt;/code&amp;gt; (enregistrement d’une photo avec retardateur de 5sec), puis &amp;lt;code&amp;gt;raspivid -o video.h264&amp;lt;/code&amp;gt; vidéo)&lt;br /&gt;
# Premier stream avec : &amp;lt;code&amp;gt;raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264&amp;lt;/code&amp;gt; sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : &amp;lt;code&amp;gt;rtsp://@IPpi:8080/&amp;lt;/code&amp;gt; [[Fichier:StreamCam.png|500px|thumb|right|streaming de la caméra sur un PC connecté au même réseau Wifi (partage de connexion dans notre cas)]]&lt;br /&gt;
# Installation de Mjpg-Streamer :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~&lt;br /&gt;
sudo apt-get install libjpeg9-dev&lt;br /&gt;
git clone https://github.com/jacksonliam/mjpg-streamer.git&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install cmake&lt;br /&gt;
CFLAGS+=&amp;quot;-Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s&amp;quot; make&lt;br /&gt;
sudo make install&lt;br /&gt;
cd ~/mjpg-streamer/mjpg-streamer-experimental./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Lancement du serveur Mjpg Streamer sur le port 8080&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Utilisation du port série====&lt;br /&gt;
Il est nécessaire d'activer et d'accorder les droits d'accès au port série :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;raspi-config &amp;gt; Interface options &amp;gt; Serial Port &amp;gt; Enable&lt;br /&gt;
sudo chmod 666 /dev/ttyS0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Choix de l'environnement serveur====&lt;br /&gt;
&lt;br /&gt;
Pour la gestion back sur le Raspberry, nous avons d'abord pensé utiliser un programme C++ proche du matériel et de la série. Cependant, la gestion web était alors largement compliquée.&lt;br /&gt;
Nous avons retenu d'utilisation d'un serveur node.js pour servir la page web et transmettre les commandes d'avancement comme les remontées d'alertes.&lt;br /&gt;
&lt;br /&gt;
=Interface Web=&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Afin de télépiloter le robot maître, nous utilisons une interface homme-machine via une page web.&lt;br /&gt;
Le serveur et le client communiquent à l’aide d’une connexion socket.&lt;br /&gt;
&lt;br /&gt;
Le flux vidéo est fourni par un serveur &amp;lt;code&amp;gt;mjpg streamer&amp;lt;/code&amp;gt;, indépendant du serveur &amp;lt;code&amp;gt;NodeJS&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Front===&lt;br /&gt;
La page web servie est en HTML, et contient un script JS.&lt;br /&gt;
D’une part, le retour caméra est incrusté à l’aide de la simple ligne suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;img width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; src=&amp;quot;http://192.168.246.107:8080/?action=stream&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au clic d’un bouton, il émet un évènement sur le socket.&lt;br /&gt;
S'il reçoit un message d'alerte sur le socket, il modifie en conséquence la couleur de l'alerte correspondante&lt;br /&gt;
&lt;br /&gt;
===Back===&lt;br /&gt;
Le serveur web est en NodeJS.&lt;br /&gt;
Outre servir la page web aux clients qui se connecte, il reçoit les évènements par le socket ouvert avec chacun d’eux. Il les transmet sur le port série.&lt;br /&gt;
Lorsqu'il commence à recevoir des données d'alerte sur le port série, il envoie un message pour afficher l'alerte sur le client.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas, des timers sont déclenchés pour stopper le robot ou le déclanchement des alertes en cas de déconnexion WiFi.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé la bibliothèque NodeJS &amp;lt;code&amp;gt;SerialPort&amp;lt;/code&amp;gt; pour la gestion des entrées/sorties sur le port série.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo apt install nodejs&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installation du serveur==&lt;br /&gt;
Dans un terminal du Raspberry, exécuter à l’emplacement des fichiers du serveur :&lt;br /&gt;
&amp;lt;code&amp;gt; npm i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lancement des serveurs au démarage==&lt;br /&gt;
Pour la mise en route des serveurs automatiquement lors du boot de la carte, nous avons modifié le fichier /etc/rc.local pour y placer juste avant la ligne &amp;lt;code&amp;gt;exit 0&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo ./home/pi/Documents/script&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script contient :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; #!/bin/bash&lt;br /&gt;
cd /home/pi/mjpg-streamer/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot; &amp;amp;&lt;br /&gt;
cd /home/pi/Desktop/Server&lt;br /&gt;
sudo node server.js&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tests serveur==&lt;br /&gt;
On peut ensuite tester l'envoi et la réception de trames UART depuis la Raspberry :&lt;br /&gt;
#Ouvrir un terminal, lancer mjpg streamer et le serveur &lt;br /&gt;
#Vérifier que l'appui sur des boutons du serveur côté client engendre l'envoie de trames depuis la broche Tx de la carte à l'aide d'un oscilloscope&lt;br /&gt;
#Vérifier que des données sont bien reçues, via l'interface graphique du serveur ou via le terminal en observant les données reçues provenant d'une carte ESP 32 Thing avec un code adapté pour le test&lt;br /&gt;
[[Fichier:raspbberry_av.PNG|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
==Capteur de température==&lt;br /&gt;
===Étude de la diffusion de la température en cas d'incendie===&lt;br /&gt;
Lors d'un incendie, le rayonnement est la principale source de transmission de la chaleur.&lt;br /&gt;
Un tableau fournit par le ministère permet d'estimer la densité de flux thermique radiatif en fonction de la distance à la flamme:&lt;br /&gt;
[[Fichier:Fnap.png|500px|thumb|center]]&lt;br /&gt;
On utilise ensuite la loi de Stéphan afin de déterminer la température:&lt;br /&gt;
[[Fichier:StephanLoi.png|500px|thumb|center]]&lt;br /&gt;
A l'aide d'Excel, on obtient les résultats suivants:&lt;br /&gt;
[[Fichier:Flamme_gaz.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Flamme_hydrocarbure.JPG|1000px|thumb|center]]&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur AOSONG AM2302 qui permet de mesurer la température ainsi que le taux d'humidité de l'air, fonction dont on ne servira pas.&lt;br /&gt;
Ce capteur permet de mesurer des températures de -40°C à 80°C.&lt;br /&gt;
&lt;br /&gt;
D'après le modèle :&lt;br /&gt;
&lt;br /&gt;
On n’a que 4 points donc on est peu précis mais on obtient un ordre de grandeur de l’ordre de 23m -27m pour ressentir 80°C en cas d’incendie, le choix d’un capteur mesurant jusqu’à une température de 80°C est donc cohérent avec le cas d’étude. Détecter un incendie environ 25m avant de l’atteindre dans un bâtiment est acceptable pour un robot, sachant qu’on a en plus des capteurs pour le gaz et la fumée (MQ9 et MQ135). On a une température de 60°C à 30m du feu environ (ça chute vite). On placera un seuil d'alerte à 60°C pour détecter les potentiels feux (le robot serait à une distance théorique de 30m du feu ce qui semble correct et réaliste).&lt;br /&gt;
&lt;br /&gt;
ATTENTION : On ne prend pas en compte la convexion et la conduction, on a seulement le rayonnement dans ce modèle simplifié. On aura donc une température un peu plus élevée dans la réalité.&lt;br /&gt;
==Capteur UV==&lt;br /&gt;
Pour mesurer l'indice UV, nous avons considéré le capteur SI1145 qui fonctionne par I²C, nous l'avions testé et était fonctionnel. Malheureusement lors d'un autre essai, son alimentation et sa masse ont été malencontreusement inversés ce qui a rendu le capteur hors service.&lt;br /&gt;
Nous avons donc redirigé notre choix vers les UV sensor Grove v1.1 qui ne fonctionnent pas en I²C mais à l'aide de 3 fils (GND, VCC, Signal). Il fournit des valeurs d'UV cohérentes lors de nos tests (indice UV entre 2 et 3). Nous placerons le seuil d'alerte à 6 pour prévenir d'un risque élevé.&lt;br /&gt;
[[Fichier:IndiceUv.jpg|400px|thumb|center]]&lt;br /&gt;
==Capteur de gaz toxiques==&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur MQ9 qui est un capteur coûtant peu cher et offrant une performance acceptable à condition de l'avoir préchauffé avant utilisation. Il permet de mesurer la concentration en CO (gaz carbonique) afin de permettre au robot maitre de prévenir un danger d'intoxication au gaz carbonique. Il permet également de mesurer la concentration en CH4 afin de pouvoir détecter de potentielles fuites de gaz.&lt;br /&gt;
&lt;br /&gt;
Il fonctionne à l'aide de 3 fils (GND, VCC, Signal).&lt;br /&gt;
&lt;br /&gt;
La concentration en CH4 devient dangereuse à partir de 50 000 ppm (limite d’explosivité), mais une concentration au-delà de 1000 ppm (500 fois supérieure à ce que l'on trouve pour un air pur) ne laisse aucun doute quand à une fuite de gaz. On placera donc la limite à 1000 ppm.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SeuilCO.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Codanger.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Pour le CO, on placera la limite à 200 ppm, stade à partir duquel une exposition de deux ou trois heures provoque des maux de têtes (--&amp;gt; besoin de vigilance).&lt;br /&gt;
Le capteur MQ9 permet de mesurer le CO de 10 ppm à 1000 ppm, et le CH4 de 100 ppm à 10 000 ppm donc il convient pour notre projet.&lt;br /&gt;
===Étalonnage du capteur===&lt;br /&gt;
La datasheet permet d'étalonner le capteur, à l'aide d'Excel on détermine une courbe de tendance à utiliser pour obtenir nos valeurs.&lt;br /&gt;
[[Fichier:EtalonMQ9.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Note: Rs est la valeur renvoyée par le capteur, R0 est déterminée grâce à la datasheet, et les courbes d'étalonnage fournies servent à retrouver les concentrations en ppm des différents gaz.&lt;br /&gt;
==Capteur de CO2==&lt;br /&gt;
Le CO2 présente également des dangers pour les personnes, on équipe ainsi le robot d'un capteur de CO2. Les seuils de danger du CO2 sont les suivants:&lt;br /&gt;
[[Fichier:SeuilCO2.JPG|1000px|thumb|center]]&lt;br /&gt;
On va donc placer une alerte à 2000 ppm pour le CO2.&lt;br /&gt;
Nous avions initialement choisi le capteur XENSIV PAS CO2 qui correspondait à ces critères (mesure le CO2 entre 0 ppm et 32 000 ppm), mais son prix a soudainement grimpé pour des raisons d'approvisionnement. Nous nous sommes donc rabattus sur un autre modèle: le CCS811 qui permet de mesurer le taux de CO2 pour des valeurs comprises en 400 ppm et 8192 ppm (il donne pour résultat 400 ppm par défaut pour les valeurs inférieures ou égales à 400 ppm).&lt;br /&gt;
==Télémètres==&lt;br /&gt;
Le robot maitre étant dirigé par caméra, on ne l'équipera que d'un télémètre pour assister le pilote lors de la détection d'obstacles frontaux. Les robots esclaves eux vont être équipés de télémètres pour pouvoir détecter les obstacles dans leur direction de mouvement. Pour le robot maitre, on met une alerte en place pour un obstacle détecté à 20 cm du robot et on bloque le robot si il se trouve à 10 cm de l'obstacle et qu'il souhaite se déplacer vers l'obstacle. Pour le robot esclave, on force le robot esclave à changer de trajectoire 15 cm avant l'obstacle afin de lui laisser le temps d'éviter la collision.&lt;br /&gt;
===SRF===&lt;br /&gt;
Dans la série des télémètres SRF, on a à notre disposition les modèles SRF08, SRF10 et SRF04. Les modèles SRF08 et SRF10 fonctionnent à l'aide de l'I²C, le modèle SRF04 lui fonctionne par voie analogique à l'aide de 4 fils (echo, trigger, GND, supply). SRF08 peut détecter les objets jusqu'à 6m avec un angle de détection de 55°, le SRF10 peut détecter les objets jusqu'à 6m avec un angle de détection de 72°, le SRF04 peut détecter les objets jusqu'à 3m avec un angle de détection de 30°. La distance minimale de détection des 3 capteurs est de 3 cm. Ces 3 capteurs conviennent à notre utilisation.&lt;br /&gt;
&lt;br /&gt;
===US-020===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), son angle de détection est de 15°, il permet de mesurer les obstacles entre 2cm et 7m. L'angle de détection est plutôt faible mais il pourrait servir sur les robots esclaves pour surveiller les angles du robot.&lt;br /&gt;
===VMA360===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), il a un angle de détection de 15°, il permet de mesurer les obstacles entre 2cm et 4,5m. L'angle de détection est plutôt faible mais il pourrait servir sur les esclaves pour surveiller les angles du robot.&lt;br /&gt;
==Tableau récapitulatif==&lt;br /&gt;
[[Fichier:Capteurs_pompier.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
On estime possible d'alimenter tous ces capteurs avec les batteries prévues au vu des courants d'alimentation qu'elles fournissent.&lt;br /&gt;
==Librairies Arduino==&lt;br /&gt;
Nous avons dû installer des librairies Arduino pour faire fonctionner les capteurs :&lt;br /&gt;
&amp;quot;DFRobot_CCS811&amp;quot; pour le capteur de CO2 CCS811;&lt;br /&gt;
&amp;quot;DHT Sensor Library&amp;quot; pour le capteur de température;&lt;br /&gt;
&amp;quot;Adafruit Circuit Playground&amp;quot; et &amp;quot;Adafruit Unified Sensor&amp;quot; pour les capteurs d'Adafruit.&lt;br /&gt;
&lt;br /&gt;
Il faut également avoir installé une librairie dans le gestionnaire de cartes pour pouvoir utiliser l'ESP32 Thing (carte utilisée pour acquérir les données des capteurs et pilote la Teensy). Lien du site officiel pour réaliser cette manipulation: https://learn.sparkfun.com/tutorials/esp32-thing-hookup-guide.&lt;br /&gt;
&lt;br /&gt;
=Code informatique=&lt;br /&gt;
==Robot maitre==&lt;br /&gt;
&lt;br /&gt;
===Communication entre la Raspberry et l'ESP32===&lt;br /&gt;
====Dans le sens Raspberry vers ESP32====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer&lt;br /&gt;
 | &amp;lt;code&amp;gt;av&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;dt&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Dans le sens ESP32 vers Raspberry====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer les alertes de l'ESP32 vers la Raspberry :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Alerte&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO&lt;br /&gt;
 | &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO2&lt;br /&gt;
 | &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CH4&lt;br /&gt;
 | &amp;lt;code&amp;gt;C4&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Température Haute&lt;br /&gt;
 | &amp;lt;code&amp;gt;TH&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | UV&lt;br /&gt;
 | &amp;lt;code&amp;gt;UV&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Distance à l'avant du robot&lt;br /&gt;
 | &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Erreur : en cas de commande av non exécutée car distance avant trop faible&lt;br /&gt;
 | &amp;lt;code&amp;gt;er&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Communication vers le robot esclave===&lt;br /&gt;
====ESP32 Maitre vers ESP32 Esclave====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rdXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche d'un angle XXX en degrés&lt;br /&gt;
 | &amp;lt;code&amp;gt;rgXXX&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi-tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd180&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Schéma récapitulatif des différentes communications==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Communications_pompier.png|500px|thumb|left]]&lt;br /&gt;
&lt;br /&gt;
===Robots esclaves===&lt;br /&gt;
&lt;br /&gt;
=Notes tableaux J101=&lt;br /&gt;
Sauvegarde des notes des tableaux de la J101 le 7 avril 2022.&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_5.jpg|500px|thumb|left|Tableau 5]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_4.jpg|500px|thumb|left|Tableau 4]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_3.jpg|500px|thumb|left|Tableau 3]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_2.jpg|500px|thumb|left|Tableau 2]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_1.jpg|500px|thumb|left|Tableau 1]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Fichier:Communications_pompier.png&amp;diff=11791</id>
		<title>Fichier:Communications pompier.png</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Fichier:Communications_pompier.png&amp;diff=11791"/>
		<updated>2022-05-05T10:26:54Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11778</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11778"/>
		<updated>2022-05-05T09:56:44Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots pompiers==&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maitre :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elle est connectée au PCB à l'aide du connecteur d'alimentation situé dans l'angle inférieur gauche.&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner la carte ESP32&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino via ce [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
&lt;br /&gt;
==Déplacement du robot==&lt;br /&gt;
&lt;br /&gt;
* Pour gérer le déplacement via le terminal on a utilisé le [https://mootse.telecom-st-etienne.fr/mod/resource/view.php?id=13653 code pour une plateforme holonome 4 moteurs]. &lt;br /&gt;
* Procédure de test de la chaine d'alimentation, contrôle et asservissement :&lt;br /&gt;
# Téléverser ce [https://bacasable.arpitania.eu/index.php?title=Fichier:TeensyVSL298AsservissementVitesse4X_V2_0.zip code fourni] sur la carte teensy. La pleine vitesse citée plus tard est définie par paramVitesse dans les paramètres globaux en début de code.&lt;br /&gt;
# Téléverser un programme vide dans l'ESP32 thing&lt;br /&gt;
# Connecter les pin RX de la teensy sur le pin RX de l'ESP32, respectivement pour TX. En effet, les deux cartes sont branchées en parallèle, la carte ESP32 étant logiquement transparente, elle nous permet simplement d'envoyer des commandes série sur la teensy&lt;br /&gt;
# Connecter un pc à la carte ESP32 via le port micro USB&lt;br /&gt;
# Ouvrir une console série (par exemple la série arduino) sur le port concerné et tester les moteurs avec les commandes suivantes :&lt;br /&gt;
#:- &amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse, (resp. ''av2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse, (resp. ''am2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
# Tester les mouvements entiers :&lt;br /&gt;
#:* Robot 4 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à pleine vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à demi vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;rXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens horaire d'un angle XX = {45,90,135}&lt;br /&gt;
#::- &amp;lt;code&amp;gt;gXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens trigo d'une angle XX = {45,90,135}&lt;br /&gt;
#:* Robot 3 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amXXX&amp;lt;/code&amp;gt; pour définir la direction ''XXX'' (en degrés) de déplacement du robot&lt;br /&gt;
#::- &amp;lt;code&amp;gt;ho3&amp;lt;/code&amp;gt; pour avancer dans la direction définie précédemment&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer à la Teensy via l'UART :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant&lt;br /&gt;
 | &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant à demi vitesse&lt;br /&gt;
 | &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;r45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;g45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi-tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;demit&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Odométrie robot maître==&lt;br /&gt;
On utilise deux informations couplées : calcul de la position depuis les capteurs des moteurs et en parallèle un accéléromètre et un gyroscope contenus dans la centrale à inertie. &lt;br /&gt;
&lt;br /&gt;
Utilisation d'une centrale à inertie pour le calcul du déplacement effectué par le robot maître : MPU9250 10dof. Cette centrale à inertie est composée d'un gyroscope, d'un accéléromètre, d'un magnétomètre et d'un baromètre. La communication se fait en I²C.&lt;br /&gt;
&lt;br /&gt;
Le reste de la documentation est disponible sur https://cdn.sparkfun.com/assets/learn_tutorials/5/5/0/MPU-9250-Register-Map.pdf.&lt;br /&gt;
&lt;br /&gt;
=Programmation carte Raspberry Pi 3=&lt;br /&gt;
&lt;br /&gt;
====Installation d'un système d'exploitation====&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balena Etcher pour flasher l’image sur la carte SD&lt;br /&gt;
&lt;br /&gt;
On aurait aussi pu passer par l'utilitaire Raspberry Pi Imager, qui se charge de télécharger automatiquement l'OS et de flasher la carte SD. &lt;br /&gt;
&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale &lt;br /&gt;
&lt;br /&gt;
====Utilisation de la caméra====&lt;br /&gt;
# Si la liaison de la Raspberry avec un écran en HDMI ne se fait pas, il faut modifier le fichier config.txt (hdmi_group et hdmi_mode) de la carte micro SD de la Raspberry, pour forcer l'envoi sur le port HDMI même si rien n'est détecté à l'autre bout du câble.&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Dans le terminal, lancer &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt; et activer la caméra dans le menu Interfaces. Redémarrer ensuite la Raspberry. &lt;br /&gt;
# Premiers tests en local avec : &amp;lt;code&amp;gt;raspistill -o photo.jpg&amp;lt;/code&amp;gt; (enregistrement d’une photo avec retardateur de 5sec), puis &amp;lt;code&amp;gt;raspivid -o video.h264&amp;lt;/code&amp;gt; vidéo)&lt;br /&gt;
# Premier stream avec : &amp;lt;code&amp;gt;raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264&amp;lt;/code&amp;gt; sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : &amp;lt;code&amp;gt;rtsp://@IPpi:8080/&amp;lt;/code&amp;gt; [[Fichier:StreamCam.png|500px|thumb|right|streaming de la caméra sur un PC connecté au même réseau Wifi (partage de connexion dans notre cas)]]&lt;br /&gt;
# Installation de Mjpg-Streamer :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~&lt;br /&gt;
sudo apt-get install libjpeg9-dev&lt;br /&gt;
git clone https://github.com/jacksonliam/mjpg-streamer.git&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install cmake&lt;br /&gt;
CFLAGS+=&amp;quot;-Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s&amp;quot; make&lt;br /&gt;
sudo make install&lt;br /&gt;
cd ~/mjpg-streamer/mjpg-streamer-experimental./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Lancement du serveur Mjpg Streamer sur le port 8080&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Utilisation du port série====&lt;br /&gt;
Il est nécessaire d'activer et d'accorder les droits d'accès au port série :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;raspi-config &amp;gt; Interface options &amp;gt; Serial Port &amp;gt; Enable&lt;br /&gt;
sudo chmod 666 /dev/ttyS0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Choix de l'environnement serveur====&lt;br /&gt;
&lt;br /&gt;
Pour la gestion back sur le Raspberry, nous avons d'abord pensé utiliser un programme C++ proche du matériel et de la série. Cependant, la gestion web était alors largement compliquée.&lt;br /&gt;
Nous avons retenu d'utilisation d'un serveur node.js pour servir la page web et transmettre les commandes d'avancement comme les remontées d'alertes.&lt;br /&gt;
&lt;br /&gt;
=Interface Web=&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Afin de télépiloter le robot maître, nous utilisons une interface homme-machine via une page web.&lt;br /&gt;
Le serveur et le client communiquent à l’aide d’une connexion socket.&lt;br /&gt;
&lt;br /&gt;
Le flux vidéo est fourni par un serveur &amp;lt;code&amp;gt;mjpg streamer&amp;lt;/code&amp;gt;, indépendant du serveur &amp;lt;code&amp;gt;NodeJS&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Front===&lt;br /&gt;
La page web servie est en HTML, et contient un script JS.&lt;br /&gt;
D’une part, le retour caméra est incrusté à l’aide de la simple ligne suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;img width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; src=&amp;quot;http://192.168.246.107:8080/?action=stream&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au clic d’un bouton, il émet un évènement sur le socket.&lt;br /&gt;
S'il reçoit un message d'alerte sur le socket, il modifie en conséquence la couleur de l'alerte correspondante&lt;br /&gt;
&lt;br /&gt;
===Back===&lt;br /&gt;
Le serveur web est en NodeJS.&lt;br /&gt;
Outre servir la page web aux clients qui se connecte, il reçoit les évènements par le socket ouvert avec chacun d’eux. Il les transmet sur le port série.&lt;br /&gt;
Lorsqu'il commence à recevoir des données d'alerte sur le port série, il envoie un message pour afficher l'alerte sur le client.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas, des timers sont déclenchés pour stopper le robot ou le déclanchement des alertes en cas de déconnexion WiFi.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé la bibliothèque NodeJS &amp;lt;code&amp;gt;SerialPort&amp;lt;/code&amp;gt; pour la gestion des entrées/sorties sur le port série.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo apt install nodejs&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installation du serveur==&lt;br /&gt;
Dans un terminal du Raspberry, exécuter à l’emplacement des fichiers du serveur :&lt;br /&gt;
&amp;lt;code&amp;gt; npm i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lancement des serveurs au démarage==&lt;br /&gt;
Pour la mise en route des serveurs automatiquement lors du boot de la carte, nous avons modifié le fichier /etc/rc.local pour y placer juste avant la ligne &amp;lt;code&amp;gt;exit 0&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo ./home/pi/Documents/script&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script contient :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; #!/bin/bash&lt;br /&gt;
cd /home/pi/mjpg-streamer/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot; &amp;amp;&lt;br /&gt;
cd /home/pi/Desktop/Server&lt;br /&gt;
sudo node server.js&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tests serveur==&lt;br /&gt;
On peut ensuite tester l'envoi et la réception de trames UART depuis la Raspberry :&lt;br /&gt;
#Ouvrir un terminal, lancer mjpg streamer et le serveur &lt;br /&gt;
#Vérifier que l'appui sur des boutons du serveur côté client engendre l'envoie de trames depuis la broche Tx de la carte à l'aide d'un oscilloscope&lt;br /&gt;
#Vérifier que des données sont bien reçues, via l'interface graphique du serveur ou via le terminal en observant les données reçues provenant d'une carte ESP 32 Thing avec un code adapté pour le test&lt;br /&gt;
[[Fichier:raspbberry_av.PNG|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
==Capteur de température==&lt;br /&gt;
===Étude de la diffusion de la température en cas d'incendie===&lt;br /&gt;
Lors d'un incendie, le rayonnement est la principale source de transmission de la chaleur.&lt;br /&gt;
Un tableau fournit par le ministère permet d'estimer la densité de flux thermique radiatif en fonction de la distance à la flamme:&lt;br /&gt;
[[Fichier:Fnap.png|500px|thumb|center]]&lt;br /&gt;
On utilise ensuite la loi de Stéphan afin de déterminer la température:&lt;br /&gt;
[[Fichier:StephanLoi.png|500px|thumb|center]]&lt;br /&gt;
A l'aide d'Excel, on obtient les résultats suivants:&lt;br /&gt;
[[Fichier:Flamme_gaz.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Flamme_hydrocarbure.JPG|1000px|thumb|center]]&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur AOSONG AM2302 qui permet de mesurer la température ainsi que le taux d'humidité de l'air, fonction dont on ne servira pas.&lt;br /&gt;
Ce capteur permet de mesurer des températures de -40°C à 80°C.&lt;br /&gt;
&lt;br /&gt;
D'après le modèle :&lt;br /&gt;
&lt;br /&gt;
On n’a que 4 points donc on est peu précis mais on obtient un ordre de grandeur de l’ordre de 23m -27m pour ressentir 80°C en cas d’incendie, le choix d’un capteur mesurant jusqu’à une température de 80°C est donc cohérent avec le cas d’étude. Détecter un incendie environ 25m avant de l’atteindre dans un bâtiment est acceptable pour un robot, sachant qu’on a en plus des capteurs pour le gaz et la fumée (MQ9 et MQ135). On a une température de 60°C à 30m du feu environ (ça chute vite). On placera un seuil d'alerte à 60°C pour détecter les potentiels feux (le robot serait à une distance théorique de 30m du feu ce qui semble correct et réaliste).&lt;br /&gt;
&lt;br /&gt;
ATTENTION : On ne prend pas en compte la convexion et la conduction, on a seulement le rayonnement dans ce modèle simplifié. On aura donc une température un peu plus élevée dans la réalité.&lt;br /&gt;
==Capteur UV==&lt;br /&gt;
Pour mesurer l'indice UV, nous avons considéré le capteur SI1145 qui fonctionne par I²C, nous l'avions testé et était fonctionnel. Malheureusement lors d'un autre essai, son alimentation et sa masse ont été malencontreusement inversés ce qui a rendu le capteur hors service.&lt;br /&gt;
Nous avons donc redirigé notre choix vers les UV sensor Grove v1.1 qui ne fonctionnent pas en I²C mais à l'aide de 3 fils (GND, VCC, Signal). Il fournit des valeurs d'UV cohérentes lors de nos tests (indice UV entre 2 et 3). Nous placerons le seuil d'alerte à 6 pour prévenir d'un risque élevé.&lt;br /&gt;
[[Fichier:IndiceUv.jpg|400px|thumb|center]]&lt;br /&gt;
==Capteur de gaz toxiques==&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur MQ9 qui est un capteur coûtant peu cher et offrant une performance acceptable à condition de l'avoir préchauffé avant utilisation. Il permet de mesurer la concentration en CO (gaz carbonique) afin de permettre au robot maitre de prévenir un danger d'intoxication au gaz carbonique. Il permet également de mesurer la concentration en CH4 afin de pouvoir détecter de potentielles fuites de gaz.&lt;br /&gt;
&lt;br /&gt;
Il fonctionne à l'aide de 3 fils (GND, VCC, Signal).&lt;br /&gt;
&lt;br /&gt;
La concentration en CH4 devient dangereuse à partir de 50 000 ppm (limite d’explosivité), mais une concentration au-delà de 1000 ppm (500 fois supérieure à ce que l'on trouve pour un air pur) ne laisse aucun doute quand à une fuite de gaz. On placera donc la limite à 1000 ppm.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SeuilCO.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Codanger.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Pour le CO, on placera la limite à 200 ppm, stade à partir duquel une exposition de deux ou trois heures provoque des maux de têtes (--&amp;gt; besoin de vigilance).&lt;br /&gt;
Le capteur MQ9 permet de mesurer le CO de 10 ppm à 1000 ppm, et le CH4 de 100 ppm à 10 000 ppm donc il convient pour notre projet.&lt;br /&gt;
===Étalonnage du capteur===&lt;br /&gt;
La datasheet permet d'étalonner le capteur, à l'aide d'Excel on détermine une courbe de tendance à utiliser pour obtenir nos valeurs.&lt;br /&gt;
[[Fichier:EtalonMQ9.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Note: Rs est la valeur renvoyée par le capteur, R0 est déterminée grâce à la datasheet, et les courbes d'étalonnage fournies servent à retrouver les concentrations en ppm des différents gaz.&lt;br /&gt;
==Capteur de CO2==&lt;br /&gt;
Le CO2 présente également des dangers pour les personnes, on équipe ainsi le robot d'un capteur de CO2. Les seuils de danger du CO2 sont les suivants:&lt;br /&gt;
[[Fichier:SeuilCO2.JPG|1000px|thumb|center]]&lt;br /&gt;
On va donc placer une alerte à 2000 ppm pour le CO2.&lt;br /&gt;
Nous avions initialement choisi le capteur XENSIV PAS CO2 qui correspondait à ces critères (mesure le CO2 entre 0 ppm et 32 000 ppm), mais son prix a soudainement grimpé pour des raisons d'approvisionnement. Nous nous sommes donc rabattus sur un autre modèle: le CCS811 qui permet de mesurer le taux de CO2 pour des valeurs comprises en 400 ppm et 8192 ppm (il donne pour résultat 400 ppm par défaut pour les valeurs inférieures ou égales à 400 ppm).&lt;br /&gt;
==Télémètres==&lt;br /&gt;
Le robot maitre étant dirigé par caméra, on ne l'équipera que d'un télémètre pour assister le pilote lors de la détection d'obstacles frontaux. Les robots esclaves eux vont être équipés de télémètres pour pouvoir détecter les obstacles dans leur direction de mouvement. Pour le robot maitre, on met une alerte en place pour un obstacle détecté à 20 cm du robot et on bloque le robot si il se trouve à 10 cm de l'obstacle et qu'il souhaite se déplacer vers l'obstacle. Pour le robot esclave, on force le robot esclave à changer de trajectoire 15 cm avant l'obstacle afin de lui laisser le temps d'éviter la collision.&lt;br /&gt;
===SRF===&lt;br /&gt;
Dans la série des télémètres SRF, on a à notre disposition les modèles SRF08, SRF10 et SRF04. Les modèles SRF08 et SRF10 fonctionnent à l'aide de l'I²C, le modèle SRF04 lui fonctionne par voie analogique à l'aide de 4 fils (echo, trigger, GND, supply). SRF08 peut détecter les objets jusqu'à 6m avec un angle de détection de 55°, le SRF10 peut détecter les objets jusqu'à 6m avec un angle de détection de 72°, le SRF04 peut détecter les objets jusqu'à 3m avec un angle de détection de 30°. La distance minimale de détection des 3 capteurs est de 3 cm. Ces 3 capteurs conviennent à notre utilisation.&lt;br /&gt;
&lt;br /&gt;
===US-020===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), son angle de détection est de 15°, il permet de mesurer les obstacles entre 2cm et 7m. L'angle de détection est plutôt faible mais il pourrait servir sur les robots esclaves pour surveiller les angles du robot.&lt;br /&gt;
===VMA360===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), il a un angle de détection de 15°, il permet de mesurer les obstacles entre 2cm et 4,5m. L'angle de détection est plutôt faible mais il pourrait servir sur les esclaves pour surveiller les angles du robot.&lt;br /&gt;
==Tableau récapitulatif==&lt;br /&gt;
[[Fichier:Capteurs_pompier.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
On estime possible d'alimenter tous ces capteurs avec les batteries prévues au vu des courants d'alimentation qu'elles fournissent.&lt;br /&gt;
==Librairies Arduino==&lt;br /&gt;
Nous avons dû installer des librairies Arduino pour faire fonctionner les capteurs :&lt;br /&gt;
&amp;quot;DFRobot_CCS811&amp;quot; pour le capteur de CO2 CCS811;&lt;br /&gt;
&amp;quot;DHT Sensor Library&amp;quot; pour le capteur de température;&lt;br /&gt;
&amp;quot;Adafruit Circuit Playground&amp;quot; et &amp;quot;Adafruit Unified Sensor&amp;quot; pour les capteurs d'Adafruit.&lt;br /&gt;
&lt;br /&gt;
Il faut également avoir installé une librairie dans le gestionnaire de cartes pour pouvoir utiliser l'ESP32 Thing (carte utilisée pour acquérir les données des capteurs et pilote la Teensy). Lien du site officiel pour réaliser cette manipulation: https://learn.sparkfun.com/tutorials/esp32-thing-hookup-guide.&lt;br /&gt;
&lt;br /&gt;
=Code informatique=&lt;br /&gt;
==Robot maitre==&lt;br /&gt;
&lt;br /&gt;
===Communication entre la Raspberry et l'ESP32===&lt;br /&gt;
====Dans le sens Raspberry vers ESP32====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer&lt;br /&gt;
 | &amp;lt;code&amp;gt;av&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;dt&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Dans le sens ESP32 vers Raspberry====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer les alertes de l'ESP32 vers la Raspberry :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Alerte&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO&lt;br /&gt;
 | &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO2&lt;br /&gt;
 | &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CH4&lt;br /&gt;
 | &amp;lt;code&amp;gt;C4&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Température Haute&lt;br /&gt;
 | &amp;lt;code&amp;gt;TH&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | UV&lt;br /&gt;
 | &amp;lt;code&amp;gt;UV&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Distance à l'avant du robot&lt;br /&gt;
 | &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Erreur : en cas de commande av non exécutée car distance avant trop faible&lt;br /&gt;
 | &amp;lt;code&amp;gt;er&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Robots esclaves===&lt;br /&gt;
=Notes tableaux J101=&lt;br /&gt;
Sauvegarde des notes des tableaux de la J101 le 7 avril 2022.&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_5.jpg|500px|thumb|left|Tableau 5]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_4.jpg|500px|thumb|left|Tableau 4]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_3.jpg|500px|thumb|left|Tableau 3]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_2.jpg|500px|thumb|left|Tableau 2]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_1.jpg|500px|thumb|left|Tableau 1]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11777</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11777"/>
		<updated>2022-05-05T09:51:34Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots pompiers==&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maitre :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elle est connectée au PCB à l'aide du connecteur d'alimentation situé dans l'angle inférieur gauche.&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner la carte ESP32&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino via ce [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
&lt;br /&gt;
==Déplacement du robot==&lt;br /&gt;
&lt;br /&gt;
* Pour gérer le déplacement via le terminal on a utilisé le [https://mootse.telecom-st-etienne.fr/mod/resource/view.php?id=13653 code pour une plateforme holonome 4 moteurs]. &lt;br /&gt;
* Procédure de test de la chaine d'alimentation, contrôle et asservissement :&lt;br /&gt;
# Téléverser ce [https://bacasable.arpitania.eu/index.php?title=Fichier:TeensyVSL298AsservissementVitesse4X_V2_0.zip code fourni] sur la carte teensy. La pleine vitesse citée plus tard est définie par paramVitesse dans les paramètres globaux en début de code.&lt;br /&gt;
# Téléverser un programme vide dans l'ESP32 thing&lt;br /&gt;
# Connecter les pin RX de la teensy sur le pin RX de l'ESP32, respectivement pour TX. En effet, les deux cartes sont branchées en parallèle, la carte ESP32 étant logiquement transparente, elle nous permet simplement d'envoyer des commandes série sur la teensy&lt;br /&gt;
# Connecter un pc à la carte ESP32 via le port micro USB&lt;br /&gt;
# Ouvrir une console série (par exemple la série arduino) sur le port concerné et tester les moteurs avec les commandes suivantes :&lt;br /&gt;
#:- &amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse, (resp. ''av2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse, (resp. ''am2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
# Tester les mouvements entiers :&lt;br /&gt;
#:* Robot 4 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à pleine vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à demi vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;rXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens horaire d'un angle XX = {45,90,135}&lt;br /&gt;
#::- &amp;lt;code&amp;gt;gXX&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens trigo d'une angle XX = {45,90,135}&lt;br /&gt;
#:* Robot 3 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amXXX&amp;lt;/code&amp;gt; pour définir la direction ''XXX'' (en degrés) de déplacement du robot&lt;br /&gt;
#::- &amp;lt;code&amp;gt;ho3&amp;lt;/code&amp;gt; pour avancer dans la direction définie précédemment&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer à la Teensy via l'UART :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant&lt;br /&gt;
 | &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant à demi vitesse&lt;br /&gt;
 | &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;r45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 45 degrés ; dispo 90 et 135&lt;br /&gt;
 | &amp;lt;code&amp;gt;g45&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi-tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;demit&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Odométrie robot maître==&lt;br /&gt;
On utilise deux informations couplées : calcul de la position depuis les capteurs des moteurs et en parallèle un accéléromètre et un gyroscope contenus dans la centrale à inertie. &lt;br /&gt;
&lt;br /&gt;
Utilisation d'une centrale à inertie pour le calcul du déplacement effectué par le robot maître : MPU9250 10dof. Cette centrale à inertie est composée d'un gyroscope, d'un accéléromètre, d'un magnétomètre et d'un baromètre. La communication se fait en I²C.&lt;br /&gt;
&lt;br /&gt;
Le reste de la documentation est disponible sur https://cdn.sparkfun.com/assets/learn_tutorials/5/5/0/MPU-9250-Register-Map.pdf.&lt;br /&gt;
&lt;br /&gt;
=Programmation carte Raspberry Pi 3=&lt;br /&gt;
&lt;br /&gt;
====Installation d'un système d'exploitation====&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balena Etcher pour flasher l’image sur la carte SD&lt;br /&gt;
&lt;br /&gt;
On aurait aussi pu passer par l'utilitaire Raspberry Pi Imager, qui se charge de télécharger automatiquement l'OS et de flasher la carte SD. &lt;br /&gt;
&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale &lt;br /&gt;
&lt;br /&gt;
====Utilisation de la caméra====&lt;br /&gt;
# Si la liaison de la Raspberry avec un écran en HDMI ne se fait pas, il faut modifier le fichier config.txt (hdmi_group et hdmi_mode) de la carte micro SD de la Raspberry, pour forcer l'envoi sur le port HDMI même si rien n'est détecté à l'autre bout du câble.&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Premiers tests en local avec : &amp;lt;code&amp;gt;raspistill -o photo.jpg&amp;lt;/code&amp;gt; (enregistrement d’une photo avec retardateur de 5sec), puis &amp;lt;code&amp;gt;raspivid -o video.h264&amp;lt;/code&amp;gt; vidéo)&lt;br /&gt;
# Premier stream avec : &amp;lt;code&amp;gt;raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264&amp;lt;/code&amp;gt; sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : &amp;lt;code&amp;gt;rtsp://@IPpi:8080/&amp;lt;/code&amp;gt; [[Fichier:StreamCam.png|500px|thumb|right|streaming de la caméra sur un PC connecté au même réseau wifi]]&lt;br /&gt;
# Installation de Mjpg-Streamer :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~&lt;br /&gt;
sudo apt-get install libjpeg9-dev&lt;br /&gt;
git clone https://github.com/jacksonliam/mjpg-streamer.git&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install cmake&lt;br /&gt;
CFLAGS+=&amp;quot;-Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s&amp;quot; make&lt;br /&gt;
sudo make install&lt;br /&gt;
cd ~/mjpg-streamer/mjpg-streamer-experimental./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Lancement du serveur Mjpg Streamer sur le port 8080&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ~/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Utilisation du port série====&lt;br /&gt;
Il est nécessaire d'activer et d'accorder les droits d'accès au port série :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;raspi-config &amp;gt; Interface options &amp;gt; Serial Port &amp;gt; Enable&lt;br /&gt;
sudo chmod 666 /dev/ttyS0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Choix de l'environnement serveur====&lt;br /&gt;
&lt;br /&gt;
Pour la gestion back sur le Raspberry, nous avons d'abord pensé utiliser un programme C++ proche du matériel et de la série. Cependant, la gestion web était alors largement compliquée.&lt;br /&gt;
Nous avons retenu d'utilisation d'un serveur node.js pour servir la page web et transmettre les commandes d'avancement comme les remontées d'alertes.&lt;br /&gt;
&lt;br /&gt;
=Interface Web=&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Afin de télépiloter le robot maitre, nous utilisons une interface homme-machine via une page web.&lt;br /&gt;
Le serveur et le client communiquent à l’aide d’une connexion socket.&lt;br /&gt;
&lt;br /&gt;
Le flux vidéo est fourni par un serveur &amp;lt;code&amp;gt;mjpg streamer&amp;lt;/code&amp;gt;, indépendant du serveur &amp;lt;code&amp;gt;NodeJS&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Front===&lt;br /&gt;
La page web servie est en html, et contient un script JS.&lt;br /&gt;
D’une part, le retour caméra est incrusté à l’aide de la simple ligne suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;img width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; src=&amp;quot;http://192.168.246.107:8080/?action=stream&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au clic d’un bouton, il émet un évènement sur le socket.&lt;br /&gt;
S'il reçoit un message d'alerte sur le socket, il modifie en conséquence la couleur de l'alerte correspondante&lt;br /&gt;
&lt;br /&gt;
===Back===&lt;br /&gt;
Le serveur web est en NodeJS.&lt;br /&gt;
Outre servir la page web aux clients qui se connecte, il reçoit les évènements par le socket ouvert avec chacun d’eux. Il les transmet sur le port série.&lt;br /&gt;
Lorsqu'il commence à recevoir des données d'alerte sur le port série, il envoie un message pour afficher l'alerte sur le client.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas, des timers sont déclenchés pour stopper le robot ou le déclanchement des alertes en cas de déconnexion WiFi.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé la bibliothèque NodeJS &amp;lt;code&amp;gt;SerialPort&amp;lt;/code&amp;gt; pour la gestion des entrées/sorties sur le port série.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo apt install nodejs&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installation du serveur==&lt;br /&gt;
Dans un terminal du Raspberry, exécuter à l’emplacement des fichiers du serveur :&lt;br /&gt;
&amp;lt;code&amp;gt; npm i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lancement des serveurs au démarage==&lt;br /&gt;
Pour la mise en route des serveurs automatiquement lors du boot de la carte, nous avons modifié le fichier /etc/rc.local pour y placer juste avant la ligne &amp;lt;code&amp;gt;exit 0&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo ./home/pi/Documents/script&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script contient :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; #!/bin/bash&lt;br /&gt;
cd /home/pi/mjpg-streamer/mjpg-streamer/mjpg-streamer-experimental&lt;br /&gt;
./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot; &amp;amp;&lt;br /&gt;
cd /home/pi/Desktop/Server&lt;br /&gt;
sudo node server.js&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tests serveur==&lt;br /&gt;
On peut ensuite tester l'envoi et la réception de trames UART depuis la Raspberry :&lt;br /&gt;
#Ouvrir un terminal, lancer mjpg streamer et le serveur &lt;br /&gt;
#Vérifier que l'appui sur des boutons du serveur côté client engendre l'envoie de trames depuis la broche Tx de la carte à l'aide d'un oscilloscope&lt;br /&gt;
#Vérifier que des données sont bien reçues, via l'interface graphique du serveur ou via le terminal en observant les données reçues provenant d'une carte ESP 32 Thing avec un code adapté pour le test&lt;br /&gt;
[[Fichier:raspbberry_av.PNG|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
==Capteur de température==&lt;br /&gt;
===Étude de la diffusion de la température en cas d'incendie===&lt;br /&gt;
Lors d'un incendie, le rayonnement est la principale source de transmission de la chaleur.&lt;br /&gt;
Un tableau fournit par le ministère permet d'estimer la densité de flux thermique radiatif en fonction de la distance à la flamme:&lt;br /&gt;
[[Fichier:Fnap.png|500px|thumb|center]]&lt;br /&gt;
On utilise ensuite la loi de Stéphan afin de déterminer la température:&lt;br /&gt;
[[Fichier:StephanLoi.png|500px|thumb|center]]&lt;br /&gt;
A l'aide d'Excel, on obtient les résultats suivants:&lt;br /&gt;
[[Fichier:Flamme_gaz.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Flamme_hydrocarbure.JPG|1000px|thumb|center]]&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur AOSONG AM2302 qui permet de mesurer la température ainsi que le taux d'humidité de l'air, fonction dont on ne servira pas.&lt;br /&gt;
Ce capteur permet de mesurer des températures de -40°C à 80°C.&lt;br /&gt;
&lt;br /&gt;
D'après le modèle:&lt;br /&gt;
&lt;br /&gt;
On n’a que 4 points donc on est peu précis mais on obtient un ordre de grandeur de l’ordre de 23m -27m pour ressentir 80°C en cas d’incendie, le choix d’un capteur mesurant jusqu’à une température de 80°C est donc cohérent avec le cas d’étude. Détecter un incendie environ 25m avant de l’atteindre dans un bâtiment est acceptable pour un robot, sachant qu’on a en plus des capteurs pour le gaz et la fumée (MQ9 et MQ135). On a une température de 60°C à 30m du feu environ (ça chute vite). On placera un seuil d'alerte à 60°C pour détecter les potentiels feux (le robot serait à une distance théorique de 30m du feu ce qui semble correct et réaliste).&lt;br /&gt;
&lt;br /&gt;
ATTENTION : On ne prend pas en compte la convexion et la conduction, on a seulement le rayonnement dans ce modèle simplifié. On aura donc une température un peu plus élevée dans la réalité.&lt;br /&gt;
==Capteur UV==&lt;br /&gt;
Pour mesurer l'indice UV, nous avons considéré le capteur SI1145 qui fonctionne par I²C, nous l'avions testé et était fonctionnel. Malheureusement lors d'un autre essai, son alimentation et sa masse ont été malencontreusement inversés ce qui a rendu le capteur hors service.&lt;br /&gt;
Nous avons donc redirigé notre choix vers les UV sensor Grove v1.1 qui ne fonctionnent pas en I²C mais à l'aide de 3 fils (GND, VCC, Signal). Il fournit des valeurs d'UV cohérentes lors de nos tests (indice UV entre 2 et 3). Nous placerons le seuil d'alerte à 6 pour prévenir d'un risque élevé.&lt;br /&gt;
[[Fichier:IndiceUv.jpg|400px|thumb|center]]&lt;br /&gt;
==Capteur de gaz toxiques==&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur MQ9 qui est un capteur coûtant peu cher et offrant une performance acceptable à condition de l'avoir préchauffé avant utilisation. Il permet de mesurer la concentration en CO (gaz carbonique) afin de permettre au robot maitre de prévenir un danger d'intoxication au gaz carbonique. Il permet également de mesurer la concentration en CH4 afin de pouvoir détecter de potentielles fuites de gaz.&lt;br /&gt;
&lt;br /&gt;
Il fonctionne à l'aide de 3 fils (GND, VCC, Signal).&lt;br /&gt;
&lt;br /&gt;
La concentration en CH4 devient dangereuse à partir de 50 000 ppm (limite d’explosivité), mais une concentration au-delà de 1000 ppm (500 fois supérieure à ce que l'on trouve pour un air pur) ne laisse aucun doute quand à une fuite de gaz. On placera donc la limite à 1000 ppm.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SeuilCO.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Codanger.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Pour le CO, on placera la limite à 200 ppm, stade à partir duquel une exposition de deux ou trois heures provoque des maux de têtes (--&amp;gt; besoin de vigilance).&lt;br /&gt;
Le capteur MQ9 permet de mesurer le CO de 10 ppm à 1000 ppm, et le CH4 de 100 ppm à 10 000 ppm donc il convient pour notre projet.&lt;br /&gt;
===Étalonnage du capteur===&lt;br /&gt;
La datasheet permet d'étalonner le capteur, à l'aide d'Excel on détermine une courbe de tendance à utiliser pour obtenir nos valeurs.&lt;br /&gt;
[[Fichier:EtalonMQ9.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Note: Rs est la valeur renvoyée par le capteur, R0 est déterminée grâce à la datasheet, et les courbes d'étalonnage fournies servent à retrouver les concentrations en ppm des différents gaz.&lt;br /&gt;
==Capteur de CO2==&lt;br /&gt;
Le CO2 présente également des dangers pour les personnes, on équipe ainsi le robot d'un capteur de CO2. Les seuils de danger du CO2 sont les suivants:&lt;br /&gt;
[[Fichier:SeuilCO2.JPG|1000px|thumb|center]]&lt;br /&gt;
On va donc placer une alerte à 2000 ppm pour le CO2.&lt;br /&gt;
Nous avions initialement choisi le capteur XENSIV PAS CO2 qui correspondait à ces critères (mesure le CO2 entre 0 ppm et 32 000 ppm), mais son prix a soudainement grimpé pour des raisons d'approvisionnement. Nous nous sommes donc rabattus sur un autre modèle: le CCS811 qui permet de mesurer le taux de CO2 pour des valeurs comprises en 400 ppm et 8192 ppm (il donne pour résultat 400 ppm par défaut pour les valeurs inférieures ou égales à 400 ppm).&lt;br /&gt;
==Télémètres==&lt;br /&gt;
Le robot maitre étant dirigé par caméra, on ne l'équipera que d'un télémètre pour assister le pilote lors de la détection d'obstacles frontaux. Les robots esclaves eux vont être équipés de télémètres pour pouvoir détecter les obstacles dans leur direction de mouvement. Pour le robot maitre, on met une alerte en place pour un obstacle détecté à 20 cm du robot et on bloque le robot si il se trouve à 10 cm de l'obstacle et qu'il souhaite se déplacer vers l'obstacle. Pour le robot esclave, on force le robot esclave à changer de trajectoire 15 cm avant l'obstacle afin de lui laisser le temps d'éviter la collision.&lt;br /&gt;
===SRF===&lt;br /&gt;
Dans la série des télémètres SRF, on a à notre disposition les modèles SRF08, SRF10 et SRF04. Les modèles SRF08 et SRF10 fonctionnent à l'aide de l'I²C, le modèle SRF04 lui fonctionne par voie analogique à l'aide de 4 fils (echo, trigger, GND, supply). SRF08 peut détecter les objets jusqu'à 6m avec un angle de détection de 55°, le SRF10 peut détecter les objets jusqu'à 6m avec un angle de détection de 72°, le SRF04 peut détecter les objets jusqu'à 3m avec un angle de détection de 30°. La distance minimale de détection des 3 capteurs est de 3 cm. Ces 3 capteurs conviennent à notre utilisation.&lt;br /&gt;
&lt;br /&gt;
===US-020===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), son angle de détection est de 15°, il permet de mesurer les obstacles entre 2cm et 7m. L'angle de détection est plutôt faible mais il pourrait servir sur les robots esclaves pour surveiller les angles du robot.&lt;br /&gt;
===VMA360===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), il a un angle de détection de 15°, il permet de mesurer les obstacles entre 2cm et 4,5m. L'angle de détection est plutôt faible mais il pourrait servir sur les esclaves pour surveiller les angles du robot.&lt;br /&gt;
==Tableau récapitulatif==&lt;br /&gt;
[[Fichier:Capteurs_pompier.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
On estime possible d'alimenter tous ces capteurs avec les batteries prévues au vu des courants d'alimentation qu'elles fournissent.&lt;br /&gt;
==Librairies Arduino==&lt;br /&gt;
Nous avons dû installer des librairies Arduino pour faire fonctionner les capteurs :&lt;br /&gt;
&amp;quot;DFRobot_CCS811&amp;quot; pour le capteur de CO2 CCS811;&lt;br /&gt;
&amp;quot;DHT Sensor Library&amp;quot; pour le capteur de température;&lt;br /&gt;
&amp;quot;Adafruit Circuit Playground&amp;quot; et &amp;quot;Adafruit Unified Sensor&amp;quot; pour les capteurs d'Adafruit.&lt;br /&gt;
&lt;br /&gt;
Il faut également avoir installé une librairie dans le gestionnaire de cartes pour pouvoir utiliser l'ESP32 Thing (carte utilisée pour acquérir les données des capteurs et pilote la Teensy). Lien du site officiel pour réaliser cette manipulation: https://learn.sparkfun.com/tutorials/esp32-thing-hookup-guide.&lt;br /&gt;
&lt;br /&gt;
=Code informatique=&lt;br /&gt;
==Robot maitre==&lt;br /&gt;
&lt;br /&gt;
===Communication entre la Raspberry et l'ESP32===&lt;br /&gt;
====Dans le sens Raspberry vers ESP32====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer&lt;br /&gt;
 | &amp;lt;code&amp;gt;av&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Demi tour&lt;br /&gt;
 | &amp;lt;code&amp;gt;dt&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche de 30°&lt;br /&gt;
 | &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Dans le sens ESP32 vers Raspberry====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer les alertes de l'ESP32 vers la Raspberry :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Alerte&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO&lt;br /&gt;
 | &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO2&lt;br /&gt;
 | &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CH4&lt;br /&gt;
 | &amp;lt;code&amp;gt;C4&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Température Haute&lt;br /&gt;
 | &amp;lt;code&amp;gt;TH&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | UV&lt;br /&gt;
 | &amp;lt;code&amp;gt;UV&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Distance à l'avant du robot&lt;br /&gt;
 | &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Erreur : en cas de commande av non exécutée car distance avant trop faible&lt;br /&gt;
 | &amp;lt;code&amp;gt;er&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Robots esclaves===&lt;br /&gt;
=Notes tableaux J101=&lt;br /&gt;
Sauvegarde des notes des tableaux de la J101 le 7 avril 2022.&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_5.jpg|500px|thumb|left|Tableau 5]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_4.jpg|500px|thumb|left|Tableau 4]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_3.jpg|500px|thumb|left|Tableau 3]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_2.jpg|500px|thumb|left|Tableau 2]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_1.jpg|500px|thumb|left|Tableau 1]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Utilisateur:Alexandre_Oriol&amp;diff=11775</id>
		<title>Utilisateur:Alexandre Oriol</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Utilisateur:Alexandre_Oriol&amp;diff=11775"/>
		<updated>2022-05-05T09:05:01Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : Page blanchie&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11754</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11754"/>
		<updated>2022-05-04T08:31:09Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots pompiers==&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maitre :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale étant environ à 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elle est connectée au PCB à l'aide du connecteur d'alimentation situé dans l'angle inférieur gauche.&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner la carte ESP32&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino via ce [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
&lt;br /&gt;
==Déplacement du robot==&lt;br /&gt;
&lt;br /&gt;
* Pour gérer le déplacement via le terminal on a utilisé le [https://mootse.telecom-st-etienne.fr/mod/resource/view.php?id=13653 code pour une plateforme holonome 4 moteurs]. &lt;br /&gt;
* Procédure de test de la chaine d'alimentation, contrôle et asservissement :&lt;br /&gt;
# Téléverser ce [https://bacasable.arpitania.eu/index.php?title=Fichier:TeensyVSL298AsservissementVitesse4X_V2_0.zip code fourni] sur la carte teensy. La pleine vitesse citée plus tard est définie par paramVitesse dans les paramètres globaux en début de code.&lt;br /&gt;
# Téléverser un programme vide dans l'ESP32 thing&lt;br /&gt;
# Connecter les pin RX de la teensy sur le pin RX de l'ESP32, respectivement pour TX. En effet, les deux cartes sont branchées en parallèle, la carte ESP32 étant logiquement transparente, elle nous permet simplement d'envoyer des commandes série sur la teensy&lt;br /&gt;
# Connecter un pc à la carte ESP32 via le port micro USB&lt;br /&gt;
# Ouvrir une console série (par exemple la série arduino) sur le port concerné et tester les moteurs avec les commandes suivantes :&lt;br /&gt;
#:- &amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse, (resp. ''av2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse, (resp. ''am2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
# Tester les mouvements entiers :&lt;br /&gt;
#:* Robot 4 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à pleine vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit à demi vitesse&lt;br /&gt;
#::- &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens horaire&lt;br /&gt;
#::- &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens trigo&lt;br /&gt;
#:* Robot 3 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amXXX&amp;lt;/code&amp;gt; pour définir la direction ''XXX'' (en degrés) de déplacement du robot&lt;br /&gt;
#::- &amp;lt;code&amp;gt;ho3&amp;lt;/code&amp;gt; pour avancer dans la direction définie précédemment&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer à la teensy via l'uart :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant&lt;br /&gt;
 | &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avant à demi vitesse&lt;br /&gt;
 | &amp;lt;code&amp;gt;amd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Arrière&lt;br /&gt;
 | &amp;lt;code&amp;gt;ard&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche&lt;br /&gt;
 | &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Odométrie robot maître==&lt;br /&gt;
On utilise deux informations couplées : calcul de la position depuis les capteurs des moteurs et en parallèle un accéléromètre et un gyroscope contenus dans la centrale à inertie. &lt;br /&gt;
&lt;br /&gt;
Utilisation d'une centrale à inertie pour le calcul du déplacement effectué par le robot maître : MPU9250 10dof. Cette centrale à inertie est composée d'un gyroscope, d'un accéléromètre, d'un magnétomètre et d'un baromètre. La communication se fait en I2C.&lt;br /&gt;
&lt;br /&gt;
Le reste de la documentation est disponible sur https://cdn.sparkfun.com/assets/learn_tutorials/5/5/0/MPU-9250-Register-Map.pdf.&lt;br /&gt;
&lt;br /&gt;
=Programmation carte Raspberry Pi 3=&lt;br /&gt;
&lt;br /&gt;
La première étape consiste à installer un système d'exploitation sur la Raspberry Pi 3 :&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balenaetcher pour flasher l’image sur la carte S&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale&lt;br /&gt;
&lt;br /&gt;
Tests de la caméra et essais initiaux : &lt;br /&gt;
# Si la liaison de la Raspbery avec un écran en hdmi ne se fait pas, il faut modifier le fichier config.txt (hdmi_group et hdmi_mode) de la carte micro SD de la Raspberry, pour forcer l'envoi sur le port hdmi même si rien n'est détecté à l'autre bout du câble.&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Premiers tests en local avec : raspistill -o photo.jpg (enregistrement d’une photo avec retardateur de 5sec), puis raspivid -o video.h264 (enregistre une vidéo)&lt;br /&gt;
# Premier stream avec : raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264 sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : rtsp://@IPpi:8080/&lt;br /&gt;
# Utilisation de Mjpg-Streamer&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo apt-get install libjpeg9-dev&lt;br /&gt;
git clone https://github.com/jacksonliam/mjpg-streamer.git&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install cmake&lt;br /&gt;
CFLAGS+=&amp;quot;-Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s&amp;quot; make&lt;br /&gt;
sudo make install&lt;br /&gt;
cd ~/mjpg-streamer/mjpg-streamer/mjpg-streamer-experimental./mjpg_streamer -i &amp;quot;./input_uvc.so -f 15&amp;quot; -o &amp;quot;./output_http.so -w ./www&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Lancer le stream et serveur web via mjpg streamer : &lt;br /&gt;
&lt;br /&gt;
mkdir /tmp/stream&lt;br /&gt;
(raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &amp;amp;)&lt;br /&gt;
raspivid -t 0 -n --width 1280 --height 720 -o - | cvlc stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264 &lt;br /&gt;
&lt;br /&gt;
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i &amp;quot;input_file.so -f /tmp/stream -n pic.jpg&amp;quot; -o &amp;quot;output_http.so -w /usr/local/www&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premiers résultats :&lt;br /&gt;
[[Fichier:StreamCam.png|500px|thumb|left|streaming de la caméra sur un PC connecté au même réseau wifi]]&lt;br /&gt;
&lt;br /&gt;
Ensuite pour diffuser la vidéo sur une page web, nous avons utilisé MJPG-Streamer. Il a été installé grâce à une archive zip. &lt;br /&gt;
Pour démarrer la caméra, nous avons utilisé la commande suivante:&lt;br /&gt;
raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &amp;amp;&lt;br /&gt;
Pour lancer le stream:&lt;br /&gt;
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i &amp;quot;input_file.so -f /tmp/stream -n pic.jpg&amp;quot; -o &amp;quot;output_http.so -w /usr/local/www&amp;quot;&lt;br /&gt;
Nous avons modifié la page html index.html pour créer une page web avec seulement la caméra et les 4 boutons (avancer, reculer, tourner à gauche et à droite). &lt;br /&gt;
Pour la gestion de l'appui sur les boutons, nous avons d'abord penser utiliser &lt;br /&gt;
Un serveur node.js a été installé pour télécommander le robot depuis la page web grâce à la caméra. &lt;br /&gt;
[[Fichier:Sortie-uart.png|200px|thumb|left]&lt;br /&gt;
&lt;br /&gt;
====Utilisation du port série====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo chmod 666 /dev/ttyS0&lt;br /&gt;
raspi-config &amp;gt; Interface options &amp;gt; Serial Port &amp;gt; Enable&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Interface Web=&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Afin de télépiloter le robot maitre, nous utilisons une interface homme-machine via une page web.&lt;br /&gt;
Cette page web est en ‘’JS’’, servie par un serveur ‘’NodeJS’’. Le serveur et le client communiquent à l’aide d’une connexion socket.&lt;br /&gt;
&lt;br /&gt;
Le flux vidéo est fourni par un serveur ‘’mjpeg streamer’’, indépendant du serveur ‘’NodeJS’’.&lt;br /&gt;
&lt;br /&gt;
===Front===&lt;br /&gt;
La page web servie est en html, et contient un script JS.&lt;br /&gt;
D’une part, le retour caméra est incrusté à l’aide de la simple ligne suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;img width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; src=&amp;quot;http://192.168.246.107:8080/?action=stream&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au clic d’un bouton, il émet un évènement sur le socket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
bouttonForward.onclick = function () {&lt;br /&gt;
    socket.emit(&amp;quot;forward&amp;quot;, true);&lt;br /&gt;
    console.log(&amp;quot;bouton forward appuyé&amp;quot;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Back===&lt;br /&gt;
Le serveur web est en NodeJS.&lt;br /&gt;
Outre servir la page web aux clients qui se connecte, il reçoit les évènements par le socket ouvert avec chacun d’eux. Alors, il envoie un message console de debug et un message sur la communication série choisie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Installation du serveur==&lt;br /&gt;
Dans un terminal du Raspberry, exécuter à l’emplacement des fichiers du serveur :&lt;br /&gt;
&amp;lt;code&amp;gt; npm i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
Exécuter &amp;lt;code&amp;gt;ToDo&amp;lt;/code&amp;gt; pour lancer le serveur ‘’mjpeg’’&lt;br /&gt;
&lt;br /&gt;
Exécuter &amp;lt;code&amp;gt; node server.js&amp;lt;/code&amp;gt; pour lancer le serveur web&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
==Capteur de température==&lt;br /&gt;
===Étude de la diffusion de la température en cas d'incendie===&lt;br /&gt;
Lors d'un incendie, le rayonnement est la principale source de transmission de la chaleur.&lt;br /&gt;
Un tableau fournit par le ministère permet d'estimer la densité de flux thermique radiatif en fonction de la distance à la flamme:&lt;br /&gt;
[[Fichier:Fnap.png|500px|thumb|center]]&lt;br /&gt;
On utilise ensuite la loi de Stéphan afin de déterminer la température:&lt;br /&gt;
[[Fichier:StephanLoi.png|500px|thumb|center]]&lt;br /&gt;
A l'aide d'Excel, on obtient les résultats suivants:&lt;br /&gt;
[[Fichier:Flamme_gaz.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Flamme_hydrocarbure.JPG|1000px|thumb|center]]&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur AOSONG AM2302 qui permet de mesurer la température ainsi que le taux d'humidité de l'air, fonction dont on ne servira pas.&lt;br /&gt;
Ce capteur permet de mesurer des températures de -40°C à 80°C.&lt;br /&gt;
&lt;br /&gt;
D'après le modèle:&lt;br /&gt;
&lt;br /&gt;
On n’a que 4 points donc on est peu précis mais on obtient un ordre de grandeur de l’ordre de 23m -27m pour ressentir 80°C en cas d’incendie, le choix d’un capteur mesurant jusqu’à une température de 80°C est donc cohérent avec le cas d’étude. Détecter un incendie environ 25m avant de l’atteindre dans un bâtiment est acceptable pour un robot, sachant qu’on a en plus des capteurs pour le gaz et la fumée (MQ9 et MQ135). On a une température de 60°C à 30m du feu environ (ça chute vite). On placera un seuil d'alerte à 60°C pour détecter les potentiels feux (le robot serait à une distance théorique de 30m du feu ce qui semble correct et réaliste).&lt;br /&gt;
&lt;br /&gt;
ATTENTION : On ne prend pas en compte la convexion et la conduction, on a seulement le rayonnement dans ce modèle simplifié. On aura donc une température un peu plus élevée dans la réalité.&lt;br /&gt;
==Capteur UV==&lt;br /&gt;
Pour mesurer l'indice UV, nous avons considéré le capteur SI1145 qui fonctionne par I²C, nous l'avions testé et était fonctionnel. Malheureusement lors d'un autre essai, son alimentation et sa masse ont été malencontreusement inversés ce qui a rendu le capteur hors service.&lt;br /&gt;
Nous avons donc redirigé notre choix vers les UV sensor Grove v1.1 qui ne fonctionnent pas en I²C mais à l'aide de 3 fils (GND, VCC, Signal). Il fournit des valeurs d'UV cohérentes lors de nos tests (indice UV entre 2 et 3). Nous placerons le seuil d'alerte à 6 pour prévenir d'un risque élevé.&lt;br /&gt;
[[Fichier:IndiceUv.jpg|400px|thumb|center]]&lt;br /&gt;
==Capteur de gaz toxiques==&lt;br /&gt;
===Choix du capteur===&lt;br /&gt;
Nous avons choisi le capteur MQ9 qui est un capteur coûtant peu cher et offrant une performance acceptable à condition de l'avoir préchauffé avant utilisation. Il permet de mesurer la concentration en CO (gaz carbonique) afin de permettre au robot maitre de prévenir un danger d'intoxication au gaz carbonique. Il permet également de mesurer la concentration en CH4 afin de pouvoir détecter de potentielles fuites de gaz.&lt;br /&gt;
&lt;br /&gt;
Il fonctionne à l'aide de 3 fils (GND, VCC, Signal).&lt;br /&gt;
&lt;br /&gt;
La concentration en CH4 devient dangereuse à partir de 50 000 ppm (limite d’explosivité), mais une concentration au-delà de 1000 ppm (500 fois supérieure à ce que l'on trouve pour un air pur) ne laisse aucun doute quand à une fuite de gaz. On placera donc la limite à 1000 ppm.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SeuilCO.JPG|1000px|thumb|center]]&lt;br /&gt;
[[Fichier:Codanger.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Pour le CO, on placera la limite à 200 ppm, stade à partir duquel une exposition de deux ou trois heures provoque des maux de têtes (--&amp;gt; besoin de vigilance).&lt;br /&gt;
Le capteur MQ9 permet de mesurer le CO de 10 ppm à 1000 ppm, et le CH4 de 100 ppm à 10 000 ppm donc il convient pour notre projet.&lt;br /&gt;
===Étalonnage du capteur===&lt;br /&gt;
La datasheet permet d'étalonner le capteur, à l'aide d'Excel on détermine une courbe de tendance à utiliser pour obtenir nos valeurs.&lt;br /&gt;
[[Fichier:EtalonMQ9.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Note: Rs est la valeur renvoyée par le capteur, R0 est déterminée grâce à la datasheet, et les courbes étalons fournies servent à retrouver les concentrations en ppm des différents gaz.&lt;br /&gt;
==Capteur de CO2==&lt;br /&gt;
Le CO2 présente également des dangers pour les personnes, ainsi on équipe le robot d'un capteur de CO2 pour détecter d'éventuels problèmes, les seuils de danger du CO2 sont les suivants:&lt;br /&gt;
[[Fichier:SeuilCO2.JPG|1000px|thumb|center]]&lt;br /&gt;
On va donc placer une alerte à 2000 ppm pour le CO2.&lt;br /&gt;
Nous avions initialement choisi le capteur XENSIV PAS CO2 qui correspondait à ces critères (mesure le CO2 entre 0 ppm et 32 000 ppm), mais son prix a soudainement grimpé pour des raisons d'approvisionnement. Nous nous sommes donc rabattus sur un autre modèle: le CCS811 qui permet de mesurer le taux de CO2 pour des valeurs comprises en 400 ppm et 8192 ppm (il donne pour résultat 400 ppm par défaut pour les valeurs inférieures ou égales à 400 ppm).&lt;br /&gt;
==Télémètres==&lt;br /&gt;
Le robot maitre étant dirigé par caméra, on ne l'équipera que d'un télémètre pour assister le pilote lors de la détection d'obstacles frontaux. Les robots esclaves eux vont être équipés de télémètres pour pouvoir détecter les obstacles dans leur direction de mouvement. Pour le robot maitre, on met une alerte en place pour un obstacle détecté à 20 cm du robot et on bloque le robot si il se trouve à 10 cm de l'obstacle et qu'il souhaite se déplacer vers l'obstacle. Pour le robot esclave, on force le robot esclave à changer de trajectoire 15 cm avant l'obstacle afin de lui laisser le temps d'éviter la collision.&lt;br /&gt;
===SRF===&lt;br /&gt;
Dans la série des télémètres SRF, on a à notre disposition les modèles SRF08, SRF10 et SRF04. Les modèles SRF08 et SRF10 fonctionnent à l'aide l'I²C, le modèle SRF04 lui fonctionne par voie analogique à l'aide de 4 fils (echo, trigger, GND, supply). SRF08 peut détecter les objets jusqu'à 6m avec un angle de détection de 55°, le SRF10 peut détecter les objets jusqu'à 6m avec un angle de détection de 72°, le SRF04 peut détecter les objets jusqu'à 3m avec un angle de détection de 30°. La distance minimale de détection des 3 capteurs est de 3 cm. Ces 3 capteurs conviennent à notre utilisation.&lt;br /&gt;
===US-020===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), son angle de détection est de 15°, il permet de mesurer les obstacles entre 2cm et 7m. L'angle de détection est plutôt faible mais il pourrait servir sur les robots esclaves pour surveiller les angles du robot.&lt;br /&gt;
===VMA360===&lt;br /&gt;
C'est un capteur qui fonctionne avec 4 fils (echo, trigger, gnd, alim), il a un angle de détection de 15°, il permet de mesurer les obstacles entre 2cm et 4,5m. L'angle de détection est plutôt faible mais il pourrait servir sur les esclaves pour surveiller les angles du robot.&lt;br /&gt;
==Tableau récapitulatif==&lt;br /&gt;
[[Fichier:Capteurs_pompier.JPG|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
On estime possible d'alimenter tous ces capteurs avec les batteries prévues au vu des courants d'alimentation qu'elles fournissent.&lt;br /&gt;
==Librairies Arduino==&lt;br /&gt;
Nous avons dû installer des librairies Arduino pour faire fonctionner les capteurs :&lt;br /&gt;
&amp;quot;DFRobot_CCS811&amp;quot; pour le capteur de CO2 CCS811;&lt;br /&gt;
&amp;quot;DHT Sensor Library&amp;quot; pour le capteur de température;&lt;br /&gt;
&amp;quot;Adafruit Circuit Playground&amp;quot; et &amp;quot;Adafruit Unified Sensor&amp;quot; pour les capteurs d'Adafruit.&lt;br /&gt;
&lt;br /&gt;
Il faut également avoir installé une librairie dans le gestionnaire de cartes pour pouvoir utiliser l'ESP32 thing (carte utilisée pour les capteurs). Lien du site officiel pour réaliser cette manipulation: https://learn.sparkfun.com/tutorials/esp32-thing-hookup-guide.&lt;br /&gt;
&lt;br /&gt;
=Code informatique=&lt;br /&gt;
==Robot maitre==&lt;br /&gt;
&lt;br /&gt;
===Communication entre la Raspberry et l'ESP32===&lt;br /&gt;
====Dans le sens Raspberry vers ESP32====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer de la Raspberry vers l'ESP32 :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Commande&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Stop&lt;br /&gt;
 | &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Avancer&lt;br /&gt;
 | &amp;lt;code&amp;gt;av&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Arrière&lt;br /&gt;
 | &amp;lt;code&amp;gt;ar&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Déplacement à droite&lt;br /&gt;
 | &amp;lt;code&amp;gt;dr&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Déplacement à gauche&lt;br /&gt;
 | &amp;lt;code&amp;gt;ga&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à droite&lt;br /&gt;
 | &amp;lt;code&amp;gt;rd&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Rotation à gauche&lt;br /&gt;
 | &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Dans le sens ESP32 vers Raspberry====&lt;br /&gt;
 {| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Synthèse des commandes pour communiquer les alertes de l'ESP32 vers la Raspberry :&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Alerte&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO&lt;br /&gt;
 | &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CO2&lt;br /&gt;
 | &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | CH4&lt;br /&gt;
 | &amp;lt;code&amp;gt;C4&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Température Haute&lt;br /&gt;
 | &amp;lt;code&amp;gt;TH&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | UV&lt;br /&gt;
 | &amp;lt;code&amp;gt;UV&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Distance à l'avant du robot&lt;br /&gt;
 | &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ! scope=&amp;quot;row&amp;quot; | Erreur : en cas de commande av non exécutée car distance avant trop faible&lt;br /&gt;
 | &amp;lt;code&amp;gt;er&amp;lt;/code&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Robots esclaves===&lt;br /&gt;
=Notes tableaux J101=&lt;br /&gt;
Sauvegarde des notes des tableaux de la J101 le 7 avril 2022.&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_5.jpg|500px|thumb|left|Tableau 5]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_4.jpg|500px|thumb|left|Tableau 4]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_3.jpg|500px|thumb|left|Tableau 3]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_2.jpg|500px|thumb|left|Tableau 2]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_1.jpg|500px|thumb|left|Tableau 1]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Utilisateur:Alexandre_Oriol&amp;diff=11714</id>
		<title>Utilisateur:Alexandre Oriol</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Utilisateur:Alexandre_Oriol&amp;diff=11714"/>
		<updated>2022-05-02T09:27:10Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Futur maître de l'univers :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pigeon copie 4.jpg]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Utilisateur:Alexandre_Oriol&amp;diff=11713</id>
		<title>Utilisateur:Alexandre Oriol</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Utilisateur:Alexandre_Oriol&amp;diff=11713"/>
		<updated>2022-05-02T09:26:50Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : Page créée avec « Fichier:pigeon copie 4.jpg »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:pigeon copie 4.jpg]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11708</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11708"/>
		<updated>2022-05-02T07:39:15Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Présentation==&lt;br /&gt;
&lt;br /&gt;
===Objectifs pédagogiques===&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en oeuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
===Modalités d'évaluation===&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
===Outils à utiliser===&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
===Missions des robots pompiers===&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
==Décomposition initiale du travail==&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
==Prise en main des plateformes==&lt;br /&gt;
&lt;br /&gt;
===Alimentation===&lt;br /&gt;
*Le robot maitre :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'un pile de 12V relié au convertisseur.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun 500mA&lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 12V. Elle est connectée au PCB à l'aide du connecteur d'alimentation situé dans l'angle inférieur gauche.&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
===Programmation des cartes===&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner la carte ESP32&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino via ce [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
&lt;br /&gt;
===Déplacement du robot===&lt;br /&gt;
&lt;br /&gt;
* Pour gérer le déplacement via le terminal on a utilisé le [https://mootse.telecom-st-etienne.fr/mod/resource/view.php?id=13653 code pour une plateforme holonome 4 moteurs]. &lt;br /&gt;
* Procédure de test de la chaine d'alimentation, contrôle et asservissement :&lt;br /&gt;
# Téléverser ce [https://bacasable.arpitania.eu/index.php?title=Fichier:TeensyVSL298AsservissementVitesse4X_V2_0.zip code fourni] sur la carte teensy.&lt;br /&gt;
# Téléverser un programme vide dans l'ESP32 thing&lt;br /&gt;
# Connecter les pin RX de la teensy sur le pin RX de l'ESP32, respectivement pour TX. En effet, les deux cartes sont branchées en parallèle, la carte ESP32 étant logiquement transparente, elle nous permet simplement d'envoyer des commandes série sur la teensy&lt;br /&gt;
# Connecter un pc à la carte ESP32 via le port micro USB&lt;br /&gt;
# Ouvrir une console série (par exemple la série arduino) sur le port concerné et tester les moteurs avec les commandes suivantes :&lt;br /&gt;
#:- &amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1, (resp. ''am2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
# Tester les mouvements entiers :&lt;br /&gt;
#:* Robot 4 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit &lt;br /&gt;
#::- &amp;lt;code&amp;gt;dr&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens horaire&lt;br /&gt;
#::- &amp;lt;code&amp;gt;gh&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens trigo&lt;br /&gt;
#:* Robot 3 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amXXX&amp;lt;/code&amp;gt; pour définir la direction ''XXX'' (en degrés) de déplacement du robot&lt;br /&gt;
#::- &amp;lt;code&amp;gt;ho3&amp;lt;/code&amp;gt; pour avancer dans la direction définie précédemment&lt;br /&gt;
&lt;br /&gt;
===Odométrie robot maître===&lt;br /&gt;
Utilisation d'une centrale à inertie pour le calcul du déplacement effectué par le robot maître : Pololu AltIMU-10 v4. Cette centrale à inertie est composée des gyroscopes L3GD20H, des accéléromètres/magnétomètres LSM303D et un baromètre LPS25H. La communication se fait en I2C.&lt;br /&gt;
&lt;br /&gt;
Le reste de la documentation est disponible sur le [https://www.pololu.com/product/2470 site du composant].&lt;br /&gt;
&lt;br /&gt;
===Programmation carte Raspberry Pi 3===&lt;br /&gt;
&lt;br /&gt;
La première étape consiste à installer un système d'exploitation sur la Raspberry Pi 3 :&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balenaetcher pour flasher l’image sur la carte S&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale&lt;br /&gt;
&lt;br /&gt;
Tests de la caméra et essais initiaux : &lt;br /&gt;
# Si la liaison de la Raspbery avec un écran en hdmi ne se fait pas, il faut modifier le fichier config.txt (hdmi_group et hdmi_mode) de la carte micro SD de la Raspberry, pour forcer l'envoi sur le port hdmi même si rien n'est détecté à l'autre bout du câble.&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Premier tests en local avec : raspistill -o photo.jpg (enregistrement d’une photo avec retardateur de 5sec), puis raspivid -o video.h264 (enregistre une vidéo)&lt;br /&gt;
# Premier stream avec : raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264 sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : rtsp://@IPpi:8080/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Lancer le stream et serveur web via mjpg streamer : &lt;br /&gt;
&lt;br /&gt;
mkdir /tmp/stream&lt;br /&gt;
(raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &amp;amp;)&lt;br /&gt;
raspivid -t 0 -n --width 1280 --height 720 -o - | cvlc stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264 &lt;br /&gt;
&lt;br /&gt;
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i &amp;quot;input_file.so -f /tmp/stream -n pic.jpg&amp;quot; -o &amp;quot;output_http.so -w /usr/local/www&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premiers résultats :&lt;br /&gt;
[[Fichier:StreamCam.png|500px|thumb|left|streaming de la caméra sur un PC connecté au même réseau wifi]]&lt;br /&gt;
&lt;br /&gt;
Ensuite pour diffuser la vidéo sur une page web, nous avons utilisé MJPG-Streamer. Il a été installé grâce à une archive zip. &lt;br /&gt;
Pour démarrer la caméra, nous avons utilisé la commande suivante:&lt;br /&gt;
raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &amp;amp;&lt;br /&gt;
Pour lancer le stream:&lt;br /&gt;
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i &amp;quot;input_file.so -f /tmp/stream -n pic.jpg&amp;quot; -o &amp;quot;output_http.so -w /usr/local/www&amp;quot;&lt;br /&gt;
Nous avons modifié la page html index.html pour créer une page web avec seulement la caméra et les 4 boutons (avancer, reculer, tourner à gauche et à droite). &lt;br /&gt;
Pour la gestion de l'appui sur les boutons, nous avons d'abord penser utiliser &lt;br /&gt;
Un serveur node.js a été installé pour télécommander le robot depuis la page web grâce à la caméra. &lt;br /&gt;
[[Fichier:Sortie-uart.png|200px|thumb|left]&lt;br /&gt;
&lt;br /&gt;
=Interface Web=&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Afin de télépiloter le robot maitre, nous utilisons une interface homme-machine via une page web.&lt;br /&gt;
Cette page web est en ‘’JS’’, servie par un serveur ‘’NodeJS’’. Le serveur et le client communiquent à l’aide d’une connexion socket.&lt;br /&gt;
&lt;br /&gt;
Le flux vidéo est fourni par un serveur ‘’mjpeg streamer’’, indépendant du serveur ‘’NodeJS’’.&lt;br /&gt;
&lt;br /&gt;
===Front===&lt;br /&gt;
La page web servie est en html, et contient un script JS.&lt;br /&gt;
D’une part, le retour caméra est incrusté à l’aide de la simple ligne suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;img width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; src=&amp;quot;http://192.168.246.107:8080/?action=stream&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au clic d’un bouton, il émet un évènement sur le socket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
bouttonForward.onclick = function () {&lt;br /&gt;
    socket.emit(&amp;quot;forward&amp;quot;, true);&lt;br /&gt;
    console.log(&amp;quot;bouton forward appuyé&amp;quot;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Back===&lt;br /&gt;
Le serveur web est en NodeJS.&lt;br /&gt;
Outre servir la page web aux clients qui se connecte, il reçoit les évènements par le socket ouvert avec chacun d’eux. Alors, il envoie un message console de debug et un message sur la communication série choisie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Installation du serveur==&lt;br /&gt;
Dans un terminal du Raspberry, exécuter à l’emplacement des fichiers du serveur :&lt;br /&gt;
&amp;lt;code&amp;gt; npm i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
Exécuter &amp;lt;code&amp;gt;ToDo&amp;lt;/code&amp;gt; pour lancer le serveur ‘’mjpeg’’&lt;br /&gt;
&lt;br /&gt;
Exécuter &amp;lt;code&amp;gt; node server.js&amp;lt;/code&amp;gt; pour lancer le serveur web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Notes tableaux J101=&lt;br /&gt;
Sauvegarde des notes des tableaux de la J101 le 7 avril 2022.&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_5.jpg|500px|thumb|left|Tableau 5]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_4.jpg|500px|thumb|left|Tableau 4]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_3.jpg|500px|thumb|left|Tableau 3]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_2.jpg|500px|thumb|left|Tableau 2]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_1.jpg|500px|thumb|left|Tableau 1]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11707</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11707"/>
		<updated>2022-04-20T12:33:10Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Présentation==&lt;br /&gt;
&lt;br /&gt;
===Objectifs pédagogiques===&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en oeuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
===Modalités d'évaluation===&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
===Outils à utiliser===&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
===Missions des robots pompiers===&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
==Décomposition initiale du travail==&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
==Prise en main des plateformes==&lt;br /&gt;
&lt;br /&gt;
===Alimentation===&lt;br /&gt;
*Le robot maitre :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'un pile de 12V relié au convertisseur.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun 500mA&lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 12V. Elle est connectée au PCB à l'aide du connecteur d'alimentation situé dans l'angle inférieur gauche.&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
===Programmation des cartes===&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner la carte ESP32&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino via ce [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
&lt;br /&gt;
===Déplacement du robot===&lt;br /&gt;
&lt;br /&gt;
* Pour gérer le déplacement via le terminal on a utilisé le [https://mootse.telecom-st-etienne.fr/mod/resource/view.php?id=13653 code pour une plateforme holonome 4 moteurs]. &lt;br /&gt;
* Procédure de test de la chaine d'alimentation, contrôle et asservissement :&lt;br /&gt;
# Téléverser ce [https://bacasable.arpitania.eu/index.php?title=Fichier:TeensyVSL298AsservissementVitesse4X_V2_0.zip code fourni] sur la carte teensy.&lt;br /&gt;
# Téléverser un programme vide dans l'ESP32 thing&lt;br /&gt;
# Connecter les pin RX de la teensy sur le pin RX de l'ESP32, respectivement pour TX. En effet, les deux cartes sont branchées en parallèle, la carte ESP32 étant logiquement transparente, elle nous permet simplement d'envoyer des commandes série sur la teensy&lt;br /&gt;
# Connecter un pc à la carte ESP32 via le port micro USB&lt;br /&gt;
# Ouvrir une console série (par exemple la série arduino) sur le port concerné et tester les moteurs avec les commandes suivantes :&lt;br /&gt;
#:- &amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1, (resp. ''am2'', ...)&lt;br /&gt;
#:- &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
# Tester les mouvements entiers :&lt;br /&gt;
#:* Robot 4 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour faire avancer le robot tout droit &lt;br /&gt;
#::- &amp;lt;code&amp;gt;dr&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens horaire&lt;br /&gt;
#::- &amp;lt;code&amp;gt;gh&amp;lt;/code&amp;gt; pour faire tourner le robot sur lui même dans le sens trigo&lt;br /&gt;
#:* Robot 3 moteurs :&lt;br /&gt;
#::- &amp;lt;code&amp;gt;amXXX&amp;lt;/code&amp;gt; pour définir la direction ''XXX'' (en degrés) de déplacement du robot&lt;br /&gt;
#::- &amp;lt;code&amp;gt;ho3&amp;lt;/code&amp;gt; pour avancer dans la direction définie précédemment&lt;br /&gt;
&lt;br /&gt;
===Odométrie robot maître===&lt;br /&gt;
Utilisation d'une centrale à inertie pour le calcul du déplacement effectué par le robot maître : Pololu AltIMU-10 v4. Cette centrale à inertie est composée des gyroscopes L3GD20H, des accéléromètres/magnétomètres LSM303D et un baromètre LPS25H. La communication se fait en I2C.&lt;br /&gt;
&lt;br /&gt;
Le reste de la documentation est disponible sur le [https://www.pololu.com/product/2470 site du composant].&lt;br /&gt;
&lt;br /&gt;
===Programmation carte Raspberry Pi 3===&lt;br /&gt;
&lt;br /&gt;
La première étape consiste à installer un système d'exploitation sur la Raspberry Pi 3 :&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balenaetcher pour flasher l’image sur la carte S&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale&lt;br /&gt;
&lt;br /&gt;
Tests de la caméra et essais initiaux : &lt;br /&gt;
# Si la liaison de la Raspbery avec un écran en hdmi ne se fait pas, il faut modifier le fichier config.txt (hdmi_group et hdmi_mode) de la carte micro SD de la Raspberry, pour forcer l'envoi sur le port hdmi même si rien n'est détecté à l'autre bout du câble.&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Premier tests en local avec : raspistill -o photo.jpg (enregistrement d’une photo avec retardateur de 5sec), puis raspivid -o video.h264 (enregistre une vidéo)&lt;br /&gt;
# Premier stream avec : raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264 sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : rtsp://@IPpi:8080/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Lancer le stream et serveur web via mjpg streamer : &lt;br /&gt;
&lt;br /&gt;
mkdir /tmp/stream&lt;br /&gt;
raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i &amp;quot;input_file.so -f /tmp/stream -n pic.jpg&amp;quot; -o &amp;quot;output_http.so -w /usr/local/www&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premiers résultats :&lt;br /&gt;
[[Fichier:StreamCam.png|500px|thumb|left|streaming de la caméra sur un PC connecté au même réseau wifi]]&lt;br /&gt;
&lt;br /&gt;
Ensuite pour diffuser la vidéo sur une page web, nous avons utilisé MJPG-Streamer. Il a été installé grâce à une archive zip. &lt;br /&gt;
Pour démarrer la caméra, nous avons utilisé la commande suivante:&lt;br /&gt;
raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &amp;amp;&lt;br /&gt;
Pour lancer le stream:&lt;br /&gt;
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i &amp;quot;input_file.so -f /tmp/stream -n pic.jpg&amp;quot; -o &amp;quot;output_http.so -w /usr/local/www&amp;quot;&lt;br /&gt;
Nous avons modifié la page html index.html pour créer une page web avec seulement la caméra et les 4 boutons (avancer, reculer, tourner à gauche et à droite). &lt;br /&gt;
Pour la gestion de l'appui sur les boutons, nous avons d'abord penser utiliser &lt;br /&gt;
Un serveur node.js a été installé pour télécommander le robot depuis la page web grâce à la caméra. &lt;br /&gt;
[[Fichier:Sortie-uart.png|200px|thumb|left]&lt;br /&gt;
&lt;br /&gt;
=Interface Web=&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Afin de télépiloter le robot maitre, nous utilisons une interface homme-machine via une page web.&lt;br /&gt;
Cette page web est en ‘’JS’’, servie par un serveur ‘’NodeJS’’. Le serveur et le client communiquent à l’aide d’une connexion socket.&lt;br /&gt;
&lt;br /&gt;
Le flux vidéo est fourni par un serveur ‘’mjpeg streamer’’, indépendant du serveur ‘’NodeJS’’.&lt;br /&gt;
&lt;br /&gt;
===Front===&lt;br /&gt;
La page web servie est en html, et contient un script JS.&lt;br /&gt;
D’une part, le retour caméra est incrusté à l’aide de la simple ligne suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;img width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; src=&amp;quot;http://192.168.246.107:8080/?action=stream&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au clic d’un bouton, il émet un évènement sur le socket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
bouttonForward.onclick = function () {&lt;br /&gt;
    socket.emit(&amp;quot;forward&amp;quot;, true);&lt;br /&gt;
    console.log(&amp;quot;bouton forward appuyé&amp;quot;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Back===&lt;br /&gt;
Le serveur web est en NodeJS.&lt;br /&gt;
Outre servir la page web aux clients qui se connecte, il reçoit les évènements par le socket ouvert avec chacun d’eux. Alors, il envoie un message console de debug et un message sur la communication série choisie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Installation du serveur==&lt;br /&gt;
Dans un terminal du Raspberry, exécuter à l’emplacement des fichiers du serveur :&lt;br /&gt;
&amp;lt;code&amp;gt; npm i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
Exécuter &amp;lt;code&amp;gt;ToDo&amp;lt;/code&amp;gt; pour lancer le serveur ‘’mjpeg’’&lt;br /&gt;
&lt;br /&gt;
Exécuter &amp;lt;code&amp;gt; node server.js&amp;lt;/code&amp;gt; pour lancer le serveur web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Notes tableaux J101=&lt;br /&gt;
Sauvegarde des notes des tableaux de la J101 le 7 avril 2022.&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_5.jpg|500px|thumb|left|Tableau 5]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_4.jpg|500px|thumb|left|Tableau 4]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_3.jpg|500px|thumb|left|Tableau 3]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_2.jpg|500px|thumb|left|Tableau 2]]&lt;br /&gt;
[[Fichier:Robots_pompiers_20220407_1.jpg|500px|thumb|left|Tableau 1]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11660</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11660"/>
		<updated>2022-04-05T15:17:25Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Présentation==&lt;br /&gt;
&lt;br /&gt;
===Objectifs pédagogiques===&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en oeuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
===Modalités d'évaluation===&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
===Outils à utiliser===&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
===Missions des robots pompiers===&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
==Décomposition initiale du travail==&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
===Programmation carte Raspberry Pi 3===&lt;br /&gt;
&lt;br /&gt;
La première étape consiste à installer un système d'exploitation sur la Raspberry Pi 3 :&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balenaetcher pour flasher l’image sur la carte S&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale&lt;br /&gt;
&lt;br /&gt;
Tests de la caméra et essais initiaux : &lt;br /&gt;
&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Premier tests en local avec : raspistill -o photo.jpg (enregistrement d’une photo avec retardateur de 5sec), puis raspivid -o video.h264 (enregistre une vidéo)&lt;br /&gt;
# Premier stream avec : raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264 sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : rtsp://@IPpi:8080/&lt;br /&gt;
&lt;br /&gt;
Premiers résultats :&lt;br /&gt;
[[Fichier:StreamCam.png|500px|thumb|left|streaming de la caméra sur un PC connecté au même réseau wifi]]&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11659</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11659"/>
		<updated>2022-04-05T15:15:14Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Présentation==&lt;br /&gt;
&lt;br /&gt;
===Objectifs pédagogiques===&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en oeuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
===Modalités d'évaluation===&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
===Outils à utiliser===&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
===Missions des robots pompiers===&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
==Décomposition initiale du travail==&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
===Programmation carte Raspberry Pi 3===&lt;br /&gt;
&lt;br /&gt;
La première étape consiste à installer un système d'exploitation sur la Raspberry Pi 3 :&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balenaetcher pour flasher l’image sur la carte S&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale&lt;br /&gt;
&lt;br /&gt;
Tests de la caméra et essais initiaux : &lt;br /&gt;
&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Premier tests en local avec : raspistill -o photo.jpg (enregistrement d’une photo avec retardateur de 5sec), puis raspivid -o video.h264 (enregistre une vidéo)&lt;br /&gt;
# Premier stream avec : raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264 sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : rtsp://@IPpi:8080/&lt;br /&gt;
&lt;br /&gt;
Premiers résultats :&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Fichier:StreamCam.png&amp;diff=11658</id>
		<title>Fichier:StreamCam.png</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Fichier:StreamCam.png&amp;diff=11658"/>
		<updated>2022-04-05T15:13:27Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11657</id>
		<title>Robots pompiers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_pompiers&amp;diff=11657"/>
		<updated>2022-04-05T15:12:30Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Présentation==&lt;br /&gt;
&lt;br /&gt;
===Objectifs pédagogiques===&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en oeuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
===Modalités d'évaluation===&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe, utilisation des outils demandés...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 12 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
===Outils à utiliser===&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
===Missions des robots pompiers===&lt;br /&gt;
Les robots pompiers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : taux de CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, température, rayonnement UV...&lt;br /&gt;
# si détection de paramètres anormaux, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
&lt;br /&gt;
==Décomposition initiale du travail==&lt;br /&gt;
&lt;br /&gt;
Première partie : &lt;br /&gt;
# S'approprier les plateformes (Maître et esclave) : batteries, test moteurs, communication UART entre PC et Teensy&lt;br /&gt;
# Programmation Raspberry + Caméra&lt;br /&gt;
# Définir précisément quels capteurs utiliser (en fonction du matériel mis à disposition)&lt;br /&gt;
&lt;br /&gt;
===Programmation carte Raspberry Pi 3===&lt;br /&gt;
&lt;br /&gt;
La première étape consiste à installer un système d'exploitation sur la Raspberry Pi 3 :&lt;br /&gt;
&lt;br /&gt;
# Téléchargement de l’image sur le site de Raspbian&lt;br /&gt;
# Utilisation de Balenaetcher pour flasher l’image sur la carte S&lt;br /&gt;
# Premier boot du Raspberry Pi : configuration initiale&lt;br /&gt;
&lt;br /&gt;
Tests de la caméra et essais initiaux : &lt;br /&gt;
&lt;br /&gt;
# Mettre à jour le système et activer la caméra avec le menu &amp;quot;Configuration du Raspberry Pi&amp;quot;&lt;br /&gt;
# Premier tests en local avec : raspistill -o photo.jpg (enregistrement d’une photo avec retardateur de 5sec), puis raspivid -o video.h264 (enregistre une vidéo)&lt;br /&gt;
# Premier stream avec : raspivid -o - -t 0 -w 800 -h 600 -fps 12  | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264 sur Raspberry, et avec VLC sur PC : menu Ouvrir un flux réseau, y mettre : rtsp://@IPpi:8080/&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11420</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11420"/>
		<updated>2021-06-05T13:55:16Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
&lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.&lt;br /&gt;
&lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord commencé par tester le module ESP32. Il faut tout d'abord installer la librairie (avec le Gestionnaire de cartes) afin de pouvoir compiler et téléverser le programme pour l'ESP32. On a essayé un programme de permettant de faire clignoter de la LED embarquée avec un PC Windows et le logiciel Arduino IDE. Le programme fonctionne et la LED clignote. &lt;br /&gt;
&lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faudrait qu'on arrive à récupérer les informations des capteurs et les interpréter.&lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine, fournie avec le gant et l'ESP32 lors de la séance précédente :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png]]&lt;br /&gt;
&lt;br /&gt;
Il s'agit de ponts diviseurs de tension avec 3V3 en entrée, une résistance fixe (soudée à la platine), une résistance de pull-down (flexomètre). La valeur de la tension de sortie est redirigée vers un connecteur qui sera connecté à l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des 5 flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. Ces broches sont reliées à des ADCs, permettant de faire la conversion analogique vers numérique des valeurs afin de pouvoir les interpréter ensuite. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir le logiciel Processing, à établir une communication entre Processing et l'ESP32 et commencer à traiter les données. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 : Découverte de Processing== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un second programme avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : Processing, la suite ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées, ce qui nous permettra par la suite d'orienter la main comme on le souhaite : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : Débuts de la modélisation de la main==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : Optimisation==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 : Communication sans-fil== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code Arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : Problèmes matériels ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. En effet, la pate de fixation, posée sur la piste résistive et sertie au substrat en plastique frotte contre la piste conductrice. Au fil de l'utilisation, cette pate use la piste et le contact ne se fait plus. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du capteur et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Une autre solution de réparation était d'utiliser de l'encre conductrice pour rétablir la connexion.&lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu Pierre, Feuille, Ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les exigences minimales du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu Pierre, Feuille, Ciseaux à notre code Processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
Pierre : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGPierre.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Feuille : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGFeuille.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ciseaux : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGCiseaux.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
&lt;br /&gt;
- Définition Dataglove : https://fr.wikipedia.org/wiki/Gant_de_données&lt;br /&gt;
&lt;br /&gt;
- Datasheeet ESP32 : https://cdn.sparkfun.com/datasheets/IoT/esp32_datasheet_en.pdf&lt;br /&gt;
&lt;br /&gt;
- Caractéristiques flexomètres : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide/all&lt;br /&gt;
&lt;br /&gt;
- Explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
&lt;br /&gt;
- Codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;br /&gt;
&lt;br /&gt;
- Moyenne glissante : https://arduino.blaisepascal.fr/lisser-un-signal-analogique/&lt;br /&gt;
&lt;br /&gt;
- Code final Processing : https://pastebin.com/auzgTeC5&lt;br /&gt;
&lt;br /&gt;
- Code final Arduino : https://pastebin.com/wSdvaNBw&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11419</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11419"/>
		<updated>2021-06-05T13:54:53Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
&lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.&lt;br /&gt;
&lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord commencé par tester le module ESP32. Il faut tout d'abord installer la librairie (avec le Gestionnaire de cartes) afin de pouvoir compiler et téléverser le programme pour l'ESP32. On a essayé un programme de permettant de faire clignoter de la LED embarquée avec un PC Windows et le logiciel Arduino IDE. Le programme fonctionne et la LED clignote. &lt;br /&gt;
&lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faudrait qu'on arrive à récupérer les informations des capteurs et les interpréter.&lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine, fournie avec le gant et l'ESP32 lors de la séance précédente :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png]]&lt;br /&gt;
&lt;br /&gt;
Il s'agit de ponts diviseurs de tension avec 3V3 en entrée, une résistance fixe (soudée à la platine), une résistance de pull-down (flexomètre). La valeur de la tension de sortie est redirigée vers un connecteur qui sera connecté à l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des 5 flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. Ces broches sont reliées à des ADCs, permettant de faire la conversion analogique vers numérique des valeurs afin de pouvoir les interpréter ensuite. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir le logiciel Processing, à établir une communication entre Processing et l'ESP32 et commencer à traiter les données. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 : Découverte de Processing== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un second programme avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : Processing, la suite ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées, ce qui nous permettra par la suite d'orienter la main comme on le souhaite : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : Débuts de la modélisation de la main==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : Optimisation==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 : Communication sans-fil== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code Arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : Problèmes matériels ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. En effet, la pate de fixation, posée sur la piste résistive et sertie au substrat en plastique frotte contre la piste conductrice. Au fil de l'utilisation, cette pate use la piste et le contact ne se fait plus. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du capteur et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Une autre solution de réparation était d'utiliser de l'encre conductrice pour rétablir la connexion.&lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu Pierre, Feuille, Ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les exigences minimales du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu Pierre, Feuille, Ciseaux à notre code Processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
Pierre : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGPierre.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Feuille : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGFeuille.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ciseaux : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGCiseaux.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
&lt;br /&gt;
- Définition Dataglove : https://fr.wikipedia.org/wiki/Gant_de_données&lt;br /&gt;
&lt;br /&gt;
- Datasheeet ESP32 : https://cdn.sparkfun.com/datasheets/IoT/esp32_datasheet_en.pdf&lt;br /&gt;
&lt;br /&gt;
- Caractéristiques flexomètres : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide/all&lt;br /&gt;
&lt;br /&gt;
- Explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
&lt;br /&gt;
- Codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;br /&gt;
&lt;br /&gt;
- Moyenne glissante : https://arduino.blaisepascal.fr/lisser-un-signal-analogique/&lt;br /&gt;
&lt;br /&gt;
- Code final Processing : https://pastebin.com/auzgTeC5&lt;br /&gt;
&lt;br /&gt;
- Code final Arduino : https://pastebin.com/wSdvaNBw&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11418</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11418"/>
		<updated>2021-06-05T13:54:02Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
&lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.&lt;br /&gt;
&lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord commencé par tester le module ESP32. Il faut tout d'abord installer la librairie (avec le Gestionnaire de cartes) afin de pouvoir compiler et téléverser le programme pour l'ESP32. On a essayé un programme de permettant de faire clignoter de la LED embarquée avec un PC Windows et le logiciel Arduino IDE. Le programme fonctionne et la LED clignote. &lt;br /&gt;
&lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faudrait qu'on arrive à récupérer les informations des capteurs et les interpréter.&lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine, fournie avec le gant et l'ESP32 lors de la séance précédente :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png]]&lt;br /&gt;
&lt;br /&gt;
Il s'agit de ponts diviseurs de tension avec 3V3 en entrée, une résistance fixe (soudée à la platine), une résistance de pull-down (flexomètre). La valeur de la tension de sortie est redirigée vers un connecteur qui sera connecté à l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des 5 flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. Ces broches sont reliées à des ADCs, permettant de faire la conversion analogique vers numérique des valeurs afin de pouvoir les interpréter ensuite. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir le logiciel Processing, à établir une communication entre Processing et l'ESP32 et commencer à traiter les données. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 : Découverte de Processing== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un second programme avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : Processing, la suite ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées, ce qui nous permettra par la suite d'orienter la main comme on le souhaite : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : Débuts de la modélisation de la main==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : Optimisation==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 : Communication sans-fil== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code Arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : Problèmes matériels ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. En effet, la pate de fixation, posée sur la piste résistive et sertie au substrat en plastique frotte contre la piste conductrice. Au fil de l'utilisation, cette pate use la piste et le contact ne se fait plus. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du capteur et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Une autre solution de réparation était d'utiliser de l'encre conductrice pour rétablir la connexion.&lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu Pierre, Feuille, Ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les exigences minimales du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu Pierre, Feuille, Ciseaux à notre code Processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
Pierre : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGPierre.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Feuille : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGFeuille.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ciseaux : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGCiseaux.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
&lt;br /&gt;
- Définition Dataglove : https://fr.wikipedia.org/wiki/Gant_de_données&lt;br /&gt;
&lt;br /&gt;
- Datasheeet ESP32 : https://cdn.sparkfun.com/datasheets/IoT/esp32_datasheet_en.pdf&lt;br /&gt;
&lt;br /&gt;
- Caractéristiques flexomètres : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide/all&lt;br /&gt;
&lt;br /&gt;
- Explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
&lt;br /&gt;
- Codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;br /&gt;
&lt;br /&gt;
- Moyenne glissante : https://arduino.blaisepascal.fr/lisser-un-signal-analogique/&lt;br /&gt;
&lt;br /&gt;
- Code final Processing : https://pastebin.com/auzgTeC5&lt;br /&gt;
&lt;br /&gt;
- Code final Arduino : https://pastebin.com/wSdvaNBw&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11417</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11417"/>
		<updated>2021-06-05T13:53:37Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
&lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.&lt;br /&gt;
&lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord commencé par tester le module ESP32. Il faut tout d'abord installer la librairie (avec le Gestionnaire de cartes) afin de pouvoir compiler et téléverser le programme pour l'ESP32. On a essayé un programme de permettant de faire clignoter de la LED embarquée avec un PC Windows et le logiciel Arduino IDE. Le programme fonctionne et la LED clignote. &lt;br /&gt;
&lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faudrait qu'on arrive à récupérer les informations des capteurs et les interpréter.&lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine, fournie avec le gant et l'ESP32 lors de la séance précédente :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png]]&lt;br /&gt;
&lt;br /&gt;
Il s'agit de ponts diviseurs de tension avec 3V3 en entrée, une résistance fixe (soudée à la platine), une résistance de pull-down (flexomètre). La valeur de la tension de sortie est redirigée vers un connecteur qui sera connecté à l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des 5 flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. Ces broches sont reliées à des ADCs, permettant de faire la conversion analogique vers numérique des valeurs afin de pouvoir les interpréter ensuite. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir le logiciel Processing, à établir une communication entre Processing et l'ESP32 et commencer à traiter les données. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 : Découverte de Processing== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un second programme avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : Processing, la suite ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées, ce qui nous permettra par la suite d'orienter la main comme on le souhaite : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : Débuts de la modélisation de la main==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : Optimisation==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 : Communication sans-fil== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code Arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : Problèmes matériels ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. En effet, la pate de fixation, posée sur la piste résistive et sertie au substrat en plastique frotte contre la piste conductrice. Au fil de l'utilisation, cette pate use la piste et le contact ne se fait plus. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du capteur et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Une autre solution de réparation était d'utiliser de l'encre conductrice pour rétablir la connexion.&lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu Pierre, Feuille, Ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les exigences minimales du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu Pierre, Feuille, Ciseaux à notre code Processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
Pierre : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGPierre.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Feuille : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGFeuille.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ciseaux : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGCiseaux.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
&lt;br /&gt;
- Définition Dataglove : https://fr.wikipedia.org/wiki/Gant_de_données&lt;br /&gt;
&lt;br /&gt;
- Datasheeet ESP32 : https://cdn.sparkfun.com/datasheets/IoT/esp32_datasheet_en.pdf&lt;br /&gt;
&lt;br /&gt;
- Caractéristiques flexomètres : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide/all&lt;br /&gt;
&lt;br /&gt;
- Explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
&lt;br /&gt;
- Codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;br /&gt;
&lt;br /&gt;
- Moyenne glissante : https://arduino.blaisepascal.fr/lisser-un-signal-analogique/&lt;br /&gt;
&lt;br /&gt;
- Code final Processing : https://pastebin.com/auzgTeC5&lt;br /&gt;
&lt;br /&gt;
- Code final Arduino : https://pastebin.com/wSdvaNBw&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11416</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11416"/>
		<updated>2021-06-05T13:52:41Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
&lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.&lt;br /&gt;
&lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord commencé par tester le module ESP32. Il faut tout d'abord installer la librairie (avec le Gestionnaire de cartes) afin de pouvoir compiler et téléverser le programme pour l'ESP32. On a essayé un programme de permettant de faire clignoter de la LED embarquée avec un PC Windows et le logiciel Arduino IDE. Le programme fonctionne et la LED clignote. &lt;br /&gt;
&lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faudrait qu'on arrive à récupérer les informations des capteurs et les interpréter.&lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine, fournie avec le gant et l'ESP32 lors de la séance précédente :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png]]&lt;br /&gt;
&lt;br /&gt;
Il s'agit de ponts diviseurs de tension avec 3V3 en entrée, une résistance fixe (soudée à la platine), une résistance de pull-down (flexomètre). La valeur de la tension de sortie est redirigée vers un connecteur qui sera connecté à l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des 5 flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. Ces broches sont reliées à des ADCs, permettant de faire la conversion analogique vers numérique des valeurs afin de pouvoir les interpréter ensuite. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir le logiciel Processing, à établir une communication entre Processing et l'ESP32 et commencer à traiter les données. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 : Découverte de Processing== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un second programme avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : Processing, la suite ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées, ce qui nous permettra par la suite d'orienter la main comme on le souhaite : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : Débuts de la modélisation de la main==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : Optimisation==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 : Communication sans-fil== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code Arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : Problèmes matériels ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. En effet, la pate de fixation, posée sur la piste résistive et sertie au substrat en plastique frotte contre la piste conductrice. Au fil de l'utilisation, cette pate use la piste et le contact ne se fait plus. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du capteur et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Une autre solution de réparation était d'utiliser de l'encre conductrice pour rétablir la connexion.&lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu Pierre, Feuille, Ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les exigences minimales du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu Pierre, Feuille, Ciseaux à notre code Processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
Pierre : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGPierre.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Feuille : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGFeuille.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ciseaux : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGCiseaux.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
&lt;br /&gt;
- Définition Dataglove : https://fr.wikipedia.org/wiki/Gant_de_données&lt;br /&gt;
&lt;br /&gt;
- Datasheeet ESP32 : https://cdn.sparkfun.com/datasheets/IoT/esp32_datasheet_en.pdf&lt;br /&gt;
&lt;br /&gt;
- Caractéristiques flexomètres : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide/all&lt;br /&gt;
&lt;br /&gt;
- Explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
&lt;br /&gt;
- Codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;br /&gt;
&lt;br /&gt;
- Moyenne glissante : https://arduino.blaisepascal.fr/lisser-un-signal-analogique/&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11415</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11415"/>
		<updated>2021-06-05T13:52:26Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
&lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.&lt;br /&gt;
&lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord commencé par tester le module ESP32. Il faut tout d'abord installer la librairie (avec le Gestionnaire de cartes) afin de pouvoir compiler et téléverser le programme pour l'ESP32. On a essayé un programme de permettant de faire clignoter de la LED embarquée avec un PC Windows et le logiciel Arduino IDE. Le programme fonctionne et la LED clignote. &lt;br /&gt;
&lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faudrait qu'on arrive à récupérer les informations des capteurs et les interpréter.&lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine, fournie avec le gant et l'ESP32 lors de la séance précédente :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png]]&lt;br /&gt;
&lt;br /&gt;
Il s'agit de ponts diviseurs de tension avec 3V3 en entrée, une résistance fixe (soudée à la platine), une résistance de pull-down (flexomètre). La valeur de la tension de sortie est redirigée vers un connecteur qui sera connecté à l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des 5 flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. Ces broches sont reliées à des ADCs, permettant de faire la conversion analogique vers numérique des valeurs afin de pouvoir les interpréter ensuite. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir le logiciel Processing, à établir une communication entre Processing et l'ESP32 et commencer à traiter les données. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 : Découverte de Processing== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un second programme avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : Processing, la suite ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées, ce qui nous permettra par la suite d'orienter la main comme on le souhaite : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : Débuts de la modélisation de la main==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : Optimisation==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 : Communication sans-fil== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code Arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : Problèmes matériels ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. En effet, la pate de fixation, posée sur la piste résistive et sertie au substrat en plastique frotte contre la piste conductrice. Au fil de l'utilisation, cette pate use la piste et le contact ne se fait plus. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du capteur et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Une autre solution de réparation était d'utiliser de l'encre conductrice pour rétablir la connexion.&lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu Pierre, Feuille, Ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les exigences minimales du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu Pierre, Feuille, Ciseaux à notre code Processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
Pierre : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGPierre.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Feuille : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGFeuille.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ciseaux : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGCiseaux.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
&lt;br /&gt;
- Définition Dataglove : https://fr.wikipedia.org/wiki/Gant_de_données&lt;br /&gt;
&lt;br /&gt;
- Datasheeet ESP32 : https://cdn.sparkfun.com/datasheets/IoT/esp32_datasheet_en.pdf&lt;br /&gt;
&lt;br /&gt;
- Caractéristiques flexomètres : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide/all&lt;br /&gt;
&lt;br /&gt;
- Explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
&lt;br /&gt;
- Codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;br /&gt;
&lt;br /&gt;
- Moyenne glissante : https://arduino.blaisepascal.fr/lisser-un-signal-analogique/&lt;br /&gt;
&lt;br /&gt;
- Code final Processing : https://pastebin.com/auzgTeC5&lt;br /&gt;
&lt;br /&gt;
- Code final ESP32 Arduino IDE : https://pastebin.com/wSdvaNBw&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11414</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11414"/>
		<updated>2021-06-05T13:48:39Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
&lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.&lt;br /&gt;
&lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord commencé par tester le module ESP32. Il faut tout d'abord installer la librairie (avec le Gestionnaire de cartes) afin de pouvoir compiler et téléverser le programme pour l'ESP32. On a essayé un programme de permettant de faire clignoter de la LED embarquée avec un PC Windows et le logiciel Arduino IDE. Le programme fonctionne et la LED clignote. &lt;br /&gt;
&lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faudrait qu'on arrive à récupérer les informations des capteurs et les interpréter.&lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine, fournie avec le gant et l'ESP32 lors de la séance précédente :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png]]&lt;br /&gt;
&lt;br /&gt;
Il s'agit de ponts diviseurs de tension avec 3V3 en entrée, une résistance fixe (soudée à la platine), une résistance de pull-down (flexomètre). La valeur de la tension de sortie est redirigée vers un connecteur qui sera connecté à l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des 5 flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. Ces broches sont reliées à des ADCs, permettant de faire la conversion analogique vers numérique des valeurs afin de pouvoir les interpréter ensuite. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir le logiciel Processing, à établir une communication entre Processing et l'ESP32 et commencer à traiter les données. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 : Découverte de Processing== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un second programme avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : Processing, la suite ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées, ce qui nous permettra par la suite d'orienter la main comme on le souhaite : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : Débuts de la modélisation de la main==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : Optimisation==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 : Communication sans-fil== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code Arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : Problèmes matériels ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. En effet, la pate de fixation, posée sur la piste résistive et sertie au substrat en plastique frotte contre la piste conductrice. Au fil de l'utilisation, cette pate use la piste et le contact ne se fait plus. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du capteur et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Une autre solution de réparation était d'utiliser de l'encre conductrice pour rétablir la connexion.&lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu Pierre, Feuille, Ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les exigences minimales du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu Pierre, Feuille, Ciseaux à notre code Processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
Pierre : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGPierre.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Feuille : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGFeuille.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ciseaux : &lt;br /&gt;
&lt;br /&gt;
 [[image:DGCiseaux.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
&lt;br /&gt;
- Définition Dataglove : https://fr.wikipedia.org/wiki/Gant_de_données&lt;br /&gt;
&lt;br /&gt;
- Datasheeet ESP32 : https://cdn.sparkfun.com/datasheets/IoT/esp32_datasheet_en.pdf&lt;br /&gt;
&lt;br /&gt;
- Caractéristiques flexomètres : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide/all&lt;br /&gt;
&lt;br /&gt;
- Explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
&lt;br /&gt;
- Codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;br /&gt;
&lt;br /&gt;
- Moyenne glissante : https://arduino.blaisepascal.fr/lisser-un-signal-analogique/&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Fichier:DGFeuille.png&amp;diff=11413</id>
		<title>Fichier:DGFeuille.png</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Fichier:DGFeuille.png&amp;diff=11413"/>
		<updated>2021-06-05T13:47:01Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Fichier:DGPierre.png&amp;diff=11412</id>
		<title>Fichier:DGPierre.png</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Fichier:DGPierre.png&amp;diff=11412"/>
		<updated>2021-06-05T13:46:35Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Fichier:DGCiseaux.png&amp;diff=11411</id>
		<title>Fichier:DGCiseaux.png</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Fichier:DGCiseaux.png&amp;diff=11411"/>
		<updated>2021-06-05T13:46:13Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11410</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11410"/>
		<updated>2021-06-05T13:41:43Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
&lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.&lt;br /&gt;
&lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord commencé par tester le module ESP32. Il faut tout d'abord installer la librairie (avec le Gestionnaire de cartes) afin de pouvoir compiler et téléverser le programme pour l'ESP32. On a essayé un programme de permettant de faire clignoter de la LED embarquée avec un PC Windows et le logiciel Arduino IDE. Le programme fonctionne et la LED clignote. &lt;br /&gt;
&lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faudrait qu'on arrive à récupérer les informations des capteurs et les interpréter.&lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine, fournie avec le gant et l'ESP32 lors de la séance précédente :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png]]&lt;br /&gt;
&lt;br /&gt;
Il s'agit de ponts diviseurs de tension avec 3V3 en entrée, une résistance fixe (soudée à la platine), une résistance de pull-down (flexomètre). La valeur de la tension de sortie est redirigée vers un connecteur qui sera connecté à l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des 5 flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. Ces broches sont reliées à des ADCs, permettant de faire la conversion analogique vers numérique des valeurs afin de pouvoir les interpréter ensuite. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir le logiciel Processing, à établir une communication entre Processing et l'ESP32 et commencer à traiter les données. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 : Découverte de Processing== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un second programme avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : Processing, la suite ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées, ce qui nous permettra par la suite d'orienter la main comme on le souhaite : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : Débuts de la modélisation de la main==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : Optimisation==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 : Communication sans-fil== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code Arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : Problèmes matériels ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. En effet, la pate de fixation, posée sur la piste résistive et sertie au substrat en plastique frotte contre la piste conductrice. Au fil de l'utilisation, cette pate use la piste et le contact ne se fait plus. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du capteur et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Une autre solution de réparation était d'utiliser de l'encre conductrice pour rétablir la connexion.&lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu Pierre, Feuille, Ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les exigences minimales du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu Pierre, Feuille, Ciseaux à notre code Processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
&lt;br /&gt;
- Définition Dataglove : https://fr.wikipedia.org/wiki/Gant_de_données&lt;br /&gt;
&lt;br /&gt;
- Datasheeet ESP32 : https://cdn.sparkfun.com/datasheets/IoT/esp32_datasheet_en.pdf&lt;br /&gt;
&lt;br /&gt;
- Caractéristiques flexomètres : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide/all&lt;br /&gt;
&lt;br /&gt;
- Explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
&lt;br /&gt;
- Codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;br /&gt;
&lt;br /&gt;
- Moyenne glissante : https://arduino.blaisepascal.fr/lisser-un-signal-analogique/&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11409</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11409"/>
		<updated>2021-06-05T13:41:21Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
&lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.&lt;br /&gt;
&lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord commencé par tester le module ESP32. Il faut tout d'abord installer la librairie (avec le Gestionnaire de cartes) afin de pouvoir compiler et téléverser le programme pour l'ESP32. On a essayé un programme de permettant de faire clignoter de la LED embarquée avec un PC Windows et le logiciel Arduino IDE. Le programme fonctionne et la LED clignote. &lt;br /&gt;
&lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faudrait qu'on arrive à récupérer les informations des capteurs et les interpréter.&lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine, fournie avec le gant et l'ESP32 lors de la séance précédente :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png]]&lt;br /&gt;
&lt;br /&gt;
Il s'agit de ponts diviseurs de tension avec 3V3 en entrée, une résistance fixe (soudée à la platine), une résistance de pull-down (flexomètre). La valeur de la tension de sortie est redirigée vers un connecteur qui sera connecté à l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des 5 flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. Ces broches sont reliées à des ADCs, permettant de faire la conversion analogique vers numérique des valeurs afin de pouvoir les interpréter ensuite. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir le logiciel Processing, à établir une communication entre Processing et l'ESP32 et commencer à traiter les données. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 : Découverte de Processing== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un second programme avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : Processing, la suite ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées, ce qui nous permettra par la suite d'orienter la main comme on le souhaite : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : Débuts de la modélisation de la main==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : Optimisation==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 : Communication sans-fil== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code Arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : Problèmes matériels ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. En effet, la pate de fixation, posée sur la piste résistive et sertie au substrat en plastique frotte contre la piste conductrice. Au fil de l'utilisation, cette pate use la piste et le contact ne se fait plus. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du capteur et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Une autre solution de réparation était d'utiliser de l'encre conductrice pour rétablir la connexion.&lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu Pierre, Feuille, Ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les exigences minimales du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu Pierre, Feuille, Ciseaux à notre code Processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
&lt;br /&gt;
- Définition Dataglove : https://fr.wikipedia.org/wiki/Gant_de_données&lt;br /&gt;
- Datasheeet ESP32 : https://cdn.sparkfun.com/datasheets/IoT/esp32_datasheet_en.pdf&lt;br /&gt;
- Caractéristiques flexomètres : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide/all&lt;br /&gt;
- Explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- Codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;br /&gt;
- Moyenne glissante : https://arduino.blaisepascal.fr/lisser-un-signal-analogique/&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11408</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11408"/>
		<updated>2021-06-05T13:38:27Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
&lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.&lt;br /&gt;
&lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord commencé par tester le module ESP32. Il faut tout d'abord installer la librairie (avec le Gestionnaire de cartes) afin de pouvoir compiler et téléverser le programme pour l'ESP32. On a essayé un programme de permettant de faire clignoter de la LED embarquée avec un PC Windows et le logiciel Arduino IDE. Le programme fonctionne et la LED clignote. &lt;br /&gt;
&lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faudrait qu'on arrive à récupérer les informations des capteurs et les interpréter.&lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine, fournie avec le gant et l'ESP32 lors de la séance précédente :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Il s'agit de ponts diviseurs de tension avec 3V3 en entrée, une résistance fixe (soudée à la platine), une résistance de pull-down (flexomètre). La valeur de la tension de sortie est redirigée vers un connecteur qui sera connecté à l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des 5 flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. Ces broches sont reliées à des ADCs, permettant de faire la conversion analogique vers numérique des valeurs afin de pouvoir les interpréter ensuite. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir le logiciel Processing, à établir une communication entre Processing et l'ESP32 et commencer à traiter les données. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 : Découverte de Processing== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un second programme avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : Processing, la suite ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées, ce qui nous permettra par la suite d'orienter la main comme on le souhaite : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : Débuts de la modélisation de la main==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : Optimisation==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 : Communication sans-fil== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code Arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png|alt]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : Problèmes matériels ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. En effet, la pate de fixation, posée sur la piste résistive et sertie au substrat en plastique frotte contre la piste conductrice. Au fil de l'utilisation, cette pate use la piste et le contact ne se fait plus. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du capteur et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Une autre solution de réparation était d'utiliser de l'encre conductrice pour rétablir la connexion.&lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu Pierre, Feuille, Ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les exigences minimales du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu Pierre, Feuille, Ciseaux à notre code Processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11407</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11407"/>
		<updated>2021-06-05T13:37:58Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
&lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.&lt;br /&gt;
&lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord commencé par tester le module ESP32. Il faut tout d'abord installer la librairie (avec le Gestionnaire de cartes) afin de pouvoir compiler et téléverser le programme pour l'ESP32. On a essayé un programme de permettant de faire clignoter de la LED embarquée avec un PC Windows et le logiciel Arduino IDE. Le programme fonctionne et la LED clignote. &lt;br /&gt;
&lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faudrait qu'on arrive à récupérer les informations des capteurs et les interpréter.&lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine, fournie avec le gant et l'ESP32 lors de la séance précédente :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Il s'agit de ponts diviseurs de tension avec 3V3 en entrée, une résistance fixe (soudée à la platine), une résistance de pull-down (flexomètre). La valeur de la tension de sortie est redirigée vers un connecteur qui sera connecté à l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des 5 flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. Ces broches sont reliées à des ADCs, permettant de faire la conversion analogique vers numérique des valeurs afin de pouvoir les interpréter ensuite. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir le logiciel Processing, à établir une communication entre Processing et l'ESP32 et commencer à traiter les données. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 : Découverte de Processing== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un second programme avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : Processing, la suite ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées, ce qui nous permettra par la suite d'orienter la main comme on le souhaite : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : Débuts de la modélisation de la main==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : Optimisation==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 : Communication sans-fil== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code Arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png|alt]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : Problèmes matériels ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. En effet, la pate de fixation, posée sur la piste résistive et sertie au substrat en plastique frotte contre la piste conductrice. Au fil de l'utilisation, cette pate use la piste et le contact ne se fait plus. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du capteur et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Une autre solution de réparation était d'utiliser de l'encre conductrice pour rétablir la connexion.&lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu Pierre, Feuille, Ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les exigences minimales du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu Pierre, Feuille, Ciseaux à notre code Processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11406</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11406"/>
		<updated>2021-06-05T13:37:25Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
&lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.&lt;br /&gt;
&lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png|alt]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord commencé par tester le module ESP32. Il faut tout d'abord installer la librairie (avec le Gestionnaire de cartes) afin de pouvoir compiler et téléverser le programme pour l'ESP32. On a essayé un programme de permettant de faire clignoter de la LED embarquée avec un PC Windows et le logiciel Arduino IDE. Le programme fonctionne et la LED clignote. &lt;br /&gt;
&lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faudrait qu'on arrive à récupérer les informations des capteurs et les interpréter.&lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine, fournie avec le gant et l'ESP32 lors de la séance précédente :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Il s'agit de ponts diviseurs de tension avec 3V3 en entrée, une résistance fixe (soudée à la platine), une résistance de pull-down (flexomètre). La valeur de la tension de sortie est redirigée vers un connecteur qui sera connecté à l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des 5 flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. Ces broches sont reliées à des ADCs, permettant de faire la conversion analogique vers numérique des valeurs afin de pouvoir les interpréter ensuite. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir le logiciel Processing, à établir une communication entre Processing et l'ESP32 et commencer à traiter les données. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 : Découverte de Processing== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un second programme avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : Processing, la suite ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées, ce qui nous permettra par la suite d'orienter la main comme on le souhaite : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : Débuts de la modélisation de la main==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : Optimisation==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 : Communication sans-fil== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code Arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png|alt]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : Problèmes matériels ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. En effet, la pate de fixation, posée sur la piste résistive et sertie au substrat en plastique frotte contre la piste conductrice. Au fil de l'utilisation, cette pate use la piste et le contact ne se fait plus. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du capteur et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Une autre solution de réparation était d'utiliser de l'encre conductrice pour rétablir la connexion.&lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu Pierre, Feuille, Ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les exigences minimales du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu Pierre, Feuille, Ciseaux à notre code Processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11405</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11405"/>
		<updated>2021-06-05T12:51:04Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
Description de l'existant : &lt;br /&gt;
- flexomètre : capteur électronique qui mesure le taux de flexion ; plus l'angle de flexion est élevé, plus la résistance est grande. Le capteur est constitué d'une encre polymère composée de particules conductrices imprimée sur un substrat en plastique. Lors de la flexion, Les particules conductrices de l'encre s'écartent les unes des autres, ce qui fait varier la résistance du capteur.  &lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png|alt]]&lt;br /&gt;
&lt;br /&gt;
- Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a testé l'ESP32 avec un programme de clignotement de la LED embarquée avec un PC Windows et Arduino IDE. Le programme fonctionne et la LED clignotte. &lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faut qu'on remette en état le gant et qu'on essaye de lire les données des capteurs. &lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. Cela nous a permis de valider les doigts auxquels sont reliés les différents ports. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir Processing, à établir une communication entre Processing et l'ESP32 et commencer à les traiter. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 :== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un programme d'essai avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 :== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png|alt]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du flexo et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Nous aurions pu utiliser de l'encre conductrice, mais il n'y en avait pas. &lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu papier, caillou, ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les besoins minimum du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu papier, caillou, ciseaux à notre code processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11404</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11404"/>
		<updated>2021-06-05T12:41:46Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
=Projet : Datagloves à flexomètres et transmission sans fil (Sparkfun ESP32 Thing)=&lt;br /&gt;
&lt;br /&gt;
==Séance 1 : Découverte du sujet==&lt;br /&gt;
&lt;br /&gt;
flexomètre : résistance variable qui augmente avec l'angle de flexion. &lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a testé l'ESP32 avec un programme de clignotement de la LED embarquée avec un PC Windows et Arduino IDE. Le programme fonctionne et la LED clignotte. &lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faut qu'on remette en état le gant et qu'on essaye de lire les données des capteurs. &lt;br /&gt;
&lt;br /&gt;
==Séance 2 : Acquisition des données brutes sur l'IDE Arduino==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. Cela nous a permis de valider les doigts auxquels sont reliés les différents ports. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir Processing, à établir une communication entre Processing et l'ESP32 et commencer à les traiter. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
==Séance 3 :== &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un programme d'essai avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
==Séance 4 : ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
==Séance 5 : ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
==Travail à la maison n°1 : ==&lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 6 : ==&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
==Séance 7 :== &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png|alt]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 8 : ==&lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du flexo et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Nous aurions pu utiliser de l'encre conductrice, mais il n'y en avait pas. &lt;br /&gt;
&lt;br /&gt;
==Bonus : implémentation du jeu papier, caillou, ciseaux==&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les besoins minimum du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu papier, caillou, ciseaux à notre code processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Liens : ==&lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Fichier:Bluetooth_processing.png&amp;diff=11402</id>
		<title>Fichier:Bluetooth processing.png</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Fichier:Bluetooth_processing.png&amp;diff=11402"/>
		<updated>2021-05-31T10:18:38Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11401</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11401"/>
		<updated>2021-05-31T10:18:19Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
Projet : Datagloves à flexomètres et transmission sans fil (ESP32 Thing)&lt;br /&gt;
&lt;br /&gt;
Séance 1 : Découverte du sujet&lt;br /&gt;
&lt;br /&gt;
flexomètre : résistance variable qui augmente avec l'angle de flexion. &lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a testé l'ESP32 avec un programme de clignotement de la LED embarquée avec un PC Windows et Arduino IDE. Le programme fonctionne et la LED clignotte. &lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faut qu'on remette en état le gant et qu'on essaye de lire les données des capteurs. &lt;br /&gt;
&lt;br /&gt;
Séance 2 : Acquisition des données brutes sur l'IDE Arduino&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. Cela nous a permis de valider les doigts auxquels sont reliés les différents ports. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir Processing, à établir une communication entre Processing et l'ESP32 et commencer à les traiter. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
Séance 3 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un programme d'essai avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
Séance 4 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
Séance 5 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
Travail à la maison n°1 : &lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Séance 6 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
Séance 7 : &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds) : &lt;br /&gt;
&lt;br /&gt;
 [[image:bluetooth_processing.png|alt]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis un ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Séance 8 : &lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du flexo et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Nous aurions pu utiliser de l'encre conductrice, mais il n'y en avait pas. &lt;br /&gt;
&lt;br /&gt;
Bonus : implémentation du jeu papier, caillou, ciseaux&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les besoins minimum du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu papier, caillou, ciseaux à notre code processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Liens : &lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11400</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11400"/>
		<updated>2021-05-31T10:15:37Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
Projet : Datagloves à flexomètres et transmission sans fil (ESP32 Thing)&lt;br /&gt;
&lt;br /&gt;
Séance 1 : Découverte du sujet&lt;br /&gt;
&lt;br /&gt;
flexomètre : résistance variable qui augmente avec l'angle de flexion. &lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a testé l'ESP32 avec un programme de clignotement de la LED embarquée avec un PC Windows et Arduino IDE. Le programme fonctionne et la LED clignotte. &lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. Il semble s'agir d'un problème de bibliothèque.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faut qu'on remette en état le gant et qu'on essaye de lire les données des capteurs. &lt;br /&gt;
&lt;br /&gt;
Séance 2 : Acquisition des données brutes sur l'IDE Arduino&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. Cela nous a permis de valider les doigts auxquels sont reliés les différents ports. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir Processing, à établir une communication entre Processing et l'ESP32 et commencer à les traiter. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
Séance 3 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un programme d'essai avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
Séance 4 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
Séance 5 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
Travail à la maison n°1 : &lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Séance 6 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
Séance 7 : &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds). &lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis mon ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Séance 8 : &lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du flexo et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Nous aurions pu utiliser de l'encre conductrice, mais il n'y en avait pas. &lt;br /&gt;
&lt;br /&gt;
Bonus : implémentation du jeu papier, caillou, ciseaux&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les besoins minimum du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu papier, caillou, ciseaux à notre code processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Liens : &lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11399</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11399"/>
		<updated>2021-05-31T10:11:09Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
Projet : Datagloves à flexomètres et transmission sans fil (ESP32 Thing)&lt;br /&gt;
&lt;br /&gt;
Séance 1 : Découverte du sujet&lt;br /&gt;
&lt;br /&gt;
flexomètre : résistance variable qui augmente avec l'angle de flexion. &lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a testé l'ESP32 avec un programme de clignotement de la LED embarquée avec un PC Windows et Arduino IDE. Le programme fonctionne et la LED clignotte. &lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faut qu'on remette en état le gant et qu'on essaye de lire les données des capteurs. &lt;br /&gt;
&lt;br /&gt;
Séance 2 : Acquisition des données brutes sur l'IDE Arduino&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. Cela nous a permis de valider les doigts auxquels sont reliés les différents ports. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir Processing, à établir une communication entre Processing et l'ESP32 et commencer à les traiter. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
Séance 3 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un programme d'essai avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
Séance 4 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
Séance 5 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
Travail à la maison n°1 : &lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Séance 6 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
Séance 7 : &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds). &lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis mon ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Séance 8 : &lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du flexo et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Nous aurions pu utiliser de l'encre conductrice, mais il n'y en avait pas. &lt;br /&gt;
&lt;br /&gt;
Bonus : implémentation du jeu papier, caillou, ciseaux&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les besoins minimum du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu papier, caillou, ciseaux à notre code processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Liens : &lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Fichier:Courbe_delta.png&amp;diff=11398</id>
		<title>Fichier:Courbe delta.png</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Fichier:Courbe_delta.png&amp;diff=11398"/>
		<updated>2021-05-31T10:10:31Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11397</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11397"/>
		<updated>2021-05-31T10:10:12Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
Projet : Datagloves à flexomètres et transmission sans fil (ESP32 Thing)&lt;br /&gt;
&lt;br /&gt;
Séance 1 : Découverte du sujet&lt;br /&gt;
&lt;br /&gt;
flexomètre : résistance variable qui augmente avec l'angle de flexion. &lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 80kΩ à plat, 180kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 25kΩ à plat, 100kΩ fléchi (environ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a testé l'ESP32 avec un programme de clignotement de la LED embarquée avec un PC Windows et Arduino IDE. Le programme fonctionne et la LED clignotte. &lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faut qu'on remette en état le gant et qu'on essaye de lire les données des capteurs. &lt;br /&gt;
&lt;br /&gt;
Séance 2 : Acquisition des données brutes sur l'IDE Arduino&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Concernant les plages de valeurs des capteurs, l'ESP32 convertit les signaux analogiques en signaux numériques sur 12 bits (4096 valeurs). Avec les résistances présentes sur la platine, les tensions présentes sur les ports de l'ESP32 se situent entre 1,69 et 2,67V, soit un ∆≈1V.&lt;br /&gt;
&lt;br /&gt;
Après étude, afin d'optimiser la plage de valeurs en fonction des flexomètres, il faudrait que les résistances de la platine aient une valeur d'environ 50kΩ, on obtiendrait un ∆≈1,1V : &lt;br /&gt;
&lt;br /&gt;
[[image:courbe_delta.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de conserver les résistances déjà présentes sur la platine ; si on augmente la valeur des résistances, pour des valeurs de tension aussi faibles, le bruit thermique et les perturbations externes deviennent de moins en moins négligeables. Résultat : les valeurs oscillent plus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. Cela nous a permis de valider les doigts auxquels sont reliés les différents ports. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir Processing, à établir une communication entre Processing et l'ESP32 et commencer à les traiter. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
Séance 3 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un programme d'essai avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
Séance 4 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
Séance 5 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
Travail à la maison n°1 : &lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant : &lt;br /&gt;
&lt;br /&gt;
 [[image:nouveau_dataglove.JPG|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Séance 6 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
Séance 7 : &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds). &lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis mon ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Séance 8 : &lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du flexo et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Nous aurions pu utiliser de l'encre conductrice, mais il n'y en avait pas. &lt;br /&gt;
&lt;br /&gt;
Bonus : implémentation du jeu papier, caillou, ciseaux&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les besoins minimum du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu papier, caillou, ciseaux à notre code processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Liens : &lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Fichier:Nouveau_dataglove.JPG&amp;diff=11396</id>
		<title>Fichier:Nouveau dataglove.JPG</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Fichier:Nouveau_dataglove.JPG&amp;diff=11396"/>
		<updated>2021-05-31T09:57:23Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11393</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11393"/>
		<updated>2021-05-31T06:53:48Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
Projet : Datagloves à flexomètres et transmission sans fil (ESP32 Thing)&lt;br /&gt;
&lt;br /&gt;
Séance 1 : Découverte du sujet&lt;br /&gt;
&lt;br /&gt;
flexomètre : résistance variable qui augmente avec l'angle de flexion. &lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 50kΩ à plat&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 20kΩ à plat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a testé l'ESP32 avec un programme de clignotement de la LED embarquée avec un PC Windows et Arduino IDE. Le programme fonctionne et la LED clignotte. &lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faut qu'on remette en état le gant et qu'on essaye de lire les données des capteurs. &lt;br /&gt;
&lt;br /&gt;
Séance 2 : Acquisition des données brutes sur l'IDE Arduino&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. Cela nous a permis de valider les doigts auxquels sont reliés les différents ports. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir Processing, à établir une communication entre Processing et l'ESP32 et commencer à les traiter. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
Séance 3 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un programme d'essai avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
Séance 4 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
Séance 5 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
Travail à la maison n°1 : &lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
Aussi, nous nous sommes accordés avec l'autre binôme du groupe A pour refaire le gant (petites pochettes pour mieux contenir les flexomètres). On remercie tout particulièrement Gaël Riou et sa soeur pour le nouveau gant, bien plus robuste et fonctionnel qu'auparavant. &lt;br /&gt;
&lt;br /&gt;
Séance 6 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
Séance 7 : &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds). &lt;br /&gt;
&lt;br /&gt;
Aussi, suite à une mise à jour des librairies Arduino sur Mac, il m'a été possible de complier et de téléverser le code depuis mon ordinateur portable, au lieu de passer à chaque fois par le PC fixe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Séance 8 : &lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du flexo et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Nous aurions pu utiliser de l'encre conductrice, mais il n'y en avait pas. &lt;br /&gt;
&lt;br /&gt;
Bonus : implémentation du jeu papier, caillou, ciseaux&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les besoins minimum du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu papier, caillou, ciseaux à notre code processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Liens : &lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11392</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11392"/>
		<updated>2021-05-31T06:47:03Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
Projet : Datagloves à flexomètres et transmission sans fil (ESP32 Thing)&lt;br /&gt;
&lt;br /&gt;
Séance 1 : Découverte du sujet&lt;br /&gt;
&lt;br /&gt;
flexomètre : résistance variable qui augmente avec l'angle de flexion. &lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 50kΩ à plat&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 20kΩ à plat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a testé l'ESP32 avec un programme de clignotement de la LED embarquée avec un PC Windows et Arduino IDE. Le programme fonctionne et la LED clignotte. &lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faut qu'on remette en état le gant et qu'on essaye de lire les données des capteurs. &lt;br /&gt;
&lt;br /&gt;
Séance 2 : Acquisition des données brutes sur l'IDE Arduino&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. Cela nous a permis de valider les doigts auxquels sont reliés les différents ports. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir Processing, à établir une communication entre Processing et l'ESP32 et commencer à les traiter. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
Séance 3 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un programme d'essai avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
Séance 4 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
Séance 5 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Nous utilison la bibliothèque Runningaverage.h dans le code arduino qui intègre toutes les fonctionnalités nécessaires. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
Travail à la maison n°1 : &lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
 [[image:main_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Sur notre fenêtre, nous affichons également la valeur des flexomètres, ce qui permet de mieux déboguer. &lt;br /&gt;
&lt;br /&gt;
Séance 6 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
Séance 7 : &lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le protocole de communication de l'ESP32. Nous utilisions auparavant une liaison série USB filaire, nous sommes passés par une liaison série Bluetooth (sans-fil). Pour cela, nous avons dû modifier le code arduino en ajoutant la bibliothèque Bluetoothserial.h et en utilisant les méthodes adaptées. En ce qui concerne l'implémentation Processing, nous avons simplement dû changer le nom du port série et la vitesse de communication (pasage de 9600 à 115200 bauds). &lt;br /&gt;
&lt;br /&gt;
Séance 8 : &lt;br /&gt;
&lt;br /&gt;
Au cours de cette séance, nous avons été confrontés à plusieurs problèmes matériels; le flexomètre de l'auriculaire ne fonctionnait plus, en raison de son design peu robuste. N'ayant pas de flexomètre de rechange, nous n'avons pas eu d'autre moyen que de tenter une réparation en soudant un fil sur la pate du flexo et de la plaquer sur la piste conductrice à l'aide d'un morceau de scotch. Cette solution semble fonctionner malgré tout. Nous aurions pu utiliser de l'encre conductrice, mais il n'y en avait pas. &lt;br /&gt;
&lt;br /&gt;
Bonus : implémentation du jeu papier, caillou, ciseaux&lt;br /&gt;
&lt;br /&gt;
Ayant respecté tous les besoins minimum du cahier des charges, nous avons décidé d'aller plus loin et d'implémenter le jeu papier, caillou, ciseaux à notre code processing. Le programme détecte si on fait une des figures, l'affiche et si on appuie sur la fenêtre, le programme génère automatiquement une figure et affiche si nous avons gagné, perdu ou égalité. Le score est également géré. Nous avons par contre eu un problème concernant la gestion du temps. En effet, il n'est pas possible de mettre un délai dans la boucle permettant d'afficher le résultat quelques instants. La fonction délai semble inutilisable dans une boucle draw(). Nous n'avons pas eu le temps de régler ce problème; notre code et jeu reste fonctionnel tout de même. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Liens : &lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Fichier:Main_processing.png&amp;diff=11389</id>
		<title>Fichier:Main processing.png</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Fichier:Main_processing.png&amp;diff=11389"/>
		<updated>2021-05-31T06:31:28Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11388</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11388"/>
		<updated>2021-05-31T06:31:16Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
Projet : Datagloves à flexomètres et transmission sans fil (ESP32 Thing)&lt;br /&gt;
&lt;br /&gt;
Séance 1 : Découverte du sujet&lt;br /&gt;
&lt;br /&gt;
flexomètre : résistance variable qui augmente avec l'angle de flexion. &lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 50kΩ à plat&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 20kΩ à plat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a testé l'ESP32 avec un programme de clignotement de la LED embarquée avec un PC Windows et Arduino IDE. Le programme fonctionne et la LED clignotte. &lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faut qu'on remette en état le gant et qu'on essaye de lire les données des capteurs. &lt;br /&gt;
&lt;br /&gt;
Séance 2 : Acquisition des données brutes sur l'IDE Arduino&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. Cela nous a permis de valider les doigts auxquels sont reliés les différents ports. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir Processing, à établir une communication entre Processing et l'ESP32 et commencer à les traiter. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
Séance 3 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un programme d'essai avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
Séance 4 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
Séance 5 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement) : &lt;br /&gt;
&lt;br /&gt;
 [[image:doigt_processing.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pour essayer de régler les problèmes de valeurs instables, nous avons implémenté une moyenne glissante sur les 5 valeurs des flexomètres. Cette moyenne fonctionne bien, sauf pour celle du pouce, qui reste malgré tout très instable. &lt;br /&gt;
&lt;br /&gt;
Travail à la maison n°1 : &lt;br /&gt;
&lt;br /&gt;
Pour être plus efficace, nous avons emporté le dataglove pour poursuivre le projet chez nous. Nous avons pu effectuer le traitement des valeurs par processing, ce qui permet aux doigts modélisés de bien suivre les mouvements réels de la main : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Séance 6 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons décidé de changer l'une des résistances sur notre platine, celle du pouce. Celle-ci avait une valeur de 71.5kΩ, valeur trop élevée pour avoir une précision correcte (la valeur n'était pas stable et présence de bruit). Nous l'avons remplacée par une résistance de 24 kΩ, proche de la valeur des 4 autres présentes sur notre platine. Suite à ce changement, nous avons dû recalibrer nos valeurs, mais cette opération a réglé nos problèmes. &lt;br /&gt;
&lt;br /&gt;
Séance 7 : &lt;br /&gt;
&lt;br /&gt;
Bonus : implémentation du jeu papier, caillou, ciseaux&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Liens : &lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Fichier:Doigt_processing.png&amp;diff=11380</id>
		<title>Fichier:Doigt processing.png</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Fichier:Doigt_processing.png&amp;diff=11380"/>
		<updated>2021-05-31T06:21:24Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11379</id>
		<title>PAE 2021 Datagloves</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=PAE_2021_Datagloves&amp;diff=11379"/>
		<updated>2021-05-31T06:20:25Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Oriol : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DUMAS Clément, ORIOL Alexandre&lt;br /&gt;
&lt;br /&gt;
Projet : Datagloves à flexomètres et transmission sans fil (ESP32 Thing)&lt;br /&gt;
&lt;br /&gt;
Séance 1 : Découverte du sujet&lt;br /&gt;
&lt;br /&gt;
flexomètre : résistance variable qui augmente avec l'angle de flexion. &lt;br /&gt;
Schéma de câblage pour l'acquisition des données du capteur :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_flexomètre.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Le data glove que nous allons utiliser :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-gant-redim.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Sur ce gant, il y a deux types de capteurs de flexion : &lt;br /&gt;
&lt;br /&gt;
- celui du pouce (plus court) : R = 50kΩ à plat&lt;br /&gt;
&lt;br /&gt;
- tous les autres (plus long) : R = 20kΩ à plat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a testé l'ESP32 avec un programme de clignotement de la LED embarquée avec un PC Windows et Arduino IDE. Le programme fonctionne et la LED clignotte. &lt;br /&gt;
Sur Mac, on n'arrive pas à compiler le programme, aucun compilateur n'est détecté pour ce type de carte. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, il faut qu'on remette en état le gant et qu'on essaye de lire les données des capteurs. &lt;br /&gt;
&lt;br /&gt;
Séance 2 : Acquisition des données brutes sur l'IDE Arduino&lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons identifié le câblage de la platine :&lt;br /&gt;
&lt;br /&gt;
[[image:photo-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
On en a déduit le câblage suivant :&lt;br /&gt;
 &lt;br /&gt;
[[image:schéma-platine.png|alt]]&lt;br /&gt;
&lt;br /&gt;
Par conséquent, nous avons besoin d'une broche de Masse (GND), d'une alimentation 3V3 et de 5 broches GPIO pour l'acquisition des données des flexomètres. Nous câblerons les broches sur les pins 26, 27, 14, 12 et 13 de l'ESP32. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé une première acquisition des données à l'aide de ce code :&lt;br /&gt;
&lt;br /&gt;
[[image:DUMAS_ORIOL_code_22_mars.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Il permet de récupérer les données analogiques des flexomètres et de rafraichir les 5 valeurs toutes les 1/2 secondes. Cela nous a permis de valider les doigts auxquels sont reliés les différents ports. &lt;br /&gt;
&lt;br /&gt;
Pour la séance suivante, on pense commencer à découvrir Processing, à établir une communication entre Processing et l'ESP32 et commencer à les traiter. Si possible, il serait intéressant d'essayer de communiquer avec l'ESP32 en Wi-Fi (présence d'un code d'essai dans la librairie de l'ESP32). &lt;br /&gt;
&lt;br /&gt;
Séance 3 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons fait des essais de communication entre Processing et l'ESP32, d'abord via port COM en USB. Nous avons tout d'abord essayé de récupérer la valeur de résistance d'un flexomètre qui permet de modifier la couleur d'une fenêtre sur Processing. Nous nous sommes rendu compte que nous allions devoir sérialiser les données afin de transmettre les données des 5 doigts sur une seule trame. Nous avons réalisé un programme d'essai avec 3 données, séparées par des virgules pour les distinguer sur le port COM : &lt;br /&gt;
&lt;br /&gt;
[[image:Capture transmission serie 3 doigts.JPG]]&lt;br /&gt;
&lt;br /&gt;
En fin de séance, nous avons essayé des codes d'exemples permettant une communication sans fil. Nous avons modifié ce fichier avec un nouveau nom de réseau et un mot de passe : &lt;br /&gt;
&lt;br /&gt;
[[image:code-AP-wifi.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Après avoir téléversé le code sur l'ESP32, le réseau Wi-Fi est bien détecté par un téléphone ou un PC et nous pouvons bien nous connecter. &lt;br /&gt;
&lt;br /&gt;
Séance 4 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la programmation sous Processing. Nous avons débuté nos essais par créer un rectangle dans une fenêtre et de le faire tourner sur lui-même avec la souris : &lt;br /&gt;
&lt;br /&gt;
[[image:code_vue_camera.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Grâce à une souris ou un trackpad, nous pouvons orienter le cube selon les axes des abscisses et des ordonnées : &lt;br /&gt;
&lt;br /&gt;
[[image:vue_processing_cube.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous avons fait l'acquisition des données des 5 doigts sous Processing et visualiser les valeurs avec des rotations qui s'opèrent sur 5 cubes : &lt;br /&gt;
[[image:Code processing 8 avril.jpg|500px]]&lt;br /&gt;
[[image:5 Cubes Processing.JPG|600px]]&lt;br /&gt;
&lt;br /&gt;
Pour la prochaine séance, nous pensons commencer à modéliser une main sur Processing et essayer de la contrôler avec le dataglove.&lt;br /&gt;
&lt;br /&gt;
Séance 5 : &lt;br /&gt;
&lt;br /&gt;
Lors de cette séance, nous avons débuté la modélisation de la main à partir d'une solution trouvée sur internet. Elle modélise les doigts de la main à l'aide d'une succession de sphères (on ne peut pas modéliser ce genre de formes nativement). &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Liens : &lt;br /&gt;
- explications flexomètres + exemple application : https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide&lt;br /&gt;
- codes exemples processing : http://learningprocessing.com/examples/chp14/example-14-14-rotate-rect1-rect2&lt;/div&gt;</summary>
		<author><name>Alexandre Oriol</name></author>
		
	</entry>
</feed>