Резистивное сенсорное стекло (контроллер для Android/Windows)

Almas Amirov

✩✩✩✩✩✩✩
20 Дек 2019
3
0
Всем привет!

Я автолюбитель, в автомобиле (1998 года выпуска) с завода ставится цветной сенсорный монитор, который показывает карты навигации, расход, климат контроль и в принципе все. Болезнь мониторов этих годов в том, что он вместо картинки начинает показывать тупо белый экран. Многие ставят китайские пионеры и иные аналоги 2дин, но я любитель заводского вида. Но с современными кишками. Поэтому от штатного монитора выкинул почти все кишки, установил TFT матрицу 7" с алиэкспресс, помимо штатной картинки вывел изображение с Android TV Box, но теперь встал вопрос с сенсором. Сенсор довольно примитивный, сверху и сбоку стоят по 13шт ИК излучателей, напротив них по 13шт фотоприемников. Головное устройство (далее ГУ) с каждого фотоприемника получает сигнал (1), т.е. в ГУ идет 26 импульсов. Когда пальцем нажимаем на экран, мы пальцем препятствуем прохождению ИК лучам и фоторезистора (снизу и сбоку) выдает 0, т.е. в ГУ идет 24 импулсьса, и по отсутсвующему импульсу ГУ определяет координаты. Т.к. от заводского сенсора нам придется избавиться, стоит задача установить сенсорное стекло, чтобы управлял Android-ом и имитировал работу штатного оптического сенсора.

Выбор пал на резистивник по причине доступности кода, нашел на сайте https://wiki.iarduino.ru/page/rabota-s-touchscreen/ . Но здесь описан способ считывания координатов с резистивника. Поэтому я пошел дальше: получив координаты, я преобразовал их в разрешение дисплея, но столкнулся с проблемой, ведь резистивник у меня имитирует мышь, поэтому пришлось преобразовать в разрешение мыши. Я нарисовал калибровочну сетку, на Arduino дал команду mouse.move (100, 100), тем самым определив разрешение мыши на Андроид (разрешение мыши андроид и винды отличаются)Снимок.JPG
Рис 1. Калибровочная сетка. Слева вверху указан квадрат 100х100

Получив квадрат 100х100 пикселей выясняем разрешение нашей мышки на Андроиде равна 320х180. Но вот беда, библиотека мыши ограничивает нас char, которое имеет значение -127 .... 127. Это значит мышку отправить гулять мы можем в этих пределах. Поэтому я составил формулу:

x0 = p.x / 127;
у0 = p.у / 127;

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

for (int i = 0; i < x0; i++) { // двигать курсор по оси Х "х0" раз
Mouse.move (127, 0);
}
for (int i = 0; i < y0; i++) { // двигать курсор по оси У "у0" раз
Mouse.move (0, 127);
}

Ну остается хвостик пикселей:

x = p.x - x0 * 127; // высчитываем хвост пикселей
y = p.y - y0 * 127;

И перемещаем, затем кликаем:

Mouse.move (x, y); // перемещаем на оставшийся хвост пиксели
Mouse.click ();

Получаем резистивное сенсорное стекло для управления Андроидом, работает хорошо. Теперь надо подружить резистивник с ГУ, т.к. оптику выкидываем. ГУ шлет оптике сигналы, для синхронизации. В определенный момент, который повторяется 1 раз за цикл, оптика видит синхронизацию и выдает 26 импульсов. Синхронизацию описал так:

boolean c1 = digitalRead(ch1);
boolean c2 = digitalRead(ch2);
boolean c3 = digitalRead(ch3);
boolean c4 = digitalRead(ch4);
boolean c5 = digitalRead(ch5);
boolean c6 = digitalRead(ch6);

if (c1 == HIGH && c2 == LOW && c3 == LOW && c4 == LOW && c5 == LOW && c6 == HIGH) { //момент синхронизации

и выдаем пачку с импульсами, но преобразовываем координаты резистивника в оптику

for (int i = 1; i < 27; i++) {
if (i != y1 && i != x1 ) {
digitalWrite(ch0, HIGH);
delay(1);
digitalWrite(ch0, LOW);
delay(1);
}
else
{
delay(1);
}
}
Снимок1.JPG
Рис 2. Черная сетка - координаты резистивника, красная - оптики.

Код преобразования вышел огромный, выкладывать сюда не буду))) Но выложу сам скетч. Эмуляцию оптики еще не проверил, жду деталь с алиэкспресс, переходник видео с RGBS на VGA. Автомобиль отправляет картинку по RGB но с не с H-Sync и V-Sync, а по C-Sync, т.е. вертикалка + горизонталка.

Из минусов - нет свайпа вверх или вниз. Меню листать нет возможности. Я не смог написать код, чтоб была возможность листать меню. Думал с помощью команды mouse.move (0, 0, 100), но не вышло. Так что жду ваши предложения)))
 

Вложения

kostyamat

★★★★★★✩
29 Окт 2019
1,610
775
И Вам не хворать. Вопрос: почему бы вам не купить к резистивному тачю сразу контроллер, с USB-выходом? Они есть на Али (если ещё с производства не сняли). Он определяется большинством андроид аппаратов. А так же отлично работает в Виндовз.

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

Almas Amirov

✩✩✩✩✩✩✩
20 Дек 2019
3
0
И Вам не хворать. Вопрос: почему бы вам не купить к резистивному тачю сразу контроллер, с USB-выходом? Они есть на Али (если ещё с производства не сняли). Он определяется большинством андроид аппаратов. А так же отлично работает в Виндовз.

Если уж собрались все сами, то свайп вверх/вниз можно эмулировать с помощью щелчков виртуального энкодера, виртуальной мышки. Некоторые библиотеки HID для Ардуино такое поддерживают. Да и движение нажатой мышкой, как правило, тоже. Похоже вы не со всеми методами библиотеки ознакомились, или выбрали не ту.
Дело в том, что в прошивку готового контроллера с USB мне еще надо добавить код эмуляции штатного сенсора. А кода контроллера в открытом доступе нет. Поэтому пришлось юзать имеющийся открытый код резистивника. А так бы емкостной использовал бы, андроидом управляет без проблем. Но ведь штатный сенсор тоже нужен, как в машине печкой управлять?)))

А можно по-подробней про виртуальный энкодер? Движение мышкой я планировал с помощью mouse.press, затем mouse.move и mouse.releaseAll, а после этого mouse.click. Но в случае когда долго нажимаем по одной точке, курсор начинает бегать по экрану и отрабатывать mouse.move и все остальное
 

kostyamat

★★★★★★✩
29 Окт 2019
1,610
775
https://github.com/NicoHood/HID
Вот эта библиотека как бы поддерживает типа вращение энкодера (weel), но как это реализовать, лично я не разбирался.
Мне кажется, что вы делаете концептуальную ошибку. Вы бы задачу более конкретно описали. Во первых, это поможет прежде всего вам (у меня всегда так, я когда падаю в ступор, пробую описать задачу простым языком, но максимально конкретизировано, как бы для несведущего человека. Решение приходит в голову, пока это делаешь), второе - это даст возможность вам помочь.

К примеру, не совсем ясно - светодиодный сенсор у вас стоит с завода, типа родной? И вы хотите его сохранить, что бы работали штатные функции авто?
Второе - зачем у вас контроллер резистивного тача эмулирует мышь? Ну ещё бы тачпад, но почему мишь?

Кстати, может это вам поможет?
http://pccar.ru/showthread.php?t=18943
 
Последнее редактирование:

Almas Amirov

✩✩✩✩✩✩✩
20 Дек 2019
3
0
https://github.com/NicoHood/HID
Вот эта библиотека как бы поддерживает типа вращение энкодера (weel), но как это реализовать, лично я не разбирался.
Мне кажется, что вы делаете концептуальную ошибку. Вы бы задачу более конкретно описали. Во первых, это поможет прежде всего вам (у меня всегда так, я когда падаю в ступор, пробую описать задачу простым языком, но максимально конкретизировано, как бы для несведущего человека. Решение приходит в голову, пока это делаешь), второе - это даст возможность вам помочь.

К примеру, не совсем ясно - светодиодный сенсор у вас стоит с завода, типа родной? И вы хотите его сохранить, что бы работали штатные функции авто?
Второе - зачем у вас контроллер резистивного тача эмулирует мышь? Ну ещё бы тачпад, но почему мишь?

Кстати, может это вам поможет?
http://pccar.ru/showthread.php?t=18943
ДАНО:
Штатное головное устройство, цветной экран с сенсорным управлением. Климат контроль производится через него. Сенсор - на оси Х иУ расположены инфракрасные (ИК) излучатели, а напротив них фотоприемники. Палец прерывает луч по осям Х и У, по отсутствующим сигналам с фотоприемника голова видит координаты нажатия.

ЗАДАЧА:
Оставить родной заводской вид. На цветной экран подается Андроид и чтоб им управлять устанавливаю Резистивный тачскрин. Заводской ИК удаляется. Резистивный тачскрин Андроидом управляет удовлетворительно (отсутствуют свайпы и прокрутки страниц). Надо заставить Резистивник отправлять в ГУ координаты в том формате, что и заводской.

Ту ссылку видел давно, еще в прошлом году. Оттуда я брал контроллеры на емкостный тачскрин. Там есть просто прошивка, а мне надо код, чтоб добавить алгоритм эмуляции штатного ИК сенсора
 

kostyamat

★★★★★★✩
29 Окт 2019
1,610
775
Ту ссылку видел давно, еще в прошлом году. Оттуда я брал контроллеры на емкостный тачскрин. Там есть просто прошивка, а мне надо код,
Как написано: hex, прошивальщих и ИСХОДНИК теперь в одном архиве. Не вижу смысла не верить.