Подключение датчика кнопки к ардуино требует определенных знаний и навыков. В этой статье мы поговорим о том, что такое тактовая кнопка, что такое дребезг кнопки, как правильно подключать кнопку с подтягивающим и стягивающим резистором, как можно управлять с помощью кнопки светодиодами и другими устройствами.
Кнопка ардуино
Кнопка (или кнопочный переключатель) – самый простой и доступный из всех видов датчиков. Нажав на нее, вы подаете контроллеру сигнал, который затем приводит к каким-то действиям: включаются светодиоды, издаются звуки, запускаются моторы. В своей жизни мы часто встречаемся с разными выключателями и хорошо знакомы с этим устройством.
Тактовые кнопки и кнопки-переключатели
Как обычно, начинаем раздел с простых вещей, интересных только начинающим. Если вы владеете азами и хотите узнать о различных вариантах подключения кнопки к ардуино – можете пропустить этот параграф.
Что такое кнопка? По сути, это достаточно простое устройство, замыкающее и размыкающее электрическую сеть. Выполнять это замыкание/размыкание можно в разных режимах, при этому фиксировать или не фиксировать свое положение. Соответственно, все кнопки можно поделить на две большие группы:
- Кнопки переключатели с фиксацией. Они возвращаются в исходное состояние после того, как их отпустили. При в зависимости от начального состояния разделяют на нормально-замкнутые и нормально-разомкнутые кнопки.
- Кнопки без фиксации (тактовые кнопки). Они фиксируются и остаются в том положении, в котором их оставили.
Вариантов различных кнопок великое множество, это действительно один из самых распространенных видов электронных компонентов.
Кнопки ардуино для простых проектов
В наших проектах мы будем работать с очень простыми тактовыми кнопками с 4 ножками, которые идут практически в любом наборе ардуино. Кнопка представляет собой переключатель с двумя парами контактов. Контакты в одной паре соединены между собой, поэтому больше одного выключателя в схеме реализовать не удастся, но вы можете одновременно управлять двумя параллельными сегментами, это бывает полезно.
В зависимости от ситуации, вы можете создавать как схемы с нормально замкнутыми, так и с нормально разомкнутыми контактами – для этого нужно будет только соответствующим образом выполнить соединение в схеме.
Для удобства работы в комплекте с тактовой кнопкой обычно идет пластмассовый колпачок какого-то цвета, он достаточно очевидно надевается на кнопку и придает проекту менее хакерский вид.
Подключение кнопки Ардуино
Включение и выключение светодиода с помощью кнопки
Давайте начнем с самого простого способа подключения тактовой кнопки. Рассмотрим схему с Arduino в качестве источника питания, светодиода, ограничительного резистора номиналом 220 Ом и кнопки, которая будет замыкать и размыкать цепь.
При подключении кнопки с двумя парами ножек важно правильно выбрать размыкающие контакты. Посмотрите на изображение внимательно: пары ножек расположены по бокам кнопки. Сама кнопка квадратная, но расстояния между парами контактов визуально заметны: можно сразу выделить два на одной стороне и два а другой. Так вот, именно между одной «парой» на стороне и будет реализован выключатель. Для включения в схему мы соединяемся с одним и с другим контактом, между которыми минимальное расстояние. Вторая пара контактов просто дублирует первую.Если у вас переключатель другого типа, то можете смело выбрать контакты с противоположных углов (на некоторых кнопка делается специальный знак в виде выемки, по которому можно определить, с какой стороны расположены спаренные контакты). Самый надежный способ определить правильные ножки – это прозвонить контакты тестером.
Сама схема с кнопкой, светодиодом и контроллером Arduino не нуждается в особых пояснениях. Кнопка разрывает цепь, светодиод не горит. При нажатии цепь замыкается, светодиод включается. Если вы перепутаете контакты (включите через замкнутые спаренные контакты кнопки), то кнопка работать не будет, потому что цепь никогда не разомкнется. Просто поменяйте контакты местами.
Подключение кнопки с подтягивающим резистором
Давайте теперь подключим кнопку к ардуино так, чтобы можно было считывать в скетче ее состояние. Для этого воспользуемся следующей схемой.
В скетче мы будем отслеживать факт нажатия и выводить сообщение в монитор порта. Более интересный пример и подробное объяснение самой схемы мы приведем чуть позже.
Следует обратить внимание на сопротивление 10 К, которое мы добавили в этой схеме. Более подробно о его предназначении мы поговорим позже, просто имейте в виду, что такой резистор необходим для правильной работы схемы.
Скетч для кнопки ардуино с подтягивающим резистором:
/* Пример использования тактовой кнопки в ардуино. Кнопка подключена к пину 2. */ const int PIN_BUTTON = 2; void setup() { Serial.begin(9600); pinMode(PIN_LED, OUTPUT); } void loop() { // Получаем состояние кнопки и выводим в мониторе порта int buttonState = digitalRead(PIN_BUTTON); Serial.println(buttonState); delay(50); }
Подключение кнопки в режиме INPUT_PULLUP
В указанной выше схеме мы использовали резистор, называемый подтягивающим, для формирования определенного уровня сигнала на цифровом порту. Но есть другой способ подключить кнопку без резистора, используя внутренне сопротивление платы ардуино. В блоке setup мы должны всего лишь определить тип пина, к которому подключим кнопку, как INPUT_PULLUP.
pinMode(PIN_BUTTON, INPUT_PULLUP);
Альтернативным вариантом будет выбрать режим пина как OUTPUT и установить на данный порт высокий уровень сигнала. Встроенный подтягивающий резистор подключиться автоматически.
pinMode(PIN_BUTTON, INPUT_PULLUP); digitalWrite(PIN_BUTTON, HIGH);
И все. Можно собрать вот такую сложную схему и работать с кнопкой в скетче.
Мигание светодиода после нажатия на кнопку
В предыдущем примере со светодиодами мы подключили кнопку к плате ардуино и поняли, как она работает. Светодиод включался и выключался, но делал это в совершенно пассивном режиме – сам контроллер здесь был абсолютно лишним, его можно было бы заменить батарейками. Поэтому давайте сделаем наш новый проект более «интеллектуальным»: при нажатии на кнопку заставим светодиод непрерывно мигать. Обычной схемой с лампочкой и выключателем этого уже не сделаешь – мы будем использовать мощь нашего микроконтроллера для решения этой пусть и простой, но не тривиальной задачи.
Полная схема проекта изображена на рисунке:
Фрагмент схемы со светодиодом уже хорошо нам знаком. Мы собрали обычный маячок со светодиодом и ограничительным резистором. А вот во второй части мы видим знакомую нам кнопку и еще один резистор. Пока не будем вдаваться в подробности, просто соберем схему и закачаем в ардуино простой скетч. Все элементы схемы идут в самых простых стартовых наборах ардуино.
/* Скетч для схемы с использованием тактовой кнопки и светодиода Светодиод мигает, пока нажата кнопка. Кнопка подтянута к земле, нажатию соответствует HIGH на входе */ const int PIN_BUTTON = 2; const int PIN_LED = 13; void setup() { Serial.begin(9600); pinMode(PIN_LED, OUTPUT); } void loop() { // Получаем состояние кнопки int buttonState = digitalRead(PIN_BUTTON); Serial.println(buttonState); // Если кнопка не нажата, то ничего не делаем if (!buttonState) { delay(50); return; } // Этот блок кода будет выполняться, если кнопка нажата // Мигаем светодиодом digitalWrite(PIN_LED, HIGH); delay(1000); digitalWrite(PIN_LED, LOW); delay(1000); }
Нажимаем и держим – светодиод мигает. Отпускаем – он гаснет. Именно то , что хотели. Хлопаем от радости в ладоши и приступаем к анализу того, что сделали.
Давайте посмотрим на скетч. В нем мы видим довольно простую логику.
- Определяем, нажата ли кнопка.
- Если кнопка не нажата, то просто выходим из метода loop, ничего не включая и не меняя.
- Если кнопка нажата, то выполняем мигание, используя фрагмент стандартного скетча:
- Включаем светодиод, подавая напряжение на нужный порт
- Делаем нужную паузу при включенном светодиоде
- Выключаем светодиод
- Делаем нужную паузу при выключенном светодиоде
Логика поведения кнопки в скетче может зависеть от способа подключения с подтягивающим резистором. Об этом мы поговорим в следующей статье.
Дребезг кнопки ардуино
В процессе работы с кнопками мы можем столкнуться с очень неприятным явлением, называемым дребезгом кнопки. Как следует из самого названия, явление это обуславливается дребезгом контактов внутри кнопочного переключателя. Металлические пластины соприкасаются друг с другом не мгновенно (хоть и очень быстро для наших глаз), поэтому на короткое время в зоне контакта возникают скачки и провалы напряжения. Если мы не предусмотрим появление таких “мусорных” сигналов, то будем реагировать на них каждый раз и можем привести наш проект к хаусу.
Для устранения дребезга используют программные и аппаратные решения. В двух словах лишь упомянем основные методы подавления дребезга:
- Добавляем в скетче паузу 10-50 миллисекунд между полкучением значений с пина ардуино.
- Если мы используем прерывания, то программный метд использоваться не может и мы формируем аппаратную защиту. Простейшая из них – RC фильтр с конденсатором и сопротивлением.
- Для более точного подавления дребезга используется аппаратный фильтр с использованием триггера шмидта. Этот вариант позволит получить на входе в ардуино сигнал практически идеальной формы.
Более подробную информацию о способах борьбы с дребезгом вы можете найти в этой статье об устранении дребезга кнопок.
Переключение режимов с помощью кнопки
Для того, чтобы определить, была ли нажата кнопка, надо просто зафиксировать факт ее нажатия и сохранить признак в специальной переменной.
Факт нажатия мы определяем с помощью функции digitalRead(). В результате мы получим HIGH (1, TRUE) или LOW(0, FALSE), в зависимости от того, как подключили кнопку. Если мы подключаем кнопку с помощью внутреннего подтягивающего резистора, то нажатие кнопки приведет к появлению на входе уровня 0 (FALSE).
Для хранения информации о нажатии на кнопку можно использовать переменную типа boolean:
boolean keyPressed = digitalRead(PIN_BUTTON)==LOW;
Почему мы используем такую конструкцию, а не сделали так:
boolean keyPressed = digitalRead(PIN_BUTTON);
Все дело в том, что digitalRead() может вернуть HIGH, но оно не будет означать нажатие кнопки. В случае использования схемы с подтягивающим резистором HIGH будет означать, что кнопка, наоборот, не нажата. В первом варианте (digitalRead(PIN_BUTTON)==LOW ) мы сразу сравнили вход с нужным нам значением и определили, что кнопка нажата, хотя и на входе сейчас низкий уровень сигнала. И сохранили в переменную статус кнопки. Старайтесь явно указывать все выполняемые вами логические операции, чтобы делать свой код более прозрачным и избежать лишних глупых ошибок.
Как переключать режимы работы после нажатия кнопки?
Часто возникает ситуация, когда мы с помощью кнопок должны учитывать факт не только нажатия, но и отпускания кнопки. Например, нажав и отпустив кнопку, мы можем включить свет или переключить режим работы схемы. Другими словами, нам нужно как-то зафиксировать в коде факт нажатия на кнопку и использовать информацию в дальнейшем, даже если кнопка уже не нажата. Давайте посмотрим, как это можно сделать.
Логика работы программы очень проста:
- Запоминаем факт нажатия в служебной переменной.
- Ожидаем, пока не пройдут явления, связанные с дребезгом.
- Ожидаем факта отпускания кнопки.
- Запоминаем факт отпускания и устанавливаем в отдельной переменной признак того, что кнопка была полноценно нажата.
- Очищаем служебную переменную.
Как определить нажатие нескольких кнопок?
Нужно просто запомнить состояние каждой из кнопок в соответствующей переменной или в массиве ардуино. Здесь главное понимать, что каждая новая кнопка – это занятый пин. Поэтому если количество кнопок у вас будет большим, то возможно возникновение дефицита свободных контактов. Альтернативным вариантом является использование подключения кнопок на один аналоговый пин по схеме с резистивным делителем. Об этом мы поговорим в следующих статьях.
СОДЕРЖАНИЕ ►
Как подключить тактовую кнопку к цифровым и аналоговым входам на Arduino Uno правильно. Расскажем, как избежать «дребезг контактов», рассмотрим схему подключения одной и нескольких кнопок к плате Ардуино. Рассмотрим функции digitalRead и analogRead в языке программирования C++, которые часто требуется использовать при создании различных проектов на Ардуино для начинающих.
Работа с тактовыми кнопками на Ардуино
Главная проблема использования кнопок для управления Arduino заключается в «дребезге контактов». Дело в том, что механические контакты в тактовых кнопках никогда не замыкаются и размыкаются мгновенно. В течении нескольких миллисекунд происходит многократное замыкание и размыкание контактов — в итоге на микроконтроллер поступает не единичный сигнал, а серия импульсов.
Для того, чтобы исключить на микроконтроллере Arduino дребезг кнопки используют различные электрические схемы с триггерами и конденсаторами. Но намного удобнее и проще использовать программный способ борьбы с возможным дребезгом тактовой кнопки — для этого применяют задержку на несколько миллисекунд или используют библиотеку Bounce2.h для борьбы с дребезгом контактов для Arduino.
Подключение к Ардуино тактовой кнопки
Для занятия нам понадобятся следующие детали:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- макетная плата;
- 1 светодиод;
- резисторы на 220 Ом и 10 кОм;
- 1 тактовая кнопка;
- провода «папа-папа» и «папа-мама».
Используем цифровые порты на плате для подключения тактовой кнопки и команду digitalRead
для считывания данных. Соберите схему, как на рисунке выше и загрузите скетч. Обратите внимание, что при отпущенной кнопке на Pin2 поступает логический «0». С помощью кнопки будем выключать и включать встроенный светодиод, подключенный к цифровому 13 порту на плате микроконтроллера Ардуино.
Скетч подключение кнопки к цифровому входу
voidsetup() { pinMode(13, OUTPUT); // объявляем пин 13 как выходpinMode(2, INPUT); // объявляем пин 2 как вход } voidloop() { if (digitalRead(2) == HIGH) // когда на пин 2 поступает высокий сигнал { digitalWrite(13, HIGH); // зажигаем светодиод } if (digitalRead(2) == LOW) // когда на пин 2 поступает низкий сигнал { digitalWrite(13, LOW); // выключаем светодиод } }
Пояснения к коду:
- процедура
setup
выполняется один раз, используется процедура для конфигурации портов микроконтроллера (назначение режима работы портов); - процедуры
setup
иloop
должны присутствовать в любой программе (скетче); - использованные константы:
INPUT
,OUTPUT
,LOW
,HIGH
, пишутся заглавными буквами, иначе компилятор их не распознает и выдаст ошибку.
Скетч подключения кнопки к аналоговому входу
Можно также сделать подключение кнопок к аналоговому входу Ардуино (обозначены, как Analog In на плате). Принципиальное отличие данной схемы — это использование аналогового порта на микроконтроллере. Для включения и выключения светодиода будем также использовать встроенный светодиод на плате. Переключите тактовую кнопку к аналоговому входу A1 и загрузите в плату следующий скетч.
void { pinMode(13, OUTPUT); // объявляем пин 13 как выходpinMode(A1, INPUT); // объявляем пин A1 как вход } voidloop() { if (analogRead(A1) > 300) // когда аналоговая кнопка нажата { digitalWrite(13, HIGH); // зажигаем светодиод } if (analogRead(A1) < 300) // когда аналоговая кнопка отпущена { digitalWrite(13, LOW); // выключаем светодиод } }
Пояснения к коду:
- в данном скетче мы используем функцию
analogRead
для считывания значений с аналогового входаA1
, при этом порт можно использовать, как цифровой; - значения на аналоговом входе могут отличаться (все зависит от сопротивления резистора в схеме) и могут принимать значения в диапазоне от 0 до 1023.
Arduino
Кажется, что может быть проще, чем подключить кнопку? Тем не менее, и тут есть свои подводные камни. Давайте разберёмся.
Инструкция по подключению кнопки к Arduino
Нам понадобится:
- Arduino UNO или иная совместимая плата;
- тактовая кнопка;
- резистор 10 кОм (вот отличный набор резисторов с основными номиналами от 10 Ом до 10 МОм);
- макетная плата (breadboard);
- соединительные провода (рекомендую вот такой набор);
- персональный компьютер со средой разработки Arduino IDE.
1 Виды кнопок
Кнопки бывают разные, но все они выполняют одну функцию – физически соединяют (или, наоборот, разрывают) между собой проводники для обеспечения электрического контакта. В простейшем случае – это соединение двух проводников, есть кнопки, которые соединяют большее количество проводников.
Некоторые кнопки после нажатия оставляют проводники соединёнными (фиксирующиеся кнопки), другие – сразу же после отпускания размыкают цепь (нефиксирующиеся кнопки).
Также кнопки делят на:
- нормально разомкнутые,
- нормально замкнутые.
Первые при нажатии замыкают цепь, вторые – размыкают.
Сейчас нашёл широкое применение тип кнопок, которые называют «тактовые кнопки». Тактовые – не от слова «такт», а от слова «тактильный», т.к. нажатие хорошо чувствуется пальцами. Но этот ошибочный термин устоялся, и теперь эти кнопки у нас повсеместно так называют. Это кнопки, которые при нажатии замыкают электрическую цепь, а при отпускании – размыкают, т.е. это нефиксирующиеся, нормально разомкнутые кнопки.
2Дребезг контактов
Кнопка – очень простое и полезное изобретение, служащее для лучшего взаимодействия человека и техники. Но, как и всё в природе, она не идеальна. Проявляется это в том, что при нажатии на кнопку и при её отпускании возникает т.н. «дребезг» («bounce» по-английски). Это многократное переключение состояния кнопки за короткий промежуток времени (порядка нескольких миллисекунд), прежде чем она примет установившееся состояние. Это нежелательное явление возникает в момент переключения кнопки из-за упругости материалов кнопки или из-за возникающих при электрическом контакте микроискр.
</p> Последнее изменениеВторник, 05 Ноябрь 2019 19:15 Прочитано 38126 разИспользуемые источники:
- https://arduinomaster.ru/datchiki-arduino/knopka-arduino/
- https://xn--18-6kcdusowgbt1a4b.xn--p1ai/%d0%bf%d0%be%d0%b4%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d0%ba%d0%bd%d0%be%d0%bf%d0%ba%d0%b8-%d0%b0%d1%80%d0%b4%d1%83%d0%b8%d0%bd%d0%be/
- https://soltau.ru/index.php/arduino/item/376-kak-podklyuchit-knopku-k-arduino