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

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

Здравствуйте.

Нужна помощь в калибровке резистивного тачскрина 7 дюймов. У кого есть опыт, помогите разобраться, в чём ошибка. Тачскрин опрашиваю через XPT2046, мк STM32. Бьюсь над проблемой уже 3-ю неделю.

 

Немного истории и суть проблемы:

Вначале проект был на LCD 3.2 дюйма (разрешение 320 x 240). Калибровка была по 3-м точкам. Работало идеально, хоть от пальца, хоть от стилуса.

 

Дальше проект перешёл на LCD 5 дюймов (разрешение 800 x 480). Возникло 2 проблемы:

1-ая это калибровки по 3-м точкам стало не хватать, решение - сделал калибровку по 9-ти точкам (чтоб больше не возвращаться к этому вопросу);

2-ая это пришлось учитывать степень нажатия на экран, т.е. читать z1 и вводить поправочный коэффициент для разных областей экрана (хватило 4-х областей). Стало работать тоже идеально. И думал, что вопрос закрыт.

 

Дальше проект перешёл на LCD 7 дюймов (разрешение 800 x 480) и тут с тачскрином застрял. Он не калибруется должным образом. Чем дальше удаляться от центра экрана, тем курсор имеет большую погрешность (калибровка по 9-ти точкам), по разным краям разную. Причём тачскрин по краям имеет большой разброс сопротивления, если считывать код АЦП, то разница составляет от 100..300 единиц минимум по одной оси. Силу нажатия нужно учитывать ещё больше, для этого снял в калибровочных точках координату z1 и считаю, какая должна быть z1 для каждой координаты. Но всё это не даёт хороший результат.

 

Подключал 5-ти и 7-ми дюймовый экран к GPS навигатору, шлейфы у них одинаковые, на навигаторе WinCE,работают абсолютно одинаково, с одной и той же калибровкой. Но там не отображается курсор, но в пиктограммы всё чётко попадает, лишь на совсем крайних точках нужно больше давить на экран. На навигаторе калибровка по 5-ти точкам.

 

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


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

Читать это.

 

По 5 точкам:

#define POINT_QTY	 5

typedef struct
{	
Int32U  x;		  
Int32U  y;					   
} tPoint;

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

void FactorsCalc(tPoint *s, tPoint *t, tFactors *factors)
{
 Int8U j;
 Int64U a=0, b=0, c=0, d=0, e=0, X1=0, X2=0, X3=0, Y1=0, Y2=0, Y3=0;
 Int64S D, Dx1, Dx2, Dx3, Dy1, Dy2, Dy3; 

 for(j=0; j<POINT_QTY; 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=(Flo64)((Flo64)Dx1/(Flo64)D);
 factors->beta_x=(Flo64)((Flo64)Dx2/(Flo64)D);
 factors->delta_x=(Flo64)((Flo64)Dx3/(Flo64)D);

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

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

Изменено пользователем IgorKossak
[codebox] для длинного кода. [code]-для короткого!!!

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


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

Здравствуйте.

Нужна помощь в калибровке резистивного тачскрина 7 дюймов. У кого есть опыт, помогите разобраться, в чём ошибка. Тачскрин опрашиваю через XPT2046, мк STM32. Бьюсь над проблемой уже 3-ю неделю.

 

А в чем проблема? Хотите получить высокое разрешение(чтоб стилусом в писать текст от руки или просто по кнопкам в 2 кв. см. пальцем попасть)? В последнем случае использую "контроллер", сделанный из тини25го с калибровкой в 2 точки.

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


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

skripach, У меня подобный алгоритм только для 9-ти точек, AN от Analog Devices.

 

mantech, Проблема описана в 1-ом посте, если его весь прочитать, а не первые 2 строчки.

Интересно глянуть как будет работать тач на 7-ми дюймовом LCD с калибровкой по двум точкам. Точность будет +/- сантиметр и больше. Точность нужна, где нажал там и курсор стоит и скорость реакции не секундами исчислялась.

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


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

Точность будет +/- сантиметр и больше. Точность нужна, где нажал там и курсор стоит и скорость реакции не секундами исчислялась.

 

Точность +- 3-5мм на 10и дюймовом экране. меньше не получите в любом случае, ибо это радиус пальца при прикосновении.

 

ЗЫ. А вообще меня интересует, как эти тачи реагируют на изменение температуры окр. среды, скажем от +30 до +5 градусов, может, кто знает, на сколько точность "уплывет"?

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

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


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

3 - 5 мм это много, если нажимать стилусом. У меня на 5 дюймовом при нажатии курсор изменяет свою позицию максимум на 1-2 пикселя и то ближе к краю экрана, и то не всегда. А так стоит как вкопанный. На 7 дюймовом это выполнимо только ближе к центру, к крайним точкам экрана значения начинают уплывать до 5-15мм, меня это не устраивает. Нелинейность тача для 7-ми дюймов 100..200 по показаниям 12 битного АЦП, а нелинейность тача для 5 дюймов 10-30. Плюс нужно учитывать силу нажатия, т.к. при слабом нажатии в точке отдалённой от центра будут читаться неправильные значения АЦП.

Как вас калибровка по 2-м точкам для 10-ти дюймового тача, может устраивать для меня загадка.

 

Т.к. предложений от сообщества никаких, пришла мысль разделить экран на 4 части и сделать для каждой части свою калибровку по 4-м точкам. Это останется та же калибровка по 9-ти точкам, только будут свои коэффициенты для каждой области.

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


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

skripach, У меня подобный алгоритм только для 9-ти точек, AN от Analog Devices.

Ссылку дадите?

И да, у самого края проблемы неизбежны, там диалектик мешает, который между слоями тачка. Разделить экран на несколько частей наверно неплохая идея, добавление точек в алгоритм приведённый мной по ссылке приведёт к существенному усложнению расчетов и наверно потребует увеличить разрядность некоторых переменных, а там уже некуда...

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


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

3 - 5 мм это много, если нажимать стилусом. У меня на 5 дюймовом при нажатии курсор изменяет свою позицию максимум на 1-2 пикселя и то ближе к краю экрана, и то не всегда. А так стоит как вкопанный.

 

Согласен, но мне тач нужен именно для работы без стилуса, поэтому данная точность вполне оправдана.

 

На счет, как по 2м точкам - как сказать, видать тачи с достаточно линейной характеристикой попадаются, почему и спрашиваю, как при разных температурах будет, может нелинейность увеличится...

 

ЗЫ. Кстати, почему именно резистивный выбрали? В моем случае нужно, чтоб работало в условиях влажности и сырости.

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

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


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

skripach, смотрите AN-1021.

В 5-ти дюймовом края уже не проблема, думаю и для 7-ми дюймового можно откалибровать, только методику нужно изменить, из-за его нелинейности. Текущий алгоритм у меня на float числах. Разницу c double не заметил.

Нужно ещё придумать как области которые разделить для своей калибровки, синхронизировать между собой. Пока думаю придётся помимо калибровочный коэффициентов ещё крайние значения АЦП хранить для каждой области. Но в таком случае, нужно учесть, если вдруг попадётся экран с поменянными X- и Х+ или Y- и Y+. Калибровка всего экрана это учитывает в алгоритме.

 

mantech, Ёмкостные тачи вроде не так давно в широком доступе, может год, полтора и то, что видел это только на buydisplay, на али ещё тоже появились, но вместе с экрани. Экраны с телефонов не беру в расчёт. Да и ёмкостной тач, является лицевой частью корпуса, это тоже нужно учитывать. Другой плюс для меня, это одинаковость шлейфов для 5 и 7 дюймовых LCD.

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


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

Ёмкостные тачи вроде не так давно в широком доступе, может год, полтора и то, что видел это только на buydisplay, на али ещё тоже появились, но вместе с экрани. Экраны с телефонов не беру в расчёт. Да и ёмкостной тач, является лицевой частью корпуса, это тоже нужно учитывать.

 

На счет "недавно", смотрел года 2 назад - уже не мало было, интересовали тачи для планшетов, т.к. они подходили под искомую диагональ (7-10") Единственный минус - разные контроллеры, либо надо было ставить свой на плату и к нему 1 или 2 широких разъема.

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


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

Может быть и полно, но мне как то не попадались. Да и мультитач мне пока не нужен, поэтому резистивного вполне хватало.

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


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

Может быть и полно, но мне как то не попадались. Да и мультитач мне пока не нужен, поэтому резистивного вполне хватало.

Использовал 7" тач с экраном от стартеркита SK-ATM0700D4-Plug, так же модули md070sd. Там у них примеры калибровки - работает идеально, 1-3 мм погрешность по краям приблизительно.

Но ушли на ёмкостные - люди привыкли к смартам и тяжело понимают, что надо нажать сильно для отклика.

 

Я фильтровал силу нажатия (z), поэтому слабые касания не обрабатывались. Так же фильтровал по накоплению координат.

 

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


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

Я фильтровал силу нажатия (z), поэтому слабые касания не обрабатывались. Так же фильтровал по накоплению координат.

 

В смысле? Контроллер тача разве это не делает сам? У меня был самодельный на МК и с спец. контроллерами не работал, приходилось делать нормирование и фильтрацию, думал, что специализированные ИС это должны делать, иначе зачем они тогда, скоммутировать порты и замерить сопротивление??

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


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

В смысле? Контроллер тача разве это не делает сам? У меня был самодельный на МК и с спец. контроллерами не работал, приходилось делать нормирование и фильтрацию, думал, что специализированные ИС это должны делать, иначе зачем они тогда, скоммутировать порты и замерить сопротивление??

Я работал с XPT2046, фильтрация обязательна.

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


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

... Там у них примеры калибровки ...

А примеры примеры в общем доступе есть? Я их не нашёл.

 

Я фильтровал силу нажатия (z) ...

Значение для силы нажатия меняется от координат. С одного края лёгкое нажатие это может быть 200-300 (значение АЦП), а с другого края для лёгкого нажатия это уже значение не меньше 800-1000. Силу нажатия привязывали по координатам при калибровке?

 

 

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


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

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

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

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

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

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

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

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

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

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