Эта статья посвящена работе с резистивными TouchScreen со встроенными контроллерами функций TouchScreen.
Наличие контроллера избавляет от необходимости определять уровни напряжений используя аналоговые входы.
Аналоговые данные обрабатываются контроллером и выводятся по последовательной шине данных.
Ознакомиться с процессом получения координат касания от TouchScreen без встроенных контроллеров можно в разделе Wiki - работа с TouchScreen.
Некоторые дисплеи оснащены сенсорным экраном (TouchScreen - дословно переводится как трогать экран), который позволяет получать координаты точки прикосновения. Используя эти координаты, можно рисовать кривые или использовать их для имитации клавиатуры.
В настоящее время разработано множество сенсорных экранов, которые фиксируют прикосновение и получают координаты различными способами: резистивные, матричные, емкостные, инфракрасные, оптические, тензометрические, пьезоэлектрические, индукционные и даже ультразвуковые. Мы рассмотрим резистивные TouchScreen со встроенными контроллерами.
Общие сведения:
Резистивный TouchScreen состоит из двух прозрачных панелей. Одна панель - стеклянная (находится со стороны дисплея), вторая панель - из эластичного пластика (находится с внешней стороны, именно на неё мы и нажимаем), она выполняет роль мембраны. На внутренние поверхности обеих панелей (которые «смотрят» друг на друга) нанесён тонкий токопроводящий слой, имеющий однородное сопротивление. С противоположных сторон панелей присутствуют выводы, по два на каждую панель (см. рисунок ниже). Между панелями существует небольшой зазор заполненный микро-изоляторами (диэлектрическими микро-шариками), гарантирующими, что панели электрически не соединены. При касании мембраны, токопроводящие слои на мембране и на стекле соприкасаются друг с другом, электрически соединяясь. Сопротивление между выводами обеих панелей зависит от координат точки их соприкосновения.
Выводы X- (XM), X+ (XP), Y- (YM) и Y+ (YP) подключаются к контроллеру функций TouchScreen, в котором имеется мультиплексор (для переключения выводов) АЦП (для преобразования аналогового сигнала в цифровые значения), контроллер последовательной шины данных (для получения команд и отправки результата) и иные цифровые блоки. Контроллер возвращает не координаты касания, а «сырые» данные АЦП.
Получение координат касания:
Для получения данных АЦП пропорциональных координате касания по оси X, контроллеру подаётся команда: установить на выводе XP положительный потенциал, на выводе XM отрицательный потенциал, а аналоговый сигнал с вывода YP подать на АЦП, значения которого вернуть по последовательной шине данных.
Для получения данных АЦП пропорциональных координате касания по оси Y, контроллеру подаётся команда: установить на выводе YP положительный потенциал, на выводе YM отрицательный потенциал, а аналоговый сигнал с вывода XP подать на АЦП, значения которого вернуть по последовательной шине данных.
Вам не нужно знать команды контроллера, формировать запросы и обрабатывать ответы, преобразуя «сырые» данные в координаты касания. Со всеми этими задачами успешно справляется библиотека URTouch, которая является дополнением к библиотеке UTFT и не будет работать без неё. В папке examples\Arduino библиотеки URTouch имеется несколько примеров и калибровочный скетч с которого и нужно начать работу.
Калибровка:
Мы уже выяснили, что контроллер возвращает не координаты касания, а «сырые» данные АЦП. Благодаря этому одни и те-же контроллеры могут работать с различными дисплеями вне зависимости от их геометрических размеров и сопротивлений TouchScreen панелей. Калибровочный скетч нужен для того, что бы «научить» библиотеку преобразовывать «сырые» данные контроллера в координаты точки касания, которые будут совпадать с координатами пикселей дисплея. Калибровку для каждого дисплея достаточно выполнить только один раз.
Подключите выводы дисплея и TouchScreen к Arduino, и откройте калибровочный скетч «URTouch_Calibration» из папки examples\Arduino\URTouch_Calibration библиотеки URTouch.
Укажите в скетче, какие именно выводы Arduino Вы задействовали для подключения дисплея и TouchScreen.
Выводы указываются при объявлении объектов библиотек:
UTFT myGLCD( ТИП_ДИСПЛЕЯ, SDI/MOSI, SCK, CS, RESET, DC/RS ); // объект для работы с дисплеем, с указанием выводов дисплея: SDI/MOSI, SCK, CS, RESET, DC/RS URTouch myTouch( T_CLK, T_CS, T_DIN, T_OUT, T_IRQ ); // объект для работы с TouchScreen, с указанием выводов TouchScreen: T_CLK, T_CS, T_DIN, T_OUT, T_IRQ
В скетче имеется строка определяющая константу TOUCH_ORIENTATION которая может принимать одно из двух значений: PORTRAIT или LANDSCAPE. Это значение определяет ориентацию осей TouchScreen (портретная - вертикальная или ландшафтная - горизонтальная):
#define TOUCH_ORIENTATION PORTRAIT // Портретная (вертикальная) ориентация
Если требуется, измените её значение на LANDSCAPE. Информацию о соответствии этого значения используемому типу дисплея, можно найти в файле URTouch_Supported_display_modules.pdf из папки Documentation библиотеки URTouch.
После того как Все изменения внесены в скетч, загрузите его в Arduino, на дисплее появится текст:
ИНСТРУКЦИЯ: Используйте стилус или любой подобный ему предмет для касания центров перекрестий. Вам нужно будет удерживать нажатие в центре перекрестия пока оно ярко выделено. Далее повторить эти действия для всех подсвеченных перекрестий. После завершения калибровки отобразится страница с пояснением дальнейших действий. НЕ используйте палец для касаний перекрестий, иначе результат калибровки будет неточным. Коснитесь экрана для продолжения... |
Для калибровки потребуется стилус, если у Вас его нет, то подойдёт любой предмет с узким, НО НЕ ОСТРЫМ кончиком, чтоб не повредить внешний эластичный слой резистивного TouchScreen. Коснитесь экрана для начала калибровки.
На экране появятся 8 перекрестий, одно из которых (в левом верхнем углу) будет подсвечено, именно центра этого перекрестия и нужно коснуться, удерживая стилус пока с перекрестия не снимется подсветка, после чего подсветится следующее перекрестие. Во время калибровки в центре экрана (на красном фоне) будут появляться подсказки: PRESS - нажмите, HOLD - удерживайте, RELEASE - отпустите. |
Как только Вы отпустите последнее (в правом нижнем углу) перекрестие, на дисплее появится текст:
КАЛИБРОВКА ЗАВЕРШЕНА Для вступления в силу новых настроек, отредактируйте файл URTouchCD.h Измените следующие значения, находящиеся в файле сразу под комментарием. CAL_X 0x00000000UL CAL_Y 0x00000000UL CAL_S 0x00000000UL |
Перепишите значения констант CAL_X, CAL_Y и CAL_S отображаемые на Вашем дисплее в файл URTouchCD.h который находится в корневой папке библиотеки URTouch. На этом калибровка считается завершённой.
Если Вы планируете использовать библиотеку URTouch в разных проектах с разными типами дисплеев, то скопируйте файл URTouchCD.h в папки тех проектов которые её используют, удалив этот файл из папки библиотеки URTouch. В каждом проекте использующим библиотеку URTouch должен находиться файл URTouchCD.h, с результатами калибровки для используемого в проекте дисплея.
Примеры:
После завершения калибровки проверьте работу TouchScreen загрузив примеры из папки examples\Arduino библиотеки URTouch.
В папке имеется три коротких примера демонстрирующих то, как можно использовать функции библиотеки:
- URTouch_ButtonTest - прорисовка кнопок с выводом информации о нажатой кнопке.
- URTouch_QuickDraw - рисование кривых тонкой линией белым цветом.
- URTouch_QuickPaint - рисование кривых с возможностью выбора цвета, толщины кисти и стиранием рисунка.
Не забудьте указать в скетчах примеров номера выводов, которые Вы использовали для подключения дисплея и TouchScreen.
Описание функций библиотеки:
Библиотека позволяет работать с контроллерами функций TouchScreen, она является дополнением к библиотеке UTFT и не будет работать без неё. Ранее библиотека URTouch назвалась Utouch (без буквы R) но была переименована из-за проблем с торговой маркой.
Подключение библиотеки:
#include <UTFT.h> // Подключаем библиотеку для вывода данных на дисплей. #include <URTouch.h> // Подключаем библиотеку для работы с TouchScreen. // Создаём объекты для работы с функциями и методами библиотек: UTFT myGLCD ( ТИП_ДИСПЛЕЯ , ВЫВОД SDI/MOSI , ВЫВОД SCK , ВЫВОД CS , ВЫВОД RESET , [ВЫВОД DC/RS]); // Создаём объект библиотеки UTFT. URTouch myTouch ( ВЫВОД T_CLK , ВЫВОД T_CS , ВЫВОД T_DIN , ВЫВОД T_OUT , ВЫВОД T_IRQ ); // Создаём объект библиотеки URTouch.
Функция InitTouch();
- Назначение: Инициализация работы с TouchScreen.
- Синтаксис: InitTouch( [ПОЛОЖЕНИЕ] );
- Параметры:
- ПОЛОЖЕНИЕ - может принимать одно из двух значений: PORTRAIT или LANDSCAPE.
Это значение определяет ориентацию осей TouchScreen (портретная - вертикальная или ландшафтная - горизонтальная).
Значение по умолчанию - LANDSCAPE.
- ПОЛОЖЕНИЕ - может принимать одно из двух значений: PORTRAIT или LANDSCAPE.
- Возвращаемые значения: Нет
- Примечание: Функция вызывается после создания объекта библиотеки UTFT но до обращения к любой функции объекта библиотеки URTouch.
- Пример:
myTouch.InitTouch(PORTRAIT); // Инициируем работу с TouchScreen указывая, что он вертикально ориентирован.
Функция setPrecision();
- Назначение: Указание точности определения координат касания.
- Синтаксис: setPrecision( [ТОЧНОСТЬ] );
- Параметры:
- ТОЧНОСТЬ - может принимать одно из четырёх значений: PREC_LOW, PREC_MEDIUM, PREC_HI или PREC_EXTREME.
PREC_LOW-низкая, PREC_MEDIUM-средняя, PREC_HI-высокая, PREC_EXTREME-максимальная.
- ТОЧНОСТЬ - может принимать одно из четырёх значений: PREC_LOW, PREC_MEDIUM, PREC_HI или PREC_EXTREME.
- Возвращаемые значения: Нет.
- Примечание: Чем выше точность определения координат, тем дольше они определяются.
- Пример:
myTouch.setPrecision(PREC_HI); // Устанавливаем высокую точность определения координат касания
Функция dataAvailable();
- Назначение: Проверка наличия касания.
- Синтаксис: dataAvailable();
- Параметры: Нет
- Возвращаемые значения: true (есть касание) или false (нет касания).
- Пример:
bool i = myTouch.dataAvailable(); // Возвращаем флаг наличия касания в переменную i. if(i){...} // Выполняем действия если касание есть ... else {...} // Выполняем действия если касания нет ...
Функция read();
- Назначение: Запуск процесса определения координат касания.
- Синтаксис: read();
- Параметры: Нет
- Возвращаемые значения: Нет
- Примечание: Обращаться к функции нужно только после того, как функция dataAvailable() вернула true. После обращения к данной функции можно получить значения АЦП для координат касания из переменных TP_X и TP_Y, либо обратиться к функциям getX() и getY() для получения реальных (обработанных) координат точки касания.
- Пример:
if(myTouch.dataAvailable()){ // Если зафиксировано касание, то ... myTouch.read(); // Запускаем процесс определения координат точки касания. }
Функция getX();
- Назначение: Получение координаты касания по оси X.
- Синтаксис: getX();
- Параметры: Нет
- Возвращаемые значения: число типа int16_t являющееся координатой касания по оси X.
- Примечание: Функция вызывается после обращения к функции read().
- Пример:
if(myTouch.dataAvailable()){ // Если зафиксировано касание, то ... myTouch.read(); // Запускаем процесс определения координат точки касания. Serial.print("X="); Serial.print(myTouch.getX()); // Получаем и выводим в монитор последовательного порта координату касания по оси X Serial.print(", Y="); Serial.print(myTouch.getY()); // Получаем и выводим в монитор последовательного порта координату касания по оси Y Serial.println("."); }
Функция getY();
- Назначение: Получение координаты касания по оси Y.
- Синтаксис: getY();
- Параметры: Нет
- Возвращаемые значения: число типа int16_t являющееся координатой касания по оси Y.
- Примечание: Функция вызывается после обращения к функции read().
- Пример:
if(myTouch.dataAvailable()){ // Если зафиксировано касание, то ... myTouch.read(); // Запускаем процесс определения координат точки касания. Serial.print("X="); Serial.print(myTouch.getX()); // Получаем и выводим в монитор последовательного порта координату касания по оси X Serial.print(", Y="); Serial.print(myTouch.getY()); // Получаем и выводим в монитор последовательного порта координату касания по оси Y Serial.println("."); }
Переменные TP_X и TP_Y
- Назначение: Содержат значения АЦП для определения координат точки касания.
- Тип данных: int16_t
- Примечание: Данные содержащиеся в переменных являются значениями АЦП прочитанными из контроллера функций TouchScreen после обращения к функции read().
- Пример:
if(myTouch.dataAvailable()){ // Если зафиксировано касание, то ... myTouch.read(); // Запускаем процесс определения координат точки касания. Serial.print("X="); Serial.print(myTouch.TP_X); // Получаем и выводим в монитор последовательного порта значение АЦП для координаты касания по оси X Serial.print(", Y="); Serial.print(myTouch.TP_Y); // Получаем и выводим в монитор последовательного порта значение АЦП для координаты касания по оси Y Serial.println("."); }
Ссылки:
- Цветной графический дисплей 2.4 TFT 240x320 с сенсорным экраном.
- Библиотека URTouch, для работы с сенсорными экранами оснащёнными контроллерами функций TouchScreen.
- Библиотека UTFT, для работы с цветными графическими дисплеями.
- Wiki - Работа с цветными графическими дисплеям.
- Wiki - Установка библиотек в Arduino IDE.
Обсуждение