Projet IMA3 P4, 2017/2018, TD1 : Différence entre versions
(→Communication entre Arduino et Raspberry) |
(→Communication entre Arduino et Raspberry) |
||
Ligne 239 : | Ligne 239 : | ||
// Temps lors de la dernière transmission des valeurs | // Temps lors de la dernière transmission des valeurs | ||
unsigned long last_capt; | unsigned long last_capt; | ||
+ | |||
+ | // Temps lors de la dernière transmission de vérification | ||
+ | unsigned long last_sent; | ||
void setup(void) | void setup(void) | ||
Ligne 245 : | Ligne 248 : | ||
last_capt = main_clock; | last_capt = main_clock; | ||
+ | |||
+ | last_sent = main_clock; | ||
Serial.begin(9600); | Serial.begin(9600); | ||
Ligne 254 : | Ligne 259 : | ||
pinMode(capteur5,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; | ||
+ | } | ||
} | } | ||
Ligne 293 : | Ligne 308 : | ||
old_capteurs=capteurs; | old_capteurs=capteurs; | ||
+ | |||
+ | verif_serial(); | ||
}</pre> | }</pre> |
Version du 19 juin 2018 à 02:12
Sommaire
Projet IMA3-SC 2017/2018 - GlovesPad Project
-- Le Wiki sera complet pour le Mardi 19 Juin --
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. 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.
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:
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:
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) :
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.
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 :
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 :
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éliorer afin 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 :
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.
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 (l'utilisation de potentiomètres par exemple).
Réalisation du site de l'application GlovesPad
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.
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 :