Touch panel with arduino

Работа с TouchScreen

Эта статья посвящена работе с резистивными TouchScreen без встроенных контроллеров.
Координаты касания определяются по аналоговым данным полученным с TouchScreen.

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

Некоторые дисплеи оснащены сенсорным экраном (TouchScreen — дословно переводится как трогать экран), который позволяет получать координаты точки прикосновения. Используя эти координаты, можно рисовать кривые или использовать их для имитации клавиатуры.

В настоящее время разработано множество сенсорных экранов, которые фиксируют прикосновение и получают координаты различными способами: резистивные, матричные, емкостные, инфракрасные, оптические, тензометрические, пьезоэлектрические, индукционные и даже ультразвуковые. Мы рассмотрим резистивные TouchScreen.

Общие сведения:

Резистивный TouchScreen состоит из двух прозрачных панелей. Одна панель — стеклянная (находится со стороны дисплея), вторая панель — из эластичного пластика (находится с внешней стороны, именно на неё мы и нажимаем), она выполняет роль мембраны. На внутренние поверхности обеих панелей (которые «смотрят» друг на друга) нанесён тонкий токопроводящий слой, имеющий однородное сопротивление. С противоположных сторон панелей присутствуют выводы, по два на каждую панель (см. рисунок ниже). Между панелями существует небольшой зазор заполненный микро-изоляторами (диэлектрическими микро-шариками), гарантирующими, что панели электрически не соединены. При касании мембраны, токопроводящие слои на мембране и на стекле соприкасаются друг с другом, электрически соединяясь. Сопротивление между выводами обеих панелей зависит от координат точки их соприкосновения.

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

Получение координат касания:

Для получения координат, нужно сконфигурировать два вывода Arduino подключённые к одной панели в режим входа, а два вывода Arduino подключённые к другой панели, в режим выхода. На выходы, подать разные логические уровни (на один LOW на другой HIGH), а с одного из входов, считать уровень напряжения.

Получение координаты по оси X:

  • Выводы Arduino к которым подключены выводы X+ и X- (с напыления на стекле) переводятся в режим выхода.
  • На вывод X+ (XP) подаётся уровень HIGH, а на вывод X- (XM) подаётся уровень LOW.
  • Выводы Arduino к которым подключены выводы Y+ и Y- (с напыления на мембране) переводятся в режим входа.
  • Данные полученные функцией analogRead, со входа Y+ (YP) будут обратно пропорциональны координате касания по оси X.
  • Вывод Y- (YM) находится в состоянии высокого импеданса, так как мы перевели его в режим входа, но данные с него читать не будем.
Напряжение снимаемое с выхода Y+ (YP) зависит от горизонтального делителя (R левее и R правее точки касания).
Вертикальный делитель не влияет на уровень снимаемого напряжения (R выше точки касания лишь ограничивает ток, а R ниже точки касания вообще не участвует в схеме, т.к. вывод Y- (YM) находится в состоянии высокого импеданса («висит» как не подключённый).

Получение координаты по оси Y:

  • Выводы Arduino к которым подключены выводы Y+ и Y- (с напыления на мембране) переводятся в режим выхода.
  • На вывод Y+ (YP) подаётся уровень HIGH, а на вывод Y- (YM) подаётся уровень LOW.
  • Выводы Arduino к которым подключены выводы X+ и X- (с напыления на стекле) переводятся в режим входа.
  • Данные полученные функцией analogRead, со входа X- (XM) будут обратно пропорциональны координате касания по оси Y.
  • Вывод X+ (XP) находится в состоянии высокого импеданса, так как мы перевели его в режим входа, но данные с него читать не будем.
Напряжение снимаемое с выхода X- (XM) зависит от вертикального делителя (R выше и R ниже точки касания).
Горизонтальный делитель не влияет на уровень снимаемого напряжения (R правее точки касания лишь ограничивает ток, а R левее точки касания вообще не участвует в схеме, т.к. вывод X+ (XP) находится в состоянии высокого импеданса («висит» как не подключённый).

Если на выводы пластины, к которой подаётся напряжение, вместо LOW подать HIGH, а вместо HIGH подать LOW (поменять местами уровни выводов), то считанное значение будет не обратно, а прямо пропорционально координате касания.

Читать данные можно с любого вывода той пластины, на которую не подавалось напряжение (уровни LOW и HIGH), но так как обычно один из выводов соединён с аналоговым выводом Arduino, а другой с цифровым, то и читать данные приходится только с того вывода, который подключён к аналоговому выводу Arduino.

После чтения координат, все выводы нужно сконфигурировать в тот режим, который был установлен до чтения, для нормальной работы с дисплеем.

Со всеми этими задачами успешно справляется библиотека TouchScreen. Она не только возвращает уровни напряжений прямо пропорциональные точкам касания, но еще и уровень силы нажатия.

Пример:

Калибровка:

Для калибровки в скетче предусмотрены 4 константы: tsMinX, tsMinY, tsMaxX и tsMaxY, хранящие экстремумы (крайние значения) читаемых уровней с аналоговых входов для осей X и Y.

Дело в том, что библиотека TouchScreen возвращает прочитанные уровни, а не значения координат. Для того чтоб они стали координатами, их нужно преобразовать от диапазона уровней к диапазону координат, что и происходит в скетче в разделе «Преобразуем значения полученные с TouchScreen в координаты дисплея». Диапазон координат нам известен: для оси X от 0 до ширины дисплея, для оси Y от 0 до высоты дисплея, в пикселях. А диапазон читаемых уровней зависит от типа TouchScreen . Для того чтоб узнать этот диапазон, нужно разкомментировать строку в разделе « Выводим «сырые» показания TouchScreen», загрузить скетч и открыть монитор последовательного порта.

Грубая калибровка:

При каждом нажатии на экран, в мониторе будут отображаться координаты нажатия X и Y. Понажимайте возле каждого края экрана, при этом запомните или запишите как самое максимальное, так и самое минимальное значение для каждой оси. После чего присвойте эти значения, в разделе «Определяем экстремумы» (в начале скетча), для каждой константы: tsMinX, tsMinY, tsMaxX и tsMaxY. И загрузите скетч заново.

Точная калибровка:

После того как TouchScreen был грубо откалиброван, может понадобиться более точная калибровка.

Расположите экран так, как это показано на самом первом рисунке данной статьи (начало координат обеих осей слева сверху).

  • Плавно проведите линию по экрану от центра влево.
    • Если выводимая на дисплее линия опережает точку нажатия, то значение tsMinX нужно уменьшить.
    • Если Выводимая на дисплее линия отстаёт от точки нажатия, то значение tsMinX нужно увеличить.
  • Плавно проведите линию по экрану от центра вправо.
    • Если выводимая на дисплее линия опережает точку нажатия, то значение tsMaxX нужно увеличить.
    • Если Выводимая на дисплее линия отстаёт от точки нажатия, то значение tsMaxX нужно уменьшить.
  • Плавно проведите линию по экрану от центра вверх.
    • Если выводимая на дисплее линия опережает точку нажатия, то значение tsMinY нужно уменьшить.
    • Если Выводимая на дисплее линия отстаёт от точки нажатия, то значение tsMinY нужно увеличить.
  • Плавно проведите линию по экрану от центра вниз.
    • Если выводимая на дисплее линия опережает точку нажатия, то значение tsMaxY нужно увеличить.
    • Если Выводимая на дисплее линия отстаёт от точки нажатия, то значение tsMaxY нужно уменьшить.

Описание функций библиотеки:

Подключение библиотеки:

Функция getPoint();

  • Назначение: получение «сырых» данных о точке нажатия
  • Синтаксис: getPoint();
  • Параметры: Нет
  • Возвращаемые значения: Структура из трёх переменных типа int16_t
    • x — значение с аналогового входа, прямопропорциональное координате нажатия по оси X
    • y — значение с аналогового входа, прямопропорциональное координате нажатия по оси X
    • z — значение соответствующее степени нажатия на TouchScreen
  • Примечание: Каждое значение можно получить по отдельности, воспользовавшись функциями описанными ниже
  • Пример:

Функция readTouchX();

  • Назначение: получение «сырого» значения соответствующего точке нажатия по оси X
  • Синтаксис: readTouchX();
  • Параметры: Нет
  • Возвращаемые значения: число типа int
  • Примечание: Полученное значение требуется преобразовать от диапазона «сырых» значений к диапазону ширины экрана
  • Пример:

Функция readTouchY();

  • Назначение: получение «сырого» значения соответствующего точке нажатия по оси Y
  • Синтаксис: readTouchY();
  • Параметры: Нет
  • Возвращаемые значения: число типа int
  • Примечание: Полученное значение требуется преобразовать от диапазона «сырых» значений к диапазону высоты экрана
  • Пример:

Функция pressure();

  • Назначение: получение значения соответствующего степени нажатия на TouchScreen
  • Синтаксис: pressure();
  • Параметры: Нет
  • Возвращаемые значения: число типа int
  • Пример:

Примечание:

Координаты сенсора должны совпадать с координатами дисплея. Если Вы будете выводить данные на дисплей библиотекой не UTFT, то возможно Вам придется изменить название осей, поменяв местами номера выводов X и Y при создании объекта библиотеки.

Так как TouchScreen использует выводы двойного назначения, то следует обратить внимание на то, что при неинициализированном дисплее, данные с его выводов могут влиять на показания TouchScreen и читаемые координаты будут некорректными.

Источник

Работа с сенсорным экраном на Arduino DUE

1. Общие сведения

Это дополнение разработано тем же автором, что и базовая библиотека. Свежую версию можно скачать здесь:
http://www.henningkarlsen.com/electronics/library.php?id=55
Это дополнение не является самостоятельным и требует подключения базовой библиотеки UTFT.

Итак, рассмотрим более подробно дополнение Utouch, предназначенное для работы с сенсорным экраном, которым оборудовано большинство TFT дисплеев.

2. Начало работы с сенсорным экраном

Для работы с дополнением Utouch необходимо подгрузить его в Вашу программу и выполнить инициализацию. Естественно, при этом должна быть подгружена и инициализирована базовая библиотека UTFT. Напоминаем, что для нашего дисплея, о котором шла речь в предыдущей статье, инициализация выглядит следующим образом:
#include
UTFT myGLCD(CTE32HR,25,26,27,28);

Теперь подгружаем дополнение и создаем объект – сенсорный экран с именем myTouch. В качестве параметров команде инициализации передаются номера пинов, к которым подключены сигналы TCLK, TCS, TDIN, TDOUT и IRQ. Эти параметры следует выяснить у производителя дисплея или шильда, посредством которого дисплей подключен к контроллеру.

В нашей модели сенсорного экрана вышеупомянутые сигналы подключены, соответственно, к пинам 6, 5, 4, 3 и 2. Напоминаем, что схему шильда, при помощи которого подключается дисплей можно найти здесь:
http://coldtears.lin3.siteonlinetest.com/files/CTE_DUE_shield.zip
а схему самого дисплейного модуля – здесь:
http://coldtears.lin3.siteonlinetest.com/files/3.2b.zip

Итак для нашего дисплея мы должны вставить в программу следующие строки:
#include
UTouch myTouch(6,5,4,3,2);

Далее необходимо проинициализировать в процедуре void setup() дисплей и сенсорный экран:
void setup() <
myGLCD.InitLCD();
myTouch.InitTouch();
>

Команда InitTouch также, как и команда InitLCD базовой библиотеки, задает вертикальную или горизонтальную ориентацию дисплея. По умолчанию задается горизонтальная ориентация. Все, теперь можно работать с нашим сенсорным экраном. Рассмотрим совсем простой пример, при помощи которого мы сможем убедиться, что сенсорный экран заработал. Скомпилируем следующую программу и загрузим ее в память контроллера:

При старте программы дисплей закрашивается красным цветом. Теперь коснемся экрана в любой точке – и дисплей окрасится в зеленый цвет.

3. Калибровка сенсорного экрана

Прежде чем продолжить работу необходимо выполнить еще одну важную процедуру – калибровку сенсорного экрана. В примерах программ, поставляемых с дополнением Utouch есть один очень важный пример, который называется UTouch_Calibration.
Для выполнения калибровки необходимо открыть этот пример через меню:
«Файл->Примеры->UTouch->Arduino->UTouch_Calibration».

ВНИМАНИЕ! Перед компиляцией не забудьте заменить строки UTFT myGLCD(….) и UTouch myTouch(….) на те, что нужны для нашего дисплея.

Также при калибровке необходимо правильно выбрать параметр TOUCH_ORIENTATION. Информацию о значении этого параметра для используемой модели дисплея можно найти в файле UTouch_Supported_display_modules.pdf, который поставляется вместе с библиотекой Utouch и размещается в ее корневой папке. Для нашего дисплея, например, должно быть установлено значение PORTRAIT, несмотря на то, что сам дисплей ориентирован горизонтально.

ВНИМАНИЕ! Это значение необходимо устанавливать только при калибровке сенсорного экрана, в дальнейшем ориентация экрана должна совпадать с ориентацией дисплейного модуля.

При запуске программа выводит на дисплей пояснительный текст и ждет прикосновения к сенсорному экрану. Затем на дисплее отображается 8 меток-крестиков по краям дисплея и красное окно с надписью PRESS в центре. Инструкция разработчиков сообщает, что необходимо коснуться подсвеченного крестика и удерживать касание до тех пор, пока подсветка на нем не погаснет, а на красном поле в центре не появится сообщение «RELEASE». Эту несложную операцию необходимо повторить для всех крестиков по очереди.
Кстати, разработчики советуют выполнять эту операцию стилусом или заостренной палочкой, не используя пальцы, это позволит повысить точность калибровки. По окончании калибровки на дисплей будут выведены три числа в 16-ричном формате. Например, вот такие:

CAL_X 0xBD95ECC8UL
CAL_Y 0x5EBC8000UL
CAL_S 0x0013F1DFUL

Эти три значения необходимо поместить в файл UTouch_CD.h, находящийся в корневой папке дополнения UTouch вместо тех значений CAL_X, CAL_Y и CAL_S, которые там указаны изначально. После этого дисплей будет работать правильно.

Теперь рассмотрим более подробно команды дополнения UTouch:

UTouch – создает базовый класс сенсорного экрана с заданным именем, в качесте параметров указывается способ подключения.

Команда имеет следующий вид:
Utouch _NAME_ (TCLK, TCS, TDIN, TDOUT, IRQ);

где _NAME_ — произвольное имя объекта «сенсорный экран», которое будет использоваться в качестве префикса при любом обращении к нему, а TCLK, TCS, TDIN, TDOUT и IRQ – номера пинов, которым подключаются соответствующие сигналы сенсорного дисплея.

Строка с этой командой размещается в области определений и должна предшествовать любым другим командам UTouch. Заданное имя объекта должно использоваться в качестве префикса ко всем последующим командам UTouch.

InitTouch – инициализирует сенсорный экран и задает горизонтальную или вертикальную ориентацию. В качестве параметра указывается идентификатор ориентации.

Если в этой команде указать PORTRAIT или 0 – будет выбрана вертикальная ориентация, если указать LANDSCAPE или 1 – горизонтальная. Обратите внимание, что ориентация сенсорного экрана должна совпадать с ориентацией дисплея. По умолчанию (без параметров) команда устанавливает горизонтальную ориентацию.

setPrecision – задает точность определения координат точки прикосновения к сенсорному дисплею. В качестве параметра передается идентификатор точности.

Всего определено четыре уровня точности, кодируемые числами от 1 до 4:

PREC_LOW – низкая точность;
PREC_MEDIUM – средняя точность;
PREC_HI – высокая точность;
PREC_EXTREME – очень высокая точность.

Естественно, уровень точности обратно пропорционален времени, затрачиваемому на определение координат. Оптимальным для большинства задач является уровень PREC_MEDIUM. Разработчики не рекомендуют использовать высокую и очень высокую точность для операций, требующих быстрого реагирования.

Разница между уровнями точности может быть проиллюстрирована примером UTouch_QuickDraw, поставляемым вместе с библиотекой UTouch. Эта программа позволяет рисовать на дисплее при помощи сенсорного экрана:

Попробуйте скомпилировать этот пример с различными значениями параметра команды setPrecision и вы сразу же почувствуете разницу.

dataAvailable – функция, возвращающая логическое значение true, eсли в момент ее вызова зафиксировано касание сенсорного экрана. В остальное время – возвращает значение false.

Эта функция может быть использована как для определения момента касания, так и его продолжительности. В нашем первом примере, который мы приводили в разделе 2, конструкция:
if (myTouch.dataAvailable()) <
myGLCD.fillScr(0,255,0);
>else

содержала вызов функции dataAvailable, по срабатыванию которой происходило изменение цвета дисплея, которое сохранялось на все время касания. Рассмотрим еще один пример – измерение времени касания в миллисекундах:

в момент касания сенсорного дисплея программа сохраняет текущее значение функции millis в переменной timeOld. Далее, до тех пор, пока касание сохраняется, программа постоянно обновляет текущее значение millis в переменной timeNew. Как только касание прекратилось – на дисплей выводится разность между этими двумя переменными, которая и будет равна времени касания в миллисекундах.

Итак, теперь мы умеем работать с событием «касание сенсорного экрана», можем определить момент касания, его продолжительность и момент отпускания. Осталось совсем немного – получить координаты точки касания. Для этого предназначены следующие команды:

read – запускает процедуру определения координат точки касания.

Эта команда не передает никаких параметров и не возвращает никакого значения. Ее следует запускать, когда функция dataAvailable принимает значение true. Полученные координаты в «сыром» виде сохраняются во внутренних переменных TP_X и TP_Y. Однако, эти данные не приведены к размерам дисплея и его разрешающей способности, поэтому для получения координат точки касания используются специальные функции getX и getY.

getX – возвращает значение X-координаты точки касания в пикселях относительно левого края дисплея.

getY – возвращает значение Y-координаты точки касания в пикселях относительно верхнего края дисплея.

При условии правильно выполненной калибровки и достаточной точности сенсорного экрана, координаты точки касания должны совпадать с координатами конкретного пикселя. Тип возвращаемых значений для этих двух функций – int.

Следующий пример при касании сенсорного экрана выводит на дисплей координаты точки касания в пикселях и в «сыром» формате:

Теперь для того, чтобы обработать, например, нажатие экранной кнопки достаточно убедиться, что полученные координаты точки касания находятся внутри области, занимаемой на дисплее данной кнопкой. Вот еще один пример:

Программа рисует на дисплее прямоугольник-кнопку. При касании сенсорного экрана в области кнопки на дисплей выводится надпись «PRESSED», при касании за пределами прямоугольника надпись гаснет.

Еще один интересный пример. Эта программа рисует на дисплее прямоугольное «окно» и позволяет изменять его размеры путем перетаскивания нижнего правого угла. Конечно, это не полноценный Drag&Drop но очень похоже:

Источник

Adblock
detector