Перейти к содержанию
    

Калибровка резистивного тачскрина 7 дюймов

Может чего-то не догнал. Попытался применить выше формулы. Проверил по методички которая выше по ссылки от TI. Но не получается откалибровать. Написал тестовый код. 

Спойлер
#include <stdio.h>
#include <stdint.h>

typedef struct
{	
int16_t  x;		  
int16_t  y;					   
} _tPoint;
_tPoint tPointTs[5];
_tPoint tPointTt[5];
_tPoint tPoint;
_tPoint tPointADC;

typedef struct
{	
float   alfa_x;
float   beta_x;
float   delta_x;
float   alfa_y;
float   beta_y;
float   delta_y;					 
} _tFactors;
_tFactors tFactors;


void FactorsCalc(_tPoint *s, _tPoint *t, _tFactors *factors)
{
 int8_t j;
 int32_t a=0, b=0, c=0, d=0, e=0, X1=0, X2=0, X3=0, Y1=0, Y2=0, Y3=0;
 int32_t D, Dx1, Dx2, Dx3, Dy1, Dy2, Dy3; 
 
 float n = 5.0;

 for(j=0; j<5; j++) 
 {
 a+=t[j].x*t[j].x;
 b+=t[j].y*t[j].y;
 c+=t[j].x*t[j].y;
 d+=t[j].x;
 e+=t[j].y;  
 X1+=t[j].x*s[j].x;  
 X2+=t[j].y*s[j].x;  
 X3+=s[j].x;  
 Y1+=t[j].x*s[j].y;  
 Y2+=t[j].y*s[j].y;  
 Y3+=s[j].y; 
 }

 D=n*(a*b-c*c)+2*c*d*e-a*e*e-b*d*d;

 Dx1=n*(X1*b-X2*c)+e*(X2*d-X1*e)+X3*(c*e-b*d);
 Dx2=n*(X2*a-X1*c)+d*(X1*e-X2*d)+X3*(c*d-a*e);
 Dx3=X3*(a*b-c*c)+X1*(c*e-b*d)+X2*(c*d-a*e);

 Dy1=n*(Y1*b-Y2*c)+e*(Y2*d-Y1*e)+Y3*(c*e-b*d);
 Dy2=n*(Y2*a-Y1*c)+d*(Y1*e-Y2*d)+Y3*(c*d-a*e);  
 Dy3=Y3*(a*b-c*c)+Y1*(c*e-b*d)+Y2*(c*d-a*e);

 factors->alfa_x=(float)((float)Dx1/(float)D);
 factors->beta_x=(float)((float)Dx2/(float)D);
 factors->delta_x=(float)((float)Dx3/(float)D);

 factors->alfa_y=(float)((float)Dy1/(float)D);
 factors->beta_y=(float)((float)Dy2/(float)D);  
 factors->delta_y=(float)((float)Dy3/(float)D); 
}

void Correction(_tPoint *corrected, _tPoint *adc, _tFactors *factors)
{  
 corrected->x=(int32_t)(factors->alfa_x*adc->x + factors->beta_x*adc->y + factors->delta_x);
 corrected->y=(int32_t)(factors->alfa_y*adc->x + factors->beta_y*adc->y + factors->delta_y);
}
 
int main()
{
   tPointTs[0].y = 0,   tPointTs[0].x = 0  ;
   tPointTs[1].y = 0,   tPointTs[1].x = 800;
   tPointTs[2].y = 600, tPointTs[2].x = 800;
   tPointTs[3].y = 600, tPointTs[3].x = 0  ;
   tPointTs[4].y = 300, tPointTs[4].x = 400;
  
   tPointTt[0].y = 3633, tPointTt[0].x = 3640;
   tPointTt[1].y = 3630, tPointTt[1].x = 313;
   tPointTt[2].y = 367,  tPointTt[2].x = 290;
   tPointTt[3].y = 375,  tPointTt[3].x = 3615;
   tPointTt[4].y = 1629, tPointTt[4].x = 1663;
 
   FactorsCalc(&tPointTs[0], &tPointTt[0], &tFactors);
   
   tPointADC.y = 3633, tPointADC.x = 3640;
   Correction(&tPoint, &tPointADC, &tFactors);		
   printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x);
   
   tPointADC.y = 3630, tPointADC.x = 313;
   Correction(&tPoint, &tPointADC, &tFactors);		
   printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x);
   
   tPointADC.y = 367, tPointADC.x = 290;
   Correction(&tPoint, &tPointADC, &tFactors);		
   printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x);
   
   tPointADC.y = 375, tPointADC.x = 3615;
   Correction(&tPoint, &tPointADC, &tFactors);		
   printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x);
   
   return 0;
}

 

Но результат вот такой:

ADCY =  3633 ; ADCX =  3640 ; Y=  7272 ; X=  7071
ADCY =  3630 ; ADCX =   313 ; Y=  3942 ; X=  3926
ADCY =   367 ; ADCX =   290 ; Y=   656 ; X=   641
ADCY =   375 ; ADCX =  3615 ; Y=  3989 ; X=  3789

 

монитор.png

Изменено пользователем Alex_Golubev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 10.03.2023 в 19:30, Alex_Golubev сказал:

Но результат вот такой:

А что не так?

приводим к нулю 3633-375=3285

нормируем 3285/5=651,6 - почти 600, ноль правда внизу

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, HardEgor сказал:

А что не так?

Я ожидаю при  ADCY =  3633 ; ADCX =  3640 получения координат x = 0, y = 0 или около того.  А получаю ADCY =  3633 ; ADCX =  3640 ; Y=  7272 ; X=  7071

Изменено пользователем Alex_Golubev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 10.03.2023 в 20:19, Alex_Golubev сказал:

Я ожидаю при  ADCY =  3633 ; ADCX =  3640 получения координат x = 0, y = 0 или около того. 

Не понятно что было и что надо получит? Экран 600х800, откуда 3633 и 3640? А какие исходные сырые значения были?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, HardEgor сказал:

Не понятно что было и что надо получит?

Исходно резистивный сенсор. Данные 3633 и 3640 это попугаи АЦП, которые выдаются при касании по разным углам указал на рисунки. Нужно откалибровать тачскрин, чтобы получить данные в виде координат Y, X. За нуль взят левый верхней угол экрана. Все точки указаны сначала Y потом X. 

Изменено пользователем Alex_Golubev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 10.03.2023 в 20:29, Alex_Golubev сказал:

Исходно резистивный сенсор. Данные 3633 и 3640 это попугаи АЦП, которые выдаются при касании по разным углам указал на рисунки. Нужно откалибровать тачскрин, чтобы получить данные в виде координат X,Y. За нуль взят левый верхней угол экрана. 

так вот калибровка по Y:

приводим к нулю 3633-375=3285

нормируем 3285/5=651,6 - почти 600

Выворачиваем формулу (3633-375)/5=600

3633=600*5+375

проверяем 600*5+375 = 3375

Чтобы ноль вверху был, надо вычесть из 600 полученные координаты.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

X = 800 - (ADCX - 301.5) / 4.1575
Y = 600 - (ADCY - 371) / 5.434

 

Данные центра на картинке, очевидно, неверны. С этими сходится:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде нашел ошибки и что-то получилось:

Спойлер
#include <stdio.h>
#include <stdint.h>

typedef struct
{	
int16_t  x;		  
int16_t  y;					   
} _tPoint;
_tPoint tPointTs[5];
_tPoint tPointTt[5];
_tPoint tPoint;
_tPoint tPointADC;

typedef struct
{	
float   alfa_x;
float   beta_x;
float   delta_x;
float   alfa_y;
float   beta_y;
float   delta_y;					 
} _tFactors;
_tFactors tFactors;


void FactorsCalc(_tPoint *s, _tPoint *t, _tFactors *factors)
{
 int8_t j;
 float a=0, b=0, c=0, d=0, e=0, X1=0, X2=0, X3=0, Y1=0, Y2=0, Y3=0;
 float D, Dx1, Dx2, Dx3, Dy1, Dy2, Dy3; 
 float n = 5.0; 

 for(j=0; j<5; j++) 
 {
 a+=t[j].x*t[j].x;
 b+=t[j].y*t[j].y;
 c+=t[j].x*t[j].y;
 d+=t[j].x;
 e+=t[j].y;  
 X1+=t[j].x*s[j].x;  
 X2+=t[j].y*s[j].x;  
 X3+=s[j].x;  
 Y1+=t[j].x*s[j].y;  
 Y2+=t[j].y*s[j].y;  
 Y3+=s[j].y; 
 }

 D=n*(a*b-c*c)+2*c*d*e-a*e*e-b*d*d;

 Dx1=n*(X1*b-X2*c)+e*(X2*d-X1*e)+X3*(c*e-b*d);
 Dx2=n*(X2*a-X1*c)+d*(X1*e-X2*d)+X3*(c*d-a*e);
 Dx3=X3*(a*b-c*c)+X1*(c*e-b*d)+X2*(c*d-a*e);

 Dy1=n*(Y1*b-Y2*c)+e*(Y2*d-Y1*e)+Y3*(c*e-b*d);
 Dy2=n*(Y2*a-Y1*c)+d*(Y1*e-Y2*d)+Y3*(c*d-a*e);  
 Dy3=Y3*(a*b-c*c)+Y1*(c*e-b*d)+Y2*(c*d-a*e);

 factors->alfa_x=(float)((float)Dx1/(float)D);
 factors->beta_x=(float)((float)Dx2/(float)D);
 factors->delta_x=(float)((float)Dx3/(float)D);

 factors->alfa_y=(float)((float)Dy1/(float)D);
 factors->beta_y=(float)((float)Dy2/(float)D);  
 factors->delta_y=(float)((float)Dy3/(float)D); 
}

void Correction(_tPoint *corrected, _tPoint *adc, _tFactors *factors)
{  
 corrected->x=(int32_t)(factors->alfa_x*adc->x + factors->beta_x*adc->y + factors->delta_x);
 corrected->y=(int32_t)(factors->alfa_y*adc->x + factors->beta_y*adc->y + factors->delta_y);
}

uint8_t TsToChar(int16_t y, int16_t x)
{
	int16_t Y = y/60;
	int16_t X = x/32;
	printf("Y = %5d ; X = %5d ; %5d\r\n", Y, X, Y*25 + X + 1);
}
 
int main()
{
   /*	Ðàñòàâèë òî÷êè êàê â äàòàøèòå îò TI		
        Öåíòðàëüíóþ òî÷êó ðàñ÷èòàë ïîêà ïðèìåðíî
   */
   tPointTs[0].y = 300  , tPointTs[0].x = 400;
   tPointTs[1].y = 0    , tPointTs[1].x = 0  ;
   tPointTs[2].y = 0    , tPointTs[2].x = 800;
   tPointTs[3].y = 600  , tPointTs[3].x = 800;
   tPointTs[4].y = 600  , tPointTs[4].x = 0  ;
  
   tPointTt[0].y = 2004, tPointTt[0].x = 1976;
   tPointTt[1].y = 3633, tPointTt[1].x = 3640;
   tPointTt[2].y = 3630, tPointTt[2].x = 313;
   tPointTt[3].y = 367,  tPointTt[3].x = 290;
   tPointTt[4].y = 375,  tPointTt[4].x = 3615;
   
    /* // òåñòîâûå òî÷êè ïðîâåðî÷íûå
	tPointTs[0].x = 128  , tPointTs[0].y = 384 ;
    tPointTs[1].x = 64   , tPointTs[1].y = 192 ;
    tPointTs[2].x = 192  , tPointTs[2].y = 192 ;
    tPointTs[3].x = 192  , tPointTs[3].y = 576 ;
    tPointTs[4].x = 64   , tPointTs[4].y = 576 ;
                                              
    tPointTt[0].x = 1698 , tPointTt[0].y = 2258;
    tPointTt[1].x = 767  , tPointTt[1].y = 1149;
    tPointTt[2].x = 2807 , tPointTt[2].y = 1327;
    tPointTt[3].x = 2629 , tPointTt[3].y = 3367;
    tPointTt[4].x = 588  , tPointTt[4].y = 3189;*/
   
   FactorsCalc(&tPointTs[0], &tPointTt[0], &tFactors);
   
   printf("alfaX = % 5.5f ; betaX = % 5.5f ; deltaX= % 5.5f \r\n", tFactors.alfa_x,  tFactors.beta_x,  tFactors.delta_x);
   printf("alfaY = % 5.5f ; betaY = % 5.5f ; deltaY= % 5.5f \r\n", tFactors.alfa_y,  tFactors.beta_y,  tFactors.delta_y);
   printf("\r\n");
   
   tPointADC.y = 3633, tPointADC.x = 3640;
   Correction(&tPoint, &tPointADC, &tFactors);		
   printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x);
   
   tPointADC.y = 3630, tPointADC.x = 313;
   Correction(&tPoint, &tPointADC, &tFactors);		
   printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x);
   
   tPointADC.y = 367, tPointADC.x = 290;
   Correction(&tPoint, &tPointADC, &tFactors);		
   printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x);
   
   tPointADC.y = 375, tPointADC.x = 3615;
   Correction(&tPoint, &tPointADC, &tFactors);		
   printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x);
   
   for(int y = 0; y < 600; y += 60){
   	
   	 for(int x = 0; x < 800; x += 32)
   	 {
   	 	TsToChar(y, x);
	 }
	 
   }
   
   return 0;
}

 

alfaX = -0.24053 ; betaX =  0.00177 ; deltaX=  869.52948
alfaY =  0.00030 ; betaY = -0.18402 ; deltaY=  667.77826

ADCY =  3633 ; ADCX =  3640 ; Y=     0 ; X=     0
ADCY =  3630 ; ADCX =   313 ; Y=     0 ; X=   800
ADCY =   367 ; ADCX =   290 ; Y=   600 ; X=   800
ADCY =   375 ; ADCX =  3615 ; Y=   599 ; X=     0

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...