![]() |
Собственный контроллер резистивного сенсорного экрана, совместимый с Android
Собрался я тут на досуге распотрошить свой штатный монитор и внедрить в него pccar на базе odroid-x2. Но это отдельная история, сейчас о мониторе, точнее о его сенсорном экране.
Размер матрицы у него 6.5", не то чтобы большая редкость, но найти удалось только с резистивным тачскрином. Много гуглив, стало ясно, что "завести" такой тачcкрин под Андроидом хотят все, но не кому это нормально не удалось. Почесав немного репу, посмотрев тут что такое резистивный экран и как он работает, я понял: "а ведь его удастся контролировать при помощи микроконтроллера avr!", тем более, решая предыдущую проблему связи с кнопками на руле, HID Class Device я уже научился делать и прикинутся для Андроида мышкой не составит труда. Погуглив еще раз, действительно нашел пару примеров, как подключить резистивный тач к микроконтроллеру. Начал я "воять". Всё получается, координаты касания к экрану определять научился, даже написал простую калибровочную утилиту. Мышкой прикидываться научился, курсор по экрану винды уже бегает примерно там, где я вожу пальцем. Настал час Х - подключение к Андроиду. Облом, не работает. Подключаю к винде - работает. Погуглив еще немножко, выяснилось, что Андроид не поддерживает мышки, которые передают абсолютные координаты, он умеет работать с мышами, которые передают движения. Вычислять, какие движения нужно передать, чтоб курсор попал в точку х,у кажется мне слишком сложными. В общем, я временно в тупике. Нужны идеи. От алгоритмов вычисления движений для перемещения курсора из точки А в точку Б, до других готовых способов подружить Андроид с резистивным тачем. |
А если взять контроллер такой мышки и на его входы подавать абсолютные координаты?
|
Цитата:
Запоминать последнюю точку и вычислять относительно нее dx и dy для новой точки. http://www.youtube.com/watch?v=RXJUcBbT19g Через какое-то время после таких вычислений будет накапливаться погрешность между реальным касанием и тем, что навычисляли. Необходимо обнулять погрешность. |
а я все никак не могу понять почему одни мышки работают в андроиде, а вторые нет
|
а если подключить через блютуз? это конечно через ж.. но может помочь
|
Цитата:
Цитата:
Цитата:
|
Виноват, упустил из виду, что оптика мыши и процессор обработки смещены в одном корпусе, поэтому подсунуть свои данные не получится
|
Цитата:
Описания нет - было реализовано на atmega8 + v-usb. |
Цитата:
|
Выяснилось, что передача смещения в 100 вызывает перемещение курсора примерно на 250 точек на экране. Пока не ясно, коэффициент 2,5 для всех компьютеров одинаков или для каждого он свой и зависит от каких-то настроек.
Ага, стало ясно, коэффициент зависит от настройки скорости перемещения курсора мыши в винде. Галочка "Включить повышенную точность установки указателя мыши" уменьшает первое движение мишкой. В Андроиде вроде нет таких настроек. Буду вычислять коэффициент на нем. На моем андроиде, коэффициент 2. Андроид с usb у меня один, проверить одинаковость на разных устройствах пока не могу. Зависит ли коэффициент от разрешения экрана? |
Цитата:
|
Цитата:
А у Андроида курсор не возвращается в верхний левый угол. Такое ощущение, что Андроид попытку сместить курсор за пределы экрана просто игнорирует, а Винда перемещает на максимально возможное расстояние, т.е. к краю экрана. |
Еще две мысли:
1) Знать бы протокол, по которому Андроид общается с мультитач контроллерами, чтобы "прикинуться" таковым. 2) Может есть программист под Андроид, который смог бы написать службу, которая бы считывала координаты с виртуального COM-порта и программным образом двигала и кликала мышкой, если такое возможно. |
Возможно стоит отказаться от эмуляции мыши и использовать другой класс устройства (touch screen device вместо pointer device):
http://source.android.com/tech/input/touch-devices.html |
возможно, нужно покурить здесь http://developer.android.com/tools/h..._concepts.html
|
Цитата:
начало вроде понятное - 16 бит каких-то данных, а вот дальше... там X и Y по 16 бит или X и Y вместе 16 бит? Потом вроде ширина и высота по 16 бит. Кто в этом разбирается, я правильно расшифровал? Код:
struct { |
По вашему вопросу не подскажу, но вот набрел на похожую разработку:
https://www.sparkfun.com/tutorials/139 В ней есть алгоритм пересчета координат, возможно вам поможет. |
Цитата:
|
а если попробовать дизассемблить прогу, которая идет вместе пионером для той же задачи, может там подсказка будет...
|
Когда учился, баловался такими вещами, это вообще жесть.
Я чувствую, решение где-то уже близко. Копать в сторону 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/libr.../gg487435.aspx http://msdn.microsoft.com/en-us/libr.../gg487437.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; //должно быть нулем. Я еще поэкспериментирую, вроде как последние три поля из дескриптора и, соответственно, отчета можно изъять. В общем, скоро будет готов контроллер резистивного тача, совместимый с Андроид! |
Вот и результат: http://www.pccar.ru/showthread.php?t=18943
Отдельное спасибо VVi3ard, благодаря его ссылке на touch screen class device было сэкономлено уйма времени. |
Цитата:
если не будет секретом принцип работы калибровочной утилиты - могу написать такую под андроид - решение будет законченным (непонятно сейчас, как будет виден калибровочный порт под андроидом) |
Вложений: 1
Цитата:
|
Цитата:
В Андроиде устройство видится как /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 - значения измерений, получаемых с АЦП. Этой информации, как мне кажется, достаточно чтобы написать калибровочную утилиту. Если остались вопросы, спрашивай. |
Цитата:
|
Цитата:
Не хотите написать свою статью на HABR? Я думаю вы в процессе разработки убедились что в рунете информации по данной теме нет, и ваша статья на хабре многим бы помогла. Плюс возможно там найдется 1-2 человека которые смогут помочь улучшить вашу разработку. Ведь для многих CARPC шников вопрос подключения штатного тача весьма актуален. |
а разве такой контроллер не работает в ондроеде?
|
Цитата:
|
Цитата:
|
Цитата:
|
а подключать его не пробовали? оно по идее тоже как hid должно определяться?
|
Цитата:
|
Цитата:
|
это уже другой разговор. искаропки можно запустить.
|
Цитата:
|
Цитата:
|
Цитата:
а 3 мм - это все же много, не хочется так промахиваться, а утилит калибровки нет, ибо в гугле считают, что андроид не ставят на резистивные тачи, везде одни емкостные стоят, а производители резистивных тачей застряли в каменном веке и для них новее винЦЕ ничего нет. |
Часовой пояс GMT +4, время: 16:16. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot