Teclado touch para Arduino – Touch Shield Sparkfun
Adicione um teclado touch ao seu projeto com este Touch Shield da Sparkfun, um teclado capacitivo para ser utilizado com o Arduino, e que utiliza a conexão I2C para comunicação:

A tecnologia capacitiva, muito usada em touch screen de tablets, computadores e afins, é aquela em que você não precisa “apertar” a tela (essas são as resistivas), apenas passar o dedo (ou um material condutor) e o contato é feito internamente. Isso gera uma enorme vantagem em termos de durabilidade.
Características do Touch shield Sparkfun
O teclado Touch Shield para Arduino pode ser utilizado tanto em forma de shield como ligado externamente, já que você pode por exemplo montar um painel com ele, e o Arduino não precisa necessariamente ficar grudado ao teclado.
Essa ligação externa também pode ser usada quando você vai usar o shield com outros tipos de Arduino. Vamos explicar.
Esse shield foi feito originalmente para ser acoplado ao Arduino Uno R3, usando os pinos 3.3v, SDA, SCL e o pino digital 2, que vai ser utilizado para a interrupção.
No Arduino Mega, por exemplo, os pinos SDA e SCL são o 20 e o 21,
logo o Shield não irá funcionar se você encaixa-lo diretamente, mas vai
funcionar se você realizar uma conexão externa e ligar os pinos
analógicos 4 e 5 do Shield nos pinos 20 (SDA) e 21 (SCL) do Mega. Vamos
mostrar isso na prática daqui a pouco.
O teclado em si é formado por 9 teclas, numa matriz 3×3, e no lado direito do shield podemos observar que há um espaço para mais três eletrodos (pinos ELE9, ELE10 e ELE11), assim você pode ter até 12 teclas disponíveis.
A imagem abaixo mostra os pinos e conexões do Shield, conforme comentamos acima.

As portas não identificadas estão livres para uso.
Conexões do Touch Shield Sparkfun
Assim, se você deseja ligar o shield sem usar barra de pinos, ligando os fios diretamente ao Arduino, faça a seguinte conexão:
- Pino 4 do Shield ao pino SDA do Arduino
- Pino 5 do Shield ao pino SCL do Arduino
- Atenção na conexão do Pino GND: repare na imagem acima que não pode ser qualquer pino GND do Shield. Precisa ser exatamente o indicado no lado esquerdo, ao lado do pino 13
- Pino 3.3v do Shield ao 3.3v do Arduino
- Pino 5v do Shield ao 5v do Arduino
Sua ligação ficará dessa maneira se você utilizar o shield com o Arduino Uno:

E dessa se você for utilizar um Arduino Mega:

Programa teclado com Arduino
O programa abaixo, sem alterações, pode ser utilizado nos dois circuitos mostrados anteriormente. Antes de compilar o programa, coloque os arquivos mpr121, i2c, defs e types (todos com extensão .h) na mesma pasta do programa. Esses arquivos você encontra nesse link.

Vamos ao programa:
//Programa : Teste Touch Shield Sparkfun
//Alteracoes e adaptacoes : Arduino e Cia
//Baseado no programa original de
//Aaron Weiss, based on the MPR121 Keypad Example by Jim Lindblom
// Inclui as bibliotecas
#include "mpr121.h"
#include "i2c.h"
// Numero maximo de digitos
#define DIGITS 11
// Relaciona as entradas do teclado com o numero
// dos eletrodos
#define UM 8
#define DOIS 5
#define TRES 2
#define QUATRO 7
#define CINCO 4
#define SEIS 1
#define SETE 6
#define OITO 3
#define NOVE 0
//Extras (nao utilizado)
#define ELE9 9
#define ELE10 10
#define ELE11 11
//Pino interrupcao
int irqpin = 2;
void setup()
{
//Define o pino da interrupcao como entrada e o
//coloca em HIGH
pinMode(irqpin, INPUT);
digitalWrite(irqpin, HIGH);
Serial.begin(9600);
DDRC |= 0b00010011;
PORTC = 0b00110000;
//Inicializa a comunicacao I2C
i2cInit();
delay(100);
//Inicializa o MPR121
mpr121QuickConfig();
//Cria uma interrupcao e a aciona quando um botao
//e pressionado e o pino da interrupcao vai para LOW
attachInterrupt(0,getNumber,LOW);
//Mensagem inicial
Serial.println("Aguardando...");
}
void loop()
{
//Coloque aqui algum codigo adicional
}
void getNumber()
{
int i = 0;
int touchNumber = 0;
uint16_t touchstatus;
char digits[DIGITS];
touchstatus = mpr121Read(0x01) << 8;
touchstatus |= mpr121Read(0x00);
//Verifica quantas teclas foram pressionadas
for (int j=0; j<12; j++)
{
if ((touchstatus & (1<<j)))
touchNumber++;
}
if (touchNumber == 1)
{
if (touchstatus & (1<<SETE))
digits[i] = '7';
else if (touchstatus & (1<<QUATRO))
digits[i] = '4';
else if (touchstatus & (1<<UM))
digits[i] = '1';
else if (touchstatus & (1<<OITO))
digits[i] = '8';
else if (touchstatus & (1<<CINCO))
digits[i] = '5';
else if (touchstatus & (1<<DOIS))
digits[i] = '2';
else if (touchstatus & (1<<NOVE))
digits[i] = '9';
else if (touchstatus & (1<<SEIS))
digits[i] = '6';
else if (touchstatus & (1<<TRES))
digits[i] = '3';
Serial.print("Tecla pressionada : ");
Serial.println(digits[i]);
i++;
}
//Nao realiza nenhuma acao caso mais de uma tecla
//seja pressionada
else if (touchNumber == 0)
;
else
;
}
Após carregar o programa no Arduino, abra o serial monitor e acione as
teclas do shield. A cada tecla pressionada, você terá uma saída
correspondente no Serial Monitor:

Claro que você não ficará limitado aos números de 1 a 12 do shield. Com pequenas alterações, é possível imprimir strings e até mesmo acionar as portas do Arduino a cada acionamento das teclas.
Gostou? Confira outros posts usando Arduino aqui mesmo no Arduino e Cia!