Tutorial: como utilizar a Breakout Sensor de toque capacitivo - MPR121 com Arduino

Adquira estes componentes na Loja do Lab de Garagem

Neste tutorial vamos mostrar como utilizar a breakout sensor de toque capacitivo com Arduino. Esta breakout funciona por interface I2C e pode controlar até 12 eletrodos ou apenas LEDS.

Primeiramente faça seguinte ligação:

Depois abra a IDE do Arduino e passe a seguinte programação:

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

#include <Wire.h>

int irqpin = 2; // Digital 2
boolean touchStates[12]; //to keep track of the previous touch states

void setup(){
pinMode(irqpin, INPUT);
digitalWrite(irqpin, HIGH); //enable pullup resistor

Serial.begin(9600);
Wire.begin();

mpr121_setup();
}

void loop(){
readTouchInputs();
}


void readTouchInputs(){
if(!checkInterrupt()){

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

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

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 & (1i)){

if(touchStates[i] == 0){
//pin i was just touched
Serial.print("pin ");
Serial.print(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(i);
Serial.println(" is no longer being touched");

//pin i is no longer being touched
}

touchStates[i] = 0;
}

}

}
}


void mpr121_setup(void){

set_register(0x5A, ELE_CFG, 0x00);

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


// Section F
// Enable Auto Config and auto Reconfig
/*set_register(0x5A, ATO_CFG0, 0x0B);
set_register(0x5A, ATO_CFGU, 0xC9); // USL = (Vdd-0.7)/vdd*256 = 0xC9 @3.3V set_register(0x5A, ATO_CFGL, 0x82); // LSL = 0.65*USL = 0x82 @3.3V
set_register(0x5A, ATO_CFGT, 0xB5);*/ // Target = 0.9*USL = 0xB5 @3.3V

set_register(0x5A, ELE_CFG, 0x0C);

}


boolean checkInterrupt(void){
return digitalRead(irqpin);
}


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

A programação configura todos os registros do controlador e a comunicação I2C com a biblioteca Wire.h. Depois ao tocar em um eletrodo, o Serial Monitor mostrará qual eletrodo foi tocado.

Agora, selecione a versão do seu Arduino (UNO, Duemilanove, etc) e a porta (COMx, ttyUSBx, ttyACMx, etc) e clique em UPLOAD. Ao terminar, abra o Serial Monitor e toque em um dos eletrodos. No Serial Monitor você verá qual pino foi tocado!

E é isso! Esperamos que tenha gostado! Em caso de dúvidas poste aqui mesmo neste blog! Para sugestões de tutoriais, clique aqui! Para ver outros tutoriais e projetos desenvolvidos pela equipe LdG e por outros garagistas, clique aqui e aqui, respectivamente! Até a próxima!

Referências:

https://www.sparkfun.com/products/9695?

http://bildr.org/page/10/

Exibições: 5022

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Everson Santana em 26 julho 2013 às 19:16

Olá alguem sabe me dizer como fazer para instalar o sensor de torque, numa placa PLC?

pode ser um tutorial, algo que possa me ajuda?

 

Comentário de Vittorio Obrali Campanini em 19 maio 2013 às 13:10

gente, alguem sabe me dizer se este sketch funciona ok??

estou tentando compilar mas me da os seguintes erros:

mpr121.cpp: In function 'void readTouchInputs()':
mpr121:73: error: expected `)' before numeric constant
mpr121:73: error: expected `)' before ';' token
mpr121:75: error: invalid operands of types 'uint16_t' and 'int __complex__' to binary 'operator&'

Comentário de Marcos André Ribeiro em 1 maio 2013 às 4:06

Você pode confirmar se é possível ligar a breakout sensor de toque capacitivo - MPR121 em série de três módulos, para controlar 36 eletrodos? Se isso for possível, existe algum tutorial com essa ligação?

Abs 

Comentário de Vittorio Obrali Campanini em 13 setembro 2012 às 11:45

onde comprar??? (No brasil)

Comentário de Mario de Oliveira em 30 agosto 2012 às 23:50

Valeu; vou me empenhar!

Obrigado. 

Comentário de Jonatas Freitas em 30 agosto 2012 às 2:39

Claro que pode. É o conceito de sensor e atuador.

É só juntar o conhecimento presente neste tutorial com o dos relês. Mais simples só o Blink.

Comentário de Mario de Oliveira em 29 agosto 2012 às 23:56

Legal!

Pergunta de um leigo:

Será que eu poderia ao tocar em um desses eletrodos fazer acionar um transistor ou mu rele, para chavear um outro dispositivo?

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço