12 agosto 2014

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:
 
Teclado Touch Shield Sparkfun

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 3x3, 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 :

Touch Shield - Pinagem
 
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
  • Pino GND do Shield ao GND do Arduino (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 :

Circuito Teclado Touch - Arduino Uno

E dessa se você for utilizar um Arduino Mega :

Circuito Teclado Touch - Arduino Mega








Programa Touch Shield Arduino


O programa abaixo, sem alterações, pode ser utilizado nos dois circuitos mostrados acima. Antes de compilar o programa, coloque os arquivos mpr121.hi2c.h, defs.h e types.h na mesma pasta do programa. Esses arquivos você encontra nesse link. Sua pasta deve ficar mais ou menos assim :

Estrutura de arquivos


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//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 :

Touch Sparkfun - 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.

Nenhum comentário:

Postar um comentário