Autor Tema: Lectura touch panel resistivo  (Leído 16054 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Lectura touch panel resistivo
« 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?

Desconectado ema

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1078
Re: Lectura touch panel resistivo
« Respuesta #1 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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Lectura touch panel resistivo
« Respuesta #2 en: 23 de Mayo de 2009, 13:46:12 »
Exactamente igual que el tuyo, 128x64. Agradecería que encontraras eso.

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: Lectura touch panel resistivo
« Respuesta #3 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

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Lectura touch panel resistivo
« Respuesta #4 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.

Desconectado ema

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1078
Re: Lectura touch panel resistivo
« Respuesta #5 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);
}
}

}


Desconectado sycho

  • PIC16
  • ***
  • Mensajes: 195
Re: Lectura touch panel resistivo
« Respuesta #6 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
« Última modificación: 23 de Mayo de 2009, 20:25:09 por sycho »

Desconectado sycho

  • PIC16
  • ***
  • Mensajes: 195
Re: Lectura touch panel resistivo
« Respuesta #7 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.
« Última modificación: 23 de Mayo de 2009, 21:25:07 por sycho »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Lectura touch panel resistivo
« Respuesta #8 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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Lectura touch panel resistivo
« Respuesta #9 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:

Desconectado sycho

  • PIC16
  • ***
  • Mensajes: 195
Re: Lectura touch panel resistivo
« Respuesta #10 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?

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Lectura touch panel resistivo
« Respuesta #11 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:

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Lectura touch panel resistivo
« Respuesta #12 en: 24 de Mayo de 2009, 15:25:26 »
Hola.

Cual es la solucion de Gera? Que controlador usa la GLCD?
El papel lo aguanta todo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Lectura touch panel resistivo
« Respuesta #13 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

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Lectura touch panel resistivo
« Respuesta #14 en: 24 de Mayo de 2009, 21:44:01 »
Ok.

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

Saludos
El papel lo aguanta todo


 

anything