Программирование ардуино для tft сенсорного дисплея. Подключение TFT дисплея с драйвером ILI9341 к Arduino
Тачскрин дисплей станет украшением для любого проекта на Arduino.
В этой статье мы рассмотрим touchscreen display shield со встроенным слотом для microSD карты. TFT дисплей имеет диагональ 2.8", подсветку, в которой используется 4 белых светодиода, и возможность отображения 262000 оттенков цветов (18 бит)! Дисплей имеет разрешением 240х320 пикселей с индивидуальным управлением. Обратите внимание, что это гораздо больше, чем, например, у черно-белого LCD дисплея 5110. На шилде встроен резистивный тачскрин, что позволяет определяеть положение пальца при нажатии на экран.
Общая информация и техническые характеристики TFT LCD шилда 2.8"
TFT shield продается в полностью собранном виде, готовый к запуску. Достаточно его просто установить сверху на вашу Arduino и подключить необходимую библиотеку в Arduino IDE . Процедура установки-наладки-первого заруска займет не больше 10 минут!
На TFT шилде есть встроенный контроллер с буферизацией RAM. В результате большинство операций передается имнно шилду, а не грузят контроллер на Arduino . Для подключения шилда TFT дисплея достаточно несколько пинов: 12 пин отвечает за дисплей, 13 - за работу SD карты, если вы ее используете.
Конечно, производители не оставили нас наедине с даташитом и пожеланием "Удачи!". Есть библиотеки, которые значительно облегчат вашу работы с TFT шилдом.
Есть отличная open-source графическая библиотека, которая дает возможность рисовать пиксели, линии, прямоугольники, окружности и текст: Скачать на Github .
Кроме того, написана тач-скрин библиотека: Скачать на Github , которая определяет координаты x, y и z (давление), в которой есть пример скетча для демонстрации указанных возможностей. Данный скетч написандля Arduino, но может быть адаптирован для других микроконтроллеров!
Технические характеристики TFT дисплея:
- Диагональ LCD TFT дисплея составляет 2.8"
- Разрешение 240x320 пикселей, 18-bit (262000) цветовая гамма
- Контроллер ILI9325 или ILI9328 со встроенным буфером оперативной памяти
- Цифровой интерфейс на 8 бит, плюс 4 линейки управления
- Использует цифровые пины 5-13 и аналоговые 0-3. Это значит, что можно использовать цифровые пины 2, 3 и аналоговые 4 и 5. Пин 12 тоже доступен, если вы не используете microSD карту
- Совместим с любой платой Arduino "328 или Mega
- Совместим с 5В! Может использовать питание логики 3.3 В и 5 В
- Есть встроенный LDO регулятор 3.3 В @ 300 мА LDO regulator
- Подсветка из 4 белых светодиодов. По умолчанию включена. Для управления можно подключить транзистор к цифровому пину с подсветкой
- 4-х проводниковый резистивный сенсорный экран
Дополнительные вопросы и ответы
Я ознакомился с даташитом и обнаружил, что доступен SPI интерфейс. Почему вы используете параллельный интерфейс? SPI ведь лучше, будет задействовано меньше пинов!
Действительно, драйвер на дисплее поддерживает SPI, но дисплеев, которые его могут использовать нет. На тачскрин шилде соответствующие пины просто не выведены в качестве коннекторов. Скорее всего это связано с тем, что скорость передачи по SPI была бы очень медленная.
Задействованы все пины! Как я могу подключить еще что-то к Arduino?
Пример рисования на сенсорном дисплее
Данный LCD TFT шилд имеет встроенный 2.8" 4-х проводниковый резистивный дисплей. Его можно использовать для определения места контакта пальца, стилуса и т.п. Для работы с сенсорным дисплеем вам понадобится 4 пина на Arduino.
Скачать пример вы можете здесь: Github repository . Не забудьте разархивировать скачанный файл и переместить его в папку с библиотеками Arduino IDE.
Сенсорный дисплей подключается к Arduino следущим образом:
- Y+ подключается к аналоговому пину 1
- Y- подключается к цифровому пину 7
- X+ подключается к цифровому пину 6
- X- подключается к аналоговому пину 2
После подключения загрузите пример tftpaint_shield, который находится в библиотеке TFTLCD library. С правой стороны на экране появятся "боксы с цветами". Вы можете нажать на один из боксов для выбора цвета, которым будете рисовать. Нажав на левую часть экрана вы можете его очистить.
Сенсорный дисплей сделан из тонкого стекла. Он очень хрупкий. Малейшая трещина или повреждение выведет его из строя. Будьте аккуратны при переносе дисплея, особенно с его углами. Для взаимодействия с резистивным экраном можно использовать не только пальцы, но и стилусы. Понятное дело, слишком сильно давить на поверхность дисплея тоже не стоит.
Загрузка рисунков
На TFT LCD дисплее 2.8" дюйма есть встроенный слот для micoSD карты. Этот слот можно использовать для загрузки изображений! Предварительно отформатируйте карту в FAT32 или FAT16 (более детально особенности работы SD карты с Arduino отображены здесь).
В большинстве скетчей-примеров SD карта не будет работать. Необходимо ее предварительно инициализировать.
Для увеличения скорости обмена данных можно загрузить дополнительную библиотеку здесь: Fixes & Updates to the Arduino SD Library . Не забудьте скопировать распакованную библиотеку в соответствующую папку в Arduino IDE.
Если вы пользуетесь Arduino Mega, внесите некоторые правки в файл SD/utility/Sd2Card.h. Надо снять тег комментария со строки #define MEGA_SOFT_SPI 1. Благодаря этому для обмена данными с SD картой, Arduino Mega сможет использовать те же пины, что и классические Arduino. Для тестировки можете загрузить это изображение тигра: Download this tiger bitmap and save it to the microsd card!
Запустите Arduino IDE и выберите скетч tftbmp_shield. Загрузите его на Arduino и вуаля! На экране отобразится следующее:
Для загрузки подойдут изображения, размер которых меньше 240х320 пикселей. Рисунки надо сохранять в 24-битном BMP формате. Даже если изначально рисунок не имел 24 бита, пересохраните его, так как это самый легкий формат для чтения с помощью Arduino. Можно поворачивать рисунки с использованием процедуры setRotation().
Управление подсветкой
По умолчанию разработчики шилда считают, что вы постоянно будете использовать подсветку. Однако вы можете управлять ее яркость с помощью ШИМ выходов или вообще выключать для экономии энергии. Для этого вам понадобится немного потрудиться. Найдите на задней стороне TFT LCD шилда 2.8" два коннектора подсветки. С помощью ножа уберите дорожку между клемами VCC и соедините два квадрата, обозначенных Pin3. После этого вы сможете управлять подсветкой с использованием цифрового пина 3.
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!
В этой статье мы поговорим о сенсорных кнопках в ардуино. С помощью этого несложного и недорогого компонента можно создавать простые и очень эффектные проекты. Чаще всего такие кнопки используются для создания всевозможных удобных сенсорных интерфейсов, например в системах умного дома. Давайте узнаем, как можно подключать сенсорные кнопки к ардуино, напишем простой скетч и обязательно рассмотрим принцип их работы.
Ни для кого не секрет, что прогресс не стоит на месте. Постоянно появляются новые технологии, совершенствуются старые. Сенсорные экраны появились совсем недавно (по меркам человечества), но уже прочно вошли в нашу повседневную жизнь. Телефоны, телевизоры, терминалы и прочие в большинстве своём используют «беcкнопочные» технологии. В кавычках это слово по той причине, что они всё-таки используют кнопки, только сенсорные. О них в данной статье как раз и пойдёт речь, а если точнее, о Touch module для Arduino.
Принцип работы сенсорных кнопок
Модули с сенсорными кнопками в большинстве своём используют проекционно-ёмкостные сенсорные экраны (https://ru.wikipedia.org/wiki/Сенсорный_экран). Если не вдаваться в пространственные объяснения их работы, для регистрации нажатия используется вычисление изменения ёмкости конденсатора (электрической цепи), при этом важной особенностью является возможность выставлять различную начальную ёмкость, в чём мы убедимся далее.
Человеческое тело обладает некоторой электрической емкостью, а следовательно, и невысоким реактивным сопротивлением для переменного электрического тока. Если прикоснуться пальцем либо каким-либо электропроводящим объектом, то через них потечет небольшой ток утечки от устройства. Специальный чип определяет эту утечку и подаёт сигнал о нажатии кнопки. Плюсами данной технологии являются: относительная долговечность, слабое влияние загрязнений и устойчивость к попаданию воды.
Сенсорные или механические кнопки
Сенсорная кнопка «ощущает» нажатие даже через небольшой слой неметаллического материала, что обеспечивает разнообразие в использовании её во всевозможных проектах.
Из предыдущего пункта вытекает и этот – возможность использовать сенсорную кнопку внутри корпуса повышает привлекательность проекта, что не влияет на функционал, но достаточно важно в повседневной жизни, чтобы не обращать на это внимание.
+ Стабильное функционирование, которое выражается отсутствием подвижных частей и частой калибровкой (о чём будет сказано ниже). Вам не придется беспокоиться о дребезге кнопок, возникающем при использовании механического собрата, что существенно облегчит жизнь начинающему ардуинщику. Поэтому ещё один плюс, пусть и не для всех – простота при работе.
Из минусов можно отметить следущее:
- Сенсорные кнопки плохо работают при минусовых температурах, поэтому они непригодны для использования за пределами помещений.
- Высокое потребление электричества, вызванное необходимостью постоянно поддерживать одинаковую ёмкость.
- Сенсорная кнопка не работает при нажатии её рукой в перчатке либо плохо проводящим электричество объектом
Обзор сенсорных кнопок
Прежде чем говорить непосредственно о работе с модулем, нужно определиться с тем, какую именно модель купить для использования. Рассмотрим несколько вариантов различных компаний:
1. Troyka touch sensor
Время отклика: 80мс (в режиме энергопотребления) и 10мс (в высокоскоростном режиме)
4 мм
Размер: 25Х25 мм
Напряжение питания : 3–5 В
Время отклика: 220 мс и 80 мс
Максимальная толщина диэлектрика для нормальной работы: 2 мм
Размер: 20Х20 мм
Напряжение питания : 2–5 В
Время отклика : 220 мс и 60 мс
Размер: 24Х24 мм
Напряжение питания : 2–5 В
Размер : 30Х20 мм
Напряжение питания : 3.3–5 В
Подключение сенсорной кнопки к Ардуино
Для использования сенсорной кнопки, как, впрочем, и всех остальных модулей и датчиков, её необходимо подключить к какой-либо плате arduino. В большинстве случаев используются стандартные модули с тремя контактами: питание, сигнал и земля. Их расположения от модели к модели меняются, на схеме они отображены согласно недавнему перечислению (сенсорная кнопка заменена переключателем по причине её отсутствии в Tincercad):
Важный момент: нужно помнить, сенсорной кнопке требуется в среднем полусекундная калибровка во время каждого запуска, что позволяет не беспокоиться о лишних шумах, которые, несомненно, возникали бы из-за различного положения кнопки в проектах. Поэтому не стоит сразу после запуска нажимать на кнопку, т.к. после этого наиболее вероятна некорректная работа устройства.
Сенсорный модуль, по своей сути аналогичен цифровой кнопке. Пока кнопка нажата, датчик отдаёт логическую единицу, а если нет, то логический ноль.
Проекты с использованием сенсорной кнопки
Начнём с простого: при нажатии на кнопку загорается встроенный светодиод.
Const int buttonPin = 7; // Выставляем значения порта, подсоединённого с сигнал-портом кнопки void setup() { pinMode(LED_BUILTIN, OUTPUT); // Команда для адекватного реагирования светодиода pinMode(buttonPin, INPUT); // Открываем порт для считывания } void loop() { buttonState = digitalRead(buttonPin); // Считываем статус кнопки (нажата / не нажата) if (digitalRead(buttonPin)) { // Если кнопка нажата... digitalWrite(LED_BUILTIN, HIGH); // Подаём напряжение на LED_BUILTIN - значение для встроенного светодиода } else { // Иначе... digitalWrite(LED_BUILTIN, LOW); // Не подаём напряжение } }
Теперь усложним задачу: Нажатием на кнопку изменяется режим работы светодиода.
Const int buttonPin = 7; // Выставляем значения порта, подсоединённого с сигнал-портом кнопки int count = 0; // Переменная, предназначенная для выбора режима работы void setup() { pinMode(LED_BUILTIN, OUTPUT); // Команда для адекватного реагирования светодиода pinMode(buttonPin, INPUT); // Открываем порт для считывания } void loop() { if(digitalRead(buttonPin)){ // При нажатии кнопки... count = count + 1; // Изменяем режим кнопки if(count > 2){ //В случае превышения значения count начинаем отсчет сначала count = 0; } while(digitalRead(buttonPin)){ // Пустой цикл для ожидания, пока пользователь отпустит кнопку } } if(count == 0) { // 3 режима по переключению кнопки: digitalWrite(LED_BUILTIN, LOW); // 1: Выключенный светодиод } else if(count == 1) { digitalWrite(LED_BUILTIN, HIGH); // 2: Включенный } else { digitalWrite(LED_BUILTIN, HIGH); // 3: Мигающий delay(100); digitalWrite(LED_BUILTIN, LOW); delay(100); } }
Заключение
В этой статье мы с вами рассмотрели принцип работы и схему подключения сенсорной кнопки к платам Arduino. С точки зрения программной модели никаких особенных отличий при работе с таким видом кнопок нет. Вы просто анализируете уровень входящего сигнала и принимаете решение о своем действии. С учетом того, что сами модули сенсорных кнопок достаточно дешевы и доступны в большом количестве интернет-магазинов, добавить такой интересный и современный интерфейс к своему ардуино-проекту на составит никакого труда.
Рассматриваемый шилд представляет собой плату с встроенными модулями индикации и управления. Индикация осуществляется с помощью LCD-дисплея TC1602, управление – через встроенные кнопки. Есть возможность регулировки яркости дисплея прямо на плате с помощью подстроечного резистора. Плата снабжена разъемами, в которые могут быть подключены другие устройства, например, датчики. Для работы с экраном используются пины 4-10, для определения нажатия кнопок – только один аналоговый пин A0. Свободными являются цифровые пины 0-3, 11-13 и аналоговые пины A1-A5.
Основные области применения шилда: создание управляющих модулей, реализующих настройки устройства с помощью интерфейса меню. Экран шилда можно использовать для вывода информации, получаемой с датчиков, с возможностью выполнения пользователем каких-либо действий путем нажатия на встроенные кнопки. Естественно, можно найти и другие способы использования платы: например, реализовать игру типа тетрис.
Технические характеристики
- Тип дисплея: LCD 1602, символьный, 4-х битный режим.
- Разрешение: 16×2 (две строки по 16 символов каждая). Знакоместо 5×8 точек.
- Цвет дисплея: синий (возможны варианты с желтым и зеленым цветом). Буквы белого цвета.
- Технология: STN, Transflective, Positive.
- Контроллер дисплея: HD44780U.
- Предельная частота обновления экрана: 5Гц
- Питание дисплея: 5 Вольт
- Кнопки: 6 кнопок (5 кнопок управления и Reset).
- Дополнительные элементы: регулировка яркости подсветки (потенциометр).
- Рабочая температура экрана: от -20 °С до +70 °С;
- Температура хранения экрана: от -30 °С до +80 °С.
Распиновка LCD shield для подключения к Arduino
Контакт дисплея LCD 1602 | Описание | Контакт на LCD Shield |
Пины LCD экрана | ||
GND | Земля | |
VDD | Питание 5В | |
Contrast | Управление контрастом | Потенциометр |
RS | Команды/Данные | 8 |
R/W | Чтение/Запись | |
Enable | Включение (активирование) | 9 |
DB0 | Не используется | |
DB1 | Не используется | |
DB2 | Не используется | |
DB3 | Не используется | |
DB4 | Дата 1 | 4 |
DB5 | Дата 2 | 5 |
DB6 | Дата 3 | 6 |
DB7 | Дата 4 | 7 |
Back LED + | Включение подсветки | 10 |
Back LED – | Питание подсветки | |
Пины для кнопок | ||
Кнопка UP | Управляющая кнопка | A0 |
Кнопка DOWN | Управляющая кнопка | A0 |
Кнопка LEFT | Управляющая кнопка | A0 |
Кнопка RIGHT | Управляющая кнопка | A0 |
Кнопка SELECT | Управляющая кнопка | A0 |
Reset | Reset | |
ICSP | ICSP для перепрошивки встроенного микроконтроллера HD44780U | |
UART | Контакты для UART соединения | 0, 1 |
Дополнительные элементы шилда
- Индикаторный светодиод (включается при подключении питания к плате).
- Контактные площадки для подключения аналоговых устройств (GND, VSS, пин данных).
- Потенциометр для регулирования контрастностью экрана.
Подключение платы LCD Shield к Arduino
Подключение шилда очень простое – нужно попасть ножками в соответствующие разъемы платы ардуино и аккуратно совместить их. Ничего дополнительно подсоединять или припаивать не надо. Нужно помнить и учитывать тот факт, что часть пинов зарезервированы для управления дисплеем и кнопками и не может быть использована для других нужд! Для удобства подключения дополнительного оборудования на плате выведены дополнительные разъемы 5В и GND к каждой контактной площадке аналоговых пинов. Это, безусловно, упрощает работу с датчиками. Также можно подключать цифровые устройства через свободные пины 0-3 и 11-13. Подключив шилд, мы можем работать с экраном и кнопками на нем так же, как с отдельными устройствами, учитывая только номера пинов, к которым припаяны соответствующие контакты.
Скетч для экрана на Arduino LCD shield
Для работы с LCD экранами обычно используют популярную библиотеку LiquidCrystal . На этапе инициализации создается объект класса LiquidCrystal, в конструкторе которого мы указываем пины с подключенными контактами экрана. Для нашего шилда требуется использовать такой вариант: LiquidCrystal lcd(8, 9, 4, 5, 6, 7); Последовательность аргументов конструктора:
- RS (8)
- Enable (9)
- data(4)
- data(5)
- data(6)
- data(7)
Ничего сложного в работе с объектом нет. В setup() мы инициализируем объект, указывая ему количество символов и строк:
Lcd.begin(16, 2);
Для вывода информации на дисплей используем метод print():
Lcd.print (“Arduino Master!”);
Текст выведется в место текущего нахождения курсора (в начале работы скетча это первая строка и первый символ). Для указания произвольного положения курсора можно использовать функцию setCursor(<столбец>, <строка>):
Lcd.setCursor(0, 0); // Первый символ первой строки lcd.setCursor(0, 1); // Первый символ второй строки lcd.setCursor(2, 1); // Третий символ второй строки
Кнопки LCD Keypad Shield
На плате присутствуют пять управляющих кнопок, работа с которыми ведется через один аналоговый пин A0. В шилде использован достаточно распространенный способ простого кодирования сигнала, при котором каждая кнопка формирует определенное значение напряжения, которое после АЦП преобразуется в соответствующее значение от 0 до 1023. Таким образом, мы можем передавать информацию о нажатии разных кнопок через один пин, считывая его при помощи функции ;
Значения уровня сигнала на пине A0 в зависимости от выбранной кнопки:
Нажатие кнопки | Значение на аналоговом пине |
RIGHT | 0-100 |
UP | 100-200 |
DOWN | 200-400 |
LEFT | 400-600 |
SELECT | 600-800 |
Клавиша не нажата | 800-1023 |
Пример скетча работы с кнопками LCD Keypad Shield:
Int keyAnalog = analogRead(A0); if (keyAnalog < 100) { // Значение меньше 100 – нажата кнопка right // Выполняем какое-то действие для кнопки вправо. } else if (keyAnalog < 200) { // Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP // Выполняем какое-то действие для кнопки вверх } else if (keyAnalog < 400) { // Значение больше 200, но меньше 400 – нажата кнопка DOWN // Выполняем действие для кнопки вниз } else if (keyAnalog < 600) { // Значение больше 400, но меньше 600 – нажата кнопка LEFT // Выполняем действие для кнопки влево } else if (keyAnalog < 800) { // Значение больше 600, но меньше 800 – нажата кнопка SELECT // Выполняем действие для кнопки выбора пункта меню } else { // Все остальные значения (до 1023) будут означать, что нажатий не было }
В выбранном методе кодирования есть два главных недостатка:
- Нельзя отслеживать одновременное нажатие нескольких кнопок;
- Возможные искажения сигнала могут привести к ложным срабатываниям.
Нужно учитывать эти ограничения, выбирая этот шлд в своих проектах, если вы планируете использовать устройство в системах с большим количеством помех, которые могут искажать сигнал на входе A0, из-за чего АЦП может сформировать ошибочное значение и скетч в результате выполнит другие инструкции.
Пример скетча для работы с экраном и кнопками меню
В данном примере мы определяем текущую нажатую кнопку и выводим ее название на экран. Обратите внимание, что для удобства мы выделили операцию определения кнопки в отдельную функцию. Также в скетче мы выделили отдельный метод для вывода текста на экран. В ней мы показываем сообщение (параметр message) и очищаем его через секунду. Нужно помнить, что в течение этой секунды нажатия кнопок не обрабатываются
#include
Краткие выводы по плате расширения LCD keypad shield
Плата расширения LCD Keypad достаточно популярная, она проста и удобна для использования в проектах Arduino. Сегодня ее можно легко купить практически в любом интернет-магазине.
Плюсы LCD Shield:
- Упрощает подключение жидкокристаллического экрана.
- Уменьшает общие размеры устройства, т.к. убирает выступающие провода и монтажные платы.
- Сокращает количество ошибок, связанных с неправильным монтажом и подключением.
- Добавляет функциональность кнопочного управления, если на плате установлены кнопки (LCD Keypad shield).
Недостатки:
- Стоимость шилда выше, чем стоимость отдельного экрана.
- Не всегда нужна дополнительная функциональность в виде кнопок.
- Шилд потребляет больше энергии, чем отдельные элементы платы.
Эта статья посвящена работе с резистивными TouchScreen без встроенных контроллеров.
Координаты касания определяются по аналоговым данным полученным с TouchScreen.
Ознакомиться с процессом получения координат касания через контроллеры функций 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:
- Выводы Arduino к которым подключены выводы Y+ и Y- (с напыления на мембране) переводятся в режим выхода.
- На вывод Y+ (YP) подаётся уровень HIGH, а на вывод Y- (YM) подаётся уровень LOW.
- Выводы Arduino к которым подключены выводы X+ и X- (с напыления на стекле) переводятся в режим входа.
- Данные полученные функцией analogRead, со входа X- (XM) будут обратно пропорциональны координате касания по оси Y.
- Вывод X+ (XP) находится в состоянии высокого импеданса, так как мы перевели его в режим входа, но данные с него читать не будем.
Если на выводы пластины, к которой подаётся напряжение, вместо LOW подать HIGH, а вместо HIGH подать LOW (поменять местами уровни выводов), то считанное значение будет не обратно, а прямо пропорционально координате касания.
Читать данные можно с любого вывода той пластины, на которую не подавалось напряжение (уровни LOW и HIGH), но так как обычно один из выводов соединён с аналоговым выводом Arduino, а другой с цифровым, то и читать данные приходится только с того вывода, который подключён к аналоговому выводу Arduino.
После чтения координат, все выводы нужно сконфигурировать в тот режим, который был установлен до чтения, для нормальной работы с дисплеем.
Со всеми этими задачами успешно справляется библиотека TouchScreen . Она не только возвращает уровни напряжений прямо пропорциональные точкам касания, но еще и уровень силы нажатия.
Пример:
// Подключаем библиотеки: #includeДля калибровки в скетче предусмотрены 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 нужно уменьшить.
Описание функций библиотеки:
Подключение библиотеки:
#includeФункция getPoint();
- Назначение: получение «сырых» данных о точке нажатия
- Синтаксис: getPoint();
- Параметры: Нет
- Возвращаемые значения: Структура из трёх переменных типа int16_t
- x - значение с аналогового входа, прямопропорциональное координате нажатия по оси X
- y - значение с аналогового входа, прямопропорциональное координате нажатия по оси X
- z - значение соответствующее степени нажатия на TouchScreen
- Примечание: Каждое значение можно получить по отдельности, воспользовавшись функциями описанными ниже
- Пример:
Функция readTouchX();
- Назначение: получение «сырого» значения соответствующего точке нажатия по оси X
- Синтаксис: readTouchX();
- Параметры: Нет
- Примечание: Полученное значение требуется преобразовать от диапазона «сырых» значений к диапазону ширины экрана
- Пример:
Int i = ts.readTouchX(); // Получаем «сырое» значение соответствующее координате X
Функция readTouchY();
- Назначение: получение «сырого» значения соответствующего точке нажатия по оси Y
- Синтаксис: readTouchY();
- Параметры: Нет
- Возвращаемые значения: число типа int
- Примечание: Полученное значение требуется преобразовать от диапазона «сырых» значений к диапазону высоты экрана
- Пример:
Int i = ts.readTouchY(); // Получаем «сырое» значение соответствующее координате Y
Функция pressure();
- Назначение: получение значения соответствующего степени нажатия на TouchScreen
- Синтаксис: pressure();
- Параметры: Нет
- Возвращаемые значения: число типа int
- Пример:
Int i = ts.pressure(); // Получаем значение соответствующее степени нажатия на TouchScreen
Примечание:
Координаты сенсора должны совпадать с координатами дисплея. Если Вы будете выводить данные на дисплей библиотекой не UTFT .
Для Arduino есть очень много модулей, датчиков. Но все это скучно без дисплея)) В этой статье мы с вами подключим TFT дисплей с драйвером ILI9341 к контролеру.
В руки мне попал Китайский брат с маркировкой KMRTM24024-SPI. Это TFT дисплей с диагональю 2.4″ и SPI интерфейсом.
Характеристики:
- Диагональ: 2,4 .
- Цвет: 18-бит, 262 000 оттенков.
- Разрешение: 320 х 240.
- Соотношение сторон экрана: 4: 3 .
- Питание: 3.3В/5 В.
- Интерфейс: SPI .
Самое интересное, что логика работы драйвера 3.3 В . По этому нам потребуется согласовать наше Arduino с логикой 5 В и дисплей.
Выводы:
- VCC = +5v (+5 вольт).
- GND = GND (земля).
- LED = +3.3v (подсветка дисплея).
- SCK = SPI.
- SDI/SD (MOSI) = SPI.
- SDO(MISO) = SPI.
- CS = выбор устройства.
- D/C = Команда/Данные.
Схема подключения:
Так как логика работу у дисплея и контролера разная нам надо их согласовать. Тут есть два варианта:
Когда на вход A подается +5 вольт, на выходе G будет +3.3 В. Думаю принцип работы понятен.
Соединение дисплея с Arduino Nano:
SCK -- pin D8 (через делитель).
SDI (MOSI) -- pin D9 (через делитель).
D/C -- pin D10 (через делитель).
RESET -- pinD 11 (через делитель).
CS -- pin D12 (через делитель).
VCC -- +5v (+5 вольт,ВНИМАНИЕ
ваш дисплей может питаться 3.3В)
GND -- GND (земля).
LED -- +3.3v (подсветка дисплея).
Кодинг:
Для работы с дисплеем есть много разных библиотек. Я использую библиотеку UTFT которую скачаем с GitHab или с нашего сайта . Загрузим готовый скетч из примеров с нашим разрешение:
// библиотека для работы с дисплеем
#include
Этот пример поможет вам с конвертацией типа float в string:
Arduino-FloatToString
#include