Skyduino:~#
Articles
arduino, programmation, test

[Test] Touch shield (sparkfun)

Salut à tous !

Aujourd’hui je vais vous parler de la sparkfun touch shield.
Alors avant toute chose je tient à précisé que je parle bien de la SPARKFUN touch shield et non de la « touch shield » l’ecran TFT.

Alors ma première erreur fut de souder des connecteurs « stackable », cette shield est vraiment faite pour être au dessus de toute les autres.
Comme vous pouvez le voir les connecteurs « stackable » cache un peu les touches, c’est pas vraiment l’idéal.

La shield en elle même est axé autour d’un MPR121 qui permet d’avoir via un bus I2C jusqu’a 12 canaux capacitif.
La shield « cable » deja 9 de ces canaux sous la forme d’un keypad 3×3, avec les numéro de 1 à 9 (je ne ferai pas de commentaires sur le 0 et si il devrait etre le premier chiffre ou pas ^^).

La shield comporte aussi un régulateur 5v-3.3v ce qui la rend compatible pro mini 5v et 3.3v ou compatible maple/chipkit (comme beaucoup d’autre shield de sparkfun).

Pour les curieux sparkfun fourni comme à son habitude le schéma de la shield :
http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Dev/Arduino/Shields/Touch_Shield-v11.pdf

Petite remarque au passage, pour ce qui voudrait une version break-out sparkfun là propose ici :
http://www.sparkfun.com/products/9695

Ou une version keypad 4×3 (non shield) ici :
http://www.sparkfun.com/products/10250

Le code d’exemple fourni par sparkfun est bizarre dans la mesure ou ils fournissent une librairie I2C en plus dans le zip.
J’ai pas cherché à comprendre j’ai simplement récupéré le fichier mpr121.h qui contient les définitions des registres et pour l’I2C j’ai utilisé la librairie wire arduino.

mpr121.h

/*
    MPR121.h
	April 8, 2010
	by: Jim Lindblom
*/

// MPR121 Register Defines
#define MHD_R	0x2B
#define NHD_R	0x2C
#define	NCL_R 	0x2D
#define	FDL_R	0x2E
#define	MHD_F	0x2F
#define	NHD_F	0x30
#define	NCL_F	0x31
#define	FDL_F	0x32
#define	ELE0_T	0x41
#define	ELE0_R	0x42
#define	ELE1_T	0x43
#define	ELE1_R	0x44
#define	ELE2_T	0x45
#define	ELE2_R	0x46
#define	ELE3_T	0x47
#define	ELE3_R	0x48
#define	ELE4_T	0x49
#define	ELE4_R	0x4A
#define	ELE5_T	0x4B
#define	ELE5_R	0x4C
#define	ELE6_T	0x4D
#define	ELE6_R	0x4E
#define	ELE7_T	0x4F
#define	ELE7_R	0x50
#define	ELE8_T	0x51
#define	ELE8_R	0x52
#define	ELE9_T	0x53
#define	ELE9_R	0x54
#define	ELE10_T	0x55
#define	ELE10_R	0x56
#define	ELE11_T	0x57
#define	ELE11_R	0x58
#define	FIL_CFG	0x5D
#define	ELE_CFG	0x5E
#define GPIO_CTRL0	0x73
#define	GPIO_CTRL1	0x74
#define GPIO_DATA	0x75
#define	GPIO_DIR	0x76
#define	GPIO_EN		0x77
#define	GPIO_SET	0x78
#define	GPIO_CLEAR	0x79
#define	GPIO_TOGGLE	0x7A
#define	ATO_CFG0	0x7B
#define	ATO_CFGU	0x7D
#define	ATO_CFGL	0x7E
#define	ATO_CFGT	0x7F


// Global Constants
#define TOU_THRESH	0x06
#define	REL_THRESH	0x0A

code arduino

#include "mpr121.h"
#include <Wire.h>

int irqpin = 2;  // Digital 2
boolean touchStates[12];
int mask[12] = {
  9, 6, 3, 8, 5, 2, 7, 4, 1, 10, 11, 12};

void setup(){
  pinMode(irqpin, INPUT);
  digitalWrite(irqpin, HIGH);

  Serial.begin(9600);
  Serial.print("MPR 121 Test Code");

  Wire.begin();

  mpr121_setup();
}

void loop(){

  if(!digitalRead(irqpin)){

    //read the touch state from the MPR121
    Wire.requestFrom(0x5A,2); 

    byte LSB = Wire.receive();
    byte MSB = Wire.receive();

    uint16_t touched = ((MSB << 8 ) | LSB); //16bits that make up the touch states


    for (int i=0; i < 12; i++){  // Check what electrodes were pressed
      if(touched & (1<<i)){

        if(touchStates[i] == 0){
          //pin i was just touched
          Serial.print("pin ");
          Serial.print(mask[i]);
          Serial.println(" was just touched");

        }
        else if(touchStates[i] == 1){
          //pin i is still being touched
        }  

        touchStates[i] = 1;      
      }
      else{
        if(touchStates[i] == 1){
          Serial.print("pin ");
          Serial.print(mask[i]);
          Serial.println(" is no longer being touched");

          //pin i is no longer being touched
        }

        touchStates[i] = 0;
      }

    }

  }
}

void mpr121_setup(void){

  // Section A - Controls filtering when data is > baseline.
  set_register(0x5A, MHD_R, 0x01);
  set_register(0x5A, NHD_R, 0x01);
  set_register(0x5A, NCL_R, 0x00);
  set_register(0x5A, FDL_R, 0x00);

  // Section B - Controls filtering when data is < baseline.
  set_register(0x5A, MHD_F, 0x01);
  set_register(0x5A, NHD_F, 0x01);
  set_register(0x5A, NCL_F, 0xFF);
  set_register(0x5A, FDL_F, 0x02);

  // Section C - Sets touch and release thresholds for each electrode
  set_register(0x5A, ELE0_T, TOU_THRESH);
  set_register(0x5A, ELE0_R, REL_THRESH);

  set_register(0x5A, ELE1_T, TOU_THRESH);
  set_register(0x5A, ELE1_R, REL_THRESH);

  set_register(0x5A, ELE2_T, TOU_THRESH);
  set_register(0x5A, ELE2_R, REL_THRESH);

  set_register(0x5A, ELE3_T, TOU_THRESH);
  set_register(0x5A, ELE3_R, REL_THRESH);

  set_register(0x5A, ELE4_T, TOU_THRESH);
  set_register(0x5A, ELE4_R, REL_THRESH);

  set_register(0x5A, ELE5_T, TOU_THRESH);
  set_register(0x5A, ELE5_R, REL_THRESH);

  set_register(0x5A, ELE6_T, TOU_THRESH);
  set_register(0x5A, ELE6_R, REL_THRESH);

  set_register(0x5A, ELE7_T, TOU_THRESH);
  set_register(0x5A, ELE7_R, REL_THRESH);

  set_register(0x5A, ELE8_T, TOU_THRESH);
  set_register(0x5A, ELE8_R, REL_THRESH);

  set_register(0x5A, ELE9_T, TOU_THRESH);
  set_register(0x5A, ELE9_R, REL_THRESH);

  set_register(0x5A, ELE10_T, TOU_THRESH);
  set_register(0x5A, ELE10_R, REL_THRESH);

  set_register(0x5A, ELE11_T, TOU_THRESH);
  set_register(0x5A, ELE11_R, REL_THRESH);

  // Section D
  // Set the Filter Configuration
  // Set ESI2
  set_register(0x5A, FIL_CFG, 0x04);

  // Section E
  // Electrode Configuration
  // Set ELE_CFG to 0x00 to return to standby mode
  set_register(0x5A, ELE_CFG, 0x0C);  // Enables all 12 Electrodes

}

void set_register(int address, unsigned char r, unsigned char v){
  Wire.beginTransmission(address);
  Wire.send(r);
  Wire.send(v);
  Wire.endTransmission();
}

Et voila le résultat :

Et comme l’image est bien pourri, la version texte :

MPR 121 Test Code
pin 1 was just touched
pin 1 is no longer being touched
pin 2 was just touched
pin 2 is no longer being touched
pin 3 was just touched
pin 3 is no longer being touched
pin 4 was just touched
pin 4 is no longer being touched
pin 5 was just touched
pin 5 is no longer being touched
pin 6 was just touched
pin 6 is no longer being touched
pin 7 was just touched
pin 7 is no longer being touched
pin 8 was just touched
pin 8 is no longer being touched
pin 9 was just touched
pin 9 is no longer being touched
pin 10 was just touched
pin 10 is no longer being touched
pin 11 was just touched
pin 11 is no longer being touched
pin 12 was just touched
pin 12 is no longer being touched

Alors une petite chose, les touches étant capacitive, elles sont EXTRÊMEMENT sensible le simple fait de poser le doigt dessus peut déclencher 2-3 interruptions. Dans un véritable application il serait bon de faire un compteur type « double clic » pour éviter les problèmes (1 clic = rien, 2 clic = action).

Conclusion :
Une shield bien pensé mais qui doit vraiment être au dessus de toutes autres shield, éviter les connecteurs « stackable » avec cette shield et pour une utilisation « sérieuse » dans un projet bien prendre en compte la sensibilité des touches.

Discussion

4 réflexions sur “[Test] Touch shield (sparkfun)

  1. Salut ! Ton tuto m’a été très utile et je te remercie beaucoup, as tu fait un tuto sur un code de sécurité a 3 ou 4 chiffres ?

    Publié par Shimizu0 | 30 janvier 2014, 12 h 00 min
  2. Salut, est-il possible de mettre une autre shield par dessus (donc on ne voit plus les touches), par exemple un écran et passer ses doigts entre les 2 shields pour utiliser les touches tactiles ?

    Publié par xYwo | 29 mars 2014, 23 h 11 min

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.