Arduino и резистивный тачскрин, библиотека KrokoTS

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Сейчас почти все устройства управляются сенсорными экранами, и у многих возникает желание оборудовать свой arduino-проект дисплеем и GUI, чтобы даже убеждённые "мышатники" смогли разобраться.

Необходимые компоненты и цена вопроса

  • Arduino любой модели - Uno: 400p

  • Резистивный сенсорный дисплей/панель - мой с разборки: 80p

  • Светодиод - 10p

  • Компьютер с установленной Arduino IDE

Что такое резистивный сенсор и почему нельзя использовать дисплей от смартфона

Резистивный тачскрин состоит резисторов, количество которых определяется АЦП микроконтроллера. В случае Atmega328 это 10 бит - 1024 резистора. Они расположены сеткой:

Сетка из резисторов, пользователь нажал в первую красную точку.
Сетка из резисторов, пользователь нажал в первую красную точку.

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

В телефонах используют другие сенсоры - емкостные. Контроллер дисплея измеряет заряд конденсатора и констатирует факт нажатия. Единственное, из МК AVR умеют работать с этими дисплеями Atmega серии PB. Atmega328PB стоит в одном нашем магазине 400р. Обычная Atmega328P - 360p. Возможно, когда-то расскажу и про этот тип сенсоров. Если вы всё-таки решите купить PB, учтите, что они физически несовместимы с обычной Atmega328P

Сборка

Резистивный сенсор - далее дисплей - имеет 4 контакта: X1, Y1, X2, Y2. Я вывел шлейфом эти контакты и припаялся к Arduino так:

Схема дисплея
Схема дисплея

Для индикации нам нужен светодиод, который мы подключаем к любому ШИМ пину, в моём случае 11.

Код программы

Первое и самое важное - библиотека. Для таких дисплеев их есть великое множество. Например, от Adafruit. Но я рекомендую использовать KrokoTS из-за одной фишки, о которой я расскажу позднее. Для загрузки можно использовать Менеджер Библиотек Arduino IDE, или скачать с GitHub.

Начнём с примеров. Идём "Файл-Примеры-KrokoTS-attach".

Разберём код по блокам, которые выделил автор.

#include<KrokoTS.h>

#define X1 A0
#define X2 A2
#define Y1 A1
#define Y2 A3
#define LED 11

KrokoTS Touch(X1, X2, Y1, Y2);

Здесь мы подключаем библиотеку, и задаём пины А0-А3 как контакты дисплея согласно схеме, создаем объект Touch, с которым будем работать далее.

void setup() {
  pinMode(LED, OUTPUT);
  Touch.attachClick(0, 1, 500, 1, 900, on);
  Touch.attachClick(1, 501, 900, 1, 900, off);

}

Теперь инициализируем светодиод, и - главное отличие этой библиотеки от других - attachClick(). Вот её синтаксис:

Name.attachClick(id, xmin, xmax, ymin, ymax, function);

Таким образом, при обнаружении касания в пределах поля xmin-xmax-ymin-ymax будет вызвана функция function. В нашем примере клик в области 1-500-1-900 вызовет on. id должен быть уникальный и в пределах от 0 до MAX_FIELDS, если надо больше, измените MAX_FIELDS. Можно динамически менять область, пересоздавая блок с таким же id.

void loop() {
  Touch.tick();
}

void on() {
  digitalWrite(LED, HIGH);
}

void off() {
  digitalWrite(LED, LOW);
}

В loop'е вызываем метод tick, который проверяет касания. Соответственно, лучше не плодить задержки delay. В блоках on/off мы включаем и выключаем светодиод. Вы ведь поставили его? На этом разбор первого примера окончен. Открываем пример getPos. Нас интересует setup.

void setup() {
  pinMode(LED, OUTPUT);

}

Тут мы просто инициализируем светодиод. Далее loop.

void loop() {
  int x = Touch.getX();
  int y = Touch.getY();
  if (x < 1000 && y < 1000) {
    if (y < 500) digitalWrite(LED, (x > 500) ? HIGH : LOW);
    else analogWrite(LED, map(x, 50, 950, 0, 255));

  }
}

Используя методы getX/getY мы получаем координаты касания, и условием обрезаем лишнее, ведь ввод у нас - INPUT_PULLUP. Если клик был в верхней части экрана, то мы через тернарный оператор выбираем уровень сигнала - высокий/низкий, а иначе - масштабируем x к значению 0-255, и пишем как ШИМ сигнал

Заключение

Надеюсь мой пост был вам полезен, и вы узнали что-то новое, а если у вас возникли вопросы, пишите в комментарии, я постараюсь ответить. Можете написать, что улучшить или подкинуть идею для следующего поста, а на этом я с вами прощаюсь, всем удачи и пока!

Источник: https://habr.com/ru/post/589143/


Интересные статьи

Интересные статьи

Однажды увидев на али оксиметр, стало интересно как же он устроен, а разобравшись, удивился его простоте и решил его повторить. Читать далее
Пришла зима, короткий день, домашней пальме мало света. Нужно организовать подсветку. Готовую лампу покупать как-то неловко, да и надо ж чем-то заняться долгими зимними в...
На картинке скрин из нашумевшей игры про не очень далёкое будущее. Заметили странный воротник у типа? Думаете что это такое? Признаюсь честно, я совсем не пытался выяснить назначение эт...
Привет, друзья! Меня зовут Петр, я представитель малого белорусского бизнеса со штатом чуть более 20 сотрудников. В данной статье хочу поделиться негативным опытом покупки 1С-Битрикс. ...
Этот пост будет из серии, об инструментах безопасности, которые доступны в Битриксе сразу «из коробки». Перечислю их все, скажу какой инструмент в какой редакции Битрикса доступен, кратко и не очень р...