Yo recuerdo que lo hice en una ocasión y resultó bastante sencillo; una regla de tres para cada eje y listo.Si yo también hice eso al principio, pero así no pude conseguir toda la precisión que quería. Ademas, por lo menos en mi touch screen, los valores de X que tomas en las dos esquinas inferiores varían ligeramente de los dos que tomas en las esquinas superiores, así que la formula para transformar las coordenadas tenia que ser algo mas compleja que una regla de tres.
Bueno, pues parece que la conclusión final es muy parecida...Yo también tenia esta solución implementada que funcionaba aceptablemente y a la que había llegado midiendo varios puntos de prueba y haciendo algunos cálculos simples. Pero no supe desarrollar un algoritmo de calibración para ajustar las constantes de compensación en tiempo de ejecución para poder calibrar el display "in situ".
Seria muy bueno conocer los resultados !No tengo manera de mostraros los resultados. Pero si os digo que lo he probado y funciona a la perfección.
CitarYo recuerdo que lo hice en una ocasión y resultó bastante sencillo; una regla de tres para cada eje y listo.Si yo también hice eso al principio, pero así no pude conseguir toda la precisión que quería. Ademas, por lo menos en mi touch screen, los valores de X que tomas en las dos esquinas inferiores varían ligeramente de los dos que tomas en las esquinas superiores, así que la formula para transformar las coordenadas tenia que ser algo mas compleja que una regla de tres.
Leyendo el PDF de TI he visto que dan la formula matricial para calcular los coeficientes de compensación para todos los puntos que queramos. Ademas, para mas de 3 puntos, las soluciones a esas ecuaciones matriciales se hacen largas y difíciles de manejar, así que dan una solución equivalente pero bien ordenada para que sea sencilla de manejar.
Os lo copio aquí para quien lo pueda necesitar:Código: C
Convert Touch to LCD X = alpha_x * Xp + beta_x * Yp + deltaX; Y = alpha_y * Xp + beta_y * Yp + deltaY;
Donde:
Xp e Yp son los valores medidos del touch screen.
X e Y son los pixels correspondiente en el LCD.
alpha_x, beta_x y deltaX son los coeficientes de compensacion para el eje X. Estas se obtienen durante la calibración.
alpha_y, beta_y y deltaY son los coeficientes de compensacion para el eje Y. Estas se obtienen durante la calibración.Código: C
Calibrate Touch for n points alpha_x = delta_x1 / delta; betha_x = delta_x2 / delta; deltaX = delta_x3 / delta; alpha_y = delta_y1 / delta; betha_y = delta_y2 / delta; deltaY = delta_y3 / delta; delta = n*(a*b - c*c) + 2*c*d*e - a*e*e - b*d*d; delta_x1 = n*(X1*b - X2*c) + e*(X2*d - X1*e) + X3*(c*e - b*d); delta_x2 = n*(X2*a - X1*c) + d*(X1*e - X2*d) + X3*(c*d - a*e); delta_x3 = X3*(a*b - c*c) + X1*(c*e - b*d) + X2*(c*d - a*e); delta_y1 = n*(Y1*b - Y2*c) + e*(Y2*d - Y1*e) + Y3*(c*e - b*d); delta_y2 = n*(Y2*a - Y1*c) + d*(Y1*e - Y2*d) + Y3*(c*d - a*e); delta_y3 = Y3*(a*b - c*c) + Y1*(c*e - b*d) + Y2*(c*d - a*e); a = sum( Xp[k]*Xp[k], k, 0, n-1 ); b = sum( Yp[k]*Yp[k], k, 0, n-1 ); c = sum( Xp[k]*Yp[k], k, 0, n-1 ); d = sum( Xp[k], k, 0, n-1 ); e = sum( Yp[k], k, 0, n-1 ); X1 = sum( Xp[k]*X[k], k, 0, n-1 ); X2 = sum( Yp[k]*X[k], k, 0, n-1 ); X3 = sum( X[k], k, 0, n-1 ); Y1 = sum( Xp[k]*Y[k], k, 0, n-1 ); Y2 = sum( Yp[k]*Y[k], k, 0, n-1 ); Y3 = sum( Y[k], k, 0, n-1 );
Donde
Xp[N] e Yp[N] son los N valores medidos del touch screen.
X[N] e Y[N] son los N pixels correspondiente en el LCD.
sum( f, v, s, e ) es el sumatorio de f[v] desde v=s hasta v=e
Tambien hay otro PDF de analog.com con informacion similar aqui: http://www.analog.com/static/imported-files/application_notes/AN-1021.pdf (http://www.analog.com/static/imported-files/application_notes/AN-1021.pdf)
Saludos
Modificado un pequeño error en las variables delta_x1 y delta_y1.