Как убрать дребезг кнопки arduino
Как избавиться от дребезга контактов при подключении кнопки к Arduino
Мы уже рассматривали подключение кнопки к Arduino и затрагивали вопрос «дребезга» контактов. Это весьма неприятное явление, которое вызывает повторные нажатия кнопки и усложняет программную обработку нажатий кнопки. Давайте же поговорим о том, как избавиться от дребезга контактов.
Инструкция по гашению дребезга контактов с помощью Arduino
Для проекта нам понадобится:
1 Проявление эффекта «дребезга» контактов
«Дребезг» контактов – это явление, свойственное механическим переключателям, кнопкам, тумблерам и реле. Из-за того, что контакты обычно делают из металлов и сплавов, которые обладают упругостью, при физическом замыкании они не сразу устанавливают надёжное соединение. В течение короткого промежутка времени контакты несколько раз смыкаются и отталкиваются друг от друга. В результате этого электрический ток принимает установившееся значение не моментально, а после череды нарастаний и спадов. Длительность этого переходного эффекта зависит от материала контактов, от их размера и конструкции. На иллюстрации показана типичная осциллограмма при замыкании контактов тактовой кнопки. Видно, что время от момента переключения до установившегося состояния составляет несколько миллисекунд. Это и называется «дребезгом».
Так выглядит эффект дребезга контактов на осциллограммах
Данные осциллограммы получены с помощью дешёвого любительского осциллографа DSO138, подробно мы рассматривали его здесь.
Этот эффект не заметен в электрических цепях управления освещением, двигателями или другими инерционными датчиками и приборами.
Но в цепях, где идёт быстрое считывание и обработка информации (где частоты того же порядка, что и импульсы «дребезга», или выше), это является проблемой. В частности, Arduino UNO, который работает на частоте 16 МГц, отлично ловит «дребезг» контактов, принимая последовательность единиц и нулей вместо единичного переключения от 0 к 1.
2 Подключение кнопки к Arduino для демонстрации подавления «дребезга»
Давайте посмотрим, как дребезг контактов влияет на правильную работу схемы. Подключим к Arduino тактовую кнопку по схеме со стягивающим резистором. Будем по нажатию кнопки зажигать светодиод и оставлять включённым до повторного нажатия кнопки. Для наглядности подключим к цифровому выводу 13 внешний светодиод, хотя можно обойтись и встроенным.
Схема подключения кнопки к Arduino для демонстрации подавления эффекта «дребезга» контактов
3 Алгоритм подавления«дребезга» контактов
Чтобы реализовать задачу подавления дребезга контактов, первое, что приходит в голову:
Напишем такой скетч и загрузим в память Arduino.
Скетч обработки нажатия кнопки без учёта эффекта дребезга контактов
При включении схемы в работу, сразу виден эффект дребезга контактов. Он проявляется в том, что светодиод загорается не сразу после нажатия кнопки, или загорается и тут же гаснет, или не выключается сразу после нажатия кнопки, а продолжает гореть. В общем, схема работает не стабильно. И если для задачи с включением светодиода это не столь критично, то для других, более серьёзных задач, это просто неприемлемо.
4 Подавление дребезга контактовс помощью задержки
Постараемся исправить ситуацию. Мы знаем, что дребезг контактов проявляет себя в течение нескольких миллисекунд после замыкания контактов. Давайте после изменения состояния кнопки выжидать, скажем, 5 мсек. Это время для человека является практически мгновением, и нажатие кнопки человеком обычно происходит значительно дольше – несколько десятков миллисекунд. А Arduino прекрасно работает с такими короткими промежутками времени, и эти 5 мсек позволят ему отсечь дребезг контактов от нажатия кнопки.
Скетч обработки нажатия кнопки с задержкой для устранения эффекта дребезга контактов
В данном скетче мы объявим процедуру debounce() («bounce» по-английски – это как раз «дребезг», приставка «de» означает обратный процесс), на вход которой мы подаём предыдущее состояние кнопки. Если нажатие кнопки длится более 5 мсек, значит это действительно нажатие. Определив нажатие, мы меняем состояние светодиода.
Загрузим скетч в плату Arduino. Теперь всё гораздо лучше! Кнопка срабатывает без сбоев, при нажатии светодиод меняет состояние, как мы и хотели.
5 Библиотеки для подавлениядребезга контактов
Библиотека Bounce2 содержит следующие методы:
Название | Назначение |
---|---|
Bounce() | инициализация объекта Bounce; |
void interval (мсек) | устанавливает время задержки в миллисекундах; |
void attach (номерПина) | задаёт вывод, к которому подключена кнопка; |
int update() | обновляет объект и возвращает true, если состояние пина изменилось, и false в противном случае; |
int read() | считывает новое состояние пина. |
Перепишем наш скетч с использованием библиотеки. Можно также запоминать и сравнивать прошлое состояние кнопки с текущим, но давайте упростим алгоритм.
Скетч обработки нажатия кнопки с использованием библиотеки для устранения влияния дребезга контактов
При нажатии кнопки будем считать нажатия, и каждое нечётное нажатие будем включать светодиод, каждое чётное – выключать. Такой скетч смотрится лаконично, его легко прочитать и легко применить.
Подавление дребезга контактов с помощью Arduino
Ну и напоследок пара видео от Джереми Блюма, где он рассказывает о способах подавления дребезга контактов на примере подключения тактовой кнопки к Arduino.
Как избавиться от дребезга контактов при подключении кнопки к Arduino
Мы уже рассматривали подключение кнопки к Arduino и затрагивали вопрос «дребезга» контактов. Это весьма неприятное явление, которое вызывает повторные нажатия кнопки и усложняет программную обработку нажатий кнопки. Давайте же поговорим о том, как избавиться от дребезга контактов.
Инструкция по гашению дребезга контактов с помощью Arduino
Для проекта нам понадобится:
1 Проявление эффекта «дребезга» контактов
«Дребезг» контактов – это явление, свойственное механическим переключателям, кнопкам, тумблерам и реле. Из-за того, что контакты обычно делают из металлов и сплавов, которые обладают упругостью, при физическом замыкании они не сразу устанавливают надёжное соединение. В течение короткого промежутка времени контакты несколько раз смыкаются и отталкиваются друг от друга. В результате этого электрический ток принимает установившееся значение не моментально, а после череды нарастаний и спадов. Длительность этого переходного эффекта зависит от материала контактов, от их размера и конструкции. На иллюстрации показана типичная осциллограмма при замыкании контактов тактовой кнопки. Видно, что время от момента переключения до установившегося состояния составляет несколько миллисекунд. Это и называется «дребезгом».
Так выглядит эффект дребезга контактов на осциллограммах
Данные осциллограммы получены с помощью дешёвого любительского осциллографа DSO138, подробно мы рассматривали его здесь.
Этот эффект не заметен в электрических цепях управления освещением, двигателями или другими инерционными датчиками и приборами.
Но в цепях, где идёт быстрое считывание и обработка информации (где частоты того же порядка, что и импульсы «дребезга», или выше), это является проблемой. В частности, Arduino UNO, который работает на частоте 16 МГц, отлично ловит «дребезг» контактов, принимая последовательность единиц и нулей вместо единичного переключения от 0 к 1.
2 Подключение кнопки к Arduino для демонстрации подавления «дребезга»
Давайте посмотрим, как дребезг контактов влияет на правильную работу схемы. Подключим к Arduino тактовую кнопку по схеме со стягивающим резистором. Будем по нажатию кнопки зажигать светодиод и оставлять включённым до повторного нажатия кнопки. Для наглядности подключим к цифровому выводу 13 внешний светодиод, хотя можно обойтись и встроенным.
Схема подключения кнопки к Arduino для демонстрации подавления эффекта «дребезга» контактов
3 Алгоритм подавления«дребезга» контактов
Чтобы реализовать задачу подавления дребезга контактов, первое, что приходит в голову:
Напишем такой скетч и загрузим в память Arduino.
Скетч обработки нажатия кнопки без учёта эффекта дребезга контактов
При включении схемы в работу, сразу виден эффект дребезга контактов. Он проявляется в том, что светодиод загорается не сразу после нажатия кнопки, или загорается и тут же гаснет, или не выключается сразу после нажатия кнопки, а продолжает гореть. В общем, схема работает не стабильно. И если для задачи с включением светодиода это не столь критично, то для других, более серьёзных задач, это просто неприемлемо.
4 Подавление дребезга контактовс помощью задержки
Постараемся исправить ситуацию. Мы знаем, что дребезг контактов проявляет себя в течение нескольких миллисекунд после замыкания контактов. Давайте после изменения состояния кнопки выжидать, скажем, 5 мсек. Это время для человека является практически мгновением, и нажатие кнопки человеком обычно происходит значительно дольше – несколько десятков миллисекунд. А Arduino прекрасно работает с такими короткими промежутками времени, и эти 5 мсек позволят ему отсечь дребезг контактов от нажатия кнопки.
Скетч обработки нажатия кнопки с задержкой для устранения эффекта дребезга контактов
В данном скетче мы объявим процедуру debounce() («bounce» по-английски – это как раз «дребезг», приставка «de» означает обратный процесс), на вход которой мы подаём предыдущее состояние кнопки. Если нажатие кнопки длится более 5 мсек, значит это действительно нажатие. Определив нажатие, мы меняем состояние светодиода.
Загрузим скетч в плату Arduino. Теперь всё гораздо лучше! Кнопка срабатывает без сбоев, при нажатии светодиод меняет состояние, как мы и хотели.
5 Библиотеки для подавлениядребезга контактов
Библиотека Bounce2 содержит следующие методы:
Название | Назначение |
---|---|
Bounce() | инициализация объекта Bounce; |
void interval (мсек) | устанавливает время задержки в миллисекундах; |
void attach (номерПина) | задаёт вывод, к которому подключена кнопка; |
int update() | обновляет объект и возвращает true, если состояние пина изменилось, и false в противном случае; |
int read() | считывает новое состояние пина. |
Перепишем наш скетч с использованием библиотеки. Можно также запоминать и сравнивать прошлое состояние кнопки с текущим, но давайте упростим алгоритм.
Скетч обработки нажатия кнопки с использованием библиотеки для устранения влияния дребезга контактов
При нажатии кнопки будем считать нажатия, и каждое нечётное нажатие будем включать светодиод, каждое чётное – выключать. Такой скетч смотрится лаконично, его легко прочитать и легко применить.
Подавление дребезга контактов с помощью Arduino
Ну и напоследок пара видео от Джереми Блюма, где он рассказывает о способах подавления дребезга контактов на примере подключения тактовой кнопки к Arduino.
Урок 2. Нажатие кнопки без ложных срабатываний. Устраняем дребезг кнопки
Самое распространенное это смена состояния при нажатии на кнопку.
Вроде бы что тут сложного! Определил, что кнопка нажата и сменил состояния. Например включил светодиод. Но не так все проста при нажатии кнопки происходит так называемы дребезг. Состояние несколько раз меняет с высокого на низкое пока не примет устойчивое.
Как видно на картинке. Дребезг есть не только при нажатие на кнопку но и когда мы ее отпускаем.
Как же бороться с дребезгом кнопки?
Существует несколько вариантов:
1. Аппаратное. Поставит дополнительные компоненты в электрическую схему. Самый простой, поставить конденсатор, который будет сглаживать импульсы. Но конденсатор не всегда справляется со своей задачей и поэтому используют более сложные схемы подключения.
2. Программный. Дребезг длиться не очень долго. И если сделать задержку между считыванием значения с кнопки, можно полностью устранить ложные срабатывание. Но тут есть тоже сложность и варианты решения.
Можно использовать библиотеку Bounce или написать свою небольшую функцию.
Написать функцию, на мой взгляд, понятнее и я сам использую данный вариант. Если будет предложения или просьбы по объяснению использования библиотеки, напишу дополнительный урок. Так что пишите в комментарии или в группу в ВК.
Для урока нам понадобиться:
Электрическая принципиальная схема.
Функция boolean debvance достаточно простая. Получаем прошлое состояние кнопки.
Ждем 5 миллисекунд. И
И возвращаем значение current.
Осталось в скетче прописать небольшие изменения.
Всего одна строчка для работы с функцией
Также нужно проверить
После условия нужно обязательно сделать переприсваивание
Остальной код пишется под ваши задачи. В данном случае включаем светодиод.
Не очень много кода и не надо дополнительных элементов при сборке схемы.
В моих проектах на Ардуино вы можете найти использование данного кода.
Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.
Спасибо за внимание!
Понравилась статья? Поделитесь ею с друзьями:
Ардуино для начинающих. Урок 6. Дребезг контактов
В этом уроке мы поговорим о том: что такое дребезг контактов, почему он появляется и как от него избавится. В среде Arduino это сделать достаточно просто. Для этого не понадобится дополнительно усложнять схему или подключать лишние библиотеки. В прошлом уроке мы уже говорили о дребезге контактов и написали небольшую функцию, которая помогала нам считывать чистые значения с кнопки. Сейчас я решил более подробно разобраться с дребезгом контактов.
Так что же такое дребезг контактов?
Дребезг контактов — это явление, происходящее в электромеханических устройствах и аппаратах (кнопках, реле, герконах, переключателях, контакторах), длящееся некоторое время после замыкания электрических контактов. После замыкания (нажатия кнопки, включения реле и т.д.) происходят многократные неконтролируемые замыкания и размыкания контактов за счет упругости материалов и деталей контактной системы — некоторое время контакты «подпрыгивают» при соударениях, размыкая и замыкая электрическую цепь. На графике ниже схематически изображен дребезг при нажатии кнопки.
Как понятно из определения дребезг контактов это временное явление. Оно может длиться от 0,5 до нескольких сотен миллисекунд. Все зависит от материалов, размеров и устройства электромеханического прибора. В масштабах ардуино это несколько миллисекунд. Именно поэтому в прошлом уроке мы написали функцию подавления дребезжания с помощью задержки в 5 миллисекунд.
Как избавиться от дребезга контактов на Arduino?
Все очень просто. Мы делали это в прошлом уроке. Возьмем пример от туда. Схема и скетч будут следующие:
Электронные печеньки
Arduino, DIY и немного этих ваших линуксов.
Дребезг контактов и способы подавления дребезга.
Что такое дребезг контактов
Дребезг контактов на экране осциллографа
Дребезг контактов — явление, возникающее в электрических и электронных переключателях, при котором они вместо некоторого стабильного переключения производят случайные многократные неконтролируемые замыкания и размыкания контактов (происходит в момент переключения, приблизительно в течение 40—100 мс). Иными словами — это явление, вызванное неизбежным несовершенством технологии изготовления переключателей.
При нажатии на тактовую кнопку, перед тем, как контакты плотно соприкоснутся, они будут колебаться (т.е. «дребезжать»), порождая множество срабатываний вместо одного. Соответственно, микроконтроллер «поймает» все эти нажатия, потому что дребезг не отличим от настоящего нажатия на кнопку. В статье рассмотрены несколько способов, позволяющих избежать дребезга.
Для понимания сути, нам нужно рассмотреть простой код, который зажигает встроенный в плату Arduino светодиод на пине 13 при нажатии кнопки и гасит светодиод при следующем нажатии. Кнопка подключена ко второму пину (о подключении кнопки читайте статью « Как подключить кнопку к Arduino »):
Это рабочий код, но из-за дребезжания контактов кнопки он поймает много лишних срабатываний. Причём всё происходит так быстро, что программа успеет поймать ложные срабатывания несколько раз и несколько раз включить-выключить светодиод. В итоге, ваше устройство будет работать случайным образом. Если повезёт — светодиод будет гореть после нажатия. Не повезёт — цикл проскочит на состояние, когда светодиод окажется выключенным.
Программный способ избавления от дребезга
Суть программного способа в том, чтобы внутри программы отличить случайные срабатывания из-за дребезга от настоящего нажатия. Самый простой способ: добавить задержку сразу после первого срабатывания. Тогда при срабатывании кнопки мы останавливаем выполнение программы и дожидаемся, пока контакты кнопки перестанут дребезжать. Ложных срабатываний не будет.
Этот способ прост и понятен, но имеет недостаток: выполнение программы останавливается при нажатии кнопки, что может быть недопустимо в некоторых случаях, а при использовании прерывания невозможно в принципе. Следующий вариант избавления от дребезга, засекать время, прошедшее от первого срабатывания кнопки с помощью функции millis:
Этот код обеспечивает избавление от дребезга и при этом не блокирует выполнение программы, как это происходит при использовании функции delay.
Еще одним способом избавлением от дребезга является использование библиотеки Bounce. В ней уже все предусмотрено, и для чтения значения на входе используются специальные функции:
Вот так просто работает эта библиотека. Предположительное значение дребезга лучше подбирать экспериментально, оно сильно зависит от качества изготовления конкретной кнопки.
Аппаратный способ подавления дребезга
Аппаратные решения всегда ценились за их надёжность и возможность облегчить написание программы.
Вот как выглядела схема подключения кнопки без аппаратной защиты от дребезга:
Схема подключения кнопки к Arduino
Добавив пару дополнительных элементов в схему мы сможем полностью избавиться от дребезга, не усложняя при этом код. А добавим мы инвертирующий триггер Шмитта и конденсатор. Мы построим RC-цепь с инвертирующим триггером.
Вот так это выглядит на схеме:
Резистор 10 кОм у нас теперь подтягивает вывод не к земле, а к +5В. Причём подтягивается не вход Ардуино, а вход инвертирующего триггера и заодно, конденсатор. Кнопка же, наоборот, подключена к земле. Сделано это в связи с тем, что триггер у нас инвертирующий. Суть такова: входящий аналоговый сигнал может быть восходящим, либо нисходящим. Внутри триггера определены пороговые значения:
1,6 В — для нисходящего сигнала и
0,9 В — для восходящего. Выход триггера становится логической единицей (5 В), при прохождении нисходящим сигналом через свой порог в 0,9 В, при этом нисхождение восходящим сигналом верхнего порога в 1,6 В будет проигнорировано. Аналогично, выход триггера становится логическим нулём (0 В), только когда восходящий сигнал проходит свой порог в 1,6 В, при этом проигнорируется прохождение нисходящим сигналом нижнего порога в 0,9 В. Зона неопределённости между порогами называется гистерезисом. То есть триггер переворачивает сигнал. Конденсатор с резистором образует RC-цепь. RC — от английских названий резистора и конденсатора (resistor и capacitor). RC-цепь замедляет затухание сигнала. То есть при снятии напряжения, оно пропадёт не сразу, а будет плавно снижаться. При нажатии кнопки мы прижмём RC-цепь к земле, конденсатор начнёт разряжаться и напряжение начнёт плавно падать. После отпускания кнопки, напряжение начнёт так же плавно расти:
График изменения напряжения RC-цепи
Инвертирующий триггер выполняет 2 функции:
1) он инвертирует (переворачивает) логические уровни: единица становится нулём, а ноль становится единицей.
2) он преобразует аналоговый сигнал в цифровой. То есть, в определённый момент, когда конденсатор разрядится до определённого уровня, триггер выдаст логическую единицу. Затем это нужно? При отпускании кнопки, при достижении определённого уровня заряда конденсатора, триггер установит на выходе низкий уровень. Сигнал на выходе триггера не будет зависеть от дребезга:
График изменения напряжения на выходе инвертирующего триггера Шмитта