Tactil de pantalla TFT me deja calibrar pero luego no funciona

Hola,espero tengan muy buenos dias!!! es la primera vez que escribo en el foro, aunque vengo leyendo y aprendiendo desde hace un tiempo.
Me estoy pasando del mundo de los pics al arduino debido al tema de las pantallas TFT , y eh quedado totalmente atrapado por Arduino, el que creo será un viaje sin retorno.
Descubrí a TFT&LCD por sus videos y gracias a él y a los post de este foro, hoy tengo en mis manos unas pantallas tft 3.2" funcionando con un arduino mega a 5v y un shield casero para reducir de 5V a 3.3V
No fue tarea fácil pero por suerte están funcionando, aunque no del todo y acá vienen las preguntas.
El problema lo tengo con el tactil, paso a describir:
La pantalla es una TFT 3.2 con controlador ILI9341 16bits de 34 pines,tarjeta SD y un chip XPT2046 para el tactil y estoy utilizando la libreria UTFT y la URtouch para manejarla. Cuando cargo el ejemplo de calibración todo funciona bien, me deja calibrarla, siguiendo las instrucciones cambio los 3 #define en el archivo URtouchCD y comento los existentes, reinicio el ide de arduino, cargo los ejemplos siguiente del touch, como el test button o el draw y ninguno funciona.
Tambien probé la librería Utouch-master y hace lo mismo.
Según leí esta pantalla comparte los pines del touch con los de la tarjeta SD la cual no estoy utilizando, y la conexión sería :

TFT Mega

pin34 CLK, 6
pin33 T_CS, 5
pin30 MOSI, 4
pin29 MISO, 3
pin31 PEN . 2

Aclaración: esto 5 pines los tengo conectado directamente al arduino mega sin reducir la tension a 3,3V

(También posee un pin llamado F_CS (pin 32) que no eh probado conectarlo)

Y así quedaría el constructor URTouch myTouch( 6, 5, 4, 3, 2); es así como esta definido en el programa que tengo funcionando ahora,(el que me permite calibrar la pantalla).
Pero la realidad es que para que funcione físicamente tuve que conectar:

TFT Mega

CLK, 52
T_CS, 5
MOSI, 51
MISO, 50
PEN . 2
Así que una de las dudas es, como es que en el programa defino unos pines que físicamente no están conectados?
Y al parecer en el ejemplo de calibración funcionan igual, pero en los demás ejemplos no.
Ya probé definir estos pines en el constructor URTouch myTouch( 52, 5, 51, 50, 2);pero no funciona ni el ejemplo de calibración.
Cual podrá ser el problema?
Espero haberme expresado correctamente con el fin de que se entienda el problema y puedan brindarme alguna ayuda. Desde ya muchas gracias.
Saludos !!!!

1 Like

Bienvenido al foro.

Aunque las lineas para activar la pantalla táctil refieren a los pines SPI, no hagas caso de esa codificación, ya que no estas usando el lector SD. En los ejemplos que he podido hacer funcionar con esa pantalla (ILI9341 16 bits, 3.2" y 34 pines), basta con conectar los pines-touch a pines digitales

Conecta físicamente los pines-touch de tu pantalla, en el siguiente orden

                                 TFT             Mega

                                  CLK              6
                                  T_CS             5
                                  MOSI             4
                                  MISO             3
                                  PEN              2

Hola TFTLCDyg, gracias por responder. Te cuento que la configuración que me recomiendas fue la primera que use pero no me funcionó, no me dejaba ni calibrar la pantalla.Es a partir de ahí que empecé a buscar otra conexión hasta que di con la antes descrita y de esa manera fue que al menos me permitió calibrar la pantalla.
A no ser que ahora que supuestamente tengo calibrada la pantalla pruebe cambiar la conexión a como me decís vos. La verdad es que no se que mas probar, si se te ocurre alguna otra sugerencia bienvenida sea.

Muchas gracias por tu atención.
Saludos!!!

Hola buenos dias!!!!! y era como vos decías TFTLCDyg, se ve que anteriormente cuando hice la conexión :

TFT Mega

CLK 6
T_CS 5
MOSI 4
MISO 3
PEN 2

algo debió haber quedado mal, o una soldadura o una linea mezclada no lo se, la cuestion es que hoy volvi a cambiar la conexión y salió funcionando así que feliz!!!!!!!!!!
Muchisimas gracias por tu ayuda!!!!, ahora se viene lo mas lindo, diseñar mi proyecto. Tal vez mas adelante te haga alguna pregunta mas.
Otra vez muchas gracias !!!!! .
Saludos!!!!!

Que bien que has logrado hacer funcionar la pantalla. Te sugiero que construyas algún tipo de PCB, en cuanto puedas, para que no batalles con los cables todo el tiempo. La pantalla tiende a fallar con el movimiento mas leve de alguno de los cables.

Hay un bug "no oficial" en la librería desde que se llamaba Utouch, a veces la calibración procede correctamente, sin embargo al momento de cargar algún ejemplo para usar la pantalla táctil, ésta deja de responder. Este fallo ocurre con mayor frecuencia cuando se conecta SCK, MOSI y MISO a las lineas SPI correspondientes. Ocurre con menor frecuencia cuando esas lineas se conectan a pines digitales.

Lo que se debe hacer es verificar el cableado (tanto como se pueda), siempre hay un cable que no sirve, luego hay que desconectar y conectar el arduino de la alimentación, en ocasiones basta con hacerlo una vez, otras hay que repetirlo varias veces.

En el extremo hay que desconectar el arduino y luego el TFT, se vuelve a conectar todo nuevamente y como por arte de magia la pantalla táctil responde.

PD: esto resulta algo molesto después de haber instalado la pantalla dentro de su gabinete o encapsulado de protección; en el diseño se deben tomar medidas para poder quitar la alimentación del arduino, cuando la pantalla táctil no responda. Por esta falla aleatoria tuve que investigar otro tipo de pantallas para mi proyecto.

Mantengo todavía una ILI9341+XPT2046 en el control de encendido de la PC, (la conservo porque fue la primer pantalla táctil que logré hacer funcionar... ya saben una especie de apego sentimental jejejeje) y a veces salta ese fallo, estoy reconsiderando otras pantallas de 2.4" que no tengan ese chip-táctil.

Mucha gracias por tus consejos,vengo leyendo tus post desde hace un tiempo y vi que recomendas usar la linea FT800 ,solo que cuando descubrí arduino y empece a leer tus recomendaciones ya había comprado estas pantalla tengo otra 3.2 con un ili9327 que también me costo pero ya la tengo funcionando.
Había notado lo de desconectar el arduino y volver a conectarlo, pero no pensé que con el tft sería igual, algo muy importante para saber.
Tengo hecho un PCB en este momento solo que estas 5 conexiones las deje con cables por que no tenía claro donde conectarlas
Las compre pensando en hacerlas funcionar con pics pero tenia que hacer o modificar librerías algo para lo que no estoy preparado,así que no tuve que pensar mucho para pasarme al arduino y ni hablar cuando descubrí la cantidad de productos y a buen precio que había para arduino, cosas que me llevaban un buen tiempo en fabricar, en arduino ya venían hechas y gastaba lo mismo ja ja ja.
Al principio pensé que había perdido mucho tiempo con los pics pero lo bueno fue que adquirí un poco mas de conocimiento .
Bueno nunca es tarde para aprender algo nuevo.
Te agradezco enormemente tus explicaciones, no solo de este post sino la de los demás también, que gracias a ellas hoy tengo funcionando estas pantallas.
Saludos !!!!!!!

Bueno como era de esperar comenzaron las pruebas y aparecieron las dificultades, estoy teniendo problemas con la presentación de números, es decir cuando muestro un valor numérico en la pantalla y va cambiando por ejemplo de tres cifras a dos me queda el residuo de la tercera cifra, vi en otro tema como lo hacían con otra librería, pero algo debo estar haciendo mal por que con la librería UTFT no me funciona. Lo que hice fue lo siguiente:
Primero defini la variable

char textBuff[20];

y luego muestro el valor:

    myGLCD.drawRoundRect(10, 130, 170, 150); 
    myGLCD.setBackColor(VGA_BLUE);
    myGLCD.setColor(VGA_WHITE);
    myGLCD.print("Pres:", 12, 132);
    sprintf(textBuff, "%02d", presAdj);
    myGLCD.printNumI(textBuff, 108 , 132);

Pero no funciona me sale un valor y queda fijo, como debería definirlo para que funcione?

Las limitaciones de las librerías actuales para TFT en arduino, no permiten en la mayoría de los casos, usar por completo las capacidades de las pantallas, hace falta una especie de GPU, es decir un segundo chip y memoria exclusiva para procesamiento gráfico. Hay librerías que lo permiten, pero la magia tras ellas, no es accesible, ya que el autor inspirado, no deja un manual para entender su obra. Se ve impresionante en el video, pero para efectos prácticos solo sirve para el ejemplo que nos muestran.

Debemos jugar con alguno que otro recurso heredado del lenguaje c.

En este caso tu variable debe tener siempre 3 caracteres. Si partes de por ejemplo 798 y quieres llegar a mostrar digamos 80, se tiene que presentar 080; si es 8, tendrá que ser 008.

La instrucción que debes usar en lugar de la que refieres:

sprintf(textBuff, "%02d", presAdj);

Es:

sprintf(textBuff, "%03d", presAdj);

Insertará ceros en las posiciones libres, pero eliminará los residuos de cifras previas.

Hola TFTLCDyg , gracias por responder, hice un programita sencillo, un contador solo para ver que funcione el spritf, asi como me dijiste pero no funciona solo salen 3 números y quedan fijos

#include <UTFT.h>
#include <URTouch.h>

UTFT    myGLCD(ILI9341_16,38,39,40,41);
URTouch  myTouch( 6, 5, 4, 3, 2);

extern uint8_t BigFont[];// 16x6 pixeles
extern uint8_t SevenSegNumFont[];//32x50 pixeles


char textBuff[20];
int x, y;

int  a=0, presAdj=10; 
void setup()
{ 
  myGLCD.InitLCD();
  myGLCD.clrScr();

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  myGLCD.setFont(BigFont);
myGLCD.fillScr(VGA_BLUE);

 
}
  void loop()
  {
a++;
delay(100);
if (a>100)a=0;
    myGLCD.setFont(BigFont);
    myGLCD.setBackColor(VGA_BLUE);
    myGLCD.drawRoundRect(6, 128, 230, 148);     
    myGLCD.print("Pres: ", 8, 130);
    myGLCD.print("Lbs", 175, 130);
    sprintf(textBuff, "%04d", a);
    myGLCD.printNumI(textBuff, 101, 130); 
}

Pruebo sacar el spritf e imprimir los números normalmente (myGLCD.printNumI(a, 101, 130):wink: y el contador funciona pero lógicamente continuo con el problema inicial.
Que estoy haciendo mal ?

Luego probé usar la técnica de tapar con un rectángulo del mismo color del fondo una vez que pasara de las 3 cifras a una, de esta manera

    if(a==0){
    myGLCD.setBackColor(VGA_BLUE);
    myGLCD.fillRoundRect(100, 130, 145, 145);
}

y para mi sorpresa me queda marcado el rectángulo en las partes donde no pisan los números pero de color blanco, por que blanco no es que le estoy indicando que sea azul ?
Habrá alguna otra libreria para ILI9341 16 bits que no sea la UTFT?
Desde ya muchas gracias por cualquier ayuda.
Saludos!!!

Instalé el código en mi ILI9341_16b, hay una pequeña falla en la linea

sprintf(textBuff, "%04d", a);
    myGLCD.printNumI(textBuff, 101, 130);

Debe ser:

sprintf(textBuff, "%04d", a);
    myGLCD.print(textBuff, 101, 130);

Hice una modificación en el código para que el limite superior sea 1100 con una mayor velocidad de cambio, añadí la impresión normal del número a

#include <UTFT.h>
#include <URTouch.h>

UTFT    myGLCD(ILI9341_16,38,39,40,41);
URTouch  myTouch( 6, 5, 4, 3, 2);

extern uint8_t BigFont[];// 16x6 pixeles
extern uint8_t SevenSegNumFont[];//32x50 pixeles


char textBuff[20];
int x, y;

int  a=0, presAdj=10; 
void setup()
{ 
  myGLCD.InitLCD();
  myGLCD.clrScr();

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  myGLCD.setFont(BigFont);
myGLCD.fillScr(VGA_BLUE);

 
}

int delta = 22;
void loop()
  {
//a++;
  a = a+delta;
  delay(100);
  if (a>=1100)delta=-23;
  if (a<=0)delta=22;
    myGLCD.setFont(BigFont);
    myGLCD.setBackColor(VGA_BLUE);
    myGLCD.drawRoundRect(6, 128, 230, 148);     
    myGLCD.print("Pres: ", 8, 130);
    myGLCD.print("Lbs", 175, 130);
    sprintf(textBuff, "%04d", a);
    myGLCD.print(textBuff, 101, 130); 
    myGLCD.printNumI(a, 101, 155);
}

Veo que funciona sin problemas, con sprintf/print. Con printNumI quedan números residuales a la derecha

Para esta pantalla no existe una mejor librería para arduino, creo que no hay. Es posible que exista alguna mas avanzada para STM32, pero ya estamos hablando de otra plataforma y formas de programación muy diferentes.

Perfecto, quedó solucionado !!!!!!! muchisimas gracias!!!!!!! ahora puedo seguir adelante.
Saludos!!!!!

Hola!!! vuelvo con una preguntitas mas, sigo avanzando con el proyecto aunque me cuesta dedicarle tiempo por razones de trabajo, pero persisto.
Una de las dudas es como hacer para apagar la pantalla sin apagar el arduino, supongo que solo cortando la alimentación de la pantalla esta se apagará, pero no si es la manera correcta, o si antes de apagarla habrá que dar alguna instrucción para que deje de enviar datos antes del corte o cosas por el estilo,todo esto es con la pantalla tft 3.2 ili9341 y el shield casero que hice yo.
Otra cosa para comentar es que me ha llegado un kit que compre hace un tiempo arduino mega + shiel TFT V2.2 + TFT 3.2 touch el cual salió funcionando sin ningún dolor de cabeza ja ja y la pregunta anterior me gustaría aplicarla acá también, como apagar la pantalla ahora con este shield sin apagar el arduino donde veo mas difícil aunque no imposible, intervenir el pin de la alimentacion. Y la ultima pregunta: es posible controlar el back light del tft con este shield? .Les dejo un video con el proyecto aunque actualmente tiene algunas mejoras pero como para mostrarles la idea . TFT 3.2' ili9341 tactil con Arduino mega prueba 1 - YouTube
Bueno les agradeceré cualquier ayuda.
Saludos!!!

No es tan simple como conectar los leds de retroiluminación y controlarlos por PWM, ya que la limitante es el balance de miliamperes.

Las salidas PWM de arduino tienen muy pocos miliamperes. Se debe emplear un circuito externo para lograr ese cometido.

Revisa este post: MIDI file player? - Arduino for STM32

Tocan el tema y creo que es la mejor solución, tendrías que intervenir ese shield para conseguir el control del retroiluminación.

PD: en la serie FT81X es posible acceder al control de la retroiluminación por PWM, pero hay un circuito específico para conseguirlo.

Revisa el circuito de control de la retroiluminación en la página 53, quizas puedas tomar alguna idea

Ok muchas gracias por toda la información, me voy a poner a leer y después te cuento. Saludos!!!

Hola he leído por arriba los links que me pasaste y de la manera que muestran como hacerlo, ya lo había hecho antes con lcd 2x16 y pics , asi que me queda mas claro entonces que esa es la forma, te agradezco esa info. Lo que no pude ver es como apagar la pantalla y dejar el arduino alimentado o en sleep. Con el display lcd 2x16 lo que hacia era poner en estado bajo todos los pines de datos (ejemplo de Db0 a Db15 en este caso) y luego cortar la alimentacion al LCD, será algo parecido con los tft ? o solo con cortar Vdd esta bien?