FR.TextileXY History
Hide minor edits - Show changes to markup
- Reconnaissance de gestes : Ce programme permet de reconnaître différents signes tracés sur la même zone et d'activer des fonctions différentes. Ce programme utilise Python et NumPy (Numerical Python) avec Pure Data. Un programe réalisé par Vincent Rioux.
- Reconnaissance de gestes : Ce programme permet de reconnaître différents signes tracés sur la même zone et d'activer des fonctions différentes. Ce programme utilise Python et NumPy (Numerical Python) avec Pure Data. Un programe réalisé par Vincent Rioux.
- Data acquisition (Pure Data) : Ce programme permet de lire les valeurs de la carte Textile_XY. Pour interpréter les valeurs X & Y, captées par le tissu nous utiliserons le programme "xyi_input_sensors.pd" (entrée capteur). Cet abstraction devra être utilisée avec l'objet "Comport" configuré sur le bon port USB et à la bonne vitesse de lecture des données: celle ci doit être la même que celle spécifiée dans le programme du LilyPad (19200).
- Data acquisition (Pure Data) : Ce programme permet de lire les valeurs de la carte Textile_XY. Pour interpréter les valeurs X & Y, captées par le tissu nous utiliserons le programme "xyi_input_sensors.pd" (entrée capteur). Cet abstraction devra être utilisée avec l'objet "Comport" configuré sur le bon port USB et à la bonne vitesse de lecture des données: celle ci doit être la même que celle spécifiée dans le programme du LilyPad (19200).
- Pure Data Librairie logiciel
- Pure Data Librairie logiciel
- Librairie Pure Data Logiciel
- Pure Data Librairie logiciel
A faire :
TODO :
Évolution du principe
Toucher et effleurer N° 358, publié dans Elektor en avril 2008
Le sens du toucher N°..., publié dans Elektor en juin 2010 \\
Atelier de recherches et développements logiciels.
Nous proposons ici un ensemble de programmes qui s'utilisent avec l'interface textile. Ces programmes fournissent une base modulaire pouvant s'adapter à différentes applications. L'ensemble des programmes sont développés pour le logiciel Pure Data, un environnement de programmation multiplateforme et open source dédié à l'interaction temps réel. Notre choix s'est porté sur ce logiciel car il propose un type de programmation visuel facilement accessible. De plus, supporté par une communauté mondiale d'utilisateurs il est doté de nombreuses extensions dédiées au son et à la vidéo.
Cette librairie de programmes est inspirée de la librairie
ENIGMES-Lib pour Max Msp. Une librairie réalisée par Roland Cahen dans le cadre du projet de recherche ENIGMES. "ENIGMES-Lib" propose un ensemble de fonctions pour programmer des partitions navigables.
- Data acquisition (Pure Data) : Ce programme permet de lire les valeurs de la carte Textile_XY. Pour interpréter les valeurs X & Y, captées par le tissu nous utiliserons le programme "xyi_input_sensors.pd" (entrée capteur). Cet abstraction devra être utilisée avec l'objet "Comport" configuré sur le bon port USB et à la bonne vitesse de lecture des données: celle ci doit être la même que celle spécifiée dans le programme du LilyPad (19200).
- Data acquisition (Processing) : Ce programme permet de lire les valeurs de la carte dans Processing.
- Suivi de trajectoires : Ce programme permet de mapper un motif sonore le long d'un axe temporelle courbe. En parcourant du doigt un motif graphique imprimé sur la toile, notre doigt joue alors le rôle de tête de lecture d'un sillon illustré par Vincent Rioux
- Détection de Zones : Ce programme permet de dessiner des zones et d'y associer des sons. Ces zones peuvent avoir des formes complexes, elles peuvent être superposées de manière à déclencher simultanément plusieurs événements musicaux.
- Détection angulaire : Ce programme permet de connaître la position angulaire et la distance d'un point par rapport a un autre.
- Munger player : Un Granulateur multi-voies, a.k.a. le couteau Suis de la synthèse granulaire temps réel. Par Dan Trueman.
- Reconnaissance de gestes : Ce programme permet de reconnaître différents signes tracés sur la même zone et d'activer des fonctions différentes. Ce programme utilise Python et NumPy (Numerical Python) avec Pure Data. Un programe réalisé par Vincent Rioux.
- La lib "mapping" comporte un objet "autoscale.pd" utile pour mettre automatiquement à l'échelle les données de position.
- Librairie Pure Data Logiciel
\\\
\\
- Programmer l'Arduino sketch with optimized communication
- Programmer Arduino
Evolution du principe
Évolution du principe
Arduino sketch with optimized communication
// SERIAL COMMUNICATION PROTOCOL for X and Y values (10 bits each) // To optimize the communication for each value, we only need 2 bytes. // On each of the byte we use the 2 leading bits (on the left) that act as IDs. // Then, decoding this protocol will first analyse these 2 bits and reassemble the values accordingly. // // Each 10bits value { xxxxxxxxxx } // |||||||||| // 9876543210 ...correspondng bit position // / \ // { ab009876 , ab543210 } ...is broken into 2 bytes // |||| |||||| // MSB(Most Significant Bits) LSB(Least Significant Bits) // // abxxxxxxx format explanation for each byte transmitted : // || // ||---------> a=0 => MSB, a=1 => LSB // |----------> b=0 => this is X, b=1 => this is Y // // { 00000xxxx , 01xxxxxx } ...will be transmitted for X // { 10000xxxx , 11xxxxxx } ...will be transmitted for Y int Y1=10; // select the analog input pin 10 int Y2=9; // select the analog input pin 9 int X1=11; // select the analog input pin 11 int X2=12; // select the analog input pin 12 int Val; // Val is use alternatively for X and Y Valus int Xmsb, Xlsb, Ymsb, Ylsb; void setup() { Serial.begin(19200); } void loop() { // FIRST TIME : GET X VALUE pinMode(X1, INPUT); // put pin in high impedance (+infinite) pinMode(X2, INPUT); // put pin in high impedance (+infinite) pinMode(Y1, OUTPUT); // declare the Pin as an OUTPUT pinMode(Y2, OUTPUT); // declare the Pin as an OUTPUT digitalWrite(Y1, LOW); // turn off the Pin 10 digitalWrite(Y2, HIGH); // turn on the Pin 9 delay(3); Val=analogRead(1); // Read Analog Input 1 // octet 1 for X ; MSB for X (More Signifiant Bits) // 00000xxx Value (after being shifted 5 times) // || // ||--------> MSB // |---------> X Xmsb = Val >> 5 ; // Division by 32, save the 5 Msb bits Serial.print(Xmsb, BYTE); // Send X MSB // octet 0 for X ; LSB for X (Less Signifiant Bits) // xxxxxxxx value // 00011111 & mask (31) // 01000000 + flag // 010xxxxx = result for // 01000000 + 64 for LSB flag // first bit is 0 for X flag Xlsb = Val & 31 ; // save the 5 lsb bits Xlsb = Xlsb + 64 ; // set second bit to 1 for lsb marker Serial.print(Xlsb, BYTE); // Send X LSB // SECOND TIME : GET Y VALUE pinMode(X1, OUTPUT); // declare the Pin as an OUTPUT pinMode(X2, OUTPUT); // declare the Pin as an OUTPUT pinMode(Y1, INPUT); // put pin in high impedance (+infinite) pinMode(Y2, INPUT); // put pin in high impedance (+infinite;) digitalWrite(X1, HIGH); // turn on the Pin 11 digitalWrite(X2, LOW); // turn off the Pin 12 delay(3); Val=analogRead(0); // Read Analog Input 0 // octet 1 for Y ; MSB for Y (More Significant Bits) // 10000xxx Value (after being shifted 5 times) // || // ||--------> MSB // |---------> 1=>Y Ymsb = Val >> 5 ; // Division by 32, save the 5 Msb bits Ymsb = Ymsb + 128 ; // add a bit for Y Serial.print(Ymsb, BYTE); // Send Y MSB // octet 0 for Y ; LSB for Y (Less Significant Bits) // xxxxxxxx value // 00011111 & mask // 000xxxxx = result // 01000000 + 64 for LSB flag // 10000000 + 128 for Y flag Ylsb = Val & 31 ; // save the 5 lsb bits Ylsb = Ylsb + 64 ; // set second bit to 1 for lsb marker Ylsb = Ylsb + 128 ; // add a bit for Y Serial.print(Ylsb, BYTE); // Send Y LSB }
Arduino sketch : fonction digitalMedian[5];
Pour supprimer les abhérations des données captées, nous utiliserons un filtre médian. Ce filtre permet de classer les valeurs du flux dans un ordre croisant et de sélectionner la valeur médiane. Sur la base du l'objet médian5 de Pure Data, Nous implémenterons ce filtre pour la carte Arduino
//fonction digitalMedian[5]; #define filterSamples 5 #define SensorPin1 0 #define SensorPin2 1 int SmoothArrayX [filterSamples]; // array for holding raw sensor values for sensor1 int SmoothArrayY [filterSamples]; // array for holding raw sensor values for sensor2 int rawDataX, smoothDataX; // variables for sensor1 data int rawDataY, smoothDataY; // variables for sensor1 data void setup() { Serial.begin(19200); // initialize serial communication with computer } void loop() { rawDataX = analogRead(SensorPin1); smoothDataX = digitalMedian(rawDataX, SmoothArrayX); rawDataY = analogRead(SensorPin2); smoothDataY = digitalMedian(rawDataY, SmoothArrayY); Serial.print(smoothDataX); // send it to the computer (as ASCII digits) Serial.print(" "); Serial.println(smoothDataY); } int digitalMedian(int rawIn, int *SmoothArray){ // "int *sensSmoothArray" passes an array to the function - the asterisk indicates the array name is a pointer static int index; int a, b, c, d, e, f, g, h, i, j, k; int median; if (index = filterSamples) // if we're at the end of the array... index = 0; // ...wrap around to the beginnin SmoothArray[index] = rawIn; // read sensor value a = max(SmoothArray[3], SmoothArray[4]); b = min(SmoothArray[3], SmoothArray[4]); c = max(SmoothArray[2], b); d = max(a, c); e = min(a, c); f = min(b, SmoothArray[2]); g = max(f, SmoothArray[1]); h = max(e, g); i = min(e, g); j = min(d, h); k = max(i, SmoothArray[0]); median = min(j, k); index++; // advance to the next index return median; }
http://xyinteraction.free.fr/photos/median_5_Image.png
Librairie Pure Data --> Librairie de programmes
Programmation
http://xyinteraction.free.fr/photos/icon_xyi.jpg %width=183px%http://xyinteraction.free.fr/photos/plan_textile.jpg %width=183px%http://xyinteraction.free.fr/photos/weaving_machin.jpg \\
\\\
A la rencontre du monde du tissage et de l' électronique, ce projet est tout d'abord né de la volonté de travailler sur l'ergonomie des interfaces numériques. Si l'on revient à la définition de l'ergonomie, il s'agit d'adapter l'outil aux caractéristiques de l'utilisateur et non l'inverse. Aussi cette interface a la qualité d'offrir des possibilités d'un jeux gestuel qui s'éloigne de l'utilisation des interfaces traditionnelles (écran d'ordinateur, clavier, souris, contrôleurs type table de mixage...). Nous proposons donc un support d'expression qui, par ses dimensions, sa texture, sa souplesse et sa transparence, favorise l'implication du corps au cours d'une représentation scénique. Face à cet outil, le performeur, qui se tient dans une posture comparable à celle d'un peintre, est actif devant son publique, ses gestes prennent une dimension sensible et expressive.\\
A la rencontre du monde du tissage et de l' électronique, ce projet est tout d'abord né de la volonté de travailler sur l'ergonomie des interfaces numériques. Si l'on revient à la définition de l'ergonomie, il s'agit d'adapter l'outil aux caractéristiques de l'utilisateur et non l'inverse. Aussi cette interface a la qualité d'offrir des possibilités d'un jeux gestuel qui s'éloigne de l'utilisation des interfaces traditionnelles (écran d'ordinateur, clavier, souris, contrôleurs type table de mixage...). Nous proposons donc un support d'expression qui, par ses dimensions, sa texture, sa souplesse et sa transparence, favorise l'implication du corps au cours d'une représentation scénique. Face à cet outil, le performeur, qui se tient dans une posture comparable à celle d'un peintre, est actif devant son publique, ses gestes prennent une dimension sensible et expressive.\\\
Projet : Textile Capteur | Client : XYinteraction | Date : 01 / 01 / 2005 |
---|---|---|
Matériau : e-textile | Version : 06 | Update : 29 / 11 / 2010 |
En travaillant sur le thème de la partition navigable, nous avons conçu une partition interactive. cette partition propose au compositeur de parcourir des sons qu'ils visualisent sur la toile imprimée. L'idée étant de concevoir des partitions graphique en adécoition avec l'univers sonore choisi. L'idée derrière ce projet est également de développer une approche qui partirait d'un univers graphique pour imaginer une composition sonore. Créé en collaboration avec des compositeurs et les graphistes, ces textiles hybrides offrent des espaces à découvrir par la regarder, le toucher et le geste. Aujourd'hui, ce projet inspire de nouveaux usages dans de nombreux domaines. Par exemple, l'idée du geste musical a interpelé un chorégraphe qui imagine intégrer ce tissu dans une pièces de danse. Nous avons aussi eu l'occasion de réaliser une installation qui permettait à des personnes de communiquer en dessinant sur des tissus reliés à Internet. Nous prévoyons également d'utiliser cette surface pour faire de la reconnaissance de gestes. L'idée est d'associer des gestes symboliques avec une fonction particulière: par exemple, de contrôler une lumière par des gestes symboliques dessinés sur un tissu placé au mur.\\
En travaillant sur le thème de la partition navigable, nous avons conçu une partition interactive. cette partition propose au compositeur de parcourir des sons qu'ils visualisent sur la toile imprimée. L'idée étant de concevoir des partitions graphique en adéquation avec l'univers sonore choisi. L'idée derrière ce projet est également de développer une approche qui part d'un univers graphique pour imaginer une composition sonore.
Créé en collaboration avec des musiciens et graphistes, ces textiles offrent des espaces à découvrir par la regarder, le toucher et le geste et l'écoute. Aujourd'hui, ce projet inspire de nouveaux usages dans de nombreux domaines. Par exemple, l'idée du geste musical a interpelé un chorégraphe qui imagine intégrer ce tissu dans une pièces de danse. Nous avons aussi eu l'occasion de réaliser une installation qui permettait à des personnes de communiquer en dessinant sur des tissus reliés à Internet. Nous prévoyons également d'utiliser cette surface pour faire de la reconnaissance de gestes. L'idée est d'associer des gestes symboliques avec une fonction particulière: par exemple, de contrôler une lumière par des gestes symboliques dessinés sur un tissu placé au mur. \\
Ce projet interdisciplinaire s'inscrit dans le cadre d'une rencontre entre art science et technologie. Il porte sur une réflexion liée aux usages scéniques d'une interface textile que nous avons précédemment développé. En effet, la recherche que nous avons entrepris s'appuie en partie sur le développement original d'un « tissu capteur » qui permet de transmettre à un ordinateur la localisation d'un doigt qui le parcourt.\\
Ce projet interdisciplinaire s'inscrit dans le cadre d'une rencontre entre art science et technologie. Il porte sur une réflexion liée aux usages scéniques d'une interface textile que nous avons précédemment développé. En effet, la recherche que nous avons entrepris s'appuie en partie sur le développement original d'un « tissu capteur » qui permet de transmettre à un ordinateur la localisation d'un doigt qui le parcourt. \\\
http://xyinteraction.free.fr/photos/icon_xyi.jpg %width=183px%http://xyinteraction.free.fr/photos/plan_textile.jpg %width=183px%http://xyinteraction.free.fr/photos/weaving_machin.jpg
Ce projet interdisciplinaire s'inscrit dans le cadre d'une rencontre entre art science et technologie. Il porte sur une réflexion liée aux usages scéniques d'une interface textile que nous avons précédemment développé. En effet, la recherche que nous avons entrepris s'appuie en partie sur le développement original d'un « tissu capteur » qui permet de transmettre à un ordinateur la localisation d'un doigt qui le parcourt.
A la rencontre du monde du tissage et de l' électronique, ce projet est tout d'abord né de la volonté de travailler sur l'ergonomie des interfaces numériques. Si l'on revient à la définition de l'ergonomie, il s'agit d'adapter l'outil aux caractéristiques de l'utilisateur et non l'inverse. Aussi cette interface a la qualité d'offrir des possibilités d'un jeux gestuel qui s'éloigne de l'utilisation des interfaces traditionnelles (écran d'ordinateur, clavier, souris, contrôleurs type table de mixage...). Nous proposons donc un support d'expression qui, par ses dimensions, sa texture, sa souplesse et sa transparence, favorise l'implication du corps au cours d'une représentation scénique. Face à cet outil, le performeur, qui se tient dans une posture comparable à celle d'un peintre, est actif devant son publique, ses gestes prennent une dimension sensible et expressive.
Cette interface permet d'intégrer la composante du geste dans l'acte de la composition musicale.
Dans le cadre du Projet ENIGMES (2006-2007), nous avons développé de nouveaux éléments musicaux, graphiques, gestuelles et de nouvelles modalités d'interactions musicales.
En travaillant sur le thème de la partition navigable, nous avons conçu une partition interactive. cette partition propose au compositeur de parcourir des sons qu'ils visualisent sur la toile imprimée. L'idée étant de concevoir des partitions graphique en adécoition avec l'univers sonore choisi. L'idée derrière ce projet est également de développer une approche qui partirait d'un univers graphique pour imaginer une composition sonore.
Créé en collaboration avec des compositeurs et les graphistes, ces textiles hybrides offrent des espaces à découvrir par la regarder, le toucher et le geste. Aujourd'hui, ce projet inspire de nouveaux usages dans de nombreux domaines. Par exemple, l'idée du geste musical a interpelé un chorégraphe qui imagine intégrer ce tissu dans une pièces de danse. Nous avons aussi eu l'occasion de réaliser une installation qui permettait à des personnes de communiquer en dessinant sur des tissus reliés à Internet. Nous prévoyons également d'utiliser cette surface pour faire de la reconnaissance de gestes. L'idée est d'associer des gestes symboliques avec une fonction particulière: par exemple, de contrôler une lumière par des gestes symboliques dessinés sur un tissu placé au mur.
Présentée sous la forme d'une installation musicale interactive lors de l'exposition Futurotextiles 2006 à Lille, cette toile a retenu l'attention de nombreux visiteurs qui ont pu l'essayer et apprécier ses qualités d'interface tactile. Ce prototype de démonstration marque l'aboutissement du développement technique que nous avons réalisé. Cette étape achevée, nous poursuivons aujourd'hui notre travail qui portera sur l'utilisation scénique de cette interface.
Enjeux
- Sortir de l'interaction classique écran, clavier, souris trop générique et vieillissant.
- Donner une dimension physique à l'interface numérique.
- Réhabiliter les gestes
- Faire évoluer la gamme des dispositifs interactifs.
- Créer de nouveaux objets à caractère tactile.
- Permettre des interaction plus riches que la souris
- Apporter une dimension sensible au monde numérique
- Fabriquer des objets accessibles
Originalité de ce matériau
- simplicité
- souplesse
- transparence
- légèreté
- texture au toucher
- grande surface d'interaction
- faible coût au m2
- grande résolution
- modelage autour de l'objet
Principe technique.
Le tissu XY-interactif propose un principe de localisation d'un contact sur un tissu.
Ce tissu technique est composé de deux toiles qui comportent chacune un réseau de fibres conductrices. Sur l'une des ces toiles, les fibres conductrices sont tissées dans le sens de la trame (horizontal), sur l'autre, ces mêmes fibres sont tissées dans le sens de la chaîne (vertical).
Les fibres conductrices de la toile supérieure ainsi que celles de la toile inférieur, sont reliées entre elles par des lisières dont les fibres sont résistives. Aux extrémités de chacune de ces lisières sont connectés des fils qui relient la toile à une électronique dédiée. Cette électronique qui fait circuler un courant dans les toiles, permet de capter des valeurs électriques significatives de la position d'un contact exercé sur ce dispositif tactile.
- Lorsque une pression est exercée sur la toile, celle-ci met en contact les deux épaisseurs du tissu ce qui permet au courant de passer d'une toile à l'autre.
- En fonction de la position du contact, le chemin parcouru par le courant est plus ou moins long, ce qui permet d'obtenir des valeurs électriques significatives de la position du contact.
- La précision de ce capteur est définie par le nombre de fibres conductrices par centimètre ainsi que par la qualité du micro-contrôleur qui échantillonne les valeurs électriques.
Documents explicatifs du principe technique extrait du magazine Élektor
Écrans tactile : publié dans Elektor en mai 2000 Elektor_f005056.pdf
Travailler avec l’écran tactile : publié dans Elektor en mai 2005 Elector_f055062.pdf
http://xyinteraction.free.fr/photos/principe.gif
Fonctionnement du firmware XY.
http://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Potentiometer.jpg/512px-Potentiometer.jpg
Le principe utilisé est un principe de captation par calcul successif de deux résistances. Ce principe peut être schématisé par l'utilisation de deux potentiomètres dont les points milieux sont reliés entre eux et les quartes pattes restantes connectées à un micro-contrôleur. Ci-dessous, les deux temps du programme qui permet d'obtenir les valeurs significatives de la position d'un doigt qui parcourt le capteur XY.
http://xyinteraction.free.fr/photos/arduino_xyi.gif
1- Calcul de la valeur des résistances (ou potentiomètres) X1-X2 et Y1-Y2 :
Pour que le circuit consomme peu et fonctionne bien. (Plus nous diminuerons la valeur de la résistance plus les valeurs captées seront stables mais plus le circuit consommera de courant).
A faire :
Schéma de connections des toiles à la carte Lilypad
http://xyinteraction.free.fr/photos/LilyPad.jpg
Arduino sketch with optimized communication
// SERIAL COMMUNICATION PROTOCOL for X and Y values (10 bits each) // To optimize the communication for each value, we only need 2 bytes. // On each of the byte we use the 2 leading bits (on the left) that act as IDs. // Then, decoding this protocol will first analyse these 2 bits and reassemble the values accordingly. // // Each 10bits value { xxxxxxxxxx } // |||||||||| // 9876543210 ...correspondng bit position // / \ // { ab009876 , ab543210 } ...is broken into 2 bytes // |||| |||||| // MSB(Most Significant Bits) LSB(Least Significant Bits) // // abxxxxxxx format explanation for each byte transmitted : // || // ||---------> a=0 => MSB, a=1 => LSB // |----------> b=0 => this is X, b=1 => this is Y // // { 00000xxxx , 01xxxxxx } ...will be transmitted for X // { 10000xxxx , 11xxxxxx } ...will be transmitted for Y int Y1=10; // select the analog input pin 10 int Y2=9; // select the analog input pin 9 int X1=11; // select the analog input pin 11 int X2=12; // select the analog input pin 12 int Val; // Val is use alternatively for X and Y Valus int Xmsb, Xlsb, Ymsb, Ylsb; void setup() { Serial.begin(19200); } void loop() { // FIRST TIME : GET X VALUE pinMode(X1, INPUT); // put pin in high impedance (+infinite) pinMode(X2, INPUT); // put pin in high impedance (+infinite) pinMode(Y1, OUTPUT); // declare the Pin as an OUTPUT pinMode(Y2, OUTPUT); // declare the Pin as an OUTPUT digitalWrite(Y1, LOW); // turn off the Pin 10 digitalWrite(Y2, HIGH); // turn on the Pin 9 delay(3); Val=analogRead(1); // Read Analog Input 1 // octet 1 for X ; MSB for X (More Signifiant Bits) // 00000xxx Value (after being shifted 5 times) // || // ||--------> MSB // |---------> X Xmsb = Val >> 5 ; // Division by 32, save the 5 Msb bits Serial.print(Xmsb, BYTE); // Send X MSB // octet 0 for X ; LSB for X (Less Signifiant Bits) // xxxxxxxx value // 00011111 & mask (31) // 01000000 + flag // 010xxxxx = result for // 01000000 + 64 for LSB flag // first bit is 0 for X flag Xlsb = Val & 31 ; // save the 5 lsb bits Xlsb = Xlsb + 64 ; // set second bit to 1 for lsb marker Serial.print(Xlsb, BYTE); // Send X LSB // SECOND TIME : GET Y VALUE pinMode(X1, OUTPUT); // declare the Pin as an OUTPUT pinMode(X2, OUTPUT); // declare the Pin as an OUTPUT pinMode(Y1, INPUT); // put pin in high impedance (+infinite) pinMode(Y2, INPUT); // put pin in high impedance (+infinite;) digitalWrite(X1, HIGH); // turn on the Pin 11 digitalWrite(X2, LOW); // turn off the Pin 12 delay(3); Val=analogRead(0); // Read Analog Input 0 // octet 1 for Y ; MSB for Y (More Significant Bits) // 10000xxx Value (after being shifted 5 times) // || // ||--------> MSB // |---------> 1=>Y Ymsb = Val >> 5 ; // Division by 32, save the 5 Msb bits Ymsb = Ymsb + 128 ; // add a bit for Y Serial.print(Ymsb, BYTE); // Send Y MSB // octet 0 for Y ; LSB for Y (Less Significant Bits) // xxxxxxxx value // 00011111 & mask // 000xxxxx = result // 01000000 + 64 for LSB flag // 10000000 + 128 for Y flag Ylsb = Val & 31 ; // save the 5 lsb bits Ylsb = Ylsb + 64 ; // set second bit to 1 for lsb marker Ylsb = Ylsb + 128 ; // add a bit for Y Serial.print(Ylsb, BYTE); // Send Y LSB }
Arduino sketch : fonction digitalMedian[5];
Pour supprimer les abhérations des données captées, nous utiliserons un filtre médian. Ce filtre permet de classer les valeurs du flux dans un ordre croisant et de sélectionner la valeur médiane. Sur la base du l'objet médian5 de Pure Data, Nous implémenterons ce filtre pour la carte Arduino
//fonction digitalMedian[5]; #define filterSamples 5 #define SensorPin1 0 #define SensorPin2 1 int SmoothArrayX [filterSamples]; // array for holding raw sensor values for sensor1 int SmoothArrayY [filterSamples]; // array for holding raw sensor values for sensor2 int rawDataX, smoothDataX; // variables for sensor1 data int rawDataY, smoothDataY; // variables for sensor1 data void setup() { Serial.begin(19200); // initialize serial communication with computer } void loop() { rawDataX = analogRead(SensorPin1); smoothDataX = digitalMedian(rawDataX, SmoothArrayX); rawDataY = analogRead(SensorPin2); smoothDataY = digitalMedian(rawDataY, SmoothArrayY); Serial.print(smoothDataX); // send it to the computer (as ASCII digits) Serial.print(" "); Serial.println(smoothDataY); } int digitalMedian(int rawIn, int *SmoothArray){ // "int *sensSmoothArray" passes an array to the function - the asterisk indicates the array name is a pointer static int index; int a, b, c, d, e, f, g, h, i, j, k; int median; if (index = filterSamples) // if we're at the end of the array... index = 0; // ...wrap around to the beginnin SmoothArray[index] = rawIn; // read sensor value a = max(SmoothArray[3], SmoothArray[4]); b = min(SmoothArray[3], SmoothArray[4]); c = max(SmoothArray[2], b); d = max(a, c); e = min(a, c); f = min(b, SmoothArray[2]); g = max(f, SmoothArray[1]); h = max(e, g); i = min(e, g); j = min(d, h); k = max(i, SmoothArray[0]); median = min(j, k); index++; // advance to the next index return median; }
http://xyinteraction.free.fr/photos/median_5_Image.png
Librairie Pure Data --> Librairie de programmes
Evolution du principe
Toucher et effleurer N° 358, publié dans Elektor en avril 2008
Le sens du toucher N°..., publié dans Elektor en juin 2010 \\