ESP32: ПОДКЛЮЧАЕМ КНОПКУ
Что нам понадобится?
Помимо платы ESP32 DEVKIT V1 нам понадобится кнопка, светодиод, пара макетных плат, резистор на 220 Ом, соединительные проводники-перемычки и кабель micro USB для подключения платы к компьютеру.Кнопка
Схема выводов кнопки (pinout)
Для того, чтобы подключить кнопку к выводу микроконтроллера используют подтягивающий резистор. Существуют два способа подключения: подключение в режиме подтягивания вывода к высокому уровню напряжения (PULL-UP) и подключение в режиме подтягивания вывода к низкому уровню (PULL-DOWN). В случае PULL-UP управляющим сигналом служит низкий уровень и кнопку подключают одним контактом к выводу микроконтроллера, а другим – к "земле" (GND). При использовании подключения в режиме PULL-DOWN управляющим сигналом служит высокий уровень, а кнопку подключают другим выводом к плюсу питания.
Подтягивающие резистор в режиме pull-down необходим, чтобы при отсутствии положительного сигнала от кнопки, на входе микроконтроллера присутствовал логический "0", обеспечиваемый подтягивающим резистором. Подтягивающий резистор в режиме pull-up необходим, чтобы при отсутствии отрицательного сигнала, на входе присутствовал высокий уровень. Обычно используют резисторы с номиналом около 10 КОм. Если не использовать подтягивающий резистор, то вывод микроконтроллера будет "болтаться в воздухе".
При подключении кнопки к ESP32 мы можем использовать внутренние подтягивающие резисторы (45 КОм), которые уже присутствуют в микроконтроллере. Для этого необходимо будет программно сконфигурировать вывод, к которому мы подключим кнопку.
Схема подключения кнопки
Подключим кнопку, например, к выводу D13 (GPIO13). К этому выводу ESP32 мы подключим внутренний подтягивающий резистор в режиме PULL-UP, когда будем писать программу. Для лучшего визуального контроля наших экспериментов подключим также светодиод, например, к выводу D27 (GPIO27). Используем для подключения светодиода ограничительный резистор 220 Ом.О том, к каким еще выводам платы можно подключать кнопки, читайте на wiki-странице "ESP32 распиновка (pinout)".
Монтаж данной схемы на макетных платах приведен в самом начале статьи.
Проверяем нажатие кнопки в цикле
Когда происходит нажатие, вывод D13 через кнопку соединяется c "землей", на выводе появляется "0", в противном случае на выводе будет присутствовать "1", которую будет обеспечивать внутренний подтягивающий резистор.Обрабатывать нажатие кнопки будем в бесконечном цикле и когда кнопка нажата, будем зажигать светодиод. Программа на языке MicroPython может выглядеть следующим образом:
# из модуля machine импортируем класс Pin
from machine import Pin
# создаем объект Pin с именем led,
# указываем идентификатор контакта GPIO27
# и задаем для контакта режим выхода Pin.OUT
led = Pin(27, Pin.OUT)
# создаем объект Pin с именем but и идентификатором 13,
# задаем для контакта режим входа Pin.IN
# и подключаем подтягивающий резистор Pin.PULL_UP
but = Pin(13, Pin.IN, Pin.PULL_UP)
# организуем бесконечный цикл
while True:
# проверяем значение на кнопке but
if but.value() == 0:
# включаем светодиод
led.on()
else:
# иначе выключаем светодиод
led.off()
Запустим Iguana IDE. Скопируем в нее текст программы. Подключим микроконтроллер к компьютеру с помощью USB-кабеля. Откроем соединение с помощью кнопки "Open" и нажмем кнопку "DOWNLOAD & RUN". Светодиод будет загораться при нажатии на кнопку. Подробнее о загрузке и запуске программ можно прочитать в статье "ПЕРВЫЙ ПРОЕКТ НА МИКРОКОНТРОЛЛЕРЕ ESP32".
Проверка нажатия кнопки в цикле с помощью условия простое, но не всегда удобное решение. Скрипт вынужден тратить время на сканирование значения пина but чтобы узнать, была ли нажата кнопка. Скрипт не может делать ничего другого, поскольку в противном случае возникнут пропущенные события. Если скрипт выполняет другие задачи в цикле, он может не успеть обнаружить кратковременное нажатие кнопки.
Для того, чтобы не зависеть от цикла, лучше использовать внешнее прерывание. Прерывание — это сигнал, посылаемый процессору, чтобы указать, что важная задача должна быть выполнена немедленно, тем самым прерывая выполнение текущей программы. Преимущество использования внешнего прерывания в том, что обнаружение нажатия будет полностью отделено от скрипта, крутящегося в цикле while.
Проверяем нажатие с помощью прерывания (Interrupt)
Благодаря прерываниям нет необходимости постоянно сканировать значение контакта: написанная нами функция будет выполняться автоматически при обнаружении изменения. Обнаружение события основано на форме сигнала, поступающего на контакт.Вот различные типы возможного обнаружения прерывания:
- Pin.IRQ_RISING : Запускает прерывание, как только сигнал переходит от LOW к HIGH (от 0 до 3,3 В)
- Pin.IRQ_FALLING запускает прерывание, как только сигнал изменяется с HIGH нa LOW (с 3,3 В на 0)
- Pin.IRQ_RISING | Pin.IRQ_FALLING запускает прерывание при изменении от LOW к HIGH или при изменении от HIGH к LOW
Примечание
IRQ означает Interrupt Request — запрос на прерывание.
ISR означает Interrupt Service Routine — это обработчик прерывания, который обычно состоит из небольшого числа инструкций.
Так как наша кнопка подключена к "земле", то есть при ее нажатии на выводе создается низкий уровень сигнала, мы используем режим FALLING. Программа может выглядеть следующим образом:
ISR означает Interrupt Service Routine — это обработчик прерывания, который обычно состоит из небольшого числа инструкций.
# из модуля machine импортируем класс Pin
from machine import Pin
# организуем функцию, которая будет запускаться прерыванием
def but_isr(pin):
# переключаем светодиод
led.value(not led.value())
# создаем объект Pin для светодиода
led = Pin(27, Pin.OUT)
# создаем объект Pin для кнопки
but = Pin(13, Pin.IN, Pin.PULL_UP)
# создаем запрос прерывания для кнопки по заднему фронту сигнала
# в handler указываем функцию, запускающуюся по прерыванию
but.irq(trigger=Pin.IRQ_FALLING, handler=but_isr)
# организуем бесконечный цикл
while True:
# что-то делаем или ничего не делаем
pass
Запустим программу и попробуем с помощью кнопки включать и выключать светодиод. Это будет получаться не очень хорошо. Кроме того, после остановки программы запрос на прерывание для кнопки всё еще будет срабатывать.
Остановить прерывание можно, например, выполнив команду but.irq(handler=None)
Устраняем дребезг контактов
Но почему же наша кнопка так нестабильно срабатывает? Всё дело в том, что кнопка механическая, и в реальности форма сигнала, получающаяся при нажатии, выглядит примерно так:Это называется "дребезг" контактов и победить его можно, используя таймер в нашей программе. Обычно его устанавливают на 200 миллисекунд, но можно поэкспериментировать с подбором наиболее оптимального интервала.
Суть простейшего метода борьбы с дребезгом механических контактов заключается в том, что при срабатывании кнопки мы запускаем таймер, который сработает через 200 миллисекунд и переключит светодиод. Если в результате "дребезга" кнопка сработает еще раз, пока не прошли 200 миллисекунд, то таймер перезапустится на новые 200 миллисекунд. Даже, если мы попытаемся нажать на кнопку еще раз, пока не прошли 200 миллисекунд, то ничего не произойдет.
# из модуля machine импортируем класс Pin и Timer
from machine import Pin, Timer
# организуем функцию, которая будет запускаться таймером
def on_pressed(timer):
# переключаем светодиод
led.value(not led.value())
# организуем функцию, которая будет запускаться прерыванием
def but_isr(pin):
# запускаем или перезапускаем таймер с однократным срабатыванием
timer.init(mode=Timer.ONE_SHOT, period=200, callback=on_pressed)
# создаем объект Pin для светодиода
led = Pin(27, Pin.OUT)
# создаем объект Pin для кнопки
but = Pin(13, Pin.IN, Pin.PULL_UP)
# создаем объект Timer
timer = Timer(0)
# создаем запрос прерывания для кнопки по заднему фронту сигнала
# в handler указываем функцию, запускающуюся по прерыванию
but.irq(trigger=Pin.IRQ_FALLING, handler=but_isr)
# организуем бесконечный цикл
while True:
# что-то делаем или ничего не делаем
pass
Удачный Вам экспериментов!
Это оригинальная статья myROBOT.ru
ПОПУЛЯРНЫЕ СТАТЬИ |
Драйвер двигателей L293D
Для управления двигателями мини робота необходимо устройство, которое бы преобразовывало управляющие сигналы малой мощности в токи, достаточные для управления моторами. Такое устройство называют драйвером двигателей.
Как сделать простейшего робота
О том, как сделать робота в домашних условиях, используя лишь микросхему драйвера моторов и пару фотоэлементов. В зависимости от способа соединения моторов, микросхемы и фотоэлементов робот будет двигаться на свет или, наоборот, прятаться в темноту, следовать по линии или бежать за вашей рукой.
Первые проекты на микроконтроллере ESP32
В качестве первых проектов на ESP32 рассмотрим примеры мигания светодиодами и напишем программу "бегущие огни". Это классика при изучении микроконтроллеров.
Как сделать простого робота на микроконтроллере (Часть 1). Управляем электромоторами
Как самому сделать робота, используя драйвер управления двигателями L293D и микроконтроллер ATmega8. Схема робота и примеры простейших программ для управления моторами.
НОВЫЕ СТАТЬИ |
Можно ли сделать BEAM-робота на Raspberry Pi?
Ответ Марка Тилдена с уникальной фотографией одной из новых работ маэстро.
Изучаем Python: TOP-5 лучших сайтов для изучения Питона
Самоучитель, интерактивный учебник, наглядные задачи и примеры программ.
Роботы на одной микросхеме своими руками
Подборками статей myROBOT.ru. Практика создания роботов: схемы и советы по изготовлению. Чтобы сделать роботов, нет необходимости даже писать программы. Все роботы начнут работать сразу же, как только Вы подключите к ним питание.
ПОПУЛЯРНОЕ НА САЙТЕ |
Драйвер программатора USBASP для Windows 7, 8, 10
Универсальный драйвер программатора USBasp v 2.0 USB ISP без необходимости принудительного отключения сертификата драйвера или использования Zadig, достаточно скачать драйвер USBasp и запустить файл InstallDriver.exe.
Учимся программировать.
Среда программирования на ЛОГО
GAME LOGO — бесплатная среда программирования для увлекательного путешествия в мир программирования и информатики. Программирование на русском языке, удобный и красивый интерфейс, продуманный синтаксис.