Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Raspberry Pi, Raspbian, XBMC и 7 дюймовый сенсорный экран eGalax

В последнее время я искал решение, как заставить мой 7-дюймовый сенсорный экран eGalax работать с Raspbian (Debian Wheezy) с XBMC 12 Frodo и, наконец, я получил то, что хотел.

arduino80-1.jpg

Необходимые компоненты:

  • Raspberry Pi модель B: ~30$
  • 7-дюймовый дисплей с сенсором для автомобильной камеры заднего вида с eBay (сенсорный экран подключается к одному USB порту): 80$
  • HDMI “папа-папа” (с eBay): <2 $
  • Карта памяти 4Гб SDHC class 4.
  • 12В (500 мА) Конвертер переменного тока в постоянный для питания дисплея.
  • 5В (1А) MicroUSB конвертер переменного тока в постоянный для питания PI
  • USB клавиатура

Вот то, что вам нужно сделать чтобы иметь стабильную систему с Raspberry Pi, Raspbian OS и XBMC 12 Frodo с правильно работающим (это значит с калиброванными осями и кликом только с одним нажатием/отпусканием) сенсорным экраном eGalax:

1. Скачать последний образ Raspbian отсюда и записать его на SD карту.

2. Собрать собственное ядро с поддержкой сенсорного экрана eGalax, как в этом посте (вам нужно будет только заменить kernel.img файл и /lib/modules и /lib/firmware folders на SD карте памяти).

3. Установить XBMC 12 на Raspberry Pi с помощью этой инструкции.
Примечание: После загрузки архива XBMC, скачайте этот архив и распаковать его в где угодно.
Установить патчи для XBMC файлов:
cd
patch -p1 /xbmc/input/linux/LinuxInputDevices.cpp < LinuxInputDevices_cpp.patch
patch -p1 /xbmc/input/MouseStat.cpp < MouseStat_cpp.patch
patch -p1 /xbmc/input/MouseStat.h < MouseStat_h.patch

4. Калибровка сенсорного экрана
Скопируйте папку eGalaxCalibration из архива (скачанного выше) в /usr/share/ на Raspberry Pi. Здесь у вас должен быть файл touchscreen_axes_calib. Он содержит четыре значения для калибровки осей и одно значение для инверсии осей.
Самый простой способ инверсии осей - это переключение четырех проводов на разъеме шлейфа сенсорного экрана наугад.

Вот как калибровка была сделана.

sch.png

На картинке выше мы видим, что область “рамка значений сенсорной панели (touch panel values frame)” отличается от области “рамки физических значений сенсорной панели” (зеленая область). Когда мы нажимаем на сенсор, мы движемся в зеленой области, но когда тач не откалиброван, стрелка XBMC будет находиться в другом месте.

“Рамкой физических значений сенсорной панели” является экран, начиная с (0,0) в левом верхнем углу, и заканчивая (ширина, высота) в правом нижнем углу. “Рамка значений сенсорной панели” это рамка, которая содержит все числа выдаваемые контроллером сенсора.

Мы видим, что эти рамки сильно отличается. Нашей основной целью является перекрытие “Рамкой значений сенсорной панели” “Рамки физических значений сенсорной панели”.

Для того, чтобы реализовать это, мы должны сделать три шага (третий сделан в программном обеспечение):
a. Масштабирование. Значения х и у считываются из драйвера сенсора, в порядке соответствия

0->диапазон ширины и, соответственно, 0 -> Диапазон высоты “Рамки физических значений сенсорной панели”  :
   Ширина “Рамки физических значений сенсорной панели”

calib_x_fact = ------------------------------------------------ -
   Ширина “Рамки значений сенсорной панели” 

   Высота “Рамки физических значений сенсорной панели”
calib_y_fact = ------------------------------------------------ -
   Высота   “Рамки значений сенсорной панели”

Ширина и высота "Рамок значений сенсорной панели" выходят за разрешение XBMC (у меня высота=1280 и высота=720).

Ширину и высоту "Рамок физических значений сенсорной панели" найти немного сложнее, но ничего сложно нет. В пункте 2 выше, вы калибровали сенсорный экран в XFCE. Вы получили некоторые значения, возвращаемые xinput_calibrator, что-то вроде:

Section "InputClass"
   Identifier  "calibration"
   MatchProduct    "eGalax Inc. USB TouchController"
   Option    "Calibration"    "1977 32 1893 131"
EndSection

В моем случае:
"Рамка физических значений сенсорной панели" Ширина 1977 - 32 = 1945
"
Рамка физических значений сенсорной панели" Высота 1893 - 131 = 1762

Теперь вычислим значения и поместим их в файл /usr/share/eGalaxCalibration/touchscreen_axes_calib.

b. Переместите “Рамку значений сенсорной панели” влево и вверх для соответствия “Рамкам физических значений сенсорной панели”.

Я не нашел оптимальный метод, чтобы сделать это, потому что мы не знаем точно, "где" “Рамки значений сенсорной панели” ,так что чтобы найти calib_x_d и calib_y_d вы должны сначала установить их  на ноль и затем запустить XBMC. Теперь, поставив некоторые четкие метки на экране, и соблюдайте расстояние между курсором на экране и положением указывания. Попробуйте приблизиться к отклонениям х и у (измеряется в пикселях) и поместить их в файл /usr/share/eGalaxCalibration/touchscreen_axes_calib.

с. Верните направление осей. Это сделано в программном обеспечении (в патчах).

5. Математика позади.
Формула для выполнения этих преобразований была реализована в файле
xbmc/input/linux/LinuxInputDevices.cpp
pointer.x = screen_width - value_read.x * calib_x_fact - calib_x_d;
pointer.y = screen_height - value_read.y * calib_y_fact - calib_y_d;

После того, как я успешно откалибровал сенсорный экран, я обнаружил, что один клик на сенсорном экране невозможен, только двойной. После копания в коде, я нашел, что это было вызвано действием перетаскивания, которое возникло в результате того, что предыдущее значение сенсора было далеко (более 5 пикселей) от нового нажатия. Например, в начале программы, курсор будет установлен на координаты 0,0, если пользователь пытается нажать на кнопку, на, скажем, 100,300, программа вычислит расстояние между этими двумя точками и узнает, что оно больше 5.
(100-0)x(100-0) + (300 - 0)x(300-0) больше, чем 5x5.
Всё работает при двойном клике, т.к. предыдущая точка при втором клике очень близка к первой. Это также работает для мышей, т.к. они не перескакивают, а ползут.

Я разработал алгоритм, чтобы избежать этой проблемы:
Когда пользователь нажимает на экран (х, у), значения сенсора создаются в (screen_width +1, screen_height +1 -> за пределами видимого экрана) только в первом событие чтения  (BTN_TOUCH PRESS).
После этого события, программа будет получать несколько абсолютных значений событий X и Y. Первые два события, одно для X и одно для Y, используются для установки предыдущего значения X, Y соответствующих текущему значению  X, Y. И с этого момента расстояние измеряется, и это не позволяет никаких нежелательных сопротивлений.
Палец пользователя/ указатель не будет оставаться в одной точке, потому что у сенсорного экрана отсутствует точность, так что он будет двигается на примерно 5-6 пикселей по х и у.
Я также установил дистанцию клика на 7. Вы можете изменить его, изменив значение click_confines value в xbmc/input/MouseStat.h. Первоначально он был установлен в 5, но это не очень хорошо для сенсорных экранов (я мог резко кликать своими ногтями, но со значением 7 я могу легко нажать пальцем -> действительно круто).

Оригинал статьи

Теги:

Опубликована: 09.04.2013 0 1
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (0) | Я собрал (0) | Подписаться

Статью еще никто не комментировал. Вы можете стать первым.
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
Мультиметр Mastech MS8268 USB осциллограф DSO-2090
вверх