Работа с TouchScreen по последовательной шине данных

Эта статья посвящена работе с резистивными TouchScreen со встроенными контроллерами функций TouchScreen.
Наличие контроллера избавляет от необходимости определять уровни напряжений используя аналоговые входы.
Аналоговые данные обрабатываются контроллером и выводятся по последовательной шине данных.

Ознакомиться с процессом получения координат касания от TouchScreen без встроенных контроллеров можно в разделе Wiki - работа с TouchScreen.

Некоторые дисплеи оснащены сенсорным экраном (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.
  • Возвращаемые значения: Нет
  • Примечание: Функция вызывается после создания объекта библиотеки UTFT но до обращения к любой функции объекта библиотеки URTouch.
  • Пример:
myTouch.InitTouch(PORTRAIT);       // Инициируем работу с TouchScreen указывая, что он вертикально ориентирован.
Функция setPrecision();
  • Назначение: Указание точности определения координат касания.
  • Синтаксис: setPrecision( [ТОЧНОСТЬ] );
  • Параметры:
    • ТОЧНОСТЬ - может принимать одно из четырёх значений: 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(".");
}

Ссылки:

Обсуждение

Присоединяйся

На главную