Ручная калибровка сенсорного экрана
Материал из PDA Prime_wiki
Некоторые аппараты со временем начинают неверно отрабатывать координату точки нажатия стилусом. С чем это связанно? Мне трудно ответить, может и банальная деформация... кто занет? На одной машинке мне пришлось лично повозиться и привести сие недоразумение до весьма приемлемого результата.
Нам понадобятся:
- Линейка
- DigitizerCheck - программа, которая отображает координаты точки нажатия стилусом. Она очень древнняя, не помню откуда она у меня. В принципе, годится любой подобный аналог.
- Редактор реестра (Реско) или аналог для редактирования реестра.
- Если координата съехала О-О-Очень далеко и нет возможности более-менее управлять машинкой, то может понадобиться любой Remote Control для управления и редактирования машинки с настольного ПК
Проводим калибровку экрана в настройках системы. Хотя этот шаг можно опустить и использовать те значения реестра, которые уже имеем.
Далее идем в реестр за координатами. Они хранятся в ветке: [HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH] в переменной
"CalibrationData"="1800,2054 1009,3152 775,958 3400,922 3089,3181 "
Вот мои замеры для разных систем:
- Windows Mobile 5 - QVGA (240x320): "CalibrationData"="482,629 96,124 100,1142 864,1142 864,124 "
- Windows Mobile 5 - VGA (480x640): "CalibrationData"="964,1266 205,248 200,2284 1728,2284 1728,248 "
- Windows Mobile 2003 - QVGA (240x320):"CalibrationData"="1898,2054 609,3152 775,958 3367,922 3089,3181 "
Последние координаты и есть значения для "больной" машинки. Ими и займемся! Значения в реестре расположены парами (горизонталь-вертикаль) в том же порядке, как и ввод нажатий стилусом.
Координаты нажатий разделены пробелом.
И так, имеем:
- C = 1898,2054 (центр)
- LU = 609,3152 (лев-верх)
- LL = 775,958 (лев-низ)
- RL = 3367,922 (прав-низ)
- RU = 3089,3181 (прав-вверх)
Легко сообразить, что в моем случае координата (0,0) - левый нижний угол экрана. Теперь проведем несложные вычисления и подсчитаем реальный размер.
Имею на данный момент следующие размеры:
- 3796 x 4108 pt
- 240 x 320 pxl
- 53 x 71 mm
где:
- Размер экрана в условных точках (points), этими значениями он записывается в реестр. Значения центральной точки умноженные на 2.
- Размер экрана в пикселах (pixels), т.е. графический размер экрана (из технических характеристик "больного" КПК)
- Физические размеры отображаемой области в миллиметрах (промер "белого" экрана линейкой) В данном случае экран 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] в отдельный файл. он может понадобиться после холодных перезапусков, чтобы не проводить все эти манипуляции. Вроде бы все? Может есть какие-то другие методы, но пока ничего другого не пришло в голову.
Bobr
del.icio.us
digg
facebook
Furl
Google
Memori
Mister Wong
News2
reddit
Slashdot
StumbleUpon
