PDA

Просмотр полной версии : Собственный контроллер резистивного сенсорного экрана, совместимый с Android


zyxel812
27.03.2013, 22:11
Собрался я тут на досуге распотрошить свой штатный монитор и внедрить в него pccar на базе odroid-x2. Но это отдельная история, сейчас о мониторе, точнее о его сенсорном экране.
Размер матрицы у него 6.5", не то чтобы большая редкость, но найти удалось только с резистивным тачскрином. Много гуглив, стало ясно, что "завести" такой тачcкрин под Андроидом хотят все, но не кому это нормально не удалось. Почесав немного репу, посмотрев тут (http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D0%BD%D1%81%D0%BE%D1%80%D0%BD%D1%8B%D 0%B9_%D1%8D%D0%BA%D1%80%D0%B0%D0%BD) что такое резистивный экран и как он работает, я понял: "а ведь его удастся контролировать при помощи микроконтроллера avr!", тем более, решая предыдущую проблему связи с кнопками на руле, HID Class Device я уже научился делать и прикинутся для Андроида мышкой не составит труда. Погуглив еще раз, действительно нашел пару примеров, как подключить резистивный тач к микроконтроллеру.
Начал я "воять". Всё получается, координаты касания к экрану определять научился, даже написал простую калибровочную утилиту. Мышкой прикидываться научился, курсор по экрану винды уже бегает примерно там, где я вожу пальцем. Настал час Х - подключение к Андроиду. Облом, не работает. Подключаю к винде - работает. Погуглив еще немножко, выяснилось, что Андроид не поддерживает мышки, которые передают абсолютные координаты, он умеет работать с мышами, которые передают движения. Вычислять, какие движения нужно передать, чтоб курсор попал в точку х,у кажется мне слишком сложными. В общем, я временно в тупике. Нужны идеи. От алгоритмов вычисления движений для перемещения курсора из точки А в точку Б, до других готовых способов подружить Андроид с резистивным тачем.

Gorynch
27.03.2013, 22:37
А если взять контроллер такой мышки и на его входы подавать абсолютные координаты?

mas_u
27.03.2013, 22:55
Нужны идеи. От алгоритмов вычисления движений для перемещения курсора из точки А в точку Б.
А какие тут могут быть идеи?
Запоминать последнюю точку и вычислять относительно нее dx и dy для новой точки.

http://www.youtube.com/watch?v=RXJUcBbT19g

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

wave_is
27.03.2013, 23:20
а я все никак не могу понять почему одни мышки работают в андроиде, а вторые нет

s.m.
28.03.2013, 00:09
а если подключить через блютуз? это конечно через ж.. но может помочь

zyxel812
28.03.2013, 00:51
А если взять контроллер такой мышки и на его входы подавать абсолютные координаты?
Поясните


А какие тут могут быть идеи?
Запоминать последнюю точку и вычислять относительно нее dx и dy для новой точки.

http://www.youtube.com/watch?v=RXJUcBbT19g

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

Это ваш проект на видео? Так и сделано? Описание где-нибудь есть?


а если подключить через блютуз? это конечно через ж.. но может помочь

Суть-то та же, просто порт как бы другой.

Gorynch
28.03.2013, 01:05
Виноват, упустил из виду, что оптика мыши и процессор обработки смещены в одном корпусе, поэтому подсунуть свои данные не получится

mas_u
28.03.2013, 01:46
Это ваш проект на видео? Так и сделано? Описание где-нибудь есть?


Проектом это назвать сложно, так - эксперименты для поиска замены треснувшего родного емкостного тача. Принцип работы как упоминал выше.
Описания нет - было реализовано на atmega8 + v-usb.

zyxel812
28.03.2013, 13:06
Проектом это назвать сложно, так - эксперименты для поиска замены треснувшего родного емкостного тача. Принцип работы как упоминал выше.
Описания нет - было реализовано на atmega8 + v-usb.
Если не трудно, расскажи пожалуйста об особенностях с которыми тебе пришлось столкнуться. Это, возможно, сэкономит мне кучу времени. Первые эксперименты, которые я сейчас сделал, не особо удачны. Для устранения ошибки, после отпускания экрана, перевожу курсор в верхний левый угол и при следующем касании отталкиваюсь от этой позиции. Однако, при касании курсор у меня перемещается на много дальше чем нужно, но при дальнейшем движении двигается вроде на правильные расстояния. В общем, проведя еще кучу экспериментов, думаю приду к правильному решению, но хотелось бы сэкономить время.

zyxel812
28.03.2013, 13:30
Выяснилось, что передача смещения в 100 вызывает перемещение курсора примерно на 250 точек на экране. Пока не ясно, коэффициент 2,5 для всех компьютеров одинаков или для каждого он свой и зависит от каких-то настроек.

Ага, стало ясно, коэффициент зависит от настройки скорости перемещения курсора мыши в винде. Галочка "Включить повышенную точность установки указателя мыши" уменьшает первое движение мишкой. В Андроиде вроде нет таких настроек. Буду вычислять коэффициент на нем.

На моем андроиде, коэффициент 2. Андроид с usb у меня один, проверить одинаковость на разных устройствах пока не могу. Зависит ли коэффициент от разрешения экрана?

s.m.
28.03.2013, 14:23
Суть-то та же, просто порт как бы другой.

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

zyxel812
28.03.2013, 15:52
я могу ошибаться, но может быть через блютуз будут поддерживаться мыши с абсолютными координатами, что сведет задачу к написанию калибровочной утилиты

Затратно и хлопотно делать bluetooth hid device, тем более что ваше предположение не подтверждено. Если бы точно знать...

А у Андроида курсор не возвращается в верхний левый угол. Такое ощущение, что Андроид попытку сместить курсор за пределы экрана просто игнорирует, а Винда перемещает на максимально возможное расстояние, т.е. к краю экрана.

zyxel812
28.03.2013, 15:58
Еще две мысли:
1) Знать бы протокол, по которому Андроид общается с мультитач контроллерами, чтобы "прикинуться" таковым.

2) Может есть программист под Андроид, который смог бы написать службу, которая бы считывала координаты с виртуального COM-порта и программным образом двигала и кликала мышкой, если такое возможно.

VVi3ard
28.03.2013, 16:08
Возможно стоит отказаться от эмуляции мыши и использовать другой класс устройства (touch screen device вместо pointer device):
http://source.android.com/tech/input/touch-devices.html

s.m.
28.03.2013, 16:39
возможно, нужно покурить здесь http://developer.android.com/tools/help/monkeyrunner_concepts.html

zyxel812
28.03.2013, 17:19
Возможно стоит отказаться от эмуляции мыши и использовать другой класс устройства (touch screen device вместо pointer device):
http://source.android.com/tech/input/touch-devices.html

Нашел вот такой Report Descriptor (http://msdn.microsoft.com/en-us/library/windows/hardware/ff553722%28v=vs.85%29.aspx),
начало вроде понятное - 16 бит каких-то данных, а вот дальше...
там X и Y по 16 бит или X и Y вместе 16 бит? Потом вроде ширина и высота по 16 бит. Кто в этом разбирается, я правильно расшифровал?
struct {
uint16_t flags;
int16_t X;
int16_t Y;
int16_t Width;
int16_t Height;
}

VVi3ard
28.03.2013, 17:50
По вашему вопросу не подскажу, но вот набрел на похожую разработку:
https://www.sparkfun.com/tutorials/139

В ней есть алгоритм пересчета координат, возможно вам поможет.

zyxel812
28.03.2013, 18:15
По вашему вопросу не подскажу, но вот набрел на похожую разработку:
https://www.sparkfun.com/tutorials/139

В ней есть алгоритм пересчета координат, возможно вам поможет.

Они используют Mouse Class Device с передачей абсолютных координат, которые не поддерживаются Андроидом. Я тот же так изначально сделал, в Винде всё работало, в Андроиде нет.

s.m.
28.03.2013, 18:18
а если попробовать дизассемблить прогу, которая идет вместе пионером для той же задачи, может там подсказка будет...

zyxel812
28.03.2013, 18:27
Когда учился, баловался такими вещами, это вообще жесть.
Я чувствую, решение где-то уже близко. Копать в сторону Touch Digitizer мне кажется правильным. Выше давали ссылку, где было заявлено, что Андроид поддерживает такой класс устройств. Мне осталось найти как правильно описать такое устройство, чтоб Винда и Андроид восприняли мою поделку именно как Touch Digitizer. Я пока не особо разбираюсь в программировании USB, предыдущие мои изделия были основаны на готовых примерах из LUFA. Готового примера для Digitizer нет, сижу разбираюсь в документации.

VVi3ard
28.03.2013, 18:44
Я сейчас занят сильно, нет времени гуглить, обрати внимание:
по ссылке http://source.android.com/tech/input/touch-devices.html в конце есть ссылки:
Linux multi-touch protocol
ENAC list of available multitouch devices on Linux

Мне все таки кажется что там тоже может быть полезная информация.

VVi3ard
28.03.2013, 19:12
Вот еще масса информации: http://www.usb.org/developers/hidpage
Нужно смотреть твой код который реализует HID класс "Мышь" возможно там есть комментарии по настройке для другого класса.
Вот от туда инфа от MS
http://msdn.microsoft.com/ru-RU/library/windows/hardware/gg487435.aspx
http://msdn.microsoft.com/en-us/library/windows/hardware/gg487437.aspx

zyxel812
28.03.2013, 21:02
Товарищи! Работает!
Как световое перо работает и на Андроиде тоже!
Вот с таким дескриптором (http://msdn.microsoft.com/en-us/library/windows/hardware/ff553722%28v=vs.85%29.aspx).
Данные отчета такие:
uint16_t flags; //чтобы не ошибится, позже расшифрую. здесь закодировано прикосновение и наличие пера в поле видимости
int16_t X; //от 0 до 32767 координата Х
int16_t Y; //от 0 до 32767 координата Y
int16_t Width; //Width of contact
int16_t Height; //Height of contact
int16_t Const; //должно быть нулем.

Я еще поэкспериментирую, вроде как последние три поля из дескриптора и, соответственно, отчета можно изъять.

В общем, скоро будет готов контроллер резистивного тача, совместимый с Андроид!

zyxel812
29.03.2013, 20:43
Вот и результат: http://www.pccar.ru/showthread.php?t=18943
Отдельное спасибо VVi3ard, благодаря его ссылке на touch screen class device было сэкономлено уйма времени.

s.m.
29.03.2013, 21:11
Вот и результат: http://www.pccar.ru/showthread.php?t=18943
Отдельное спасибо VVi3ard, благодаря его ссылке на touch screen class device было сэкономлено уйма времени.

поздравляю!
если не будет секретом принцип работы калибровочной утилиты - могу написать такую под андроид - решение будет законченным (непонятно сейчас, как будет виден калибровочный порт под андроидом)

mas_u
29.03.2013, 22:10
если не будет секретом принцип работы калибровочной утилиты - могу написать такую под андроид - решение будет законченным (непонятно сейчас, как будет виден калибровочный порт под андроидом)

Описание алгоритма для калибровки. Минимальное кол-во точек для калибровки - 3.

zyxel812
29.03.2013, 23:02
если не будет секретом принцип работы калибровочной утилиты - могу написать такую под андроид - решение будет законченным (непонятно сейчас, как будет виден калибровочный порт под андроидом)

Отличная новость! Конечно не секрет.
В Андроиде устройство видится как /dev/ttyACM0 (точнее не само устройство, а виртуальный последовательный порт в его составе)

Протокол очень простой и примитивный:
Пакет:
word - 0xFFFF - сигнатура
byte - 0x01 - признак версии
byte - cmd - команда
тут могут быть данные, если того требует команда
byte - crc - контрольная сумма - xor всех предыдущих байт пакета

в ответ придут данные, если они предусмотрены командой и один байт - 0х00 - ошибок нет, 0хFF - что-то не так.

Команды следующие:
0х01 - получить номер версии. В ответ на эту команду придет только один байт - 0х01 без закрывающего нуля. Это команда для проверки того, что мы подключились к правильному устройству.

0х0A - Получить состояние. В ответ придут:
byte x - последнее измеренное значение по оси Х
byte y - последнее измеренное значение по оси Y
byte touched - 1 - в данный момент есть прикосновение, 0 - прикосновения нет
и закрывающий 0.

0x0B - Выключить мышь. Нужно подавать эту команду перед калибровкой. Устройство перестанет передавать прикосновения в компьютер. Данные можно будет получить только по последовательному порту. В ответ придет только один байт - 0х00

0х0С - Включить мышь. Выдавать после окончания калибровки. В ответ придет только один байт - 0х00

0х0D - Записать калибровочные данные:
int32 - kx
int32 - ky
byte - dx
byte - dy
word - xsize
word - ysize
не забываем про crc.
В ответ придет один байт - 0х00.

Общий порядок калибровки:
1) Выключаем мышь, командой 0х0В
2) Просим пользователя прикоснуться куда-нибудь в верхний левый угол, и в цикле считываем значения измерений x и y командой 0х0А. В зачет идут только те результаты, в которых флаг touch = 1. На основе нескольких десятков измерений, вычисляем средний x и y.
3) Повторяем процедуру для правого нижнего угла.
На основе полученных данных, вычисляем dx,dy,kx,ky. (xsize и ysize задуманы для передачи контроллеру размеров экрана, но на данный момент не используются.)
4) Записываем результаты в контроллер, командой 0х0D
5) Включаем мышь командой 0х0С.

Теперь о том, что такое dx, dy, kx, ky.
Устройство посылает в компьютер отчет, который содержит координаты X и Y в виде чисел от 0 до 32767. При этом, 0 соответствует самой левой части экрана (или самой верхней), 32767 - самой правой части экрана (или самой нижней). Нужно пересчитать значения от 0 до 255, полученные с АЦП в числа от 0 до 32767, передаваемые в компьютер.
Формула в контроллер заложена такая.
X = kx*(adc_x - dx)/65536
Y = ky*(adc_y - dy)/65536
где Х,Y - числа от 0 до 32767, передаваемые в компьютер
adc_x, adc_y - значения измерений, получаемых с АЦП.

Этой информации, как мне кажется, достаточно чтобы написать калибровочную утилиту. Если остались вопросы, спрашивай.

zyxel812
29.03.2013, 23:09
Описание алгоритма для калибровки. Минимальное кол-во точек для калибровки - 3.

Это так. Я указал, что проект не совсем закончен, но уже работоспособен. Я упростил калибровку сознательно, исходя из следующего: При таком низком разрешении измерений (8 бит) отклонение в параллельности сенсорной панели и экрана не заметно. Т.е., принимаем как константу, что сенсорная панель параллельна экрану. И, так как мы не собираемся компенсировать поворот сенсорной панели относительно экрана, достаточно двух точек калибровки.

VVi3ard
30.03.2013, 17:18
Вот и результат: http://www.pccar.ru/showthread.php?t=18943
Отдельное спасибо VVi3ard, благодаря его ссылке на touch screen class device было сэкономлено уйма времени.

Спасибо за упоминание моего ника :) Не уверен что я достоин но спасибо.

Не хотите написать свою статью на HABR? Я думаю вы в процессе разработки убедились что в рунете информации по данной теме нет, и ваша статья на хабре многим бы помогла. Плюс возможно там найдется 1-2 человека которые смогут помочь улучшить вашу разработку.

Ведь для многих CARPC шников вопрос подключения штатного тача весьма актуален.

macau
30.03.2013, 20:37
а разве такой (http://www.aliexpress.com/item/4-wire-Resistive-USB-touch-screen-panel-controller-touch-panel-controller/547668684.html) контроллер не работает в ондроеде?

alexvtk
30.03.2013, 21:18
а разве такой (http://www.aliexpress.com/item/4-wire-Resistive-USB-touch-screen-panel-controller-touch-panel-controller/547668684.html) контроллер не работает в ондроеде?

А что такое "ондроед"? В этой ветке речь идет о контроллере резистивного сенсорного экрана, совместимый с Android.

zyxel812
30.03.2013, 23:10
Не хотите написать свою статью на HABR? Я думаю вы в процессе разработки убедились что в рунете информации по данной теме нет, и ваша статья на хабре многим бы помогла. Плюс возможно там найдется 1-2 человека которые смогут помочь улучшить вашу разработку.

Ведь для многих CARPC шников вопрос подключения штатного тача весьма актуален.
На самом деле я вроде как ничего нового тут не придумал, просто собрал в кучу разрозненную информацию и заставил работать. Прежде чем что-то писать, довести бы до ума. Хотелось бы улучшить качество аналого-цифрового преобразования и заставить его работать еще и под виндой нормально. Только после этого труд можно будет считать полноценным.

zyxel812
30.03.2013, 23:15
а разве такой (http://www.aliexpress.com/item/4-wire-Resistive-USB-touch-screen-panel-controller-touch-panel-controller/547668684.html) контроллер не работает в ондроеде?
Если речь идет всё таки о Андроиде, то нет, не работает. Такой контроллер был в комплекте с моим дисплеем (http://www.aliexpress.com/item/HDMI-VGA-2AV-Controller-board-6-5inch-AT065TN14-800-480-Lcd-panel-Touch-Screen/739455832.html). В комплекте куча драйверов и для Виндов и для Линукс и даже для Дос и Мак, а вот для Андроид ничего нет.

macau
30.03.2013, 23:21
а подключать его не пробовали? оно по идее тоже как hid должно определяться?

zyxel812
30.03.2013, 23:54
а подключать его не пробовали? оно по идее тоже как hid должно определяться?
Пробовал конечно, не работает. Оно и в Винде без драйверов не работает. Без драйверов - неизвестное устройство.

RipZ
02.04.2013, 12:12
В комплекте куча драйверов и для Виндов и для Линукс и даже для Дос и Мак, а вот для Андроид ничего нет.

поддержка данного тача, он называется eGalax - в модуле usbtouchscreen.ko

macau
02.04.2013, 12:51
это уже другой разговор. искаропки можно запустить.

s.m.
02.04.2013, 13:16
поддержка данного тача, он называется eGalax - в модуле usbtouchscreen.ko

забыли мааааааааааленькую вещь - нет в природе утилиты калибровки под Андроид (ИМХО) - без нее использовать нереально - нажатия отображаются не там где надо.

RipZ
02.04.2013, 13:18
забыли мааааааааааленькую вещь - нет в природе утилиты калибровки под Андроид (ИМХО) - без нее использовать нереально - нажатия отображаются не там где надо.

откуда дровишки? я лично прикручивал данный контроллер с 7" экраном к олвиннеру. работает сносно в обеих режимах - 1. как интернал тач, в мертвыми зонами по 4мм по периметру, 2 - как экстернал тач с правкой координат в исходниках модуля. расхождение относительно касания - справа экрана было милиметра 3, что вполне допустимо при больших контролах. так что не надо тут про калибровки :)

s.m.
03.04.2013, 00:05
с правкой координат в исходниках модуля. расхождение относительно касания - справа экрана было милиметра 3, что вполне допустимо при больших контролах. так что не надо тут про калибровки

про правку исходников под каждый экземпляр тача - это пять.
а 3 мм - это все же много, не хочется так промахиваться, а утилит калибровки нет, ибо в гугле считают, что андроид не ставят на резистивные тачи, везде одни емкостные стоят, а производители резистивных тачей застряли в каменном веке и для них
новее винЦЕ ничего нет.

VVi3ard
03.04.2013, 18:11
На самом деле я вроде как ничего нового тут не придумал, просто собрал в кучу разрозненную информацию и заставил работать. Прежде чем что-то писать, довести бы до ума. Хотелось бы улучшить качество аналого-цифрового преобразования и заставить его работать еще и под виндой нормально. Только после этого труд можно будет считать полноценным.

На хабре много талантливых инженеров, может кто и советом поможет, можно будет и вторую статью написать.

Михаил Михайлов
26.05.2013, 16:41
День добрый!
С год назад воткнул в машину монитор Лилипут - 8" и хотел замутить КАРПИСИ на виндозе. Однако сейчас склоняюсь к мнению, что Андроид вполне сносное решение. Были приобретены MINIX NEO X5 (http://4pda.ru/forum/index.php?showtopic=400345). Вещь неплохая, но при подключении резистивного тача монитора(он оформлен в USB) определяется подключенная мышка и её приходиться возить по всему экрану с минимальной вероятностью попасть туда куда нужно.
Есть ли решение для реализации работы данного тача?

macau
26.05.2013, 17:24
это где-то переключается в самом ондроеде. но к сожалению, не помню где

Михаил Михайлов
26.05.2013, 20:31
это где-то переключается в самом ондроеде. но к сожалению, не помню где

Т..е. как я понимаю, контроллер там уже есть, вопрос как заставить его работать правильно? Или же как вариант при невозможности заставить работать контроллер как надо, придётся его исключать и что-то ваять самопальное

macau
26.05.2013, 22:25
в смысле что мышку можно настроить как тач и наоборот

Михаил Михайлов
26.05.2013, 23:48
в смысле что мышку можно настроить как тач и наоборот

Не совсем понял! На данный момент тач определяется как мфышь. Есть указатель на дисплее, но этот указатель приходится тянуть пальцем до иконки, что далеко не всегда получается, и потом надо ещё умудриться сделать клик-это совсем сложно. Для моих целей такой способ вообще никак, да и наверное никому такая мышь не по нраву будет. Задача обеспечить именно тач-тыкнул в иконку-запустилось.

macau
27.05.2013, 00:16
правильно. есть какой-то конфиг, где это поведение прописано

Михаил Михайлов
27.05.2013, 01:06
правильно. есть какой-то конфиг, где это поведение прописано

Осталось только узнать где и что прописать!!!!!!

AngelOfGrief
27.05.2013, 01:14
Разработка zyxel812 видится в системе НЕ как мышь, в этом и её ценность. Всё в Андроиде работает замечательно (у меня), в том числе длинное нажатие, перелистывание, перетягивание итд итп, курсор мыши не появляется.

Насчёт утилиты калибровки под Андроид - можно сделать проще: достаточно картинки gif с точками калибровки. Я могу для калибровки подключить девайс к винде, но не могу вывести с неё изображение. Калибровка у меня удалась с нескольких раз, проверял в проге для рисования.

Михаил Михайлов
27.05.2013, 10:51
Разработка zyxel812 видится в системе НЕ как мышь, в этом и её ценность.
Проект я проштудировал. Для его реализации нужно хотя бы немного знаний и времени. Времени как раз то и нет.
Если есть готовое решение для моей задачи, просьба ткнуть носом
Полемика по возможности конфигурирования Хид устройства как тач в теме была. Было даже заявлено +-3 мм точности. Это вполне устроит т.к. видимо будет ставиться какой нибудь скин под машину с крупными значками.
Но тема поднятая RipZ
откуда дровишки? я лично прикручивал данный контроллер с 7" экраном к олвиннеру. работает сносно в обеих режимах - 1. как интернал тач, в мертвыми зонами по 4мм по периметру, 2 - как экстернал тач с правкой координат в исходниках модуля. расхождение относительно касания - справа экрана было милиметра 3, что вполне допустимо при больших контролах. так что не надо тут про калибровки
так и не была развита. А 4 мм мёртвой зоны как раз и нужны, т.к. монитор 8" и экран немного заходит внуть переходной рамки, а тапнуть вплоную к рамке нереально(дисплей в прилично углублён).

AngelOfGrief
27.05.2013, 11:22
Проект я проштудировал. Для его реализации нужно хотя бы немного знаний и времени. Времени как раз то и нет.

Там не больше времени нужно чем при покупке готового контроллера. Добавляется припаять разъём тачскрина (я писал, что нашёл такой в старом DVD ROM), и прошить процессор. Почитайте оригинальный топик, я там всё это описывал.

Михаил Михайлов
27.05.2013, 18:52
и прошить процессор. Внимательно изучу. Но возможно кто-то ещё подскажет что и как сделать?

ssssmileeee
12.01.2016, 16:23
поддержка данного тача, он называется eGalax - в модуле usbtouchscreen.ko
Подскажите, как завести такой тач-контроллер на андроиде?
Где взять этот модуль, или он есть и его нужно править?