TODOPIC

FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: Nocturno en 23 de Mayo de 2009, 12:50:34

Título: Lectura touch panel resistivo
Publicado por: Nocturno en 23 de Mayo de 2009, 12:50:34
Hola amigos, tengo que leer un touch panel resistivo de 4 hilos: -X, -Y, +X y +Y.

Por los cálculos que he hecho he deducido que la resistencia horizontal se mueve desde los 300  hasta los 400 ohm, y que la vertical se mueve desde los 570 a los 780 ohm.
Ya consigo leer desde el pic la posicion del dedo haciendo un divisor de tensión en cada eje y leyéndolo desde el ADC, pero consigo poca resolución porque mi divisor de tensión tiene 0,37V como máximo desde una punta de la GLCD hasta la otra.
¿Conocéis algún método diferente que me permita leer las resistencias aumentando el margen de actuación, de 0V a 5V o algo parecido?, ¿quizás con un operacional?
Título: Re: Lectura touch panel resistivo
Publicado por: ema en 23 de Mayo de 2009, 13:41:03
De que tamaño es el touch. Porque yo tengo uno de 128x64 y no me falta para nada resolución? Sobra

De todos modos puedes amplificar tu señal con un operacional y un puente de wheatstone. Busco lo que tengo y si lo encuentro te lo paso.

Saludos
Título: Re: Lectura touch panel resistivo
Publicado por: Nocturno en 23 de Mayo de 2009, 13:46:12
Exactamente igual que el tuyo, 128x64. Agradecería que encontraras eso.
Título: Re: Lectura touch panel resistivo
Publicado por: xocas en 23 de Mayo de 2009, 16:10:27
hola

te dejo un pdf de un entrenador que usa un circuito con transistores: http://www.mikroe.com/pdf/easypic5/easypic5_manual_v101.pdf

espero que te sirva de algo. (tengo una vaga idea de que droky me comentó que modificara el circuito porque tenía algún problema... )

un saludo
Título: Re: Lectura touch panel resistivo
Publicado por: jgpeiro06 en 23 de Mayo de 2009, 16:11:38
Se me ocurre que el problema puede estar en la impedancia de entrada del ADC. Creo que tiene una impedancia de 1KOhm o quizás 10KOhm... Mide con un voltimetro la tensión a la salida del touchscreen(presionando en el centro) con el PIN que sea como entrada digital. Después conecta el ADC y lee continuamente el valor analógico. Si la tensión que mide el voltimetro desciende es por motivo de la impedancia de entrada del ADC. Puedes añadir un operacional configurado como seguidor de emisor para aumentar la impedancia de entrada del ADC.
Título: Re: Lectura touch panel resistivo
Publicado por: ema en 23 de Mayo de 2009, 18:18:57
Te comento que no hace falta amplificarlo, sobra la resolución del ADC.
Te adjunto un pedazo del código que utilice para leer el touch. A lo mejor te sirve de algo. Esta hecho en CCS

Si pruebas este código a lo mejor te lo dibuja al reves. Porque sin queres lo pegue girado al touch :mrgreen: :mrgreen:

Si con esto no te anda, avisame y busco lo del operacional.
Aclaración: No es que no lo quiera postear, pero es que no se donde diablos esta.... :( :(

Código: [Seleccionar]
#include <18f4620.h>
#device adc=10
#fuses XT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOPROTECT
#use delay(clock = 4000000)

#use fast_io(A)
#use standard_io (B)
#use standard_io (C)
#use standard_io (D)
#use standard_io (E)

#define Tx PIN_C6
#define Rx PIN_C7

#use rs232(baud = 9600, xmit = Tx, rcv = Rx)

#include "HDM64GS12.c"
#include "graphics.c"

/*****************************************************************
** Conexion del touchscreen resistivo de 4 hilos
** X+ = RA0/AN0
** Y+ = RA1/AN1
** X- = RA2/AN2
** Y- = RA3/AN3
*****************************************************************/
int16 tmp;
int16 txx,tyy;
int16 y_min,y_max,x_min,x_max;
int16 y_rng,x_rng;
int y_loc,x_loc;

/**************************************************
*******  Lee la coordenada y   ********************
**************************************************/
int16 y_pos(void)
{
    int16 result;
    set_tris_a(0x0A); //Seteo AN1 y AN3 como entradas
    output_a(0x01);    //Energizo X, RA0
    set_adc_channel(1); //Seteo AN1 como canal analogo
  delay_us(10);
    result = read_adc();          //Adquiero Y
    set_tris_a(0x03);  //RA0 y RA1 ADC a masa 
    output_a(0x00);  //todos a masa
    Return(result);
}

/**************************************************
*******  Lee la coordenada x   ********************
**************************************************/
int16 x_pos(void)
{
    int16 result;
    set_tris_a(0x05); //Seteo AN0 y AN2 como entrada
    output_a(0x02);              //Energizo Y, RA1
    set_adc_channel(0);    //Seteo AN0 como canal analogo
    delay_us(10);
    result = read_adc(); //adquiero X
    set_tris_a(0x03);    //RA0 y RA1 ADC a masa 
    output_a(0x00);      //todas a masa
    Return(result);
}

int1 touch(void)
{
   int1 resp;
   resp=false;
   tyy = y_pos();
   if (tyy > 50)
   {
      delay_ms(30);
      tyy=y_pos();
      txx=x_pos();
      if (tyy > y_min)
      {
         if(tyy < y_max)
         {
            resp = true;
tmp=(txx-x_min)*16;
x_loc=(int)(tmp/(x_rng/8));
x_loc=127-x_loc;
            if(x_loc > 127)
x_loc = 127;
tmp=(tyy-y_min)*8;
y_loc=(int)(tmp/(y_rng/8));
            if(y_loc > 63)
y_loc = 63;
         }
      }
   }
   return(resp);
}

void calibracion()
{
    while(x_pos() < 50)
    {
      glcd_rect(125,1,127,3,YES,ON);
      delay_ms(100);
    }
    delay_ms(30);
    y_min = y_pos();
    x_min = x_pos();
    while(x_pos() > 50);
glcd_fillscreen(OFF);
    delay_ms(30);

    while(x_pos() < 50)
    {
      glcd_rect(1,61,3,63,YES,ON);
      delay_ms(100);
    }
    delay_ms(30);
    y_max = y_pos();
    x_max = x_pos();
    y_rng = y_max - y_min;
    x_rng = x_max - x_min;
    while(x_pos() > 50);
    glcd_fillScreen(OFF);
    delay_ms(30);
}

void main()
{
setup_adc_ports(AN0_TO_AN3);
    setup_adc(ADC_CLOCK_INTERNAL);

delay_ms(50);
    glcd_fillScreen(OFF);
calibracion();

while(TRUE)
{

      if(touch()==true)
      {
delay_ms(10);
glcd_pixel(x_loc, y_loc,ON);
}
}

}

Título: Re: Lectura touch panel resistivo
Publicado por: sycho en 23 de Mayo de 2009, 20:15:03
Efectivamente, como dice nocturno, la diferencia máxima de tensión que puede conseguir en el eje X(300-400ohm) es de 0,359v utilizando una resistencia de 350ohm (valor óptimo). Por lo que necesitas de algún tipo de amplificación para aprovechar la resolución del ADC. De otra forma la máxima resolución que obtendrás es de 74x80 pixels de touchpad.

Creo que la única forma de aprovecharlo al 100% es que uses un puente de wheatstone seguido de un operacional en modo diferencial. De ésta forma, eligiendo las resistencias adecuadamente, puedes tener una tensión de salida perfecta de 0 a 5v a lo largo de los ejes.

Puedes echarle un vistazo a éste documento http://focus.ti.com/lit/an/sloa034/sloa034.pdf
Título: Re: Lectura touch panel resistivo
Publicado por: sycho en 23 de Mayo de 2009, 21:21:44
te dejo un pdf de un entrenador que usa un circuito con transistores: http://www.mikroe.com/pdf/easypic5/easypic5_manual_v101.pdf

espero que te sirva de algo. (tengo una vaga idea de que droky me comentó que modificara el circuito porque tenía algún problema... )


El problema son las resistencias de 1K, que provocan que se genere un error al leer un eje según cual sea la posición en el eje contrario. Éste error puede llegar a ser enorme, incluso de un 38% en el caso extremo. Aqui un esquema de ejemplo:
http://ad2da.com/wordpress/wp-content/uploads/2008/01/ep5_touchplate_circuit.jpg
El método que han intentado implementar presupone que la tensión de contacto termina en los extremos de la placa Y sin sufrir ninguna caida, pero a causa de la resistencia de 1K ésto no es así. Aumentar el valor de ésta resistencia reduce el margen de error, pero sigue existiendo.
Título: Re: Lectura touch panel resistivo
Publicado por: Nocturno en 23 de Mayo de 2009, 21:23:00
¡Ya lo tengo!, ha costado pero al final salió.

Con el esquema que posteó Xocas con alguna pequeña modificación por fin he conseguido varios saltos del ADC por cada pixel.

Gracias
Título: Re: Lectura touch panel resistivo
Publicado por: Nocturno en 24 de Mayo de 2009, 07:31:46
No me quedaba contento con el resultado y he probado la solución de Gera.
El resultado es extraordinario y fino fino, aunque tengo un par de problemas:
a) No puedo usar los pines del ADC como salidas digitales porque el PIC18F452 no permite alternar las entradas analógicas entre las digitales, siempre que se usa la 1, también se usa la 0 como ADC. Así que he tenido que usar dos pines más que tú para hacerlo
b) No sé cómo detectar que el usuario no está pulsando la pantalla. En posición de reposo me envía lecturas de la zona media de la pantalla, lo que por otra parte es lógico.

Os dejo un pequeño vídeo del funcionamiento:
Título: Re: Lectura touch panel resistivo
Publicado por: sycho en 24 de Mayo de 2009, 09:33:59
No se supone que cuando no estás pulsando no hay contacto entre ambas láminas?
Qué solución es la que estabas usando en el video?
Título: Re: Lectura touch panel resistivo
Publicado por: Nocturno en 24 de Mayo de 2009, 15:20:19
Tienes razón, el problema es que se me había olvidado poner las resistencias de pulldown en las entradas del ADC, y lo que estaba leyendo era el valor de la entrada al aire. Ahora funciona correctamente.

Dejo nuevo vídeo:
Título: Re: Lectura touch panel resistivo
Publicado por: MLO__ en 24 de Mayo de 2009, 15:25:26
Hola.

Cual es la solucion de Gera? Que controlador usa la GLCD?
Título: Re: Lectura touch panel resistivo
Publicado por: Nocturno en 24 de Mayo de 2009, 17:11:02
Pues los pines +X, -X, +Y y -Y se conectan directamente a 4 pines del micro, que los polariza por pares dejando el otro par en alta impedancia para poder medir la resistencia leída mediante el ADC.
Lo que yo no he conseguido es hacer la polarización de los pines con los mismos pines que la lectura del ADC, mientras que Gera sí lo consigue.

Lleva este controlador: S6B0108
Título: Re: Lectura touch panel resistivo
Publicado por: MLO__ en 24 de Mayo de 2009, 21:44:01
Ok.

Gracias, por lo visto ese controlador es compatible con el KS0108B ...

Saludos
Título: Re: Lectura touch panel resistivo
Publicado por: ema en 25 de Mayo de 2009, 00:48:32
Pues los pines +X, -X, +Y y -Y se conectan directamente a 4 pines del micro, que los polariza por pares dejando el otro par en alta impedancia para poder medir la resistencia leída mediante el ADC.
Lo que yo no he conseguido es hacer la polarización de los pines con los mismos pines que la lectura del ADC, mientras que Gera sí lo consigue.

Era exactamente lo que te decia yo.

Saludos
Título: Re: Lectura touch panel resistivo
Publicado por: Nocturno en 25 de Mayo de 2009, 01:11:16
Claro, me refería a ti. Donde dije "Gera" quería decir "ema"  :D
Título: Re: Lectura touch panel resistivo
Publicado por: stk500 en 25 de Mayo de 2009, 01:16:45
 :D :D ya me estaba voviendo loco!! buscando quien fue  :D :D Manolo no beba tanto ron macho :D :D
Título: Re: Lectura touch panel resistivo
Publicado por: ema en 25 de Mayo de 2009, 01:36:21
 :D :D Entonces me alegro de haberte ayudado.. :-/ :-/

Saludos
Título: Re: Lectura touch panel resistivo
Publicado por: MLO__ en 25 de Mayo de 2009, 10:48:32
 :D :D

Por eso pregunte .... no vi a gera por ningun lado ... pense que se trataba de un MP ....
Título: Re: Lectura touch panel resistivo
Publicado por: Nocturno en 25 de Mayo de 2009, 11:33:53
Disculpad el malentendido, llevo mucho sueño atrasado últimamente.

Gracias Ema por tu ayuda

Título: Re: Lectura touch panel resistivo
Publicado por: NANO1985 en 25 de Mayo de 2009, 19:33:15
muuuuy buena manolo!!!! no habia visto ésta publicacion!! FELICIDADES!!! ha quedado re bien.
Saludos  8)
Título: Re: Lectura touch panel resistivo
Publicado por: nico_dspic en 20 de Febrero de 2010, 18:06:00
Hola Nocturno!! Estoy trabajando con un LCD gráfico de 128x64 y un touch screen para dicho LCD. La verdad que hace ya varios días que estoy renegando y no he conseguido que funcione el touch.
He intentado implementar la solución de Ema pero tengo el mismo inconveniente que vos. No puedo usar para polarizar el touch, los mismos pines de lectura del conversor AD.
Podrías postear un esquema de cómo has conectado tu touchscreen al PIC y un programa de ejemplo de cómo lo has manejado o simplemente que modificaciones has hecho sobre el programa de Ema.
Muchas gracias…
Saludos!
Título: Re: Lectura touch panel resistivo
Publicado por: Nocturno en 20 de Febrero de 2010, 18:19:08
Hola, la solución fue conectar los pines X+ e Y+ a pines digitales, además de a los analógicos.
Cuando quiero excitarlos saco un 1 por el pin digital, cuando quiero leer lo el valor analógico, pongo el pin digital como entrada, y hago la lectura con el ADC.

Este es el código:
Código: C
  1. // Lee la coordenada Y de la pantalla táctil
  2. int LeeY(int Modo) {
  3.   int resultado;
  4.   // Tensión en eje X, entradas en eje Y
  5.   Xpos_Dir=0;
  6.   Xneg_Dir=0;
  7.   Ypos_Dir=1;
  8.   Yneg_Dir=1;
  9.   Xpos=1;
  10.   Xneg=0;
  11.   delay_ms(3);
  12.   resultado=adc_read(1);
  13.  
  14.   if (resultado<75)
  15.      return(-1);
  16.   else{
  17.       if (Modo) {
  18.         resultado=(64-(int)((resultado-OffsetY)*EscalaY));
  19.         if (resultado<0) resultado=0;
  20.         if (resultado>63) resultado=63;
  21.       }
  22.      return(resultado);
  23.      }
  24. }
  25.  
  26. // Lee la coordenada X de la pantalla táctil
  27. int LeeX(int Modo) {
  28.   int resultado;
  29.   Xpos_Dir=1;
  30.   Xneg_Dir=1;
  31.   Ypos_Dir=0;
  32.   Yneg_Dir=0;
  33.   Ypos=1;
  34.   Yneg=0;
  35.  
  36.   delay_ms(3);
  37.   resultado=adc_read(0);
  38.    if (resultado<75)
  39.      return(-1);
  40.    else{
  41.         if (Modo) {
  42.           resultado=((int)((resultado-OffsetX)*EscalaX));
  43.           if (resultado<0) resultado=0;
  44.           if (resultado>127) resultado=127;
  45.           }
  46.         return(resultado);
  47.      }
  48. }
Título: Re: Lectura touch panel resistivo
Publicado por: droky en 20 de Febrero de 2010, 22:09:41
Como me suena este pedazo de código...  ;-)
Ya me sacó de un lío una vez a mí...
Salu2
Título: Re: Lectura touch panel resistivo
Publicado por: nico_dspic en 23 de Febrero de 2010, 10:23:35
Hola Nocturno!!!! He logrado que el Touch funcione. Muchas gracias por tu ayuda. Sin ella me hubiese llevado un siglo hacer que arranque. Gracias también a Ema que a través de sus posts me ha ayudado  y a todos los que siempre colaboran con el foro. Cuando tenga el proyecto funcionando un poco mejor voy a postear las rutinas del GLCD y del Touch.

Título: Re: Lectura touch panel resistivo
Publicado por: Nocturno en 23 de Febrero de 2010, 12:07:00
Me alegro, ya estás tardando en poner un vídeo  :mrgreen:
Título: Re: Lectura touch panel resistivo
Publicado por: RALF2 en 23 de Febrero de 2010, 13:46:51
Que mas amigos!
LLego tarde a la solucion del problema manolo, pero bueno que bien que lo pudiste resolver  :mrgreen:
Como dices una solucion es utilizar el el portA para el manejo de la coordenadas del pic, ya que como este puerto es analogico/digital lo podes usar para el manejo del touch.
Esto se logra sino mal recuerdo haciendo lo siguiente:
Para leer el eje "x" configuras los pines conectados a ese eje como salidas (digitales) y colocas una a cero y el otro a uno (5V), luego los pines conectados al eje "y" los configuras como entradas analogicas y lees desde uno de ellos. Luego repites el mismo procedimiento para leer el eje "Y" y listo.
Lo otro es utilizar el circuito que usa la gente de microe que te facilita las cosas y fue el que yo emplee hace algunos años para hechar a andar mi toch screen  :mrgreen:

Bueno coloco esto para amplear lo ya colocado por los demas, por si alguien le sirve  :mrgreen:
Saludos
Título: Re: Lectura touch panel resistivo
Publicado por: iels_2 en 23 de Mayo de 2010, 11:50:38
Hola, eh leido todo este tema y creo que solo ustedes pueden ayudarme, si es de su voluntad.
les explico  soy tecladista y electronico no especializado en el tema touch, pero me compre un teclado con el touch malo o sea sin el por que lo sacaron.
solo estava la pantalla,  importe de china la pantalla con el touch incluido pensando que todos eran iguales, pero mi sorpresa fue cuando veo el conector del touch para ponerlo en el teclado,  el conector era mas chico  pero si tiene los mismos hilos "8"  por lo que me eh informado el touch es resistivo  y mi teclado igual usa resistivo, entonces solde en el conector del teclado 8 hilos y estos a un conector que calzava con el touch que compre obviamente en el orden como deveria ir  y nada !
ahora no sé que mas hacer,   esta cosa se calibrará?  tendra que calentarce como los antiguos radios a tubos por que solo lo deje unos segundos, prendio  tantee con el dedo no funciono y entonces lo apagé. me podran orientar un poco hay una forma de adaptar esto ?
les envio informacion si me la piden, gracias !