PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Дополнительные устройства (http://pccar.ru/forumdisplay.php?f=177)
-   -   Собственный контроллер резистивного сенсорного экрана, совместимый с Android (http://pccar.ru/showthread.php?t=18930)

zyxel812 27.03.2013 22:11

Собственный контроллер резистивного сенсорного экрана, совместимый с Android
 
Собрался я тут на досуге распотрошить свой штатный монитор и внедрить в него pccar на базе odroid-x2. Но это отдельная история, сейчас о мониторе, точнее о его сенсорном экране.
Размер матрицы у него 6.5", не то чтобы большая редкость, но найти удалось только с резистивным тачскрином. Много гуглив, стало ясно, что "завести" такой тачcкрин под Андроидом хотят все, но не кому это нормально не удалось. Почесав немного репу, посмотрев тут что такое резистивный экран и как он работает, я понял: "а ведь его удастся контролировать при помощи микроконтроллера avr!", тем более, решая предыдущую проблему связи с кнопками на руле, HID Class Device я уже научился делать и прикинутся для Андроида мышкой не составит труда. Погуглив еще раз, действительно нашел пару примеров, как подключить резистивный тач к микроконтроллеру.
Начал я "воять". Всё получается, координаты касания к экрану определять научился, даже написал простую калибровочную утилиту. Мышкой прикидываться научился, курсор по экрану винды уже бегает примерно там, где я вожу пальцем. Настал час Х - подключение к Андроиду. Облом, не работает. Подключаю к винде - работает. Погуглив еще немножко, выяснилось, что Андроид не поддерживает мышки, которые передают абсолютные координаты, он умеет работать с мышами, которые передают движения. Вычислять, какие движения нужно передать, чтоб курсор попал в точку х,у кажется мне слишком сложными. В общем, я временно в тупике. Нужны идеи. От алгоритмов вычисления движений для перемещения курсора из точки А в точку Б, до других готовых способов подружить Андроид с резистивным тачем.

Gorynch 27.03.2013 22:37

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

mas_u 27.03.2013 22:55

Цитата:

Сообщение от zyxel812 (Сообщение 252818)
Нужны идеи. От алгоритмов вычисления движений для перемещения курсора из точки А в точку Б.

А какие тут могут быть идеи?
Запоминать последнюю точку и вычислять относительно нее 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

Цитата:

Сообщение от Gorynch (Сообщение 252821)
А если взять контроллер такой мышки и на его входы подавать абсолютные координаты?

Поясните

Цитата:

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

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

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

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

Цитата:

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

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

Gorynch 28.03.2013 01:05

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

mas_u 28.03.2013 01:46

Цитата:

Сообщение от zyxel812 (Сообщение 252840)


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

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

zyxel812 28.03.2013 13:06

Цитата:

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

Если не трудно, расскажи пожалуйста об особенностях с которыми тебе пришлось столкнуться. Это, возможно, сэкономит мне кучу времени. Первые эксперименты, которые я сейчас сделал, не особо удачны. Для устранения ошибки, после отпускания экрана, перевожу курсор в верхний левый угол и при следующем касании отталкиваюсь от этой позиции. Однако, при касании курсор у меня перемещается на много дальше чем нужно, но при дальнейшем движении двигается вроде на правильные расстояния. В общем, проведя еще кучу экспериментов, думаю приду к правильному решению, но хотелось бы сэкономить время.

zyxel812 28.03.2013 13:30

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

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

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

s.m. 28.03.2013 14:23

Цитата:

Сообщение от zyxel812 (Сообщение 252840)

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

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

zyxel812 28.03.2013 15:52

Цитата:

Сообщение от s.m. (Сообщение 252893)
я могу ошибаться, но может быть через блютуз будут поддерживаться мыши с абсолютными координатами, что сведет задачу к написанию калибровочной утилиты

Затратно и хлопотно делать 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/h..._concepts.html

zyxel812 28.03.2013 17:19

Цитата:

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

Нашел вот такой Report Descriptor,
начало вроде понятное - 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

Цитата:

Сообщение от VVi3ard (Сообщение 252942)
По вашему вопросу не подскажу, но вот набрел на похожую разработку:
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/libr.../gg487435.aspx
http://msdn.microsoft.com/en-us/libr.../gg487437.aspx

zyxel812 28.03.2013 21:02

Товарищи! Работает!
Как световое перо работает и на Андроиде тоже!
Вот с таким дескриптором.
Данные отчета такие:
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

Цитата:

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

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

mas_u 29.03.2013 22:10

Вложений: 1
Цитата:

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

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

zyxel812 29.03.2013 23:02

Цитата:

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

Отличная новость! Конечно не секрет.
В Андроиде устройство видится как /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

Цитата:

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

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

VVi3ard 30.03.2013 17:18

Цитата:

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

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

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

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

macau 30.03.2013 20:37

а разве такой контроллер не работает в ондроеде?

alexvtk 30.03.2013 21:18

Цитата:

Сообщение от macau (Сообщение 253279)
а разве такой контроллер не работает в ондроеде?

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

zyxel812 30.03.2013 23:10

Цитата:

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

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

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

zyxel812 30.03.2013 23:15

Цитата:

Сообщение от macau (Сообщение 253279)
а разве такой контроллер не работает в ондроеде?

Если речь идет всё таки о Андроиде, то нет, не работает. Такой контроллер был в комплекте с моим дисплеем. В комплекте куча драйверов и для Виндов и для Линукс и даже для Дос и Мак, а вот для Андроид ничего нет.

macau 30.03.2013 23:21

а подключать его не пробовали? оно по идее тоже как hid должно определяться?

zyxel812 30.03.2013 23:54

Цитата:

Сообщение от macau (Сообщение 253302)
а подключать его не пробовали? оно по идее тоже как hid должно определяться?

Пробовал конечно, не работает. Оно и в Винде без драйверов не работает. Без драйверов - неизвестное устройство.

RipZ 02.04.2013 12:12

Цитата:

Сообщение от zyxel812 (Сообщение 253300)
В комплекте куча драйверов и для Виндов и для Линукс и даже для Дос и Мак, а вот для Андроид ничего нет.

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

macau 02.04.2013 12:51

это уже другой разговор. искаропки можно запустить.

s.m. 02.04.2013 13:16

Цитата:

Сообщение от RipZ (Сообщение 253674)
поддержка данного тача, он называется eGalax - в модуле usbtouchscreen.ko

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

RipZ 02.04.2013 13:18

Цитата:

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

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

s.m. 03.04.2013 00:05

Цитата:

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


Часовой пояс GMT +4, время: 16:16.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot