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

De Wiki de Projets IMA
(Partie informatique)
Ligne 1 : Ligne 1 :
= Projet IMA3-SC 2017-2018 : prototype de main artificielle=
+
Projet IMA3-SC 2017-2018 : prototype de main artificielle=
  
 
== Description du projet ==
 
== Description du projet ==
Ligne 62 : Ligne 62 :
 
Ainsi, nous pouvons contrôler séparément les 2 capteurs grâce au nouveau programme établit : (programme)
 
Ainsi, nous pouvons contrôler séparément les 2 capteurs grâce au nouveau programme établit : (programme)
  
== Partie informatique ==
+
 
 
== Partie informatique ==
 
== Partie informatique ==
  
Ici nous présenterons la partie informatique, qui concerne notamment la communication entre l'Arduino et la Raspberry. Le projet initial visait à pouvoir contrôler une main via une application web ou des capteurs, mais aussi à recevoir les données desdits capteurs afin de présenter une modélisation virtuelle du système. Notre application web se présente donc en deux parties : celle gérant le mode ''application'' et celle gérant le mode ''capteurs''. Pour cela, deux pages ''.html'' sont crées afin de naviguer entre les différentes fonctions : notre fichier ''index.php'' nous présente deux liens, afin de nous diriger vers le mode voulu.  
+
Ici nous présenterons la partie informatique, qui concerne notamment la communication entre l'Arduino et la Raspberry. Le projet initial visait à pouvoir contrôler une main via une application web ou des capteurs, mais aussi à recevoir les données desdits capteurs afin de présenter une modélisation virtuelle du système. Notre application web se présente donc en deux parties : celle gérant le mode ''application'' et celle gérant le mode ''capteurs''. Pour cela, deux pages ''.html'' sont crées afin de naviguer entre les différentes fonctions : notre fichier ''index.php'' nous présente deux liens, afin de nous diriger vers le mode voulu : ''application'' ou ''capteurs''.  
  
 
*Partie application
 
*Partie application
Ici, le doigt est contrôlé via deux boutons, présents sur l'application, permettant d'ouvrir et de fermer le doigt. Pour cela, nous avons repris le code qui nous était fourni en exemple, que nous avons réadapté. Cette liaison série nous a présenté un premier problème : nous voulions pouvoir envoyer un caractère lors de l'appui sur un des deux boutons. Un 'f' déclencherait la partie du code sur l'Arduino correspondant pour "fermer" le doigt, de même avec un 'o' qui devait déclencher l'"ouverture" du doigt. Toutefois, nous nous sommes vite aperçu que l'envoi et le traitement de caractère était problématique. Nous avons donc vite décidé de simplement envoyer un entier : pour ouvrir le doigt, au lieu d'envoyer un 'o' (la 15e lettre de l'alphabet), nous enverrons un 15, et pour fermer nous enverrons un 6. Pour cela, nous passerons donc par la fonction ''sendMessage ()'' <br /> [[Fichier:SendMessageSerie.JPG]] <br /> Ainsi, nous passons grâce aux websockets l'ordre voulu. Il peut ainsi être traité par l'Arduino. Dans le body de notre page html, nous plaçons donc les deux boutons ouverture et fermeture qui utilisent la fonction ''sendMessage()'' : <br /> [[Fichier:BoutonAppli.JPG]] <br /><br />Il était initialement prévu de pouvoir naviguer directement d'un mode (appli/capteurs) à l'autre, cependant le code implanté sur l'Arduino impose d'envoyer une variable indiquant au système la fin d'un mode, nous imposant ainsi une nouvelle contrainte. En effet, on ne passe plus simplement d'une page à l'autre, mais lors de chaque appui sur un lien, cela interrompt le mode. Ainsi, nous avons ajouté des appels à la fonction ''sendMessage()'' dans toutes les balises '''<a>''' afin d'envoyer la valeur ''9'', permettant à l'Arduino de sortir du mode.
+
Ici, le doigt est contrôlé via deux boutons, présents sur l'application, permettant d'ouvrir et de fermer le doigt. Pour cela, nous avons repris le code qui nous était fourni en exemple, que nous avons réadapté. Cette liaison série nous a présenté un premier problème : nous voulions pouvoir envoyer un caractère lors de l'appui sur un des deux boutons. Un 'f' déclencherait la partie du code sur l'Arduino correspondant pour "fermer" le doigt, de même avec un 'o' qui devait déclencher l'"ouverture" du doigt. Toutefois, nous nous sommes vite aperçu que l'envoi et le traitement de caractère était problématique. Nous avons donc vite décidé de simplement envoyer un entier : pour ouvrir le doigt, au lieu d'envoyer un 'o' (la 15e lettre de l'alphabet), nous enverrons un 15, et pour fermer nous enverrons un 6. Pour cela, nous passerons donc par la fonction ''sendMessage ()'' <br /><br />
 +
<code> function sendMessage(ordre){websocket.send(ordre);}</code> <br /> <br />
 +
Ainsi, nous passons grâce aux websockets l'ordre voulu. Il peut ainsi être traité par l'Arduino. Dans le body de notre page html, nous plaçons donc les deux boutons ouverture et fermeture qui utilisent la fonction ''sendMessage()'' : <br /><br />
 +
<code>
 +
<button onclick="sendMessage(8);">Lancer la commande</button><br />
 +
<button onclick="sendMessage(15);">Ouverture</button><br />
 +
<button onclick="sendMessage(6);">Fermeture</button>
 +
</code>
 +
<br /><br />Il était initialement prévu de pouvoir naviguer directement d'un mode (appli/capteurs) à l'autre, cependant le code implanté sur l'Arduino impose d'envoyer une variable indiquant au système la fin d'un mode, nous imposant ainsi une nouvelle contrainte. En effet, on ne passe plus simplement d'une page à l'autre, mais lors de chaque appui sur un lien, cela interrompt le mode. Ainsi, nous avons ajouté des appels à la fonction ''sendMessage()'' dans toutes les balises '''<a>''' afin d'envoyer la valeur ''9'', permettant à l'Arduino de sortir du mode. Il suffit donc, une fois dans la page ''appli.html'', de lancer la commande puis de choisir le bouton ''ouvrir'' ou ''fermer'' afin de commander le doigt !<br />'''video'''<br />

Version du 16 juin 2018 à 13:47

Projet IMA3-SC 2017-2018 : prototype de main artificielle=

Description du projet

Cahier des charges

  • Reconnaissance d'un mouvement par la Rpi via l'accelerometre
  • Transmission du mouvement à l'arduino via bluetooth déclenchant le servomoteur
  • Visuel du mouvement sur serveur web
  • Bonus : Faire plusieurs doigts

Description du système

Des accelerometres sont fixés sur la main (le doigt d'abord) de l'utilisateur.
Detection d'un mouvement de doigt par les accelerometres.
Transmission du mouvement au servomoteur via l'arduino.
Transmission des informations a la Rpi pour la reproduction de mouvement sur serveur web.

Matériel nécessaire

  • 1 servomoteur
  • 1 accelerometre
  • 1 Rasberry Pi 2
  • 1 Arduino Uno

Séance 1 : Début du projet

Durant cette première séance, nous avons constitué les groupes te définit un sujet.
Nous avons pris connaissance des contraintes imposés par le projet.
Chacun de nous a commencé a se familiariser avec les différentes composantes du projet.
Brandon -> Arduino
Flora -> Rasberry
Florent -> Impression du doigt et recherches

Séance 2

Le doigt étant imprimé, nous nous sommes attelés à la conception du programme permettant de faire fonctionner celui-ci. L'objectif était de faire en sorte que, lors de l'envoi d'une donnée précise du capteur à l'Arduino, les servomoteurs suivent le mouvement indiqué par l'utilisateur. Nous pouvons décomposer les mouvements du doigt comme ceci : (images)

Par soucis du matériel et n'étant pas encore sûrs du montage final, nous avons préféré réaliser nos test à l'aide de 1 breadboard sur laquelle nous avons réalisé toutes les connectiques nécessaires à la communication entre l'ADXL et l'Arduino.

A l'issue de la séance, nous avons réussi à simuler le mouvement complet d'un doigt à l'aide d'un capteur comme vous pouvez le voir dans la vidéo ci-dessous : (vidéo)

Cependant, pour pouvoir être en accord avec l'idée de mouvement pré-établi plus haut, il est nécessaire d'ajouter un 2e capteur ADXL au montage. Peut-on contrôler 2 ADXL séparément à l'aide d'une seule carte Arduino ?L'objectif de la séance suivante sera donc de trouver un moyen d'inclure et contrôler le 2e ADXL.

Séance 3

Le but de cette séance fut de pouvoir améliorer notre montage et notre programme en y ajoutant un deuxième capteur. La tâche était assez compliquée dans la mesure où nous devions pouvoir contrôler les 2 capteurs indépendamment. En suivant le même principe que le montage précédent, nous avons pu rajouter le 2e capteur et procéder à des test similaires à ceux réaliser sur le précédent montage. Cependant, le montage était réalisé de telle sorte que les 2 ADXL soient interconnectés. Ainsi, les données relevées par l'un était une copie conforme de celle relevées par l'autre. Cela ne correspondait pas à nos attentes. Nous avons donc tenté de modifier notre programme afin de remédier à cela mais le problème persistait. La seule option possible était de revoir le schéma de montage. N'ayant pas eu suffisamment de temps pour le faire, nous nous sommes accordés à revoir ce soucis hors-séance afin d'achever notre projet.

Bilan

Activité électronique

Afin de réaliser notre projet tout en répondant notre cahier des charges, nous avons établit le montage suivant :

La masse (GND) du capteur doit être connectée à celle de l'Arduino. Les broches CS et 3.3V sont reliées à la pin 3.3V de l'Arduino, la broche CS étant étant reliée ainsi afin de faire comprendre à l'ADXL que nous l'utilisons en tant que I2C. Les broches SDA et SCL sont connectées aux pins analogiques A4 et A5 respectivement car la pin A4 de l'Arduino correspond au port série de données tandis que la pin A5 correspond au top d'horloge.

Nous nous sommes également procuré 2 LED et 2 servomoteurs pour servir de voyants repères et de simulation du mouvement respectivement, le tout conduisant au montage suivant : (image)

(Vous pouvez également voir le rendu vidéo en regardant celle qui se trouve partie Séance 2)

Pour pouvoir contrôler le mouvement de la seconde partie du doigt, il a été nécessaire de rajouter un 2e capteur ADXL345 (de même type). Ainsi, le premier capteur gère le mouvement de la base du doigt, tandis que le 2e s'occupe de celui de la partie supérieure.

Faisant suite aux problèmes signalés dans la partie Séance 3, nous avons revu le montage et établit le suivant : (image)

La pin SD0 de l'ADXL sert à la sélection de l'adresse de celui-ci. En effet, si on se réfère à la datasheet, l'ADXL dispose de 2 adresses internes qui sont sélectionnées selon l'état du pin SD0 : à l'état haut, c'est l'adresse 0x1D qui est sélectionnée; à l'état bas, c'est l'adresse 0x53 qui est sélectionnée.

Il suffit donc d'attribuer à chaque capteur l'une des 2 adresses. Pour ce faire, si on souhaite choisir l'adresse 0x1D de l'ADXL, il suffit de mettre la pin SD0 à l'état haut, soit le connecter au 3.3V de l'Arduino. À l'inverse, si on souhaite sélectionner l'adresse 0x53, on connecte le pin SD0 à la masse pour le mettre à l'état bas. Ce faisant, nous obtenons le montage suivant : (image)

Ainsi, nous pouvons contrôler séparément les 2 capteurs grâce au nouveau programme établit : (programme)


Partie informatique

Ici nous présenterons la partie informatique, qui concerne notamment la communication entre l'Arduino et la Raspberry. Le projet initial visait à pouvoir contrôler une main via une application web ou des capteurs, mais aussi à recevoir les données desdits capteurs afin de présenter une modélisation virtuelle du système. Notre application web se présente donc en deux parties : celle gérant le mode application et celle gérant le mode capteurs. Pour cela, deux pages .html sont crées afin de naviguer entre les différentes fonctions : notre fichier index.php nous présente deux liens, afin de nous diriger vers le mode voulu : application ou capteurs.

  • Partie application

Ici, le doigt est contrôlé via deux boutons, présents sur l'application, permettant d'ouvrir et de fermer le doigt. Pour cela, nous avons repris le code qui nous était fourni en exemple, que nous avons réadapté. Cette liaison série nous a présenté un premier problème : nous voulions pouvoir envoyer un caractère lors de l'appui sur un des deux boutons. Un 'f' déclencherait la partie du code sur l'Arduino correspondant pour "fermer" le doigt, de même avec un 'o' qui devait déclencher l'"ouverture" du doigt. Toutefois, nous nous sommes vite aperçu que l'envoi et le traitement de caractère était problématique. Nous avons donc vite décidé de simplement envoyer un entier : pour ouvrir le doigt, au lieu d'envoyer un 'o' (la 15e lettre de l'alphabet), nous enverrons un 15, et pour fermer nous enverrons un 6. Pour cela, nous passerons donc par la fonction sendMessage ()

function sendMessage(ordre){websocket.send(ordre);}

Ainsi, nous passons grâce aux websockets l'ordre voulu. Il peut ainsi être traité par l'Arduino. Dans le body de notre page html, nous plaçons donc les deux boutons ouverture et fermeture qui utilisent la fonction sendMessage() :

<button onclick="sendMessage(8);">Lancer la commande</button>
<button onclick="sendMessage(15);">Ouverture</button>
<button onclick="sendMessage(6);">Fermeture</button>


Il était initialement prévu de pouvoir naviguer directement d'un mode (appli/capteurs) à l'autre, cependant le code implanté sur l'Arduino impose d'envoyer une variable indiquant au système la fin d'un mode, nous imposant ainsi une nouvelle contrainte. En effet, on ne passe plus simplement d'une page à l'autre, mais lors de chaque appui sur un lien, cela interrompt le mode. Ainsi, nous avons ajouté des appels à la fonction sendMessage() dans toutes les balises <a> afin d'envoyer la valeur 9, permettant à l'Arduino de sortir du mode. Il suffit donc, une fois dans la page appli.html, de lancer la commande puis de choisir le bouton ouvrir ou fermer afin de commander le doigt !
video