FR.TextileXY History

Hide minor edits - Show changes to markup

December 01, 2010, at 12:55 AM EST by Maurin -
Changed line 105 from:
  • 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.
to:
  • 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.
December 01, 2010, at 12:54 AM EST by Maurin -
Changed line 99 from:
  • 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).
to:
  • 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).
November 29, 2010, at 04:29 PM EST by Maurin -
Added line 5:
Changed line 108 from:
  • Pure Data Librairie logiciel
to:
  • Pure Data Librairie logiciel
November 29, 2010, at 04:28 PM EST by Maurin -
Changed line 107 from:
  • Librairie Pure Data Logiciel
to:
  • Pure Data Librairie logiciel
November 29, 2010, at 04:27 PM EST by Maurin -
Changed lines 79-80 from:

A faire :

to:

TODO :

Changed lines 92-97 from:
  • Programmer Arduino
  • Librairie Pure Data Logiciel?

É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 \\

to:

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
November 29, 2010, at 02:11 PM EST by Maurin -
Changed lines 5-6 from:

\\\

to:

\\

Changed line 91 from:
  • Programmer l'Arduino sketch with optimized communication
to:
  • Programmer Arduino
Changed line 94 from:

Evolution du principe

to:

Évolution du principe

November 29, 2010, at 02:09 PM EST by Maurin -
Changed lines 91-260 from:

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

to:

Programmation

  • Programmer l'Arduino sketch with optimized communication
  • Librairie Pure Data Logiciel?
Deleted line 95:
November 29, 2010, at 02:03 PM EST by Maurin -
Deleted line 0:
Changed lines 6-7 from:

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 \\

to:

\\\

Changed lines 9-11 from:

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.\\

to:



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.\\\

November 29, 2010, at 02:02 PM EST by Maurin -
Added lines 1-6:
Projet : Textile CapteurClient : XYinteractionDate : 01 / 01 / 2005
Matériau : e-textileVersion : 06Update : 29 / 11 / 2010
November 29, 2010, at 01:37 PM EST by Maurin -
Changed lines 14-15 from:

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.\\

to:

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. \\

November 29, 2010, at 01:33 PM EST by Maurin -
Changed line 3 from:

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.\\

to:

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. \\\

November 29, 2010, at 01:31 PM EST by Maurin -
Added lines 1-46:

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


Domaines d'application



November 29, 2010, at 12:46 PM EST by Maurin -
Added lines 1-214:

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.

  1. 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.
  2. 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.
  3. 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).

Valeur minimum : sachant que d'après la doc de la Arduino les digital pins peuvent délivrer 40 mA et d'après la loi d'ohm qui dit :
(U = R * I) -> (R = U / I)
R = 5 V / 0,040 A
R = 125 ohm

A faire :

En savoir plus sur l'état input des entrées digitales comme analogiques.
A coi est relié l'état digital INPUT via la résistance 100 M Ohm.
En savoir plus sur les propriétés de l'analogue INPUT
Consommation des pins INPUTS (analogiques et Digitales)

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 \\

Powered by pmwiki-2.2.10