Всем привет!
Я автолюбитель, в автомобиле (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), тем самым определив разрешение мыши на Андроид (разрешение мыши андроид и винды отличаются)
Рис 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);
}
}
Рис 2. Черная сетка - координаты резистивника, красная - оптики.
Код преобразования вышел огромный, выкладывать сюда не буду))) Но выложу сам скетч. Эмуляцию оптики еще не проверил, жду деталь с алиэкспресс, переходник видео с RGBS на VGA. Автомобиль отправляет картинку по RGB но с не с H-Sync и V-Sync, а по C-Sync, т.е. вертикалка + горизонталка.
Из минусов - нет свайпа вверх или вниз. Меню листать нет возможности. Я не смог написать код, чтоб была возможность листать меню. Думал с помощью команды mouse.move (0, 0, 100), но не вышло. Так что жду ваши предложения)))
Я автолюбитель, в автомобиле (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), тем самым определив разрешение мыши на Андроид (разрешение мыши андроид и винды отличаются)
Рис 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);
}
}
Рис 2. Черная сетка - координаты резистивника, красная - оптики.
Код преобразования вышел огромный, выкладывать сюда не буду))) Но выложу сам скетч. Эмуляцию оптики еще не проверил, жду деталь с алиэкспресс, переходник видео с RGBS на VGA. Автомобиль отправляет картинку по RGB но с не с H-Sync и V-Sync, а по C-Sync, т.е. вертикалка + горизонталка.
Из минусов - нет свайпа вверх или вниз. Меню листать нет возможности. Я не смог написать код, чтоб была возможность листать меню. Думал с помощью команды mouse.move (0, 0, 100), но не вышло. Так что жду ваши предложения)))
Вложения
-
14.7 KB Просмотры: 6