En términos muy simples, una pantalla táctil (touch screen) es una combinación de una pantalla gráfica estándar GLCD 128x64 a la que se le ha añadido un panel táctil (touch panel TP) lo que permite crear interfaces de usuario muy simples, intuitivos, versátiles y sumamente atractivos (similares a las pantallas táctiles de los teléfonos moviles y otros equipos electrónicos). La tecnología táctil es lo más moderno que existe actualmente para la interacción entre el usuario y un dispositivo electrónico y se usa ampliamente en teléfonos celulares, tablets, computadoras personales y otros artefactos electrónicos.
¡Descubre el mundo de los microcontroladores PIC y lleva tus habilidades de programación al siguiente nivel! Obtén nuestro eBook y disfruta aprendiendo paso a paso desde cero, podrás realizar proyectos prácticos, encontrar soluciones a problemas comunes y explorar una amplia cobertura de temas desde lo más básico a lo más avanzado. Incluye software y ejemplos resueltos. ¡Cómpralo ahora y libera el increíble potencial de esta poderosa tecnología hoy mismo!
Normalmente para convertir una pantalla gráfica (GLCD 128x64) a la tecnología táctil se coloca sobre aquélla un panel táctil (se lo puede comprar por separado o incorporado al GLCD). El control del panel táctil se logra actuando sobre sus cuatro terminales de conexión a través de un pequeño circuito transistorizado y un microcontrolador. La pantalla táctil se conecta de la manera convencional al microcontrolador, y debido al número relativamente alto de conexiones necesarias se debe utilizar un microcontrolador con la cantidad suficiente de pines disponibles, por ejemplo puede ser el PIC16F877A o el PIC16F887.
El panel táctil dispone de cuatro pines de conexión (en una cinta de 4 terminales); estos terminales se identifican de la siguiente forma (se puede identificar visualmente cada pin observando con atencion a cual segmento del panel tactil esta conectado):
- T-Top (Arriba)
- R-Right (Derecha)
- B-Bottom (Abajo)
- L-Left (Izquierda)
Los pines R-L conforman lo que se llama superficie X, y permiten determinar la coordenada x
del panel tactil. Los pines T-B conforman lo que se llama superficie Y, y permiten determinar la coordenada y
del panel tactil.
Conexión del GLCD 128x64 y el panel táctil a un PIC16F877A
La conexión del GLCD 128x64 al PIC16F877A requiere 15 pines del PIC. Mientras que la conexión del panel táctil se logra por medio de un pequeño circuito transistorizado y necesita 4 pines más del PIC, como se indica en las siguientes figuras:
Los transistores pueden ser los siguientes (o en su defecto cualquier transistor de propósito general de características similares a los indicados):
- BC556 ó 2N3906 (PNP, Si)
- BC546 ó 2N3904 (NPN, Si)
Una desventaja de la pantalla táctil es su elevado número de conexiones, que al final se ve compensada por los resultados obtenidos.
Ejemplo en mikroC PRO con el PIC16F877A
GLCD_tactil.c: Pantalla táctil con GLCD 128x64 funcionando como Hoja de dibujo con el microcontrolador PIC16F877A en C (mikroC PRO). Dispone de comandos en pantalla (estos comandos se activan al tocar sobre ellos) para borrar todo CLEAR, para seleccionar el ancho del pincel (los tres puntos cuadrados), para usar el pincel como borrador ERASE y para usar el pincel como lápiz WRITE. Cuando el pincel trabaja como lápiz se puede dibujar cualquier forma en la pantalla simplemente desplazando un señalador de punta redonda (para no dañar el panel táctil). Si se desea también se puede cambiar la función del pincel para que actúe como borrador. Librerías activas de mikroC PRO: ADC, T6963C, TouchPanel y Trigonometry
//GLCD_tactil.c //Microcontrolador: PIC16F877A //Oscilador: Externo 4MHz (Modo HS) //El archivo T6963C.h contiene la definición de constantes y macros. Este //archivo se encuentra en la carpeta del proyecto. #include "T6963C.h" //Declaración de variables de conexión del T6963C char T6963C_dataPort at PORTD; // Puerto de Datos sbit T6963C_ctrlwr at RB2_bit; // Señal WR write sbit T6963C_ctrlrd at RB1_bit; // Señal RD read sbit T6963C_ctrlcd at RB0_bit; // Señal CD command/data sbit T6963C_ctrlrst at RB4_bit; // Señal RST reset sbit T6963C_ctrlwr_Direction at TRISB2_bit; // Señal WR write sbit T6963C_ctrlrd_Direction at TRISB1_bit; // Señal RD read sbit T6963C_ctrlcd_Direction at TRISB0_bit; // Señal CD command/data sbit T6963C_ctrlrst_Direction at TRISB4_bit; // Señal RST reset //Señales no empleadas por la librería, se configuran en la función main sbit T6963C_ctrlce at RB3_bit; // Señal CE sbit T6963C_ctrlfs at RB6_bit; // Señal FS sbit T6963C_ctrlmd at RB5_bit; // Señal MD sbit T6963C_ctrlce_Direction at TRISB3_bit; // Señal CE sbit T6963C_ctrlfs_Direction at TRISB6_bit; // Señal FS sbit T6963C_ctrlmd_Direction at TRISB5_bit; // Señal MD //Final de declaración de variables de conexión del T6963C // Touch Panel (TP) module connections sbit DriveA at RC0_bit; sbit DriveB at RC1_bit; sbit DriveA_Direction at TRISC0_bit; sbit DriveB_Direction at TRISC1_bit; // End Touch Panel module connections char write_erase; char pen_size; char write_msg[] = "WRITE"; // GLCD menu messages char clear_msg[] = "CLEAR"; char erase_msg[] = "ERASE"; unsigned int x_coord, y_coord; void Initialize() { DriveA_Direction = 0; // Set DriveA pin as output DriveB_Direction = 0; // Set DriveB pin as output TRISA = 3; ADC_Init(); // Initialize ADC TP_Init(128, 64, 0, 1); //Initialize TP. Canal 0(AN0) para la posición x, canal 1(AN1) //para la posición y. TP_Set_ADC_Threshold(900); // Set touch panel (TP) ADC threshold } void Calibrate() { T6963C_Dot(0,63,T6963C_WHITE); // Draw bottom left dot T6963C_Write_Text("TOUCH BOTTOM LEFT",0,3,T6963C_ROM_MODE_OR); TP_Calibrate_Bottom_Left(); // Calibration of bottom left corner Delay_ms(1000); T6963C_Dot(0,63,T6963C_BLACK); // Clear bottom left dot T6963C_Dot(127,0,T6963C_WHITE); // Draw upper right dot T6963C_Write_Text(" ",0,3,T6963C_ROM_MODE_OR); T6963C_Write_Text("TOUCH UPPER RIGHT",0,4,T6963C_ROM_MODE_OR); TP_Calibrate_Upper_Right(); // Calibration of upper right corner Delay_ms(1000); } void main() { T6963C_ctrlce_Direction = 0; T6963C_ctrlce = 0; //Habilitar el T6963C. T6963C_ctrlfs_Direction = 0; T6963C_ctrlfs = 0; //Fuente 8x8 (FS<1:0>=00). T6963C_ctrlmd_Direction = 0; T6963C_ctrlmd = 1; //32 columnas (MD<3:2>=11) (pantalla virtual) T6963C_init(128, 64, 8); //Inicializa el T6963C. Caracteres de 8 bits. T6963C_graphics(1); //Habilita la presentación de gráficos. T6963C_text(1); //Habilita la presentación de texto. Initialize(); T6963C_Write_Text("CALIBRATION",0,3,T6963C_ROM_MODE_OR); Delay_ms(1000); T6963C_txtFill(0); // Clear GLCD Calibrate(); T6963C_txtFill(0); T6963C_Write_Text("WRITE ON SCREEN",0,5,T6963C_ROM_MODE_OR) ; Delay_ms(1000); T6963C_txtFill(0); // Clear GLCD T6963C_Write_Text(clear_msg,0,0,T6963C_ROM_MODE_OR); T6963C_Write_Text(erase_msg,11,0,T6963C_ROM_MODE_OR); // Pen Menu: T6963C_Rectangle(41,0,52,9,T6963C_WHITE); T6963C_Box(45,3,48,6,T6963C_WHITE); T6963C_Rectangle(63,0,70,7,T6963C_WHITE); T6963C_Box(66,3,67,4,T6963C_WHITE); T6963C_Rectangle(80,0,86,6,T6963C_WHITE); T6963C_Dot(83,3,T6963C_WHITE); write_erase = T6963C_WHITE; pen_size = 1; while (1) { if (TP_Press_Detect()) { // After a PRESS is detected read X-Y and convert it to 128x64 space if (TP_Get_Coordinates(&x_coord, &y_coord) == 0) { if ((x_coord < 31) && (y_coord < 8)) { T6963C_grFill(0); T6963C_txtFill(0); // Pen Menu: T6963C_Rectangle(41,0,52,9,T6963C_WHITE); T6963C_Box(45,3,48,6,T6963C_WHITE); T6963C_Rectangle(63,0,70,7,T6963C_WHITE); T6963C_Box(66,3,67,4,T6963C_WHITE); T6963C_Rectangle(80,0,86,6,T6963C_WHITE); T6963C_Dot(83,3,T6963C_WHITE); T6963C_Write_Text(clear_msg,0,0,T6963C_ROM_MODE_OR); if (write_erase) T6963C_Write_Text(erase_msg,11,0,T6963C_ROM_MODE_OR); else T6963C_Write_Text(write_msg,11,0,T6963C_ROM_MODE_OR); } // If write/erase is pressed if ((x_coord > 96) && (y_coord < 8)) { if (write_erase) { write_erase = T6963C_BLACK; T6963C_Write_Text(write_msg,11,0,T6963C_ROM_MODE_OR); Delay_ms(500); } else { write_erase = T6963C_WHITE; T6963C_Write_Text(erase_msg,11,0,T6963C_ROM_MODE_OR); Delay_ms(500); } } // If pen size is selected if ((x_coord >= 41) && (x_coord <= 52) && (y_coord <= 9)) pen_size = 3; if ((x_coord >= 63) && (x_coord <= 70) && (y_coord <= 7)) pen_size = 2; if ((x_coord >= 80) && (x_coord <= 86) && (y_coord <= 6)) pen_size = 1; if (y_coord < 11) continue; switch (pen_size) { case 1 : { if ( (x_coord >= 0) && (y_coord >= 0) && (x_coord <= 127) && (y_coord <= 63) ) T6963C_Dot(x_coord, y_coord, write_erase); break; } case 2 : { if ( (x_coord >= 0) && (y_coord >= 0) && (x_coord <= 127-1) && (y_coord <= 63-1) ) T6963C_Box(x_coord, y_coord, x_coord + 1, y_coord + 1, write_erase); break; } case 3 : { if ( (x_coord >= 1) && (y_coord >= 1) && (x_coord <= 127-2) && (y_coord <= 63-2) ) T6963C_Box(x_coord-1, y_coord-1, x_coord + 2, y_coord + 2, write_erase); break; } } } } } }
Al iniciar la ejecución del programa se debe realizar en primer lugar la calibración del panel táctil, de tal forma que las coordenadas del panel coincidan con los puntos que se muestran en el GLCD 128x64 (de lo contrario, al presionar un punto en el panel se encenderá un punto del GLCD en otras coordenadas). Para la calibración hay que seguir las instrucciones que se van dando (se recomienda usar un señalador de punta delgada pero redonda, para mejorar la precisión y al mismo tiempo evitar el deterioro de la superficie del panel táctil). A continuación se pueden ver las fotografías del proceso de calibración y algunos ejemplos:
Calibracion
Tocar la esquina inferior izquierda
Tocar la esquina superior derecha
Pantalla lista para dibujar