Просмотр полной версии : Собственный контроллер резистивного сенсорного экрана, совместимый с 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 я уже научился делать и прикинутся для Андроида мышкой не составит труда. Погуглив еще раз, действительно нашел пару примеров, как подключить резистивный тач к микроконтроллеру.
Начал я "воять". Всё получается, координаты касания к экрану определять научился, даже написал простую калибровочную утилиту. Мышкой прикидываться научился, курсор по экрану винды уже бегает примерно там, где я вожу пальцем. Настал час Х - подключение к Андроиду. Облом, не работает. Подключаю к винде - работает. Погуглив еще немножко, выяснилось, что Андроид не поддерживает мышки, которые передают абсолютные координаты, он умеет работать с мышами, которые передают движения. Вычислять, какие движения нужно передать, чтоб курсор попал в точку х,у кажется мне слишком сложными. В общем, я временно в тупике. Нужны идеи. От алгоритмов вычисления движений для перемещения курсора из точки А в точку Б, до других готовых способов подружить Андроид с резистивным тачем.
А если взять контроллер такой мышки и на его входы подавать абсолютные координаты?
Нужны идеи. От алгоритмов вычисления движений для перемещения курсора из точки А в точку Б.
А какие тут могут быть идеи?
Запоминать последнюю точку и вычислять относительно нее dx и dy для новой точки.
http://www.youtube.com/watch?v=RXJUcBbT19g
Через какое-то время после таких вычислений будет накапливаться погрешность между реальным касанием и тем, что навычисляли. Необходимо обнулять погрешность.
а я все никак не могу понять почему одни мышки работают в андроиде, а вторые нет
а если подключить через блютуз? это конечно через ж.. но может помочь
zyxel812
28.03.2013, 00:51
А если взять контроллер такой мышки и на его входы подавать абсолютные координаты?
Поясните
А какие тут могут быть идеи?
Запоминать последнюю точку и вычислять относительно нее dx и dy для новой точки.
http://www.youtube.com/watch?v=RXJUcBbT19g
Через какое-то время после таких вычислений будет накапливаться погрешность между реальным касанием и тем, что навычисляли. Необходимо обнулять погрешность.
Это ваш проект на видео? Так и сделано? Описание где-нибудь есть?
а если подключить через блютуз? это конечно через ж.. но может помочь
Суть-то та же, просто порт как бы другой.
Виноват, упустил из виду, что оптика мыши и процессор обработки смещены в одном корпусе, поэтому подсунуть свои данные не получится
Это ваш проект на видео? Так и сделано? Описание где-нибудь есть?
Проектом это назвать сложно, так - эксперименты для поиска замены треснувшего родного емкостного тача. Принцип работы как упоминал выше.
Описания нет - было реализовано на atmega8 + v-usb.
zyxel812
28.03.2013, 13:06
Проектом это назвать сложно, так - эксперименты для поиска замены треснувшего родного емкостного тача. Принцип работы как упоминал выше.
Описания нет - было реализовано на atmega8 + v-usb.
Если не трудно, расскажи пожалуйста об особенностях с которыми тебе пришлось столкнуться. Это, возможно, сэкономит мне кучу времени. Первые эксперименты, которые я сейчас сделал, не особо удачны. Для устранения ошибки, после отпускания экрана, перевожу курсор в верхний левый угол и при следующем касании отталкиваюсь от этой позиции. Однако, при касании курсор у меня перемещается на много дальше чем нужно, но при дальнейшем движении двигается вроде на правильные расстояния. В общем, проведя еще кучу экспериментов, думаю приду к правильному решению, но хотелось бы сэкономить время.
zyxel812
28.03.2013, 13:30
Выяснилось, что передача смещения в 100 вызывает перемещение курсора примерно на 250 точек на экране. Пока не ясно, коэффициент 2,5 для всех компьютеров одинаков или для каждого он свой и зависит от каких-то настроек.
Ага, стало ясно, коэффициент зависит от настройки скорости перемещения курсора мыши в винде. Галочка "Включить повышенную точность установки указателя мыши" уменьшает первое движение мишкой. В Андроиде вроде нет таких настроек. Буду вычислять коэффициент на нем.
На моем андроиде, коэффициент 2. Андроид с usb у меня один, проверить одинаковость на разных устройствах пока не могу. Зависит ли коэффициент от разрешения экрана?
Суть-то та же, просто порт как бы другой.
я могу ошибаться, но может быть через блютуз будут поддерживаться мыши с абсолютными координатами, что сведет задачу к написанию калибровочной утилиты
zyxel812
28.03.2013, 15:52
я могу ошибаться, но может быть через блютуз будут поддерживаться мыши с абсолютными координатами, что сведет задачу к написанию калибровочной утилиты
Затратно и хлопотно делать bluetooth hid device, тем более что ваше предположение не подтверждено. Если бы точно знать...
А у Андроида курсор не возвращается в верхний левый угол. Такое ощущение, что Андроид попытку сместить курсор за пределы экрана просто игнорирует, а Винда перемещает на максимально возможное расстояние, т.е. к краю экрана.
zyxel812
28.03.2013, 15:58
Еще две мысли:
1) Знать бы протокол, по которому Андроид общается с мультитач контроллерами, чтобы "прикинуться" таковым.
2) Может есть программист под Андроид, который смог бы написать службу, которая бы считывала координаты с виртуального COM-порта и программным образом двигала и кликала мышкой, если такое возможно.
Возможно стоит отказаться от эмуляции мыши и использовать другой класс устройства (touch screen device вместо pointer device):
http://source.android.com/tech/input/touch-devices.html
возможно, нужно покурить здесь 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;
}
По вашему вопросу не подскажу, но вот набрел на похожую разработку:
https://www.sparkfun.com/tutorials/139
В ней есть алгоритм пересчета координат, возможно вам поможет.
zyxel812
28.03.2013, 18:15
По вашему вопросу не подскажу, но вот набрел на похожую разработку:
https://www.sparkfun.com/tutorials/139
В ней есть алгоритм пересчета координат, возможно вам поможет.
Они используют Mouse Class Device с передачей абсолютных координат, которые не поддерживаются Андроидом. Я тот же так изначально сделал, в Винде всё работало, в Андроиде нет.
а если попробовать дизассемблить прогу, которая идет вместе пионером для той же задачи, может там подсказка будет...
zyxel812
28.03.2013, 18:27
Когда учился, баловался такими вещами, это вообще жесть.
Я чувствую, решение где-то уже близко. Копать в сторону Touch Digitizer мне кажется правильным. Выше давали ссылку, где было заявлено, что Андроид поддерживает такой класс устройств. Мне осталось найти как правильно описать такое устройство, чтоб Винда и Андроид восприняли мою поделку именно как Touch Digitizer. Я пока не особо разбираюсь в программировании USB, предыдущие мои изделия были основаны на готовых примерах из LUFA. Готового примера для Digitizer нет, сижу разбираюсь в документации.
Я сейчас занят сильно, нет времени гуглить, обрати внимание:
по ссылке http://source.android.com/tech/input/touch-devices.html в конце есть ссылки:
Linux multi-touch protocol
ENAC list of available multitouch devices on Linux
Мне все таки кажется что там тоже может быть полезная информация.
Вот еще масса информации: 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 было сэкономлено уйма времени.
Вот и результат: http://www.pccar.ru/showthread.php?t=18943
Отдельное спасибо VVi3ard, благодаря его ссылке на touch screen class device было сэкономлено уйма времени.
поздравляю!
если не будет секретом принцип работы калибровочной утилиты - могу написать такую под андроид - решение будет законченным (непонятно сейчас, как будет виден калибровочный порт под андроидом)
если не будет секретом принцип работы калибровочной утилиты - могу написать такую под андроид - решение будет законченным (непонятно сейчас, как будет виден калибровочный порт под андроидом)
Описание алгоритма для калибровки. Минимальное кол-во точек для калибровки - 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 бит) отклонение в параллельности сенсорной панели и экрана не заметно. Т.е., принимаем как константу, что сенсорная панель параллельна экрану. И, так как мы не собираемся компенсировать поворот сенсорной панели относительно экрана, достаточно двух точек калибровки.
Вот и результат: http://www.pccar.ru/showthread.php?t=18943
Отдельное спасибо VVi3ard, благодаря его ссылке на touch screen class device было сэкономлено уйма времени.
Спасибо за упоминание моего ника :) Не уверен что я достоин но спасибо.
Не хотите написать свою статью на HABR? Я думаю вы в процессе разработки убедились что в рунете информации по данной теме нет, и ваша статья на хабре многим бы помогла. Плюс возможно там найдется 1-2 человека которые смогут помочь улучшить вашу разработку.
Ведь для многих CARPC шников вопрос подключения штатного тача весьма актуален.
а разве такой (http://www.aliexpress.com/item/4-wire-Resistive-USB-touch-screen-panel-controller-touch-panel-controller/547668684.html) контроллер не работает в ондроеде?
а разве такой (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). В комплекте куча драйверов и для Виндов и для Линукс и даже для Дос и Мак, а вот для Андроид ничего нет.
а подключать его не пробовали? оно по идее тоже как hid должно определяться?
zyxel812
30.03.2013, 23:54
а подключать его не пробовали? оно по идее тоже как hid должно определяться?
Пробовал конечно, не работает. Оно и в Винде без драйверов не работает. Без драйверов - неизвестное устройство.
В комплекте куча драйверов и для Виндов и для Линукс и даже для Дос и Мак, а вот для Андроид ничего нет.
поддержка данного тача, он называется eGalax - в модуле usbtouchscreen.ko
это уже другой разговор. искаропки можно запустить.
поддержка данного тача, он называется eGalax - в модуле usbtouchscreen.ko
забыли мааааааааааленькую вещь - нет в природе утилиты калибровки под Андроид (ИМХО) - без нее использовать нереально - нажатия отображаются не там где надо.
забыли мааааааааааленькую вещь - нет в природе утилиты калибровки под Андроид (ИМХО) - без нее использовать нереально - нажатия отображаются не там где надо.
откуда дровишки? я лично прикручивал данный контроллер с 7" экраном к олвиннеру. работает сносно в обеих режимах - 1. как интернал тач, в мертвыми зонами по 4мм по периметру, 2 - как экстернал тач с правкой координат в исходниках модуля. расхождение относительно касания - справа экрана было милиметра 3, что вполне допустимо при больших контролах. так что не надо тут про калибровки :)
с правкой координат в исходниках модуля. расхождение относительно касания - справа экрана было милиметра 3, что вполне допустимо при больших контролах. так что не надо тут про калибровки
про правку исходников под каждый экземпляр тача - это пять.
а 3 мм - это все же много, не хочется так промахиваться, а утилит калибровки нет, ибо в гугле считают, что андроид не ставят на резистивные тачи, везде одни емкостные стоят, а производители резистивных тачей застряли в каменном веке и для них
новее винЦЕ ничего нет.
На самом деле я вроде как ничего нового тут не придумал, просто собрал в кучу разрозненную информацию и заставил работать. Прежде чем что-то писать, довести бы до ума. Хотелось бы улучшить качество аналого-цифрового преобразования и заставить его работать еще и под виндой нормально. Только после этого труд можно будет считать полноценным.
На хабре много талантливых инженеров, может кто и советом поможет, можно будет и вторую статью написать.
Михаил Михайлов
26.05.2013, 16:41
День добрый!
С год назад воткнул в машину монитор Лилипут - 8" и хотел замутить КАРПИСИ на виндозе. Однако сейчас склоняюсь к мнению, что Андроид вполне сносное решение. Были приобретены MINIX NEO X5 (http://4pda.ru/forum/index.php?showtopic=400345). Вещь неплохая, но при подключении резистивного тача монитора(он оформлен в USB) определяется подключенная мышка и её приходиться возить по всему экрану с минимальной вероятностью попасть туда куда нужно.
Есть ли решение для реализации работы данного тача?
это где-то переключается в самом ондроеде. но к сожалению, не помню где
Михаил Михайлов
26.05.2013, 20:31
это где-то переключается в самом ондроеде. но к сожалению, не помню где
Т..е. как я понимаю, контроллер там уже есть, вопрос как заставить его работать правильно? Или же как вариант при невозможности заставить работать контроллер как надо, придётся его исключать и что-то ваять самопальное
в смысле что мышку можно настроить как тач и наоборот
Михаил Михайлов
26.05.2013, 23:48
в смысле что мышку можно настроить как тач и наоборот
Не совсем понял! На данный момент тач определяется как мфышь. Есть указатель на дисплее, но этот указатель приходится тянуть пальцем до иконки, что далеко не всегда получается, и потом надо ещё умудриться сделать клик-это совсем сложно. Для моих целей такой способ вообще никак, да и наверное никому такая мышь не по нраву будет. Задача обеспечить именно тач-тыкнул в иконку-запустилось.
правильно. есть какой-то конфиг, где это поведение прописано
Михаил Михайлов
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
Подскажите, как завести такой тач-контроллер на андроиде?
Где взять этот модуль, или он есть и его нужно править?
Работает на vBulletin® версия 3.8.4. Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot