Как бороться с дребезгом контактов в Ардуино?

Причины дребезга кнопок

Кнопка ардуино – один из самых популярных и простых видов датчиков. В основе работы любой кнопки лежит механический способ смыкания-размыкания контактов. Нажимая на любую, даже самую простую тактовую кнопку, мы формируем определенное давление на внутренние механизмы (пластины или пружины), в результате чего происходит сближение или расхождение металлических пластин.


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

Иллюстрация дребезга кнопки

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

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

Теория

Что такое дребезг контактов? Когда вы нажимаете на кнопку или на микропереключатель или изменяете положение тумблера, два металлических контакта замыкаются. Для пользователя может показаться, что контакт наступил мгновенно. Это не совсем правильно. Внутри коммутатора есть движущиеся части. Когда вы нажимаете на коммутатор, он вначале создает контакт между металлическими частями, но только в кратком разрезе микросекунды. Затем он делает контакт немного дольше, а затем еще немного дольше. В конце коммутатор полностью замыкается. Коммутатор скачет (дребезжит) между состояниями наличия и отсутствия контакта. «Когда коммутатор замыкается, два контакта фактически разъединяются и снова соединяются обычно от 10 до 100 раз за время, примерно равное 1 мс» («Искусство схемотехники», Хоровиц и Хилл, второе издание). Обычно оборудование работает быстрее, чем дребезг, что приводит к тому, что оборудование думает, что вы нажали на кнопку несколько раз. Оборудование часто является интегральной микросхемой. Следующие скриншоты иллюстрируют типовой дребезг контактов без какой-либо обработки:


Осциллограмма дребезга контактов

Каждый коммутатор обладает своими собственными характеристиками относительно дребезга. Если вы сравните два одинаковых коммутатора, есть большая вероятность того, что они будут «дребезжать» по-разному.

Я покажу вам дребезг четырех разных коммутаторов. Я меня есть две микрокнопки, 1 кнопка и 1 тумблер:


Исследуемые коммутаторы

Ошибки дребезга кнопки

Проще всего заметить основные проблемы, которые доставляет дребезг контактов на Аrduino, на непосредственном проекте, в котором прописан код для обработки события нажатия кнопки.

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

Этого времени вполне достаточно, чтобы код успел отреагировать на «шумы» при нажатии кнопки. А теперь представьте себе ситуацию – в вашей программе прописано запускать процесс, как только кнопка нажимается, и выключать, как только её отпускают. Для регистрации обоих событий применяется перепад напряжения. В результате цикл будет несколько раз запускать и закрывать функции, пока происходит дребезг контактов. Если всё это происходит ещё и в многопоточном режиме, то нагрузку в стеке микроконтроллера не сложно вообразить.

Настройка оборудования

Все коммутаторы будут подключены одинаково (это важно, если мы собираемся сравнивать результаты). Сначала мы увидим, как коммутаторы ведут себя без обработки. Основой нашей схемы будет HCF4017BE. Это десятичный счетчик/делитель, производимый STMicroelectronics. Они больше не производят эту микросхему, так как этот тип устарел. Тем не менее, есть много других производителей, которые всё еще выпускают эту маленькую микросхему, и они часто совместимы по контактам.

Микросхема получает тактовый импульс на вывод 14, после чего загорается светодиод, подключенный к Q1. Когда принимается следующий тактовый импульс, микросхема отключает Q1 и зажигает Q2, и так далее. Когда счетчик достигает Q8 (вывод 9), он подает импульс на вывод 15, который является выводом сброса. Это означает запуск отсчета, начиная с Q0.

Наша основная схема:

Схема тестового макета (описание выше)Схема тестового макета (описание выше)

Сначала мы попробуем не обрабатывать дребезг совсем. Схемы подачи тактового сигнала показаны ниже:

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

Видео:

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

Для коммутатора A:

Дребезг контактов коммутатора AДребезг контактов коммутатора A

Для коммутатора B:

Дребезг контактов коммутатора BДребезг контактов коммутатора B

Для коммутатора C:

Дребезг контактов коммутатора CДребезг контактов коммутатора C

Для коммутатора D:

Дребезг контактов коммутатора DДребезг контактов коммутатора D

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

Дребезг контактов коммутатора C (импульс соответствует логическому нулю)Дребезг контактов коммутатора C (импульс соответствует логическому нулю)

Как вы можете видеть, микросхеме кажется, что было несколько нажатий на коммутатор. Хотя это и не так, поскольку на коммутатор было выполнено только одно нажатие.

Добавим керамический конденсатор:

При добавлении конденсатора мы создаем RC-цепь. RC-цепи здесь не обсуждаются.

Новые скриншоты осциллографа сильно отличаются от полученных ранее. Это показывает, что RC-цепь отфильтровывает дребезг.

Данное видео показывает, как работает схема с керамическим конденсатором 0,1 мкФ:

Для коммутатора A:

Сигнал с коммутатора A после добавления конденсатораСигнал с коммутатора A после добавления конденсатора

Для коммутатора B:

Сигнал с коммутатора B после добавления конденсатораСигнал с коммутатора B после добавления конденсатора

Для коммутатора C:

Сигнал с коммутатора C после добавления конденсатораСигнал с коммутатора C после добавления конденсатора

Для коммутатора D:

Сигнал с коммутатора D после добавления конденсатораСигнал с коммутатора D после добавления конденсатора

Для коммутатора C (импульс соответствует логическому нулю):

Сигнал с коммутатора C после добавления конденсатора (импульс соответствует логическому нулю)Сигнал с коммутатора C после добавления конденсатора (импульс соответствует логическому нулю)

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

См. также

  • Гистерезис
  • Байпас

Литература

Титце У., Шенк К. Полупроводниковая схемотехника. Том I. — 12-е изд.. — М.: ДМК-Пресс, 2007. — 832 с. — ISBN 5940741487.

ESP8266 и дребезг контактов

Для сборки триггера Шмитта на водосчетчике потребуются следующие компоненты (ссылки на Aliexpress):

  • Wemos D1 mini.
  • Wemos D1 mini RTC shield. Напряжение питание чипа 5V, поэтому shield не пригоден для питания от батареи 3,7 V.
  • Wemos breadboard.
  • Триггер Шмитта SN74HC14N. Datasheet.
  • Резисторы 1 кОм — 2 шт.
  • Резисторы 10 кОм — 2 шт.
  • Конденсаторы керамические 100 nF (0,1 mkF) — 2 шт.
  • Батарея 18650.
  • Кейс для батареи 18650.

Wemos D1 mini RT использует следующие контакты для RTC:

Wemos D1 mini (ESP8266) Описание ESP32
D1 (GPIO5) SCL GPIO 22 (SCL)
D2 (GPIO4) SDA GPIO 21 (SDA)
5V 5V
GND GND

SD card reader использует контакты:

Wemos D1 mini (ESP8266) Описание ESP32 VSPI ESP32 HSPI
D5 (GPIO 14) CLK/SCK GPIO18 GPIO14
D6 (GPIO 12) DO/MISO GPIO19 GPIO12
D7 (GPIO13) DI/MOSI GPIO23 GPIO13
D8 (GPIO 15) CS/SS GPIO5 GPIO15

Свободными осталось немного: D0 (GPIO16), D3 (GPIO0), D4 (GPIO3). И это все проблемные входы:

  • Вход D0 Wemos D1 mini не поддерживает обработку прерываний, соответственно, не подходит.
  • D3, D4 — входы на которых при рестарте/загрузке ESP8266 должен быть определенный уровень сигнала. Если он будет другим, то микропрограмма ESP8266 не загрузится. Т.е., при каждой перезагрузке нужно отключать выводы.
  • К D4 на Wemos D1 mini подсоединен LED.

В общем, получается, что одновременно подключить RTC с карт- ридером и модуль с триггером Шмитта не получится. Либо придется в схему добавлять чип, позволяющий расширить кол-во входов. Впрочем, особого смысла в RTC и карт-ридере нет, если воспользоваться примером кода для получения времени с NTP серверов.


Выводы триггера Шмитта SN74HC14

Что понадобится для проекта

Устранить явление перекоммутации можно 2 способами:

  1. Аппаратным.
  2. Программным.
Перекоммутация

Устранить явление можно аппаратным и программным способами.

Для реализации аппаратного метода понадобится либо конденсатор, либо RS-триггер (триггер Шмитта). При выборе программного способа устранения достаточно написать в коде прошивки микроконтроллера несколько строк.

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

Литература

Титце У., Шенк К. Полупроводниковая схемотехника. Том I. — 12-е изд.. — М.: ДМК-Пресс, 2007. — 832 с. — ISBN 5940741487.

Программный метод

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

  • путём временной задержки сигнала, на период вероятного дребезга контактов;
  • методом многократного считывания состояния контактов, на заданном временном интервале. Программа считает цепь замкнутой, если на этом промежутке времени наступает период устойчивого замыкания контакта;
  • используя алгоритм подсчёта, при котором учитывается количество совпадающих значений сигналов замкнутости в определённый промежуток времени (в пределах от 10 до 100 мкс). Если программой будет замечено заданное число совпадений состояния замкнутости, она посчитает контакт устойчиво замкнутым и пропустит сигнал.

Сигнал, полученный программным способом, довольно надёжный и устойчивый. К недостаткам такой схемы подавления дребезга можно отнести разве что небольшую задержку сигнала, которая не превышает 0,1 с. Этот промежуток времени настолько мал, что им можно пренебречь во многих случаях. Обычно палец человека задерживается на клавише до момента отпускания кнопки свыше 0,2 с.

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

Программируемое устройство для устранения дребезгаПрограммируемое устройство для устранения дребезга

4Подавление дребезга контактовс помощью задержки

Постараемся исправить ситуацию. Мы знаем, что дребезг контактов проявляет себя в течение нескольких миллисекунд после замыкания контактов. Давайте после изменения состояния кнопки выжидать, скажем, 5 мсек. Это время для человека является практически мгновением, и нажатие кнопки человеком обычно происходит значительно дольше – несколько десятков миллисекунд. А Arduino прекрасно работает с такими короткими промежутками времени, и эти 5 мсек позволят ему отсечь дребезг контактов от нажатия кнопки.
Скетч обработки нажатия кнопки с задержкой для устранения эффекта дребезга контактов int switchPin = 2; // пин кнопки int ledPin = 13; // пин светодиода boolean lastButton = false; // предыдущее состояние кнопки boolean currentButton = false; // текущее состояние кнопки boolean ledOn = false; // состояние светодиода void setup() {
pinMode (switchPin, INPUT); pinMode (ledPin, OUTPUT);

} void loop() { currentButton = debounce (lastButton); // получаем состояние кнопки без дребезга if (lastButton == false && currentButton == true) { // если кнопка была нажата дольше 5 мсек, ledOn = !ledOn; // то меняем состояние светодиода } lastButton = currentButton; // обнуляем состояние нажатия кнопки digitalWrite (ledPin, ledOn); // зажигаем/гасим светодиод

} // Процедура определения нажатия кнопки без дребезга:

boolean debounce(boolean last) { boolean current = digitalRead(switchPin); // считываем текущее состояние кнопки if (last != current) { // если состояние изменилось delay(5); // делаем задержку на 5 мсек, пока уляжется дребезг current = digitalRead(switchPin); // и считываем снова } return current; // возвращаем текущее состояние кнопки

} В данном скетче мы объявим процедуру debounce() («bounce» по-английски – это как раз «дребезг», приставка «de» означает обратный процесс), на вход которой мы подаём предыдущее состояние кнопки. Если нажатие кнопки длится более 5 мсек, значит это действительно нажатие. Определив нажатие, мы меняем состояние светодиода.

Загрузим скетч в плату Arduino. Теперь всё гораздо лучше! Кнопка срабатывает без сбоев, при нажатии светодиод меняет состояние, как мы и хотели.

Алгоритм подавления

Принцип аппаратного способа устранения дребезга состоит в следующем:

  1. При использовании конденсатора. Напряжение на нем не может измениться мгновенно, поэтому множество коротких переходных процессов соединяются в 1 процедуру.
  2. При использовании RS-триггера (триггера Шмитта). Это устройство, которое имеет только 1 активное положение — сброшен/установлен (логические ноль/единица).
Алгоритм подавления

RS-триггер представляет собой простейший управляющий автомат.

Алгоритм действия программного метода состоит в следующем:

  • считать состояние клавиши;
  • подождать фиксированный отрезок времени;
  • проверить статус клавиши еще раз (если он не изменился, то считать кнопку нажатой, если обновился, то определить нажатие ложным и никак не реагировать на него).

Теги

MCUДребезг контактовКлючКнопкаМикроконтроллер

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.

Ссылки

  • Программный алгоритм опроса контакта с очисткой от дребезга и эмуляцией автоповтора нажатия.

Аппаратный способ подавления дребезга кнопки

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

Более правильный (и более сложный) способ борьбы с дребезгом – использование аппаратного решения, сглаживающего импульсы, посылаемые с кнопки. Для этого, правда, придется внести изменения в схему.

Аппаратный способ устранения дребезга основан на использовании сглаживающих фильтров. Сглаживающий фильтр, как следует из названия, занимается сглаживанием всплесков сигналов за счет добавления в схему элементов, имеющих своеобразную “инерцию” по отношению к таким электрическим параметрам как ток или напряжение. Самым распространенным примером таких “инерционных” электронных компонентов является конденсатор. Он может “поглощать” все резкие пики, медленно накапливая и отдавая энергию, точно так же, как это делает пружина в амортизаторах.

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

Пример простого фильтра на базе RC-цепочки

Схема подключение фильтра для устранения дребезга:

Пример подключения к плате ардуино

Форма сигнала после использования фильтра:

Как видим, “лес” дребезга сменился достаточно плавной линией, с которой уже можно работать дальше.

Подавление дребезга с помощью триггера шмидта

Сделать квадратную форму сигнала с помощью простой RC цепочки невозможно. Для “огранения” сглаженных форм используется специальный компонент, который называется триггер шмидта. Его особенностью является срабатывание при достижении определенного уровня сигнала. На выходе триггера шмидта мы получим или высокий или низкий уровень сигнала, никаких промежуточных значений. Выход триггера инвертированный: при спаде входного сигнала он выдает на выходе включение и наоборот. Ниже представлена схема и результат работы с триггером шмидта.

Иллюстрация результата работы:

Как видим, мы практически полностью избавились от результатов переходных процессов, сперва превратив хаос в почти гладкую кривую линию, а затем с помощью триггера шмидта “отрубили” хвосты, придав сигналу практически идеальный вид. Подав его на вход ардуино, мы уже можем не беспокоиться о ложных срабатываниях и смело использовать в скетче метод digitalRead и прерывания.

Подключение кнопки к arduino

Подключение кнопки к arduino – это один из первых шагов, которые совершаются при знакомстве с ардуино. Описывать тут особо нечего, поэтому перейду сразу к сути. Для подключения достаточно всего трех ножек кнопки. Одна соединяется с пином ардуино, на котором и будет считываться положение кнопки, вторая нога соединяется с плюсом, а третья, через резистор подтянута к земле. Сопротивление резистора должно быть от 10 до 100 кОм. Схема подключения:

Схема подключения кнопки к ардуино

( 2 оценки, среднее 4.5 из 5 )

Примечания[ | ]

  1. Предлагалось применить дребезг контактов для генерации случайных последовательностей чисел, длительности замыканий-размыканий случайны и подчиняются нормальному распределению.
  2. Недостатком данной схемы является необходимость применения именно переключающего контакта, а не простейшего нормально разомкнутого или нормально замкнутого контакта
Для улучшения этой статьи желательно:
  • Найти и оформить в виде сносок ссылки на независимые авторитетные источники, подтверждающие написанное.

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

Подключение кнопки к микроконтроллеру

Простейшая схема подключения кнопки к микроконтроллеру выглядит следующим образом:

Подключение кнопки к микроконтроллеру

Подключение кнопки к микроконтроллеру

Если ключ S1 разомкнут (кнопка отпущена), то на цифровом входе Din микроконтроллера мы будем иметь напряжение 5В, соответствующее логической единице. При нажатой кнопке вход Din подключается к земле, что соответствует уровню логического нуля и все напряжение у нас упадет на резисторе R1, величину которого выбирают исходя из того, чтобы при нажатой кнопке через него протекал не слишком большой ток (обычно порядка 10÷100 кОм).

Если же просто подключить кнопку между цифровым входом и землей (без резистора R1, подключенного к +5В) или между входом и +5В, то в положении, когда кнопка не нажата на цифровом входе микроконтроллера будет присутствовать неопределенное напряжение (может соответствовать уровню 0, а может и 1) и мы бы считывали случайные состояния. Поэтому используется резистор R1, который, как говорят, «подтягивает» вход к +5В при отпущенной кнопке.

Считывая состояние цифрового входа микроконтроллера, мы сможем определить нажата кнопка (состояние логического 0) или же нет (будем получать на входе логическую единицу).

Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...