Moderadores: 51, guest2003, Renie, gpenga
fabim escreveu:Pessoal.
Estou utilizando um display de 7" x800y480, junto com um touch screem de 4 fios.
Estou utilizando um chip dedicado com pino de interrupt com ADC de 12 bits para fazer a leitura XY.
Acontece que o touch não apresenta qualquer tipo de simetria resistiva em sua mecanica. Desta forma é necessario um tipo de calibração, o a mesma calibração efetuada em tablets ou celulares.
Até o momento eu tinha achado o erro deste display, e estava fazendo os grids pixel xy, fazendo o acerto na unha para um touch, o que não batia no outro..
E chegou a hora de fazer o negocio da forma correta, e to levando um baile.
O touch em questão, me apresenta o valor de X crescendo da direita para a esquerda, e o valor de y crescendo de cima para baixo.
Alguém ja fez algo do tipo, e poderia me dar um auxilio para entender a sistematica do calculo ?
Fabim
void calibra_touchXY(void){
int temp;
//desenha xy1
put_line(20,0,20,40,WHITE ); //linha do eixo x
put_line(0,20,40,20,WHITE ); //linha do eixo y
//enquanto não for precionado
while (!precionado){
//faz leitura analogica do touch screem
for(temp=0;temp<12000000;temp++);
SamplePoint[0][0] = touch_x;
SamplePoint[0][1] = touch_y;
};
//precionou então apaga linha xy1
put_line(20,0,20,40,BLACK ); //linha do eixo x
put_line(0,20,40,20,BLACK ); //linha do eixo y
while (precionado){;};
//desenha xy2
put_line(780,0,780,40,WHITE ); //linha do eixo x
put_line(760,20,800,20,WHITE); //linha do eixo y
//enquanto não for precionado
while (!precionado){
for(temp=0;temp<12000000;temp++);
SamplePoint[1][0] = touch_x;
SamplePoint[1][1] = touch_y;
};
//precionou então apaga linha xy1
put_line(780,0,780,40,BLACK ); //linha do eixo x
put_line(760,20,800,20,BLACK); //linha do eixo y
while (precionado){;};
//desenha xy3
put_line(0,460,40,460,WHITE ); //linha do eixo x
put_line(20,440,20,480,WHITE); //linha do eixo y
//enquanto não for precionado
while (!precionado){
for(temp=0;temp<12000000;temp++);
//faz leitura analogica do touch screem
SamplePoint[2][0] = touch_x;
SamplePoint[2][1] = touch_y;
};
put_line(20,440,20,480,BLACK); //linha do eixo x
put_line(0,460,40,460,BLACK ); //linha do eixo y
while (precionado){;};
//desenha xy3
put_line(760,460,800,460,WHITE ); //linha do eixo x
put_line(780,440,780,480,WHITE); //linha do eixo y
//enquanto não for precionado
while (!precionado){
for(temp=0;temp<12000000;temp++);
//faz leitura analogica do touch screem
SamplePoint[3][0] = touch_x;
SamplePoint[3][1] = touch_y;
};
put_line(760,460,800,460,BLACK ); //linha do eixo x
put_line(780,460,780,480,BLACK); //linha do eixo y
//0terceiro ponto para teste
while (precionado){;};
// Depois de capturados os 4[x,y] valores analogicos, e colocados na matriz //em seus respectivos lugares.
// Chama calibração para calculos lineares, para descobrir os polinomios de //correção
//the FUCK FUNCTIONAL BAGACEITION CALIBRATIONS TABAJARA
Get_Calibration_Coefficient();
}
#define N 4 // numero de pontos para calibração do touch screen
//valores de referencia dos pontos adjacentes no display.
//são N pontos de (X,Y) representados no valor real de pixel
//o valor deve ser inicializado manualmente nas posições existentes no display
short ReferencePoint[N][2]={{0,0},{760,0},{0,440},{760,440}}; // ponto de referencia ideal
/* exemplo
ReferencePoint[0]={20,20}; x1-y1
ReferencePoint[1]={780,20};x2-y2
ReferencePoint[2]={20,460};x3-y3
*/
//valores medidos de grandeza analogica no touch screen posicionado sobre o display
//são N pontos de (x,y) representados no valor real de pixel
//o valor é capturado da interface de leitura do touch screen
short SamplePoint[N][2]; // amostras analogicas sobre sobre os pontos de pixels ideais
/* exemplo
SamplePoint[0]={3100,318}; valores analogicos referente as posições x1-y1
SamplePoint[1]={70,254};valores analogicos referente as posições x2-y2
SamplePoint[2]={3020,3040};valores analogicos referente as posições x3-y3
*/
//estas variaveis são utilizadas para fatorização de coeficientes.
float KX1, KX2, KX3, KY1, KY2, KY3; // coefficients para o algoritmo de calibração
//procedimento chamado com valor analogico medido em px e px, e sobrescrito pelo valor proporcional ao pixel
//chamada da seguinte forma
//do_calibration(&amostra x, &amostra y, &resultado pixel x, &resultado pixel y)
void Do_Calibration(short *Px, short *Py, short *Ry, short *Rx)
{
*Rx=( short )(KX1*(float)(*Px)+KX2*(float)(*Py)+KX3+0.5);
*Ry=( short )(KY1*(float)(*Px)+KY2*(float)(*Py)+KY3+0.5);
}
//executa calculo para os coeficientes de calibração do display
//esta rotina deve ser chamada com os valores previamente postados ReferencePoint e SamplePoint.
// calcula coeficientes lineares de KX1, KX2, KX3, KY1, KY2, KY3
int Get_Calibration_Coefficient(void)
{
int i;
int Points=N;
float a[3],b[3],c[3],d[3],k;
if(Points<3)
{
return 0;
}
else
{
if(Points==3)
{
for(i=0; i<Points; i++)
{
a[i]=(float)(SamplePoint[i][0]);
b[i]=(float)(SamplePoint[i][1]);
c[i]=(float)(ReferencePoint[i][0]);
d[i]=(float)(ReferencePoint[i][1]);
}
}
else if(Points>3)
{
for(i=0; i<3; i++)
{
a[i]=0;
b[i]=0;
c[i]=0;
d[i]=0;
}
for(i=0; i<Points; i++)
{
a[2]=a[2]+(float)(SamplePoint[i][0]);
b[2]=b[2]+(float)(SamplePoint[i][1]);
c[2]=c[2]+(float)(ReferencePoint[i][0]);
d[2]=d[2]+(float)(ReferencePoint[i][1]);
a[0]=a[0]+(float)(SamplePoint[i][0])*(float)(SamplePoint[i][0]);
a[1]=a[1]+(float)(SamplePoint[i][0])*(float)(SamplePoint[i][1]);
b[0]=a[1];
b[1]=b[1]+(float)(SamplePoint[i][1])*(float)(SamplePoint[i][1]);
c[0]=c[0]+(float)(SamplePoint[i][0])*(float)(ReferencePoint[i][0]);
c[1]=c[1]+(float)(SamplePoint[i][1])*(float)(ReferencePoint[i][0]);
d[0]=d[0]+(float)(SamplePoint[i][0])*(float)(ReferencePoint[i][1]);
d[1]=d[1]+(float)(SamplePoint[i][1])*(float)(ReferencePoint[i][1]);
}
a[0]=a[0]/a[2];
a[1]=a[1]/b[2];
b[0]=b[0]/a[2];
b[1]=b[1]/b[2];
c[0]=c[0]/a[2];
c[1]=c[1]/b[2];
d[0]=d[0]/a[2];
d[1]=d[1]/b[2];
a[2]=a[2]/Points;
b[2]=b[2]/Points;
c[2]=c[2]/Points;
d[2]=d[2]/Points;
}
k=(a[0]-a[2])*(b[1]-b[2])-(a[1]-a[2])*(b[0]-b[2]);
KX1=((c[0]-c[2])*(b[1]-b[2])-(c[1]-c[2])*(b[0]-b[2]))/k;
KX2=((c[1]-c[2])*(a[0]-a[2])-(c[0]-c[2])*(a[1]-a[2]))/k;
KX3=(b[0]*(a[2]*c[1]-a[1]*c[2])+b[1]*(a[0]*c[2]-a[2]*c[0])+b[2]*(a[1]*c[0]-a[0]*c[1]))/k;
KY1=((d[0]-d[2])*(b[1]-b[2])-(d[1]-d[2])*(b[0]-b[2]))/k;
KY2=((d[1]-d[2])*(a[0]-a[2])-(d[0]-d[2])*(a[1]-a[2]))/k;
KY3=(b[0]*(a[2]*d[1]-a[1]*d[2])+b[1]*(a[0]*d[2]-a[2]*d[0])+b[2]*(a[1]*d[0]-a[0]*d[1]))/k;
return Points;
}
}
fabim escreveu:Nossa.
Eu estou fazendo a confirmação de click fisico no display sobre os botões através de.
Se maior que X1 e menor que X2, e maior que Y1 e menor que Y2.
Onde cada botão tem o seu X1X2Y1Y2.
Isto da um puto de um trabalho de fazer.
Existe alguma técnica super secreta de matriciassão ou algo parecido, que eu consigo derivar um valor comparativo pra saber qual botão foi precionado ?
Tipo, como o fuck SO gerencia isto ?
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante