Устранение дребезга контактов кнопки

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

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

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

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

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

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

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

Как отразится дребезг на нашем проекте? Да самым прямым образом – мы будем получать на входе совершенно случайный набор значений. Ведь если мы считываем значение с кнопки непрерывно, в каждом новом рабочем цикле функции loop, то будем замечать все “всплески” и “падения” сигнала. Потому что пауза между двумя вызовами loop составляет микросекунды и мы измерим все мелкие изменения.

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

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

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

Программный способ устранения дребезга кнопок

Самым простым способом справиться с проблемой дребезга кнопки является выдерживание паузы. Мы просто останавливаемся и ждем, пока переходный процесс не завершится. Для этого можно использовать функцию delay()или millis() (за подробной информации можете обратиться к статье про использование функций delay() и millis() в ардуино). 10-50 миллисекунд – вполне нормальное значение паузы для большинства случаев.

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

Борьба с дребезгом кнопки с помощью библиотеки ардуино

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

Пример использования библиотеки:

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

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

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

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

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

Читайте также:  Чем можно накурится в домашних условиях

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

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

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

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

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

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

Как отразится дребезг на нашем проекте? Да самым прямым образом – мы будем получать на входе совершенно случайный набор значений. Ведь если мы считываем значение с кнопки непрерывно, в каждом новом рабочем цикле функции loop, то будем замечать все “всплески” и “падения” сигнала. Потому что пауза между двумя вызовами loop составляет микросекунды и мы измерим все мелкие изменения.

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

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

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

Программный способ устранения дребезга кнопок

Самым простым способом справиться с проблемой дребезга кнопки является выдерживание паузы. Мы просто останавливаемся и ждем, пока переходный процесс не завершится. Для этого можно использовать функцию delay()или millis() (за подробной информации можете обратиться к статье про использование функций delay() и millis() в ардуино). 10-50 миллисекунд – вполне нормальное значение паузы для большинства случаев.

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

Борьба с дребезгом кнопки с помощью библиотеки ардуино

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

Читайте также:  Сын ничего не добился

Пример использования библиотеки:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Использование триггера в качестве переключателя

В предыдущих частях статьи было рассказано о триггерах типа D и JK. Здесь уместно будет вспомнить о том, что эти триггеры могут работать в счетном режиме. Это означает, что с приходом на тактирующий вход (для обоих триггеров это вход С) очередного импульса состояние триггера меняется на противоположное.

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

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

Состояние триггера лучше всего контролировать с помощью светодиодного индикатора, неоднократно описанного в предыдущих частях статьи, либо просто с помощью вольтметра. Почему такое происходит, почему, так нестабильно работает триггер, в чем тут причина?

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

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

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

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

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

Выход из положения показан на рисунке 1.

Рисунок 1. Формирователь импульсов на RS – триггере.

Проще всего устранить дребезг контактов при помощи уже хорошо нам знакомого RS – триггера, который собран на логической микросхеме К155ЛА3, точнее на ее элементах DD1.1 и DD1.2. Условимся, что прямой выход RS – триггера это вывод 3, соответственно инверсный выход это вывод 6.

Читайте также:  Суфд сервер не найден

Когда RS – триггер собирается из элементов логических микросхем, приходится делать такое соглашение. Если же триггером является готовая микросхема, например К155ТВ1, положение прямого и инверсного выходов оговорено ее справочными данными. Но, даже и в этом случае, если не используются JK и C входы, а микросхема используется просто как RS – триггер, вышеупомянутое соглашение может быть вполне уместно. Например, для удобства монтажа микросхемы на плате. Конечно, при этом RS – входы также меняются местами.

В положении переключателя, показанном на схеме, на прямом выходе RS – триггера уровень логической единицы, а на инверсном, естественно, логический нуль. Состояние счетного триггера DD2.1 пока остается таким, в каком он оказался при включении питания.

Если в этом есть необходимость, то его можно сбросить при помощи кнопки SB2. Чтобы сбросить триггер в момент включения питания между R – входом и общим проводом подключают конденсатор небольшой емкости, в пределах 0,05…0,1 мкФ, а между плюсом питания и R – входом резистор сопротивлением 1…10 КОм. Пока конденсатор не зарядится на R – входе кратковременно присутствует напряжение логического нуля. Этого короткого нулевого импульса вполне достаточно для сброса триггера. Если по условиям работы устройства необходимо триггер при включении питания установить в единичное состояние, то такую RC – цепочку подключают к S – входу. Абзац об RC – цепочке будем считать лирическим отступлением, а теперь продолжим про борьбу с дребезгом контактов.

Нажатие кнопки SB1 приведет к замыканию ее правого по рисунку контакта с общим проводом. При этом на выводе 5 микросхемы DD1.2 появится целая серия импульсов дребезга. Но быстродействие микросхем даже самых медленных серий намного выше, чем быстродействие механических контактов. И поэтому первым же импульсом RS – триггер сбросится в нулевое состояние, чему соответствует высокий уровень на инверсном выходе.

В этот момент на нем формируется положительный перепад напряжения, который по C – входу переключает триггер DD2.1 в противоположное состояние, что можно наблюдать при помощи светодиода HL2. Последующие импульсы дребезга влияние на состояние RS – триггера не оказывают, поэтому состояние триггера DD2.1 остается неизменным.

При отпускании кнопки SB1 триггер на элементах DD1.1 DD1.2 переходит снова в единичное состояние. В этот момент на инверсном выходе (вывод 6 DD1.2) формируется отрицательный перепад напряжения, который не изменяет состояние триггера DD2.1. Для того чтобы вернуть счетный триггер исходное состояние кнопку SB1 придется нажать еще раз. С таким же успехом в подобном устройстве будет работать и JK – триггер.

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

Меры по устранению ложных срабатываний, защита от помех

На схеме можно увидеть новую деталь – конденсатор C1, установленный в цепи питания триггеров. Каково его назначение? Основная его задача это защита от помех, к которым чувствительны не только триггеры, но и все остальные микросхемы.

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

Чтобы этого не произошло на шинах питания и устанавливают блокировочные конденсаторы. Практически такие конденсаторы емкостью 0,033…0,068 мкФ устанавливаются из расчета один конденсатор на каждые две-три микросхемы. Монтаж этих конденсаторов производится как можно ближе к выводам питания микросхем.

Еще одним источником ложных срабатываний микросхем могут стать неиспользуемые входные выводы. Паразитные импульсы помех будут наводиться в первую очередь именно на таких выводах. Для борьбы с ложными срабатываниями неиспользуемые входные выводы следует подключать через резисторы сопротивлением 1…10 КОм к плюсовой шине источника питания. Кроме того, если в схеме есть неиспользуемые логические элементы И – НЕ, то их входы следует соединить с общим проводом, отчего на выходе таких элементов появится логическая единица, а уже к ним подключать неиспользуемые входы триггеров.

Если в качестве источника сигнала для микросхемы используется тумблер или кнопка, то совершенно недопустима ситуация когда контакт разомкнут, а достаточно длинный провод остается «висеть в воздухе». Уж такая антенна будет принимать помехи весьма успешно. Поэтому такие проводники следует обязательно подключать к плюсовой шине питания через резистор сопротивлением 1…10 КОм.

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

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

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

Нетрудно видеть, что эти формирователи выполнены на микросхемах серии К561, которая относится к КМОП микросхемам, поэтому номиналы резисторов и конденсаторов указаны именно для таких микросхем. Эти формирователи должны использоваться в схемах, построенных на микросхемах серий К561, К564, К176 и подобных.

Оцените статью
Добавить комментарий

Adblock
detector