Projet IMA3 P4, 2017/2018, TD1 : Différence entre versions

De Wiki de Projets IMA
(Partie Informatique)
(Assemblage du système et tests)
 
(45 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 
=<div class="mcwiki-header" style="border-radius: 15px; padding: 10px; font-weight: bold; text-align: center; font-size: 80%; background: #EEEEFF; vertical-align: top; width: 99%;">  Projet IMA3-SC 2017/2018 - GlovesPad Project </div>=
 
=<div class="mcwiki-header" style="border-radius: 15px; padding: 10px; font-weight: bold; text-align: center; font-size: 80%; background: #EEEEFF; vertical-align: top; width: 99%;">  Projet IMA3-SC 2017/2018 - GlovesPad Project </div>=
  
-- Le Wiki sera complet pour le Mardi 19 Juin --
+
== Description du système et cahier des charges ==
 
 
== Description du système ==
 
  
 
Étant passionnés de musique mais également d'électronique et d'informatique, nous avions eu l'idée de reproduire le principe du traditionnel Launchpad.
 
Étant passionnés de musique mais également d'électronique et d'informatique, nous avions eu l'idée de reproduire le principe du traditionnel Launchpad.
Ligne 29 : Ligne 27 :
 
* Des fils de connexion
 
* Des fils de connexion
  
 +
=<div class="mcwiki-header" style="border-radius: 15px; padding: 10px; font-weight: bold; text-align: center; font-size: 80%; background: #EEEEFF; vertical-align: top; width: 99%;">  Journal de bord</div>=
  
  
=<div class="mcwiki-header" style="border-radius: 15px; padding: 10px; font-weight: bold; text-align: center; font-size: 80%; background: #EEEEFF; vertical-align: top; width: 99%;">  Journal de bord</div>=
 
  
 
== Séance 1 ==
 
== Séance 1 ==
Ligne 72 : Ligne 70 :
 
Le capteur piézoélectrique présent ci-dessus utilise l'effet piézoélectrique. La piézoélectricité est la propriété que possèdent certains corps de se polariser électriquement sous l’action d’une contrainte mécanique et réciproquement de se déformer lorsqu’on leur applique un champ électrique. Les deux effets sont indissociables. Le premier est appelé effet piézoélectrique direct; le second effet piézoélectrique inverse.
 
Le capteur piézoélectrique présent ci-dessus utilise l'effet piézoélectrique. La piézoélectricité est la propriété que possèdent certains corps de se polariser électriquement sous l’action d’une contrainte mécanique et réciproquement de se déformer lorsqu’on leur applique un champ électrique. Les deux effets sont indissociables. Le premier est appelé effet piézoélectrique direct; le second effet piézoélectrique inverse.
 
Dans notre cas le capteur piézoélectrique se polarisera lors d'un contact et permettra d'envoyer un signal électrique à l'un des ports de l'Arduino.
 
Dans notre cas le capteur piézoélectrique se polarisera lors d'un contact et permettra d'envoyer un signal électrique à l'un des ports de l'Arduino.
 +
 +
 +
  
 
== Séance 2 ==
 
== Séance 2 ==
Ligne 108 : Ligne 109 :
 
La fonction void setup() nous permet d'utiliser le port série de l'Arduino. Dans la fonction void loop(), analogRead(CAPTEUR) nous permet de lire et d'entrer dans la variable lectureCapteur la valeur lue sur le port correspondant à la variable CAPTEUR. Puis nous testons si la valeur lue est positive et affichons cette valeur dans un terminal à l'aide de la fonction Serial.println.
 
La fonction void setup() nous permet d'utiliser le port série de l'Arduino. Dans la fonction void loop(), analogRead(CAPTEUR) nous permet de lire et d'entrer dans la variable lectureCapteur la valeur lue sur le port correspondant à la variable CAPTEUR. Puis nous testons si la valeur lue est positive et affichons cette valeur dans un terminal à l'aide de la fonction Serial.println.
  
À la fin de cette séance nous avons donc compris le fonctionnement des capteurs piézoélectriques et la façon dont il fallait les connecter. Lors de la prochaine séance nous procéderons à l'élaboration du Schield sur lequel nous retrouverons les capteurs.
+
À la fin de cette séance nous avons donc compris le fonctionnement des capteurs piézoélectriques et la façon dont il fallait les connecter. Lors de la prochaine séance nous procéderons à l'élaboration du Shield sur lequel nous retrouverons les capteurs.
 +
 
 +
 
 +
 
  
 
== Séance 3 ==
 
== Séance 3 ==
Ligne 123 : Ligne 127 :
 
<pre> http://glovespad.glovespad.org/Music.php </pre>
 
<pre> http://glovespad.glovespad.org/Music.php </pre>
  
La page servira d'accueil et permettra la reception de fichier. En effet, c'est dans cette page qu'on importera les fichiers sonores par le biais d'un formulaire HTML qui enverra le fichier vers une page de reception (reception.php), qui vérifiera la compatibilité de type de fichiers et qui stockera dans une base de données les sons.
+
La page servira d'accueil et permettra la reception de fichier. En effet, c'est dans cette page qu'on importera les fichiers sonores par le biais d'un formulaire HTML qui enverra le fichier vers une page de reception (reception.php), qui vérifiera la compatibilité de type de fichiers (wav ou mp3) et qui stockera dans une base de données les sons.
  
 
<pre>  
 
<pre>  
Ligne 153 : Ligne 157 :
  
 
</html> </pre>
 
</html> </pre>
 +
  
 
==== Partie Électronique  ====
 
==== Partie Électronique  ====
Ligne 162 : Ligne 167 :
  
  
[[Fichier:schématique.png]]
+
[[Fichier:schématique.png|vignette|center|600px|Schématique du shield]]
 +
 
  
  
Ligne 168 : Ligne 174 :
  
  
[[Fichier:pcb.png]]
+
[[Fichier:pcb.png|vignette|center|600px|Visuel du PCB]]
  
  
Ligne 178 : Ligne 184 :
 
* L'assemblage de notre système final et les différents tests sur notre GlovesPad
 
* L'assemblage de notre système final et les différents tests sur notre GlovesPad
  
== Séance complémentaire ==
 
  
Comment nous n'avions pas eu le temps de finir le GlovesPad durant les séances prévus, nous avons donc dû continué ce projet durant notre temps libre. Ces séances complémentaires ce sont donc étalés sur toute la fin de l'année  
+
 
 +
 
 +
== Séances complémentaires ==
 +
 
 +
 
 +
Les séances prévues pour le projet ne nous ont pas permis d'arriver à nos objectifs finaux.
 +
En effet, pour la partie informatique, la configuration de la Raspberry nous a pris plus de temps que prévu. Le site doit être encore amélioré afin de générer les sons lors de l'appui des piézos, et gérer les importations utilisateur.
 +
D'un point de vue électronique, le futur shield se devait de communiquer avec les piezos et l'arduino.
 +
Il nous sera donc nécessaire de programmer des séances supplémentaires individuelles ou de groupe durant notre temps libre afin de continuer l'élaboration du projet.
 +
Ces séances complémentaires s'étaleront jusqu'à la fin de l'année.
  
 
===  Soudure des composants  ===
 
===  Soudure des composants  ===
Ligne 190 : Ligne 204 :
 
Suite à ces tests préliminaires nous nous sommes lancés dans la soudure. Tout d'abord nous avons commencé par souder les broches métalliques qui nous serviront à connecter le shield directement à l'Arduino. Ensuite nous avons soudé les 5 résistances d'1 MOhms chacune. Enfin nous avons terminé par souder les capteurs sur la carte électronique. Cependant cette étape nous a prit un peu plus de temps car nous avons reçu des piézoélectriques nus, nous avons donc du souder des fils de connexion de longueur adaptée sur ceux-ci. Voici un aperçu du résultat final de cette étape de soudure :
 
Suite à ces tests préliminaires nous nous sommes lancés dans la soudure. Tout d'abord nous avons commencé par souder les broches métalliques qui nous serviront à connecter le shield directement à l'Arduino. Ensuite nous avons soudé les 5 résistances d'1 MOhms chacune. Enfin nous avons terminé par souder les capteurs sur la carte électronique. Cependant cette étape nous a prit un peu plus de temps car nous avons reçu des piézoélectriques nus, nous avons donc du souder des fils de connexion de longueur adaptée sur ceux-ci. Voici un aperçu du résultat final de cette étape de soudure :
  
[[Fichier:soudure1.png]]
 
  
[[Fichier:soudure2.png]]
 
  
[[Fichier:soudure3.png]]
+
[[Fichier:soudure1.png]] [[Fichier:soudure3.png]] [[Fichier:soudure2.png]]
 +
 
 +
 
 +
=== Communication entre Arduino et Raspberry ===
 +
 
 +
Afin de faire fonctionner le dispositif correctement, il est impératif de faire communiquer par série l'Arduino et la Raspberry. En effet, la reception série sera effectuée par le serveur par le biais de l'API Websocket permettant la transmission ou la reception d'un message client-serveur.
 +
 
 +
Lors du lancement de la Raspberry, le système devra lancer en tâche de fond un programme qui permette la communication web-série en ouvrant les ports de communication nécessaires de la Raspberry (ici le port 9000). La communication sera faîte à une vitesse de 9600 bauds et sera paramétrée pour communiquer avec l'entrée USB ACM0 (port USB en haut à droite). Le programme Webserial fourni nous sera donc utile, ne sera pas indispensable de le modifier (sauf l'entrée USB si nécessaire qui peut varier en fonction des Raspberry) et sera lancé directement par commande bash (modification du bash-rc).
 +
 
 +
<pre> /./etc/webserial/webserial & </pre>
 +
 
 +
On programmera l'Arduino de sorte qu'une vérification de l'état des capteurs se fasse. On vérifie de manière bouclée l'état de chacun de capteur. Pour chaque capteur, on stock dans un bit d'un mot son état (5 capteurs, 5 bits de poids faible). Ce même mot sera envoyé tous les temps T (afin de ne pas saturer le serial port, on prendra T = 50ms). Si aucun capteur ne detecte de pression, il ne sera pas nécessaire d'envoyer de message. Sinon, si le ou les mêmes capteurs que l'itération précédente sont détéctés, on vérifie tous les temps T' (T'=200ms). En effet, on risque d'avoir une répétition des messages envoyés ce qui peut comme dans le cas précédent saturer le port série.
 +
 
 +
On considère que la pression est détectée si le CAN de l'arduino renvoie une valeur supérieure à un threshhold qu'on aura établi avant la compilation du programme.
 +
 
 +
On rajoute une fonction supplémentaire, qui prévient de l'activité continuelle de l'Arduino, signalant au serveur qu'il est troujours actif.
 +
Cette partie de code peut être utile pour signaler à l'utilisateur de la mise en fonctionnement correcte de l'Arduino et/ou de la communication série.
 +
Le serveur pourra interpréter le message comme message d'information en lisant la valeur du bit le plus fort.
 +
 
 +
Voici le code Arduino :
 +
<pre>
 +
#define capteur1    A1
 +
#define capteur2    A2
 +
#define capteur3    A3
 +
#define capteur4    A4
 +
#define capteur5    A5
 +
#define LTCY_MSR_DELAY 1000
 +
#define CAPT_DELAY 50
 +
#define CAPT_RPT_DELAY 500
 +
#define THRESHHOLD 400
 +
 
 +
 
 +
// Horloge principale
 +
unsigned long main_clock;
 +
 
 +
// Temps lors de la dernière transmission des valeurs
 +
unsigned long last_capt;
 +
 
 +
// Temps lors de la dernière transmission de vérification
 +
unsigned long last_sent;
 +
 
 +
void setup(void)
 +
{
 +
  main_clock = millis();
 +
 
 +
  last_capt = main_clock;
 +
 
 +
  last_sent = main_clock;
 +
 
 +
  Serial.begin(9600);
 +
 
 +
  pinMode(capteur1,INPUT);
 +
  pinMode(capteur2,INPUT);
 +
  pinMode(capteur3,INPUT);
 +
  pinMode(capteur4,INPUT);
 +
  pinMode(capteur5,INPUT);
 +
 
 +
}
 +
 
 +
void verif_serial()
 +
{
 +
  if(main_clock-last_sent > LTCY_MSR_DELAY)
 +
  {
 +
    // On envoie sur le bit le plus fort la valeur 1 afin de vérifier le fonctionnement de la connexion série
 +
    Serial.write(0x80);
 +
    last_sent = main_clock;
 +
  }
 +
}
 +
 
 +
void loop(void)
 +
{
 +
 
 +
  main_clock = millis();
 +
 
 +
 
 +
  unsigned char capteurs=0, old_capteurs=0;
 +
 
 +
  // On vérifie pour chaque capteur si la pression est supérieure au threshhold défini dans la directive de prép.
 +
  if(analogRead(capteur1)>THRESHHOLD)
 +
    capteurs |= 0x01;
 +
 
 +
  if(analogRead(capteur2)>THRESHHOLD)
 +
    capteurs |= 0x02;
 +
 
 +
  if(analogRead(capteur3)>THRESHHOLD)
 +
    capteurs |= 0x04;
 +
 
 +
  if(analogRead(capteur4)>THRESHHOLD)
 +
    capteurs |= 0x08;
 +
 
 +
  if(analogRead(capteur5)>THRESHHOLD)
 +
    capteurs |= 0x10;
 +
 
 +
 
 +
  // On vérifie si les capteurs sont pressés et que le délai de récupération est réspecté (50ms)
 +
  if(capteurs!=0 && (main_clock-last_capt)>CAPT_DELAY)
 +
  {
 +
    // On vérifie en outre si il n'y a pas répétition, sinon, on doit respecter le délai de récupération pour un appui répété (200ms)
 +
    if((main_clock-last_capt)>CAPT_RPT_DELAY && capteurs==old_capteurs || capteurs!=old_capteurs)
 +
    {
 +
      last_capt=main_clock;
 +
      Serial.write(capteurs);
 +
    }
 +
  }
 +
 
 +
  old_capteurs=capteurs; 
 +
 
 +
  verif_serial();
 +
 
 +
}</pre>
 +
 
 +
 
 +
La solution présente néanmoins ses limites. En effet, sachant que le programme Arduino fait appel à un threshhold "informatique" et n'a besoin de vérifier que deux états, la reception par l'Arduino du signal analogique peut se voir comme "plus gourmande" qu'un signal tout ou rien (digitalRead), ce qui pourrait conduire à des problèmes de latences lors de la mise en pression d'un piezo. Bien que dans notre cas, au vu du nombre peu élevé de capteurs et de la non-complexité du programme, les latences ne seraient pas distinguables à l'echelle humaine, nous aurions tout de même pu réflechir à une solution différente d'un point de vue électronique (l'utilisation de potentiomètres par exemple).
  
 
=== Réalisation du site de l'application GlovesPad ===
 
=== Réalisation du site de l'application GlovesPad ===
 +
 +
Le site est composé de plusieurs pages.
 +
On modifie la page d'accueil afin de lui apporter un rendu plus épuré que le fond blanc basique. On passe par du CSS qui apporte le rendu nécessaire et on rajoute un logo (qui sera le logo du projet).
 +
La page aura une partie script Javascript mais uniquement pour l'aspect esthétique et simplifiant le travail de l'utilisateur.
 +
 +
[[Fichier:Logo_glovespad.png|vignette|center|300px|Logo du site]]
 +
 +
 +
La page proposera à l'utilisateur d'importer des fichiers audio par le biais d'un formulaire HTML. Ce dernier soumis, il vous renverra vers une page PHP qui, si le format et la taille du fichier respecte les conditions d'import, ajoutera le fichier sonore au serveur. À contrario, la page affichera un message d'erreur.
 +
Si le fichier existe déjà dans la base de données (ou du moins un fichier avec le même nom), le protocole php incrémentera une valeur X tel qu'on ait [nomfichierX.extension] jusqu'à ce qu'il ne trouve aucun fichier du même nom, ce qui permet d'éviter d'écraser des fichiers déjà existants.
 +
 +
[[Fichier:SitePageAccueil.png|vignette|left|300px|Page d'accueil]]
 +
 +
 +
La page d'accueil propose à l'utilisateur aussi d'aller sur la page Sound Player, qui est le nerf central du site. C'est en effet là que l'utilisateur peut jouer ses sons à l'aide de son GlovesPad.
 +
 +
 +
Voici le protocole javascript de la page :
 +
* On stocke les sons disponibles dans une variable et on vérifie pour chaque son si il a le format compatible (bien que le serveur vérifie lors de l'import, un fichier peut avoir été mis manuellement
 +
* On lance le script rhythm.js. Ce script se base sur l'API WebAudio de Mozilla et provient du site [http://webaudioapi.com/samples/ WebAudioApi Samples] (script DrumKit Rhythm). Le script de ce sample a été utilisé et adapté afin qu'il respecte nos demandes.
 +
* On lance le script enregistrer.js. Ce script a été créé par nos soins et permet de stocker dans une table de séquence (un objet map javascript avec pour clé un temps en secondes et pour valeur, le chemin du fichier sonore). Lors de l'appel de la fonction record_sound, on enregistre le son et le temps pris en paramètre dans cette table. On créé aussi un objet javascript RhythmRecorded qui permettra d'enregistrer une suite de sons à des temps donnés
 +
* On instancie notre websocket en mode série, ouvert sur le port série de la Raspberry
 +
* Pour chaque bouton correpondant au doigt (bouton de son), on actualise la liste sonore avec les sons de la base de données
 +
* On vérifie l'appui de touches utiles au fonctionnement du site. Bien qu'on ait offert la possibilité de jouer les sons avec des touches clavier, ce n'est pas dans l'objectif du projet et ces touches n'ont été mis en place qu'à but de test.
 +
* On vérifie la réception de message par le websocket et on interprète en jouant les sons correspondants aux messages.
 +
* On vérifie les interactions avec les différents éléments du site (boutons, liens, listes de selections, barres de volume etc...) et on les interprètes.
 +
 +
 +
 +
[[Fichier:SiteSoundPlayers.png|vignette|right|300px|Page "Sounds Player"]]
 +
 +
 +
Voici ce que la page permet à l'utilisateur :
 +
* Choisir les sons pour chaque doigt
 +
* Modifier le volume de chaque doigt
 +
* Jouer le son pour chaque doigt
 +
* Enregistrer la partition sonore jouée
 +
* Lancer la partition enregistrée
 +
* On peut en plus enregistrer et lancer en même temps afin de jouer dans le rythme
 +
 +
 +
 +
Le système est similaire au clavier synthétiseur MiDi des années 90. En effet, il n'y a pas de système de répétition en boucle (bien qu'on aurait pu l'ajouter) et l'utilisateur se doit de jouer de manière continue les sons.
 +
Une autre limite : en cas d'erreur de l'utilisateur (appui d'une mauvaise touche par exemple), il est obligé d'actualiser la page afin de recommencer. On aurait pu ajouter un bouton afin d'annuler la dernière modification (on prend les x derniers éléments ajoutés sur la séquence temporelle, rangés dans l'ordre d'ajout, et on les supprime)
 +
Enfin, on aurait pu ajouter plusieurs enregistreurs.
 +
 +
 +
La structure Javascript complète, l'ensemble des fichiers Web ainsi que des commentaires plus détaillés sont disponibles dans l'archive jointe en annexe.
  
 
=== Conception 3D ===
 
=== Conception 3D ===
Ligne 202 : Ligne 374 :
 
Afin de rendre notre GlovesPad portatif et qu'il facilite  les mouvements de la main, nous avons eu l'idée de réaliser un support que nous fixerons au bras pour rendre le système portatif. Tout d'abord nous avions penser à réaliser une boîte dans laquelle nous aurions introduit la raspberry, l'arduino et notre shield. Cependant ceci aurait été trop encombrant alors nous avons eu l'idée de simplement modéliser un support sur lequel nous fixerons nos différents composants. Nous avons donc prit les mesures des éléments que nous placerons sur le support et nous commençons à dessiner quelques croquis pour la modélisation.  
 
Afin de rendre notre GlovesPad portatif et qu'il facilite  les mouvements de la main, nous avons eu l'idée de réaliser un support que nous fixerons au bras pour rendre le système portatif. Tout d'abord nous avions penser à réaliser une boîte dans laquelle nous aurions introduit la raspberry, l'arduino et notre shield. Cependant ceci aurait été trop encombrant alors nous avons eu l'idée de simplement modéliser un support sur lequel nous fixerons nos différents composants. Nous avons donc prit les mesures des éléments que nous placerons sur le support et nous commençons à dessiner quelques croquis pour la modélisation.  
  
[[Fichier:dessin1.png]]
 
  
[[Fichier:dessin2.png]]
+
[[Fichier:dessin1.png]] [[Fichier:dessin2.png]]
 +
 
  
 
En effet, le support se divise en deux partie, une partie sur laquelle nous fixerons la raspberry à l'aide de vis et l'autre nous aurons un système rail dans lesquels nous viendrons insérer l'Arduino et le shield. Sur la partie inférieur du support nous pourrons retrouver une fente dans laquelle nous viendrons ajouter une sangle ou un scratch pour fixer le support sur notre bras.  
 
En effet, le support se divise en deux partie, une partie sur laquelle nous fixerons la raspberry à l'aide de vis et l'autre nous aurons un système rail dans lesquels nous viendrons insérer l'Arduino et le shield. Sur la partie inférieur du support nous pourrons retrouver une fente dans laquelle nous viendrons ajouter une sangle ou un scratch pour fixer le support sur notre bras.  
  
 
Voici quelques aperçu de la modélisation 3D du support à l'aide du site internet tinkercad.com :  
 
Voici quelques aperçu de la modélisation 3D du support à l'aide du site internet tinkercad.com :  
 +
  
 
[[Fichier:modelisation.png]]
 
[[Fichier:modelisation.png]]
  
 
=== Assemblage du système et tests ===
 
=== Assemblage du système et tests ===
 +
 +
On a fixé sur le gant les capteurs piézo. On utilise un bracelet à velcro ainsi que le support imprimé en 3D afin de mettre en commun les cartes éléctroniques et les fixer.
 +
Petite attention : les capteurs piézo étant plats et les fils fin, la soudure est fragile. Il faudra donc mettre le gant avec delicatesse.
 +
 +
 +
[https://www.youtube.com/watch?v=5kJ4_e9puJ0&feature=youtu.be Vidéo du test]
 +
 +
On observe diverses latences, qui peuvent être dues à la connexion WiFi.
  
 
=<div class="mcwiki-header" style="border-radius: 15px; padding: 10px; font-weight: bold; text-align: center; font-size: 80%; background: #EEEEFF; vertical-align: top; width: 99%;">  Bilan du projet </div>=
 
=<div class="mcwiki-header" style="border-radius: 15px; padding: 10px; font-weight: bold; text-align: center; font-size: 80%; background: #EEEEFF; vertical-align: top; width: 99%;">  Bilan du projet </div>=
 +
 +
 +
Nous avons pu voir l'aspect et l'apport de la mise en connexion de différents dispositifs qui sont complémentaires les uns les autres afin de répondre à notre cahier des charges. En effet, l'Arduino avec le Shield ont permis d'interpréter les intéractions avec notre environnement (percussions) et de les communiquer à un serveur afin d'en avoir une interprétation visuelle.
 +
Bien que la conception éléctronique soit assez simple, elle est grandement suffisante et répond parfaitement à toutes les contraintes imposées par le cahier des charges. Néanmoins, la configuration informatique-éléctronique peut être grandement optimisée afin d'augmenter la performance du système (utilisation d'un threshold éléctronique au lieu d'une définition dans les directives de préprocess).
 +
La simplicité de la communication Arduino-Raspberry a néanmoins été compensée par la communication Raspberry-Utilisateur. En effet, bien que plusieurs options peuvent être ajoutées (musique en boucle, enregistrement dans un fichier), un certain nombre de fonctionnalités non négligeables ont été apportées au site permettant tout de même une utilisation correcte.
 +
Enfin, que ce soit dans l'aspect matériel ou web, une attention particulière a été apportée à l'esthétique.
 +
 +
Ainsi, ce projet a été pour nous un moyen de mettre à profit nos connaissances de cette année afin de peut-être répondre à des sujets qui se rapprocheront de l'année à venir.
 +
 +
=<div class="mcwiki-header" style="border-radius: 15px; padding: 10px; font-weight: bold; text-align: center; font-size: 80%; background: #EEEEFF; vertical-align: top; width: 99%;">  Annexe </div>=
 +
 +
L'ensemble des fichiers utiles sont dans l'archive [[:Fichier:ProjetSC GlovesPad.zip|ProjetSC]].
 +
La partie Web sera dans le dossier WebFiles.
 +
La partie Arduino sera dans le dossier ArduinoFile.
 +
 +
Un fichier LISEZMOI sera dans le dossier /home/pi/ de la Raspberry et comportera la notice d'utilisation du GlovesPad.

Version actuelle datée du 26 juin 2018 à 00:00

Projet IMA3-SC 2017/2018 - GlovesPad Project

Description du système et cahier des charges

Étant passionnés de musique mais également d'électronique et d'informatique, nous avions eu l'idée de reproduire le principe du traditionnel Launchpad. Le LaunchPad est une planche de boutons, dont la fonction de chacun est de jouer un son, afin de composer une suite musicale, dans le même principe qu'une boîte à rythme. Cependant nous voulions trouver quelque chose d'innovant pour pouvoir jouer nos sons préférés. L'idée principale de ce projet était donc de créer un gant doté de capteurs piézoélectriques sur chaque doigt connecté à une Arduino, elle même connectée à une Raspberry PI 2 qui servira de point d'accès pour smartphone qui lui produira le son lors de la pression des capteurs.

L'utilisateur pourra choisir le son qu'il voudra produire à l'aide du smartphone. Il aura donc à sa disposition 5 sons différents, un pour chaque doigt.


Ceci serait la première idée du projet mais son évolution pourrait se diriger vers une multiplication des capteurs et les disposer sur le corps afin de jouer sur une plus grande base sonore un peu comme dans la vidéo ci-dessous:

--> Homme klaxon

Matériel nécessaire

Le matériel que nous utiliserons est le suivant :

  • Raspberry Pi 2
  • Arduino UNO
  • 5 capteurs piézoélectriques
  • Smartphone
  • 5 résistances d'1 MOhms chacune
  • Un gant
  • Un shield (PCB pour l'arduino)
  • Des fils de connexion

Journal de bord

Séance 1

La première étape de ce projet, et peut-être l'une des plus difficile, était la détermination du sujet. Nous nous sommes cependant rapidement mit d'accord sur l'idée du Gloves Pad et nous avons ensuite réfléchis au au matériel nécessaire à la réalisation du projet et à la répartition des tâches.

Nous nous sommes fortement inspiré du Lauchpad qui est un Pad de forme carrée composée de boutons qui permettent de jouer un son différent à chaque bouton. Les sons sont prédéfinis auparavant par l'utilisateur. Voici à quoi ressemble le Launchpad.

Launch.jpg

Notre projet sera donc une forme dérivée du Lauchpad qui permettrait de jouer sans Pad et sur n'importe quelle surface.

Partie Informatique

Première approche sur la configuration de la Raspberry comme un point d'accès Wi-Fi pour la connexion avec le smartphone qui servira à la configuration des sons que l'on veut jouer.

Pour cela un tutoriel était mis à notre disposition: [1]

Le premier objectif qu'on se fixe pour la Raspberry est la configuration des différentes connexions qui nous seront utiles à la conception du serveur.

Après les différentes mises à jour de la distribution Raspbian, on paramètre la Raspberry pour pouvoir se connecter en ssh, afin de ne pas passer perpétuellement par le port série.

On configure l'adresse de domaine sur 10.12.92.10 pour la Raspberry. On se connectera en SSH avec la commande suivante :

 ssh pi@10.12.92.10 

On commencera la configuration du point d'accès et de l'IP Wi-Fi qui permettra à l'utilisateur de se connecter tel que le tutoriel mis à disposition nous le propose.

Partie Électronique

Premièrement, nous avons réfléchis à la manière dont nous procéderons pour détecter les mouvements et les appuis de chaque doigt. Puis nous avons eu l'idée d'utiliser des capteurs piézoélectriques. Alors nous avons tout d’abord cherché à comprendre le fonctionnement des capteurs piézoélectriques qui serviront à la détection de la pression d'un doigt sur une surface pour jouer un son.


Voici à quoi ressemble un capteur piézoélectrique:

PiezoDisk.jpg


Le capteur piézoélectrique présent ci-dessus utilise l'effet piézoélectrique. La piézoélectricité est la propriété que possèdent certains corps de se polariser électriquement sous l’action d’une contrainte mécanique et réciproquement de se déformer lorsqu’on leur applique un champ électrique. Les deux effets sont indissociables. Le premier est appelé effet piézoélectrique direct; le second effet piézoélectrique inverse. Dans notre cas le capteur piézoélectrique se polarisera lors d'un contact et permettra d'envoyer un signal électrique à l'un des ports de l'Arduino.



Séance 2

Au cours de cette deuxième séance nous avons séparé le travail en deux. Un groupe travail sur la configuration de la Raspberry en point d'accès et l'autre groupe travail sur les piézoélectriques et leur fonctionnement.

Partie Informatique

Poursuite de la configuration de la Raspberry en point d’accès. On finit la configuration du point d'accès, du nom réseau et du mot de passe (protocole de sécurité WPA)

Nom : GlovesPad

Mot de Passe : NarutoUzumaki

Partie Électronique

Nous nous sommes documenté sur internet et pour utiliser correctement les capteurs nous avons donc câblé notre Arduino, une résistance et le piézoélectrique sur une plaque de test ce qui nous a permis de comprendre le fonctionnement du capteur grâce à un petit programme Arduino mis en place.

Voici le schéma de câblage:


ArduinoPiezoTest.png

ArduinoPiezoTest2.png


Voici l'élaboration d'un programme de test Arduino qui à pour but de tester et de comprendre le fonctionnement des capteurs piézoélectrique (Voir le branchement ci-dessus) :


ProgrammeTestArduino.png


La fonction void setup() nous permet d'utiliser le port série de l'Arduino. Dans la fonction void loop(), analogRead(CAPTEUR) nous permet de lire et d'entrer dans la variable lectureCapteur la valeur lue sur le port correspondant à la variable CAPTEUR. Puis nous testons si la valeur lue est positive et affichons cette valeur dans un terminal à l'aide de la fonction Serial.println.

À la fin de cette séance nous avons donc compris le fonctionnement des capteurs piézoélectriques et la façon dont il fallait les connecter. Lors de la prochaine séance nous procéderons à l'élaboration du Shield sur lequel nous retrouverons les capteurs.



Séance 3

Partie Informatique

Durant cette séance, on finalisera la configuration de la Raspberry. On procédera à l'installation d'un serveur Web, fonctionnant sous Apache. Après la création du serveur, on créé ce qui sera la première page du site, page d'index qui renverra directement sur la page d'accueil du site web.

 http://glovespad.glovespad.org/ 

La page renverra directement vers :

 http://glovespad.glovespad.org/Music.php 

La page servira d'accueil et permettra la reception de fichier. En effet, c'est dans cette page qu'on importera les fichiers sonores par le biais d'un formulaire HTML qui enverra le fichier vers une page de reception (reception.php), qui vérifiera la compatibilité de type de fichiers (wav ou mp3) et qui stockera dans une base de données les sons.

 
<!DOCTYPE html>

<html>

  <head>

    <link rel="stylesheet" href="style.css">

    <title>Music</title>

  </head>

  <body>

    <form action="reception.php" method="post" enctype="multipart/form-data">

      <input type="file" name="soundImport"/><br>

      <input type="submit" name="Importer"/>

    </form><br><br>

    <a href="sounds_player.php">Sounds Player</a>

  </body>

</html> 


Partie Électronique

Lors de cette séance nous avons réaliser le shield pour notre Arduino à l'aide du logiciel Fritzing. Le principe de notre shield est assez simple, il effectuera la liaisons entre les 5 broches analogique de l'Arduino et les 5 capteurs piézoélectriques ainsi que la broche de la masse de l'Arduino et les masses des capteurs. Le shield sera composé de 5 capteurs placés en parallèles à 5 résistances qui permettent de limiter le courant envoyé aux broches de l'Arduino.


Tout d'abord nous avons réalisé la vue schématique de notre shield, c'est à dire le schéma des différentes connections entre les différents composants de celui-ci. Voici ci-dessus un aperçu de notre schématique :


Schématique du shield


Une fois le schématique terminé, nous avons procédé à l'élaboration du PCB, c'est à dire à la disposition des composants tels qu'ils seront sur la plaque électronique lors de l'impression de celle-ci. Nous avons tenté de faire un shield assez petit pour ne pas trop encombrer notre système. De plus, il ne fallait pas que les pistes se croisent ou qu'elles ne forment des angles droits. Voici un visuel de notre PCB final avant impression :


Visuel du PCB


Cette séance numéro trois étant la dernière, nous serons obligé de trouver d'autres créneaux afin de poursuivre ce projet. Nous procéderons donc à des séances complémentaires au cours desquelles nous réaliserons :

  • La soudure des composants sur le shield (résistances, capteurs piézoélectriques)
  • Un site internet ou de l'application qui permettra d'utiliser notre GlovesPad
  • Un support que nous pourrons attacher au bras et sur lequel nous retrouverons notre système Arduino/Raspberry
  • L'assemblage de notre système final et les différents tests sur notre GlovesPad



Séances complémentaires

Les séances prévues pour le projet ne nous ont pas permis d'arriver à nos objectifs finaux. En effet, pour la partie informatique, la configuration de la Raspberry nous a pris plus de temps que prévu. Le site doit être encore amélioré afin de générer les sons lors de l'appui des piézos, et gérer les importations utilisateur. D'un point de vue électronique, le futur shield se devait de communiquer avec les piezos et l'arduino. Il nous sera donc nécessaire de programmer des séances supplémentaires individuelles ou de groupe durant notre temps libre afin de continuer l'élaboration du projet. Ces séances complémentaires s'étaleront jusqu'à la fin de l'année.

Soudure des composants

Après avoir reçu notre carte électronique, nous procédons à des tests afin de voir si il n’y aucun problème avant de commencer à souder les composants sur celle-ci.

Ces tests consiste à voir si les pistes sont toutes correctement tracées et si il n’y a pas de court-circuit. Pour ce faire, nous utilisons un multimètre que nous réglons sur un mode qui va permettre d’identifier si deux pistes sont interconnectées (si tel est le cas il y a court-circuit).

Suite à ces tests préliminaires nous nous sommes lancés dans la soudure. Tout d'abord nous avons commencé par souder les broches métalliques qui nous serviront à connecter le shield directement à l'Arduino. Ensuite nous avons soudé les 5 résistances d'1 MOhms chacune. Enfin nous avons terminé par souder les capteurs sur la carte électronique. Cependant cette étape nous a prit un peu plus de temps car nous avons reçu des piézoélectriques nus, nous avons donc du souder des fils de connexion de longueur adaptée sur ceux-ci. Voici un aperçu du résultat final de cette étape de soudure :


Soudure1.png Soudure3.png Soudure2.png


Communication entre Arduino et Raspberry

Afin de faire fonctionner le dispositif correctement, il est impératif de faire communiquer par série l'Arduino et la Raspberry. En effet, la reception série sera effectuée par le serveur par le biais de l'API Websocket permettant la transmission ou la reception d'un message client-serveur.

Lors du lancement de la Raspberry, le système devra lancer en tâche de fond un programme qui permette la communication web-série en ouvrant les ports de communication nécessaires de la Raspberry (ici le port 9000). La communication sera faîte à une vitesse de 9600 bauds et sera paramétrée pour communiquer avec l'entrée USB ACM0 (port USB en haut à droite). Le programme Webserial fourni nous sera donc utile, ne sera pas indispensable de le modifier (sauf l'entrée USB si nécessaire qui peut varier en fonction des Raspberry) et sera lancé directement par commande bash (modification du bash-rc).

 /./etc/webserial/webserial & 

On programmera l'Arduino de sorte qu'une vérification de l'état des capteurs se fasse. On vérifie de manière bouclée l'état de chacun de capteur. Pour chaque capteur, on stock dans un bit d'un mot son état (5 capteurs, 5 bits de poids faible). Ce même mot sera envoyé tous les temps T (afin de ne pas saturer le serial port, on prendra T = 50ms). Si aucun capteur ne detecte de pression, il ne sera pas nécessaire d'envoyer de message. Sinon, si le ou les mêmes capteurs que l'itération précédente sont détéctés, on vérifie tous les temps T' (T'=200ms). En effet, on risque d'avoir une répétition des messages envoyés ce qui peut comme dans le cas précédent saturer le port série.

On considère que la pression est détectée si le CAN de l'arduino renvoie une valeur supérieure à un threshhold qu'on aura établi avant la compilation du programme.

On rajoute une fonction supplémentaire, qui prévient de l'activité continuelle de l'Arduino, signalant au serveur qu'il est troujours actif. Cette partie de code peut être utile pour signaler à l'utilisateur de la mise en fonctionnement correcte de l'Arduino et/ou de la communication série. Le serveur pourra interpréter le message comme message d'information en lisant la valeur du bit le plus fort.

Voici le code Arduino :

#define capteur1    A1
#define capteur2    A2
#define capteur3    A3
#define capteur4    A4
#define capteur5    A5
#define LTCY_MSR_DELAY 1000 
#define CAPT_DELAY 50
#define CAPT_RPT_DELAY 500
#define THRESHHOLD 400


// Horloge principale
unsigned long main_clock;

// Temps lors de la dernière transmission des valeurs
unsigned long last_capt;

// Temps lors de la dernière transmission de vérification
unsigned long last_sent;

void setup(void)
{
  main_clock = millis();
  
  last_capt = main_clock;

  last_sent = main_clock;
  
  Serial.begin(9600);

  pinMode(capteur1,INPUT);
  pinMode(capteur2,INPUT);
  pinMode(capteur3,INPUT);
  pinMode(capteur4,INPUT);
  pinMode(capteur5,INPUT);

}

void verif_serial()
{
  if(main_clock-last_sent > LTCY_MSR_DELAY)
  {
    // On envoie sur le bit le plus fort la valeur 1 afin de vérifier le fonctionnement de la connexion série
    Serial.write(0x80);
    last_sent = main_clock;
  }
}

void loop(void)
{
  
  main_clock = millis();
  
  
  unsigned char capteurs=0, old_capteurs=0;

  // On vérifie pour chaque capteur si la pression est supérieure au threshhold défini dans la directive de prép.
  if(analogRead(capteur1)>THRESHHOLD) 
    capteurs |= 0x01;
  
  if(analogRead(capteur2)>THRESHHOLD) 
    capteurs |= 0x02;
  
  if(analogRead(capteur3)>THRESHHOLD) 
    capteurs |= 0x04;
  
  if(analogRead(capteur4)>THRESHHOLD) 
    capteurs |= 0x08;
  
  if(analogRead(capteur5)>THRESHHOLD) 
    capteurs |= 0x10;


  // On vérifie si les capteurs sont pressés et que le délai de récupération est réspecté (50ms)
  if(capteurs!=0 && (main_clock-last_capt)>CAPT_DELAY)
  {
    // On vérifie en outre si il n'y a pas répétition, sinon, on doit respecter le délai de récupération pour un appui répété (200ms) 
    if((main_clock-last_capt)>CAPT_RPT_DELAY && capteurs==old_capteurs || capteurs!=old_capteurs)
    {
      last_capt=main_clock;
      Serial.write(capteurs);
    }
  }
  
  old_capteurs=capteurs;  

  verif_serial();

}


La solution présente néanmoins ses limites. En effet, sachant que le programme Arduino fait appel à un threshhold "informatique" et n'a besoin de vérifier que deux états, la reception par l'Arduino du signal analogique peut se voir comme "plus gourmande" qu'un signal tout ou rien (digitalRead), ce qui pourrait conduire à des problèmes de latences lors de la mise en pression d'un piezo. Bien que dans notre cas, au vu du nombre peu élevé de capteurs et de la non-complexité du programme, les latences ne seraient pas distinguables à l'echelle humaine, nous aurions tout de même pu réflechir à une solution différente d'un point de vue électronique (l'utilisation de potentiomètres par exemple).

Réalisation du site de l'application GlovesPad

Le site est composé de plusieurs pages. On modifie la page d'accueil afin de lui apporter un rendu plus épuré que le fond blanc basique. On passe par du CSS qui apporte le rendu nécessaire et on rajoute un logo (qui sera le logo du projet). La page aura une partie script Javascript mais uniquement pour l'aspect esthétique et simplifiant le travail de l'utilisateur.

Logo du site


La page proposera à l'utilisateur d'importer des fichiers audio par le biais d'un formulaire HTML. Ce dernier soumis, il vous renverra vers une page PHP qui, si le format et la taille du fichier respecte les conditions d'import, ajoutera le fichier sonore au serveur. À contrario, la page affichera un message d'erreur. Si le fichier existe déjà dans la base de données (ou du moins un fichier avec le même nom), le protocole php incrémentera une valeur X tel qu'on ait [nomfichierX.extension] jusqu'à ce qu'il ne trouve aucun fichier du même nom, ce qui permet d'éviter d'écraser des fichiers déjà existants.

Page d'accueil


La page d'accueil propose à l'utilisateur aussi d'aller sur la page Sound Player, qui est le nerf central du site. C'est en effet là que l'utilisateur peut jouer ses sons à l'aide de son GlovesPad.


Voici le protocole javascript de la page :

  • On stocke les sons disponibles dans une variable et on vérifie pour chaque son si il a le format compatible (bien que le serveur vérifie lors de l'import, un fichier peut avoir été mis manuellement
  • On lance le script rhythm.js. Ce script se base sur l'API WebAudio de Mozilla et provient du site WebAudioApi Samples (script DrumKit Rhythm). Le script de ce sample a été utilisé et adapté afin qu'il respecte nos demandes.
  • On lance le script enregistrer.js. Ce script a été créé par nos soins et permet de stocker dans une table de séquence (un objet map javascript avec pour clé un temps en secondes et pour valeur, le chemin du fichier sonore). Lors de l'appel de la fonction record_sound, on enregistre le son et le temps pris en paramètre dans cette table. On créé aussi un objet javascript RhythmRecorded qui permettra d'enregistrer une suite de sons à des temps donnés
  • On instancie notre websocket en mode série, ouvert sur le port série de la Raspberry
  • Pour chaque bouton correpondant au doigt (bouton de son), on actualise la liste sonore avec les sons de la base de données
  • On vérifie l'appui de touches utiles au fonctionnement du site. Bien qu'on ait offert la possibilité de jouer les sons avec des touches clavier, ce n'est pas dans l'objectif du projet et ces touches n'ont été mis en place qu'à but de test.
  • On vérifie la réception de message par le websocket et on interprète en jouant les sons correspondants aux messages.
  • On vérifie les interactions avec les différents éléments du site (boutons, liens, listes de selections, barres de volume etc...) et on les interprètes.


Page "Sounds Player"


Voici ce que la page permet à l'utilisateur :

  • Choisir les sons pour chaque doigt
  • Modifier le volume de chaque doigt
  • Jouer le son pour chaque doigt
  • Enregistrer la partition sonore jouée
  • Lancer la partition enregistrée
  • On peut en plus enregistrer et lancer en même temps afin de jouer dans le rythme


Le système est similaire au clavier synthétiseur MiDi des années 90. En effet, il n'y a pas de système de répétition en boucle (bien qu'on aurait pu l'ajouter) et l'utilisateur se doit de jouer de manière continue les sons. Une autre limite : en cas d'erreur de l'utilisateur (appui d'une mauvaise touche par exemple), il est obligé d'actualiser la page afin de recommencer. On aurait pu ajouter un bouton afin d'annuler la dernière modification (on prend les x derniers éléments ajoutés sur la séquence temporelle, rangés dans l'ordre d'ajout, et on les supprime) Enfin, on aurait pu ajouter plusieurs enregistreurs.


La structure Javascript complète, l'ensemble des fichiers Web ainsi que des commentaires plus détaillés sont disponibles dans l'archive jointe en annexe.

Conception 3D

Afin de rendre notre GlovesPad portatif et qu'il facilite les mouvements de la main, nous avons eu l'idée de réaliser un support que nous fixerons au bras pour rendre le système portatif. Tout d'abord nous avions penser à réaliser une boîte dans laquelle nous aurions introduit la raspberry, l'arduino et notre shield. Cependant ceci aurait été trop encombrant alors nous avons eu l'idée de simplement modéliser un support sur lequel nous fixerons nos différents composants. Nous avons donc prit les mesures des éléments que nous placerons sur le support et nous commençons à dessiner quelques croquis pour la modélisation.


Dessin1.png Dessin2.png


En effet, le support se divise en deux partie, une partie sur laquelle nous fixerons la raspberry à l'aide de vis et l'autre nous aurons un système rail dans lesquels nous viendrons insérer l'Arduino et le shield. Sur la partie inférieur du support nous pourrons retrouver une fente dans laquelle nous viendrons ajouter une sangle ou un scratch pour fixer le support sur notre bras.

Voici quelques aperçu de la modélisation 3D du support à l'aide du site internet tinkercad.com :


Modelisation.png

Assemblage du système et tests

On a fixé sur le gant les capteurs piézo. On utilise un bracelet à velcro ainsi que le support imprimé en 3D afin de mettre en commun les cartes éléctroniques et les fixer. Petite attention : les capteurs piézo étant plats et les fils fin, la soudure est fragile. Il faudra donc mettre le gant avec delicatesse.


Vidéo du test

On observe diverses latences, qui peuvent être dues à la connexion WiFi.

Bilan du projet

Nous avons pu voir l'aspect et l'apport de la mise en connexion de différents dispositifs qui sont complémentaires les uns les autres afin de répondre à notre cahier des charges. En effet, l'Arduino avec le Shield ont permis d'interpréter les intéractions avec notre environnement (percussions) et de les communiquer à un serveur afin d'en avoir une interprétation visuelle. Bien que la conception éléctronique soit assez simple, elle est grandement suffisante et répond parfaitement à toutes les contraintes imposées par le cahier des charges. Néanmoins, la configuration informatique-éléctronique peut être grandement optimisée afin d'augmenter la performance du système (utilisation d'un threshold éléctronique au lieu d'une définition dans les directives de préprocess). La simplicité de la communication Arduino-Raspberry a néanmoins été compensée par la communication Raspberry-Utilisateur. En effet, bien que plusieurs options peuvent être ajoutées (musique en boucle, enregistrement dans un fichier), un certain nombre de fonctionnalités non négligeables ont été apportées au site permettant tout de même une utilisation correcte. Enfin, que ce soit dans l'aspect matériel ou web, une attention particulière a été apportée à l'esthétique.

Ainsi, ce projet a été pour nous un moyen de mettre à profit nos connaissances de cette année afin de peut-être répondre à des sujets qui se rapprocheront de l'année à venir.

Annexe

L'ensemble des fichiers utiles sont dans l'archive ProjetSC. La partie Web sera dans le dossier WebFiles. La partie Arduino sera dans le dossier ArduinoFile.

Un fichier LISEZMOI sera dans le dossier /home/pi/ de la Raspberry et comportera la notice d'utilisation du GlovesPad.