April 30,2022

Módulo de teclado sensible al tacto TTP229

by Marcel Lundberg

Este teclado de 16 teclas se conecta utilizando una conexión I2C (2-Wire), aunque en el chip sensor capacitivo TTP229 tiene implementada la opción de conectar solamente 8 teclas, que tienen salida directa en los pines del módulo. Son los pines marcados como OUT1 a OUT8. Las líneas marcadas SDO y SCL pertenecen a la interfaz I2C.

Características

■ Fácil de usar, calibración automática

■ LED de encendido

■ Funciona en modo 8 o 16 canales.

■ La salida puede ser configurada como activa alta o baja

■ Simple para reemplazar salidas de llaves mecánicas

■ La salida se puede conectar directamente a los pines de entrada del microcontrolador

Especificaciones

■ Voltaje de funcionamiento: 2V-5,5V

■ Tiempo de calibración de inicio: 0,5 seg.

■ Tamaño de la plaqueta: 49,3 x 64,5mm

Este módulo es una buena alternativa para reemplazar teclados mecánicos, ya que es durable, fácil de instalar (es totalmente plano), se puede proteger con una membrana en ambientes de atmósfera corrosiva, y proporciona más durabilidad en condiciones de trabajo continuado.

Puentes que definen las opciones

(Ver las opciones definibles en la tabla abajo)

EJEMPLO:

Diagrama de pines del circuito integrado TTP229

El teclado se puede configurar tanto para usar con 8 teclas como con 16. Para el primer caso, parece poco razonable usar sólo la mitad, ya que en realidad se venden módulos directamente con sólo 8 teclas, y también con 4 y hasta con una sola.

En todo caso, la división de funciones, y la multiplicidad de opciones que se pueden elegir usando una serie de puentes en la plaqueta aportan amplia funcionalidad y una buena adaptación para distintos usos.

Cuando se elige la opción de 16 teclas, se los lee por medio de una interfaz serie de 2 vías, llamada comúnmente 2-Wire en el mundo Arduino, o I2C.

Una vez conectado el hardware y descargando el código al Arduino, al pulsar los teclas se pueden observar los resultados en el Monitor Serie del IDE Arduino.

Diagrama en bloques del circuito integrado TTP229

Diagrama del módulo de teclado TTP229

PROGRAMAS DE PRUEBA

Conexión directa de las salidas de 8 teclas

Si en alguna ocasión se necesita utilizar sólo la serie de teclas del 1 a 8, la configuración y la lectura por programa es más sencilla y simple de entender. La conexión involucra 8 pines del conector del módulo de teclado al Arduino, y dos más de ellas para alimentación +5 y GND.

Esta forma de uso tiene la desventaja de que ocupa muchas entradas digitales (que nunca sobran), aunque la ventaja es que no necesariamente se debe usar un Arduino u otro microcontrolador para recibir datos desde el módulo si se lo usa con esta configuración. Podría servir para introducir órdenes de teclado en un circuito puramente digital, sin procesador ni programa.

Diagrama de conexiones con Arduino

Código simple para 8 teclas

8 teclas conexión en paralelo /* Código simple para 8 teclas */ void setup() { pinMode(2, INPUT); // Tecla 1 pinMode(3, INPUT); // Tecla 2 pinMode(4, INPUT); // Tecla 3 pinMode(5, INPUT); // Tecla 4 pinMode(6, INPUT); // Tecla 5 pinMode(7, INPUT); // Tecla 6 pinMode(8, INPUT); // Tecla 7 pinMode(9, INPUT); // Tecla 8 Serial.begin(9600); } void loop(){ // ¿ tecla presionada ? for (byte i = 2; i < 10; i++) { if (digitalRead(i)) { Serial.print("Tecla "); Serial.println(i-1); break; } } delay(200); // Si se deja presionada la tecla, repite el mensaje cada 200 milisegundos } 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 /* Código simple para 8 teclas */ void setup ( ) { pinMode ( 2 , INPUT ) ; // Tecla 1 pinMode ( 3 , INPUT ) ; // Tecla 2 pinMode ( 4 , INPUT ) ; // Tecla 3 pinMode ( 5 , INPUT ) ; // Tecla 4 pinMode ( 6 , INPUT ) ; // Tecla 5 pinMode ( 7 , INPUT ) ; // Tecla 6 pinMode ( 8 , INPUT ) ; // Tecla 7 pinMode ( 9 , INPUT ) ; // Tecla 8 Serial . begin ( 9600 ) ; } void loop ( ) { // ¿ tecla presionada ? for ( byte i = 2 ; i < 10 ; i ++ ) { if ( digitalRead ( i ) ) { Serial . print ( "Tecla " ) ; Serial . println ( i - 1 ) ; break ; } } delay ( 200 ) ; // Si se deja presionada la tecla, repite el mensaje cada 200 milisegundos }

Resultado en Monitor Serie

Conexión para leer las 16 teclas

Para leer los teclas del 1 a 16 se debe hacer a través de la interfaz serie I2C o 2-Wire del Arduino, utilizando SCL y SDO, y con dos pines digitales que uno elija y el programa adecuado, que en general es muy simple.

Conexión entre el Arduino y el teclado para el ejemplo de 16 teclas por I2C

Cablear como se muestra a continuación y además hacer un puente en el módulo del teclado para configurarlo para funcionar con 16 teclas, sobre los puntos marcados “TP2”, que se muestran abajo en naranja.

Esto se hace soldando un alambrecito que una estos 2 terminales.

Diagrama de la conexión con Arduino

Código para la lectura de 16 teclas

Código para la lectura de 16 teclas // Define los pines digitales para Clock y Dato #define pinSCL 8 #define pinSDO 9 byte Tecla; // guarda el numero de tecla activada void setup() { Serial.begin(9600); // inicializa la interfaz serie pinMode(pinSCL, OUTPUT); // pin Clock (SCL) salida pinMode(pinSDO, INPUT); // pin Dato (SDO) entrada } void loop() { // leer el estado del teclado Tecla = leerteclas(); // si se toca una tecla lo muestra en Monitor Serie if (Tecla) { Serial.print("Tecla -> "); Serial.println(Tecla); } // esperar un poco para no // sobrecargar el puerto serie delay(200); } // funcion que lee el estado del teclado byte leerteclas(void) { byte contador; byte estadoTecla = 0; // enviar 16 pulsos de clock (uno para cada tecla) // y leer el estado del pin de dato en cada pulso for(contador = 1; contador <= 16; contador++) { digitalWrite(pinSCL, LOW); // clock a BAJO // si el pin de dato esta BAJO (el teclado tiene modo de // salida en activo BAJO)registra el número de tecla if (!digitalRead(pinSDO)) estadoTecla = contador; digitalWrite(pinSCL, HIGH); // clock a ALTO } return estadoTecla; } 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 // Define los pines digitales para Clock y Dato #define pinSCL 8 #define pinSDO 9 byte Tecla ; // guarda el numero de tecla activada void setup ( ) { Serial . begin ( 9600 ) ; // inicializa la interfaz serie pinMode ( pinSCL , OUTPUT ) ; // pin Clock (SCL) salida pinMode ( pinSDO , INPUT ) ; // pin Dato (SDO) entrada } void loop ( ) { // leer el estado del teclado Tecla = leerteclas ( ) ; // si se toca una tecla lo muestra en Monitor Serie if ( Tecla ) { Serial . print ( "Tecla -> " ) ; Serial . println ( Tecla ) ; } // esperar un poco para no // sobrecargar el puerto serie delay ( 200 ) ; } // funcion que lee el estado del teclado byte leerteclas ( void ) { byte contador ; byte estadoTecla = 0 ; // enviar 16 pulsos de clock (uno para cada tecla) // y leer el estado del pin de dato en cada pulso for ( contador = 1 ; contador <= 16 ; contador ++ ) { digitalWrite ( pinSCL , LOW ) ; // clock a BAJO // si el pin de dato esta BAJO (el teclado tiene modo de // salida en activo BAJO)registra el número de tecla if ( ! digitalRead ( pinSDO ) ) estadoTecla = contador ; digitalWrite ( pinSCL , HIGH ) ; // clock a ALTO } return estadoTecla ; }

Resultado en Monitor Serie

Lectura de 16 teclas con posibilidad de pulsar más de una a la vez

Como en cada caso en que se habilitan 16 teclas, la comunicación con el microcontrolador se realiza por medio del protocolo I2C. Cada tecla está asociada a un bit en un entero sin signo de dos bytes.

Estos son algunos ejemplos:

La tecla 1 aparecerá como 0000 0000 0000 0001

La tecla 2 aparecerá como 0000 0000 0000 0010

La tecla 3 aparecerá como 0000 0000 0000 0100

… …

La tecla 9 aparecerá como 0000 0001 0000 0000

La tecla 12 aparecerá como 0000 1000 0000 0000

La tecla 16 aparecerá como 1000 0000 0000 0000

Cuando se tocan dos o más teclas, el entero asociado contendrá dos bits o más en 1. Por ejemplo, si se pulsan la tecla 1 y la 16 al mismo tiempo, el entero asociado será 1000 0000 0000 0001

Conexiones:

Los pines TP0 a TP4 en el teclado se deben conectar (hacer un puente) como en la figura siguiente:

Diagrama de conexión con el Arduino:

Código para 16 teclas – multitecla – interfaz 2-wire:

16 teclas - multitecla - interfaz 2-wire /* * 16 teclas - multitecla - interfaz 2-wire */ int SCLPin = A5; int SDOPin = A4; unsigned int DATO = 0; unsigned int viejo_DATO = 0; void setup() { Serial.begin(9600); pinMode(SCLPin , OUTPUT); } unsigned int ttp229() { unsigned int DATO = 0; pinMode(SDOPin , OUTPUT); digitalWrite(SDOPin, HIGH); delayMicroseconds(93); digitalWrite(SDOPin, LOW); delayMicroseconds(10); pinMode(SDOPin , INPUT); for (int i = 0; i < 16; i++) { digitalWrite(SCLPin, HIGH); delayMicroseconds(1); digitalWrite(SCLPin, LOW); DATO |= digitalRead(SDOPin) << i; } delay(2); return DATO&0xFFFF; } void loop() { DATO = ttp229(); if (DATO != viejo_DATO) { Serial.println(DATO, BIN); viejo_DATO = DATO; delay(200); } } 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 /* * 16 teclas - multitecla - interfaz 2-wire */ int SCLPin = A5 ; int SDOPin = A4 ; unsigned int DATO = 0 ; unsigned int viejo_DATO = 0 ; void setup ( ) { Serial . begin ( 9600 ) ; pinMode ( SCLPin , OUTPUT ) ; } unsigned int ttp229 ( ) { unsigned int DATO = 0 ; pinMode ( SDOPin , OUTPUT ) ; digitalWrite ( SDOPin , HIGH ) ; delayMicroseconds ( 93 ) ; digitalWrite ( SDOPin , LOW ) ; delayMicroseconds ( 10 ) ; pinMode ( SDOPin , INPUT ) ; for ( int i = 0 ; i < 16 ; i ++ ) { digitalWrite ( SCLPin , HIGH ) ; delayMicroseconds ( 1 ) ; digitalWrite ( SCLPin , LOW ) ; DATO |= digitalRead ( SDOPin ) << i ; } delay ( 2 ) ; return DATO & 0xFFFF ; } void loop ( ) { DATO = ttp229 ( ) ; if ( DATO != viejo_DATO ) { Serial . println ( DATO , BIN ) ; viejo_DATO = DATO ; delay ( 200 ) ; } }

En la Terminal Serie del IDE de Arduino se verá lo que sigue al pulsar las teclas desde 1 a 16 (Nota: debido a la manera en que la función Serial.println maneja las variables, el Monitor Serie no muestra los ceros a la izquierda del entero de 16 bits):

Para este ejemplo: PDFs de ayuda (en inglés) desde el siguiente enlace:

Se puede descargar el programa INO (con textos en inglés) desde el siguiente enlace:

  • Marcel Lundberg
  • April 30,2022

Leave a Reply