ESP32 сенсорные входы

0

Вы наверное уже слышали, что у контроллера ESP32 есть аппаратные сенсорные пины. Сенсорные или по другому тактильные – означает реагирующие на прикосновение человека, а так же других божиих тварей. Принцип работы такой фичи основан на изменении емкости в цепи входа контроллера при прикосновении.

На картинке распиновки тактильные пины подписаны словом TOUCH. В ESP32 нам доступны 10 таких ёмкостных сенсорных входов. Первый тач висит на нулевом GPIO, который здесь выведен на кнопку BOOT. Пин, сконфигурированный как сенсорный можно считывать получая аналоговое значение степени прикосновения. Ещё такой пин может запускать прерывание и даже пробуждать контроллер из сна. Теперь самое время лайкнуть и подписаться на канал и идем дальше.

Такой инструмент дает нам простую и функциональную возможность строить проекты с прикольными кнопками

и даже псевдо-аналоговыми слайдерами.

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

Давайте теперь ознакомимся с программами для обработки емкостных входов ESP32.

Открываем Arduino IDE и выбираем контроллер ESP32 Dev module. Открываем примеры для ESP32->Touch->Touch Interrupt. Скетч TouchInterrupt как видим конфигурирует прерывание на два таких пина. Здесь обратите внимание на обозначение номера сенсорного входа. T2 – это второй сенсорный вход, Т3 – третий и эти обозначения не соответствуют привычным номерам GPIO. Поэтому смотрите не путайте. Хотя сюда можно писать и номер пина GPIO без приставки T. Как вам удобно.

int threshold = 40;
bool touch1detected = false;
bool touch2detected = false;
void gotTouch1(){
touch1detected = true;
}
void gotTouch2(){
touch2detected = true;
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("ESP32 Touch Interrupt Test");
touchAttachInterrupt(T2, gotTouch1, threshold);
touchAttachInterrupt(T3, gotTouch2, threshold);
}
void loop(){
if(touch1detected){
touch1detected = false;
Serial.println("Touch 1 detected");
}
if(touch2detected){
touch2detected = false;
Serial.println("Touch 2 detected");
}
}

Я хочу подключить емкостную  кнопку с счастливому GPIO 13. Открыв распиновку ESP32, видим TOUCH4, который соответствует пину номер 13. В скетч можно написать четверку Т4 вместо Т2, но так же можно и просто 13

Для подключения прерывания по тач-входу предусмотрена функция с поэтическим названием touchAttachInterrupt. Первый аргумент в ней – это номер тача. Второй – это название запускаемой функции при касании. Третий аргумент – это порог срабатывания прерывания. Этот порог устанавливается в начале скетча. В функциях по прерываниям взводятся переменные – флажки, которые в основном цикле программы активируют распечатку сообщений в монитор порта. Переменная для порога срабатывания здесь имеет тип uint16_t с возможными значениями в пределах от нуля до 65535.

Сразу откроем пример для аналогового чтения емкостного входа TouchRead. И здесь я скопирую две строчки основного цикла и вставлю в программу с прерываниями. Исправлю T0 на 13. Функция touchRead возвращает аналоговое значение тактильного входа. И полученный скетч должен писать нам в монитор порта как сработки прерываний так и степень прикосновения.

int threshold = 40;
bool touch1detected = false;
bool touch2detected = false;
void gotTouch1(){
touch1detected = true;
}
void gotTouch2(){
touch2detected = true;
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("ESP32 Touch Interrupt Test");
touchAttachInterrupt(13, gotTouch1, threshold);
touchAttachInterrupt(T3, gotTouch2, threshold);
}
void loop(){
if(touch1detected){
touch1detected = false;
Serial.println("Touch 1 detected");
}
if(touch2detected){
touch2detected = false;
Serial.println("Touch 2 detected");
}
Serial.println(touchRead(13));
delay(1000);
}

Теперь загружаем скетч в контроллер, подключаем провод к 13-му пину и потестируем. Мне больше всего интересно, с какого расстояния срабатывает прикосновение. Дотрагиваюсь к металлической части провода, и конечно срабатывает прерывание и цифра, характеризующая степень прикосновения падает ближе к нулю. Становится ясно, что чувствительность такого ёмкостного входа составляет в единицах расстояния где-то 1 мм. 

Если вы ожидали что-то более дальнее, то обратите внимание на специализированные микросхемы типа AT42QT или TTP223. 

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

Теперь я уберу из программы прерывания, сделаю обращение к монитору порта почаще и обновлю программу. Запускаю вместо монитора порта Плоттер для наглядности. И предлагаю потестить работу тача в водной среде. Налью водопроводную воду в один судок, а дистиллированную в другой, вставлю по очереди в каждый сенсорный провод и понаблюдаем вместе.

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

ФруктНе дотрагиваясьДотрагиваясь
Банан587
Мандарин680
Киви699
Грейпфрут600

В результате видим, что чувствительнее всего те фрукты, кожура которых содержит больше воды.

Теперь берём для опытов вазон и внедрим провод в землю. Сначала обхвачу пластмассовый вазон руками на уровне земли. Потом дотронусь пальцем до земли с краю вазона и наконец потрогаю за стебли и листья цветка.

int threshold = 40;
bool touch1detected = false;
bool touch2detected = false;
void gotTouch1(){
touch1detected = true;
}
void gotTouch2(){
touch2detected = true;
}
void setup() {
Serial.begin(115200);
delay(1000); // give me time to bring up serial monitor
Serial.println(«ESP32 Touch Interrupt Test»);
touchAttachInterrupt(13, gotTouch1, threshold);
touchAttachInterrupt(T3, gotTouch2, threshold);
}
void loop(){

Serial.println(touchRead(13));
delay(400);
}

Пора сделать выводы насчёт юзабилити тактильного аппаратного входа контроллера ESP32. Это было познавательно и весело. Насчет воды, я видел в ютубе попытки нескольких людей мерить её уровень в ёмкости с тонкими стенками, размещая щупы из алюминиевой фольги с наружной стороны этой ёмкости. Это получается дискретное измерение, но если прилепить к ёмкости несколько щупов по всей высоте, то можно мерить уровень с большим разрешением. Я пока не готов судить о надежности таких измерений. Знаю только, что они сильно зависимы к прикосновениям человека к ёмкости.

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

Что касается вазонов, то мне приходит в голову идея пугалки для домашнего кота, который повадился залазить лапами в вазон.

А основную свою задачу пины выполняют тоже. Порадовала возможность выставлять пороги срабатывания прерываний. И запоминаем, что чувствительность у этих входов не космос. Поэтому диэлектрические прокладки делаем не слишком толстые.

Надеюсь разбор сенсорных входов ESP32 был вам полезен. Жду от вас ливень из лайков и комментов. До новых встреч!

5 1 голос
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x