Archive for October, 2009

Cómo calibrar pantallas táctiles

Friday, October 30th, 2009

Introducción

En este articulo vamos a hablar sobre como funciona una pantalla táctil de tecnología resistiva, veremos que estas tienen la pega de tener ciertas desviaciones entre el punto que detectan con la presión y la ubicación de estos puntos en la pantalla. Visto este problema, explicaremos un algoritmo eficiente para calibrar las pantallas táctiles basado en tan solo tres puntos.

Tecnologías de las pantallas táctiles

En el momento en que escribo estas lineas conozco tres tipos de tecnología para implementar pantallas táctiles.

  • Resistivas
  • Capacitivas
  • Acústicas

De estas tres tecnologías la más habitual, por precio, sencillez y disponibilidad de fabricantes es la resistiva. A pesar de estas ventajas, los dispositivos que utilizan esta tecnología casi siempre requieren un proceso de calibración debido a que es difícil alinear perfectamente las coordenadas que nos devuelve la pantalla táctil con las coordenadas de la pantalla propiamente dicha (LCD u otra). Vamos a centrarnos en esta tecnología y a explicar un poco más a fondo su funcionamiento.

Funcionamiento de pantallas resistivas

Podemos ver en la siguiente imagen un corte transversal de una pantalla táctil (recordad que esta pantalla táctil se superpone a la pantalla real LCD, CRT, etc.)

sección transversal de una pantalla táctil

sección transversal de una pantalla táctil

Su estructura consiste en dos piezas de cristal cuya superficie interior esta “barnizada” con una sustancia conductiva. Separando estas dos capas tenemos unas gotas de cristal que mantienen una separación entre las superficies conductivas. Cuando un dedo o un pequeño instrumento como un lapiz toca el cristal este se acerca a la otra capa también barnizada con material conductivo. Cuantos más separadores haya, mayor resolución tendremos pero a cambio deberemos ejercer mayor presión para poder detectar un “toque” en la pantalla. El funcionamiento es el siguiente, un controlador aplicará una diferencia de potencial en los dos extremos de una de las capas mientras que la otra capa actuará como si se tratase de una resistencia variable, así, en función de la presión que se ejerza y de donde se efectúe esta el potencial detectado por el controlador variará proporcionando un valor binario que representa, por ejemplo, la coordenada X. A continuación se hace lo mismo pero con la otra capa, es decir se aplica potencial a la otra capa y la que queda actúa de resistencia, obtenemos así la coordenada Y. Este proceso se repite a gran velocidad y es posible tomar del orden de 200 o más muestras por segundo.

Breve comparativa de tecnologías

Simplemente, como comentario, veamos las ventajas e inconvenientes de cada tecnología.

Capacitivas

En los sistemas capacitivos una capa que almacena carga eléctrica se sitúa en el panel de cristal del monitor. Cuando un usuario toca el monitor con el dedo parte de la carga se transmite al usuario, así la carga de la capa capacitiva disminuye. Esta disminución la miden unos circuitos situados en las esquinas del monitor. Esta circuitería calcula exactamente donde se ha tocado. Una de las ventajas es que esta capa con carga eléctrica deja pasar el 90% de la luz del monitor mientras que la tecnología resistiva solo deja pasar aproximadamente un 75%. Esto hace que las imágenes se vean más claras en este tipo de pantallas que en las resistivas. Como inconveniente tenemos que no se puede usar para pulsar algo que no conduzca, por ejemplo un lápiz.

Acústicas

Esta tecnología se basa en montar un sistema de ondas acústicas, dos transductores (un receptor y un emisor) se colocan a lo largo de los ejes X e Y de la pantalla táctil. Los transductores receptores son capaces de determinar si la onda acústica ha sido perturbada por un toque de un usuario y de localizar esta perturbación en la pantalla. Dado que no se utilizan capas metálicas en la pantalla se permite el paso del 100% de la luz a través de la pantalla táctil y esto se traduce en una claridad de imagen perfecta. Es por ello que esta tecnología es la preferida cuando se trata de mostrar gráficos detallados. Otra ventaja es que podemos detectar el toque de un dedo o de cualquier objeto aunque este no conduzca como por ejemplo un lápiz. Esta tecnología es la más cara de las tres.

La calibración en las pantallas resistivas

Debido a múltiples motivos como el ruido eléctrico, desajustes mecánicos, factores de escalado, el grosor del dedo, etc. Al final debemos calibrar la pantalla para que las coordenadas que nos devuelve la pantalla táctil coincidan exactamente ( o lo más aproximadamente posible ) con las coordenadas de la pantalla que hay detras (LCD,CRT,etc.).

Presentación del problema

Vemos en el siguiente dibujo que cada posible punto en el display lo podemos representar como Pd y lo que nos dice la pantalla táctil es el punto P.

Desviación de los puntos

Desviación de los puntos

Vamos a asumir que los puntos P y Pd estan relacionados por una cantidad “M” que transforma las coordenadas de la pantalla táctil en coordenadas de la pantalla:

Pd = M * P

Esta “M” será un matriz de transformación y es lo que intentaremos calcular en este artículo. Si tenemos esta matriz podremos transformar cualquier punto reportado por la pantalla táctil en un punto para el display.

Si expresamos los puntos como pares X e Y basados en la longitud y ángulo del vector ambos puntos (táctil y display) se pueden representar así:
(Llamamos R y Rd a cada una de las hipotenusas formada por los vectores)

Pd = [ Xd, Yd ]
Pd = [ Rd cos(Sd), Rd sen(Sd) ]
P = [ X, Y ]
P = [ R cos(S), R sen(S) ]

Ahora bien, sabemos que el punto reportado por la pantalla táctil ha experimentado, una rotación, un escalado y una traslación, vamos a ver como representar ese punto rotado, escalado y trasladado. Es decir, vamos a bucar Pd como una transformación de P. Pero antes hay que establecer una notación:

  • Vamos a denominar “Pr” al punto rotado, “Pre” al Punto rotado y escalado y “Pd” al punto rotado, escalado y trasladado (este es el punto del display que buscamos).
  • El escalado sera un factor al que llamaremos Kx y Ky, uno por cada eje.
  • La traslación será Xt e Yt.
  • La diferencia de angulos entre el display y lo reportado por la pantalla táctil será “Sr”.

Pr = [ R cos(S+Sr), R sen(S+Sr) ]
Pre = [ Kx R cos(S+Sr), Ky R sen(S+Sr) ]
Pd= [ (Kx R cos(S+Sr)) + Xt, (Ky R sen(S+Sr)) + Yt ]

En este punto vamos a hacer un simplificación pragmática que nos permite “aligerar” las fórmulas, esto redundará en un menor tiempo de cálculo y una programación más sencilla. La simplificación consiste en que, vamos a asumir que la rotación que experimenta el punto dado por la pantalla táctil con respecto a la coordenada en el display es de un ángulo muy pequeño y por lo tanto podemos asumir que:

sen(Sr) = Sr
cos(Sr) = 1

De esta forma, podemos simplifcar ciertos términos de las ecuaciones anteriores asumiendo que:

cos(S+Sr) = cos(S) - (Sr sen(S))
sen(S+Sr) = sen(S) + (Sr cos(S))

Ahora las ecuaciones anteriores quedan:

Pd = [ (Kx R (cos(S) - (Sr sen(S)))) + Xt, (Ky R (sen(S) + (Sr cos(S))) ) + Yt ]
Pd = [ Kx R cos(S) - Sr Kx R sen(S) + Xt, Ky R sen(S) + Sr Ky R cos(S) + Yt ]

Ahora ya tenemos expresadas las coordenadas del display en función de las coordenadas que proporciona el touch screen.
Reformulamos la ecuación anterior y obtenemos:

Pd = [ Kx X - Sr Kx Y + Xt, Sr Ky X + Ky Y + Yt ]

Excepto X e Y, y dadas nuestras simplificaciones, todos los términos de la ecuación son constantes, por este motivo podemos expresar la anterior fórmula de un modo más conveniente:

Xd = AX + BY + C
Yd = DX + EY + F

Solución del problema

Ahora solo queda resolver las 6 incongitas, para ello necesitaremos, 6 ecuaciones, que se corresponderan con los tres puntos que vamos a usar para la calibración. Una vez tengamos las 6 incógnitas A,B,C,D,E y F podemos calcular para cada X e Y del touch screen la X e Y que le corresponde en el display.

Estos puntos deben seleccionarse con un mínimo de cuidado para que no nos den ecuaciones redundantes, asimismo debemos evitar que sean los puntos de los extremos de la pantalla puesto que es más probable que en estas ubicaciones se den diferencias no lineales entre lo que reporta la tactil y las coordenadas del display. También debemos separarlos lo suficiente para minimizar los errores de escalado.

Una buena heurística para seleccionar los puntos es que esten separados de las esquinas un 10%.

Una vez determinados los puntos que vamos a usar el modo de operar es el siguiente:

  1. Mostrar uno de los tres puntos en el display real
  2. Recoger los datos X e Y que devuelve el touch screen
  3. Volver al paso 1 hasta recoger los datos de los tres puntos
  4. Con los 6 datos y teniendo en cuenta que sabemos el valor X e Y del display podemos plantear un sistema de ecuaciones para calcular las constantes A,B,C,D,E y F

Xd0 = AX0 + BY0 + C
Xd1 = AX1 + BY1 + C
Xd2 = AX2 + BY1 + C
Yd0 = DX0 + EY0 + F
Yd1 = DX1 + EY1 + F
Yd2 = DY2 + EY2 + F

4. De aquí conocemos, Xd0,Xd1,Xd2,Yd0,Yd1,Yd2,X0,Y0,X1,Y1,X2,Y2 y nos falta por averiguar A,B,C,D,E y F.

Esto lo podemos resolver mediante matrices a través de cualquiera de los sistemas como por ejemplo Gauss-Jordan, Choletsky, matriz inversa, etc.

Ahora, una vez tenemos las incognitas resueltas, para cada punto que lea el touch screen obtendremos el real en pantalla aplicando las formulas anteriores:

Xd = AX + BY + C
Yd = DX + EY + F

Paula ya esta en casa

Thursday, October 22nd, 2009

Mi hija Paula ya está en casá, nació el Miércoles dia 14 de Octubre del 2009, peso 3Kg 300gr y todo salió perfecto así que madre e hija estan perfectamente.

Y mira tu por donde, el blog me va a ayudar por una vez en la vida a ahorrarme trabajo, voy a colgar una foto de Paula y así mato 500 pájaros de un tiro. Si, tengo un montón de gente pidiendome fotos de Paula, ¡joroba!, estoy hasta arriba de tareas y no tengo un mínimo resquicio de tiempo, ¡ya vereis cuando os toque ser padres!, os acordareis de este momento, visitias y más visitas, familiares, amigos, etc… todos reclamando su visita a casa, su foto de paula, etc… y por el camino, ¡haz papeles!, ¡visita médicos!,¡haz compras!,¡limpia la casa!, ¡atiende invitados!, ¡SOCORRO!, ¡YO ME QUIERO VOLVER AL CURRO!.

Bueno, es broma, pero a medias, esto cansa un montón (ya se que mi mujer está peor, duerme bastante menos, pero yo me quejo de lo mio).

En fín, que aquí teneis, una foto. Eso si, ni una queja, si no os gusta la foto esperais a que tenga un poco más de tiempo :-)

Paula

Paula

Keep It Simple, de nuevo

Thursday, October 8th, 2009

Una vez más, otro interesante artículo de otro gurú del software nos muestra porqué es interesante mantener el software dentro de los limites de la sencillez.

Traduzco la entrada de su articulo y os doy en enlace para que lo leáis al completo:

Si Alejandro Magno pudo conquistar el mundo conocido cuando tenia casi 33 años (este dato es incorrecto en el articulo original), uno podría pensar que adultos experimentados podrán conquistar unos pocos trozos de complejidad contenidos en las  cajas de sus escritorios (El PC).

Desafortunadamente, estos “pequeños trozos de complejidad” no son tan pequeños como la gente asume. La programación es la única profesión en la cual una mente esta obligada a rellenar la distancia intelectual entre un bit y unos megabytes, un ratio de 109, o nueve ordenes de magnitud. La inmensidad del ratio es asombrosa. Como dijo Edsgar Dijstra, “Comparado con ese número de niveles semánticos, la teoría matemática media es prácticamente plana. Evocando la necesidad de profundas jerarquías conceptuales, la computadora nos confronta con un reto intelectual radicalmente nuevo que no tiene precedente en nuestra historia”(”On the Cruelty of Really Teaching Computer Science,” Communications of the ACM, December 1989).

En la conferencia de los premios Turing de 1972, Dijkstra argumentó que la mayor parte de la programación consiste en un intento de compensar la estricta limitación del tamaño de nuestras cabezas para manejar la enorme complejidad asociada con los sistemas software modernos(”The Humble Programmer,” Communications of the ACM, October 1972).

Una cierta parte de la complejida del software es inherente al problema que intentamos resolver, pero una gran parte depende de la naturaleza de la solución como problema. Las mejores soluciones son aquellas creadas por personas que se dan cuenta de que pequeños son sus cerebros y que diseñan sus soluciones de acuerdo con esto.

Interesante artículo, si teneis un rato disfrutadlo (http://www.stevemcconnell.com/ieeesoftware/bp06.htm).

Resolución de dependencias con Make

Monday, October 5th, 2009

Esta es una duda clásica de todo programador C cuando ves por primera vez como se calculan las dependencias te sueles quedar mirando “como las vacas al tren”, abres la boca, dices “ahhhhh,ya veo” y te callas porque no has entendido absolutamente nada.

Lo grave del asunto es quedarse ahi, y no entender algo que es crucial en todo proyecto de software, tarde o temprano te tocará modificar algún Make y deberás afrontar el asunto.

Para resolverlo debes tener dos cosas bien claras, como funciona el Make y un mínimo de conocimiento de scripting de shell.

Hay varias formas de resolver este tema, yo voy a comentar la que utilizo habitualmente por ser más sencilla que la que se ha usado en mi empresa tradicionalmente.
El siguiente extracto de un Makefile de mi proyecto actual lo explica:

%.d:%.c
${CC} -M ${CFLAGS} $< > $@.$$$$;\
sed ’s,\($*\)\.o[ :]*,\1.o $@ : ,g’ < $@.$$$$ > $@; \
rm -f $@.$$$$

Explicación: Generamos un archivo de dependencias (.d) por cada .c, en 3 pasos:
Paso 1)
Llamar al gcc con el parámetro -M que recrea un archivo de dependencias para el archivo .c, esto se hace con la variable automática $<. Se redirecciona la salida a un archivo .d con extension número aleatorio que se consigue con $$$$.
En este punto tendremos tantos archivos (.d.numero_aleatorio) como archivos .c tengamos.
Paso 2)
Se invoca a la herramienta “sed” para cada archivo con extensión de número aleatorio y se le dice que haga una sustitución y guarde este resultado en un archivo con extensión .d pero sin el número aleatorio. Este será el archivo final de dependencias para un archivo .c dado.
La sustitución:
$* es una variable del makefile que equivale a el nombre del archivo .d pero sin la extensión .d. Ese nombre con la extensión .o y seguido por un número cualquiera de espacios en blanco y dos puntos se agrupa y se sustituye por lo mismo que hemos agrupado entre parentesis pero añadiendo el mismo nombre con un punto .d y luego ponemos los dos puntos.
Paso 3)
Se borran los archivos temporales (los de la extensión con número aleatorio)

Un ejemplo lo muestra mejor:

Salida del gcc -M:
calculations.o: calculations.c /usr/include/math.h \
/usr/include/features.h /usr/include/sys/cdefs.h \
/usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
….. más lineas

Salida tras la sustitución con sed:
calculations.o calculations.d : calculations.c /usr/include/math.h \
/usr/include/features.h /usr/include/sys/cdefs.h \
….. más lineas

Ahora solo nos queda incluir todos los archivos de dependencias generados en nuestro makefile, esto se consigue mediante la siguiente linea:

include $(subst .c,.d,${SOURCES})

Donde la variable SOURCES es una lista con todos mis archivos fuente.

El piñazo de Alex

Monday, October 5th, 2009

Esta pasada semana, el martes 29, Alex se dió un golpe en los dientes, los dos incisivos centrales superiores (lo que mi madre llamaría “las paletas”). Uno de ellos se “incrustó” ligeramente en la encía y ambos se le movían al tocarlos.

Pobrecillo, de momento le han atado ambos con una especie de cable, le hemos dado anti inflamatorio para que se le rebaje la inflamación de la encía y un desinfectante para las heridas de esta.

Ahora solo falta esperar, debe estar 15 días a purés y con suerte no se le caerán y todo irá bien. En caso contrario…. supongo que habrá que hacer algo, ¿un implante?, porque en esta edad aprende a hablar y necesita esos dientes para una correcta pronunciación, además de otros posibles problemas (alimentación,desarrollo del resto de dientes, estética,etc)por carecer de estos.

Bueno, espero que dentro de 20 años Alex pueda reírse de este post con una sonrisa perfecta.