TouchScreen chip GT928 con NANO via I2c

Buenas tardes.

Necesito manejar un touchscreen desde un Aruino NANO vía I2c.

El chip del controlador Touchscreen es un GT928.

Lo he identificado con I2cdetect, la dirección es 0x5d.

Veo una librería TAMC_GT911 (Arduino Library for GT911 Touch Panel)

Tengo varias dudas:

1.- Es válida para el GT928?

2.- Veo además de los pines SCL, SDA otros dos: INT y RESET.

Donde debo conectarlos y qué función realizan.

Gracias por vuestras respuestas.

¡Teléfono para @TFTLCDCyg !
:grinning_face_with_smiling_eyes:

El panel táctil capacitivo GT928 soporta hasta 10 puntos táctiles, el GT911 solo 5 puntos.

Que bien que has podido obtener la dirección i2C de tu panel, me parece que es la misma que la del GT911.

En principio podrías utilizar la librería TAMC_GT911 como base, pero debes considerar que el árbol de registros es diferente, por lo que primero debes profundizar un poco en las diferencias entre ambos chips, por lo tanto el primer paso con la librería es modificar los registros para adaptarlo al chip GT928.

Luego de esa revisión quizás podría ser que ambos grupos de registros sean compatibles, pero es mejor que aprendas algunos detales del panel que quieres usar.

GT928 datasheet
GT928 manual de programación

GT911 datasheet
GT911 manual de programación

Recuerda que debes definir el tamaño del panel en las líneas de configuración de la librería usados en el sketch, considerando el tamaño del TFT para que obtengas una mejor precisión

Gracias gatul por pasarle la llamada a TFTLCDCyg...No sé si el estará tan contento.

Tengo definido el NANO como ATMega 328P OldBootloader.
Por cierto... con #include "TAMC_GT911.h" y con un setup solo definiendo el serial y el loop con delay 3000.
Me dice al subir el sketch .
ATENCIÓN: la librería TAMC_GT911 pretende ejecutarse sobre arquitectura(s) esp32 y puede ser incompatible con tu actual tarjeta la cual corre sobre arquitectura(s) avr.

Pues nada ... me pondré a currar...
Saludos

Yo se que él sabe mucho del tema (buscá sus publicaciones).
Hay que sacarle provecho su ayuda desinteresada. :wink:

Saludos

Con gusto para ayudar.

En efecto hay una advertencia respecto a placas AVR.

De hecho hay un error en el llamado de la librería wire, dentro del archivo TAMC_GT911.ccp, ésta función debe quedar así:

void TAMC_GT911::begin(uint8_t _addr) {
  addr = _addr;
  //Wire.begin(pinSda, pinScl);  //linea que dá error
  Wire.begin();
  reset();
}

Con esa corrección el ejemplo compila sin errores, me llama la atención que persiste la advertencia de que fue creado para arquitectura esp32...

Alguna instrucción dentro de la librería quizás deba ser modificada, pero hasta no cargar al sketch persistirá la duda

PD: Si el problema es el tamaño de la placa, te sugeriría miraras la posibilidad de conseguir alguna placa teensy 3.2 o una teensy 4 o una STM32F411CE, son bastante diminutas y con mayor espacio de memoria y frecuencia en el microcontrolador. Hice pruebas de compilación en una placa teensy 4.1 y en una F411CE sin ver errores, solo la advertencia de la arquitectura para esp32.

Gracias ante todo por vuestro tiempo.

He investigado el tema de ESP o AVR y en github he encontrado que hay dos librerías WIRE.

Una para cada arquitectura.

name=Wire

version=1.0

author=Arduino

maintainer=Ivan Grokhotkov ivan@esp8266.com

sentence=Allows the communication between devices or sensors connected via Two Wire Interface Bus. For esp8266 boards.

paragraph=

category=Signal Input/Output

url=Wire - Arduino Reference

architectures=esp8266

name=Wire

version=1.0

author=Arduino

maintainer=Arduino info@arduino.cc

sentence=This library allows you to communicate with I2C and Two Wire Interface devices.

paragraph=It allows the communication with I2C devices like temperature sensors, realtime clocks and many others using SDA (Data Line) and SCL (Clock Line)

category=Communication

url=Wire - Arduino Reference

architectures=avr

La de AVR define:

void begin(uint8_t);
void begin(int);

La de ESP define:

void begin(int sda, int scl);
void begin(int sda, int scl, uint8_t address);

Por lo tanto dependiendo de si es AVR o ESP se debe de utilizar una u otra librería WIRE.

Otra cosa es como hacerlo en el IDE de Arduino o debe hacerlo automático.

Así que creo la mejor solución para mí, es utilizar la de AVR.

Me queda trabajo…. Al final tendré que rehacer las TAMC_GT911.h y cpp

¿Qué opináis?.

Tras la modificación de @TFTLCDCyg esta es la salida repetidamente:
Touch 1: x: 65535 y: 65535 size: 255
Touch 2: x: 65535 y: 65535 size: 255
Touch 3: x: 65535 y: 65535 size: 255
Touch 4: x: 65535 y: 65535 size: 255
Touch 5: x: 65535 y: 65535 size: 255
Touch 6: x: 65535 y: 65535 size: 255
Touch 7: x: 65535 y: 65535 size: 255
Touch 8: x: 65535 y: 65535 size: 255
Touch 9: x: 65535 y: 65535 size: 255
Touch 10: x: 65535 y: 65535 size: 255
Touch 11: x: 65535 y: 65535 size: 255
Touch 12: x: 65535 y: 65535 size: 255
Touch 13: x: 65535 y: 65535 size: 255
Touch 14: x: 65535 y: 65535 size: 255
Touch 15: x: 65535 y: 65535 size: 255

Aparentemente está todo a "1"

Solicito ayuda...
Saludos

¿Qué ocurre con los datos que miras en el monitor serie cuando presionas el panel táctil?, ¿se mantienen igual o cambian?.

Mira el manual de programación, los dispositivos i2C son muy sensibles a los valores de sus registros específicos. Me parece que ambos comparten similitudes, las que difieren entre los dos son las que te darán la clave.

De acuerdo con el manual de programación del GT928, las direcciones del dispositivo deberían ser:

(página 8)
"... GT928 has 2 sets of slave address 0xBA/0xBB & 0x28/29..."

Los datos no cambian.

La dirección detectada con i2cescaner e i2cdetect es la 0x5d.
Hay que cambiarle la dirección a las que aparecenen eel manual, yo creía que eran un ejemplo.

Necesito conectar INT y RST? ahora no los tengo conectados.
Este es el dispositivo.
Saludos.

Que bien que hayas subido una foto del hardware, en principio deberías conectar todos los pines, ya que la librería realiza un reset por 50 ms y llama a esos dos pines RST e INT.

Respecto a las direcciones es muy importante saber cuales tiene el panel, deberías conectar todos los pines y primero pasar un escaneo de dispositivos i2C para saber si está bien conectado.

Conectados todos los pines y he pasado i2cescaner con este resultado.

Escaner I2C
Buscando...
Se ha encontrado dispositivo I2C en la dirección 0x14 !
Se ha encontrado dispositivo I2C en la dirección 0x94 !
¡Listo!

Antes detectaba solo la 0x5d y ahora estas dos.
Dos direcciones es posible??

Saludos y gracias por vuestra colaboración.

Continúo con el GT928 sin hacer que funcione.

La dirección está configurada a 0x5D.

Aparecen en monitor serie las coordenadas de toques los primeros 2 / 3 segundos después de iniciar el programa después nada de nada. pointInfo no varía, se queda a 0.

uint8_t pointInfo = readByteData(GT911_POINT_INFO);

No soy capaz de conocer la configuración correcta que debo de cargar.

Adjunto fichero con los valores que tengo cargados.

El valor en 0x80FF (Chksum) revisado correcto y puesto a 1 Config_Fresh, lee los primeros toques del panel, lo que me confirma el ok.
TFTLCDCyg Te funciona bien a ti?
No encuentro librería para el GT928 y avr, así que utilizo esto de github.
TAMCTec/gt911-arduino/blob/main/examples/TouchPrint/TouchPrint.ino

TAMCTec/gt911-arduino/blob/main/TAMC_GT911.h y .cpp

con la librería WIRE (Wire.h y Wire.cpp) descargada de aquí es para “avr”:

/arduino/ArduinoCore-avr/blob/master/libraries/Wire/src/Wire.cpp

Agradecería que alguien me diga los valores a configurar para poder leer las coordenadas de los toques. Hay Muchos datos que no llego a entender para que valen.

Saludos.
GT928 Device TouchScreen.zip (899 Bytes)

Bueno, esto ya parece que funciona mejor :wink:
Hay una cosa que necesito mejorar:
Quiero incrementar el tiempo para dar por valido un toque.

Blockquote

23:06:27.349 -> -------------------------------------------->Touch 1: x: 336 y: 865 size: 12
23:06:27.349 -> -------------------------------------------->Touch 1: x: 336 y: 865 size: 12
23:06:27.382 -> -------------------------------------------->Touch 1: x: 336 y: 865 size: 12

Blockquote

Que el GT928 no reporte aquellos toques con duración menor de 400mS (por ejemplo)

He intentado con varias modificaciones del registro.
Me podeis orientar como afectan por ejemplo estas?
0x8097 Key_Area
0x807C Noise_Detect_Times

Gracias..

Ya no tengo el panel táctil de pruebas.

Pensé que podría hacer funcionar por separado el chip GT911 de una pantalla dañada, pero está conectado aún al chip principal de la pantalla y no he podido conseguir respuesta siquiera al escaneo de dispositivos i2C, al energizar el panel se energiza el chip de la pantalla.

En este punto toca hacer prueba y error, te sugiero revisar a detalle la hoja de datos, ya eres el experto ahora

Gracias TFTLCDCyg, he tenido que dejar este tema unos días. Las próximas semanas lo retomaré.
No implca que cualquier sugerencia será aceptada. :slightly_smiling_face:
Saludos.

Este tipo de paneles generan un vector de calibración, en el datasheet y en el manual solo refieren a un procedimiento interno durante la inicialización, pero la verdad es que no dicen nada útil.

Ese vector tiene 25 valores hexadecimales, lo sé por que este tipo de paneles táctiles han sido implementados en pantallas HMI como las FT81x o las BT81x. La variante GT911 que es la versión mas reciente, pero recortada, la utilizan las pantallas EVE3 de Matrix orbital. Y déjame decirte que en particular el chip GT es muy difícil de calibrar. Y en esas pantallas si no calibras, las entradas táctiles simplemente no funcionarán.

La versión equivalente a los chips GT (y mucho mas reciente), es el chip ILI2132A de ILITEK. Existe otra familia de chips capacitivos como los FocalTech FT53XX y los FT54XX, todos ellos requieren de una calibración de tres puntos antes de su uso normal.

Aquí esta el punto, primero hay que conseguir calibrar el panel con un mínimo de tres puntos, almacenando el vector de calibración, en por ejemplo una memoria EEPROM, esto se debería conseguir durante el proceso de calibración. De lo contrario no conseguirás que el panel responda de forma consistente.

La librería debería permitir calibrar el panel en cualquier momento, simplemente borrando los datos de la eeprom y retomando los tres puntos de calibración, para el nuevo vector. Posteriormente para poder usar los datos de la calibración, solo bastaría con leerlos de la eeprom. Esa gestión de datos debe hacerla el MCU.

Gracias por la explicación...
TFTLCDCyg Mi GT928 está calibrado (no tengo claro como lo hce), las coordenadas se corresponden dependiendo de la resolución que le pongo.
Me faltarian unas cosas:
1.- Poder definir el tamaño del "toque", lo que aparece como "SIZE".
2.- Poder definir el tiempo para validar un toque.
Supongo que serán datos muy parecidos al GT911.
Pero no encuentro donde "tocar" en la configuración.

Gracias por vuestras ayudas.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.