Ручная калибровка сенсорного экрана

Материал из PocketZ_wiki
Перейти к: навигация, поиск

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

Нам понадобятся:

  1. Линейка
  2. DigitizerCheck - программа, которая отображает координаты точки нажатия стилусом. Она очень древнняя, не помню откуда она у меня. В принципе, годится любой подобный аналог.
  3. Редактор реестра (Реско) или аналог для редактирования реестра.
  4. Если координата съехала О-О-Очень далеко и нет возможности более-менее управлять машинкой, то может понадобиться любой Remote Control для управления и редактирования машинки с настольного ПК


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

Далее идем в реестр за координатами. Они хранятся в ветке: [HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH] в переменной

"CalibrationData"="1800,2054 1009,3152 775,958 3400,922 3089,3181 "

Вот мои замеры для разных систем:

Последние координаты и есть значения для "больной" машинки. Ими и займемся! Значения в реестре расположены парами (горизонталь-вертикаль) в том же порядке, как и ввод нажатий стилусом.

Координаты нажатий разделены пробелом.

И так, имеем:

  • C = 1898,2054 (центр)
  • LU = 609,3152 (лев-верх)
  • LL = 775,958 (лев-низ)
  • RL = 3367,922 (прав-низ)
  • RU = 3089,3181 (прав-вверх)

Легко сообразить, что в моем случае координата (0,0) - левый нижний угол экрана. Теперь проведем несложные вычисления и подсчитаем реальный размер.

Имею на данный момент следующие размеры:

  1. 3796 x 4108 pt
  2. 240 x 320 pxl
  3. 53 x 71 mm

где:

  1. Размер экрана в условных точках (points), этими значениями он записывается в реестр. Значения центральной точки умноженные на 2.
  2. Размер экрана в пикселах (pixels), т.е. графический размер экрана (из технических характеристик "больного" КПК)
  3. Физические размеры отображаемой области в миллиметрах (промер "белого" экрана линейкой) В данном случае экран x3.5 дюйма.

Далее ищем коэфициенты соотношения размера в точках к размерам в пикселах и миллиметрах: для графики:

3796/240=15.8 (горизонталь)
4108/320=12.8 (вертикаль)

Итого:

hpx = 15.8 (pt/pxl)
vpx = 12.8 (pt/pxl)

Аналогично для физических размеров:

hpm= 71.6 (pt/mm)
vpm= 57.9 (pt/mm)

Значения привел дробные, но лучше округлить в любую сторону.

Почему я использовал коэффициенты для разных типов данных и pt/pxl, и pt/mm, а не один какой-то? Потому что в одних ситуациях удобно вычислять отклонения по пикселам, а в других банально измерять линейкой или на глаз!

Следующий этап - вычисление отклонений. В машинке, которую мне дали для калибровки были следующие отклонения:

LU - около 8 мм по горизонтали вправо
RL - около 3 мм по горизонтали влево

Отклонения я замерял при помощи DigitizerCheck, проводя замеры от точки касания до перекрестия на экране. Касания производил приблизительно в тех местах где расположены кресты системной калибровки. Так же при нажатии на краях (там где координата должна быть равна 0 или 239 для гор, и 0 и 319 для верт) снимал показания отклонения в пикселах для более тонкой рекалибровки. Т.е. Тапнул в точку с координатой X=0, а DigitizerCheck показал (21,222) - отклонение 21 pxl

При отклонении координаты, нам при коррекции надо двигаться в туже сторону, а именно если координата отличается в "плюс" (больше), то коррекцию надо прибавлять, если в "минус" (меньше), то вычитать.

Таким образом для своего случая я имею:

C = 1898,2054 (центр)
LU = 609 + 8*71.6,3152 (лев-верх)
LL = 775,958 (лев-низ)
RL = 3367 - 3*57.9,922 (прав-низ)
RU = 3089,3181 (прав-вверх)

Округлив до целых:

"CalibrationData"="1898,2054 1158,3152 775,958 3193,922 3089,3181 "

Заношу эти данные в реестр, делаю софт-ресет. После перезагрузки, изменяя на глаз значения, добиваюсь наиболее близкого к совершенству результата. Далее делаю экспорт из реестра ветки [HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH] в отдельный файл. он может понадобиться после холодных перезапусков, чтобы не проводить все эти манипуляции. Вроде бы все? Может есть какие-то другие методы, но пока ничего другого не пришло в голову.

Личные инструменты