Убираем дребезг кнопки ардуино

Убираем дребезг кнопки ардуино

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

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

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

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

Чаще всего с дребезгом сталкиваются при подключении кнопки, но почему так происходит? Вот пример при котором это будет:

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

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

Пример программного решения проблемы:

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

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

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

Однако, когда мы сталкиваемся с системами, способными фиксировать состояние объектов вплоть до миллисекунды, все эти процессы становятся заметными и крайне проблемными. А всё дело в том, что каждая строчка кода, которую вы прописываете при программировании системы, каким-то образом должна учитывать и обрабатывать все сигналы, в том числе и тот самый пресловутый «дребезг контактов».

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

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

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

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

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

Читайте также:  Циклы в c для начинающих

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

Мы поняли, что проблема чисто аппаратная, но, как ни парадоксально, со стороны «железа» её сложно исправить. Вы же не можете лично под микроскопом отполировать контакты, да ещё и просить пользователя нажимать на кнопку лишь с одной силой и на постоянной основе.

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

А всё на самом деле просто, ведь перед нами стоит такой перечень условий:

  1. На срок до 10-100 мС, система пребывает в нестабильном состоянии и может выдавать ошибки.
  2. Далее идет срок от 1 до 2-ух секунд, что в 10 раз больше от предыдущего, пока кнопку нажимают.
  3. И вновь, под конец, 10-100 мС, длится дребезг.

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

Борьба с дребезгом библиотекой "bounce"

Как вариант борьбы с дребезгом в Ардуино — библиотека Bounce, которую можно скачать на Github.

Название Назначение
Bounce() инициализация объекта "Bounce";
void interval (мсек) устанавливает время задержки в миллисекундах;
void attach (номерПина) задаёт вывод, к которому подключена кнопка;
int update() обновляет объект и возвращает true, если состояние пина изменилось, и false в противном случае;
int read() считывает новое состояние пина.

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

Хоть аппаратно баг и тяжело правится, но это возможно. Вам потребуется лишь подключить триггер Шмидта.

Это небольшое устройство, которое позволяет «сглаживать» углы трапеции, убирая все скачки напряжения. Делает оно это достаточно просто: устройство ожидает, пока сигнал достигнет определённого уровня и лишь тогда направляет его на контроллер.

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

Блог об Arduino, AVR, ARM, Linux и не только.

15 июня 2012 г.

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

Дребезг контактов — крайне неприятная вещь, от которой нужно избавляться. Можно это делать софтверно. К счастью, нам не придется самостоятельно ручками писать алгоритм в Arduino IDE, поскольку для нас разработчики уже написали библиотеку. Знакомимся с Bounce.

Когда мы нажимаем на кнопку, мы ожидаем от нее, что она нам что-то включит, и это будет радостно работать. То есть сигнал будет вести себя так:

Но все далеко не так радужно. Из-за дребезга при нажатии кнопки сигнал ведет себя вот так:

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

Дребезг можно подавлять как хардверно, так и софтверно. Распространены два программных алгоритма подавления дребезга.
Тупой алгоритм заключается в простой задержке срабатывая на несколько сот микросекунд после нажатия кнопки. Этот алгоритм тормозной и не исключает случайного нажатия.
Продвинутый алгоритм считает время нахождения кнопки в положении "нажато". Если это время больше некоторого значения, то кнопка считается действительно нажатой. Как только кнопка меняет свое состояние, счетчик обнуляется.
С Arduino нам можно не размышлять об этом, а использовать библиотеку Bounce.

Библиотека Bounce предназначена для подавления дребезга. Она предоставляет нам в пользование замечательный класс Bounce, в котором мы можем создавать объекты.

Читайте также:  Ластик в корел дро

Сам объект выглядит так:
Bounce ( byte pin, unsugned long debounce_interval),
где pin — это номер пина Arduino, на котором сидит кнопка, а debounce_interval — время дребезга.

Полезные функции в этом классе:

int update() — проверка смены состояния, возвращает 1, если состояние пина изменилось;
void interval( unsigned long interval) — изменяет время дребезга (в мс);
int read() — читает состояние пина;
void write ( int state) — устанавливает значение пина;
void rebounce(unsignet long interval) — заставляет пин менять состояние через промежуток времени, указанный в interval, даже если на самом деле оно не меняется;
unsigned long duration(void) — возвращает время в мс, в которое пин был в текущем состоянии;
bool risingEdge() — возвращает 1 во время первого чтения, если состояние пина сменилось с 0 на 1;
bool fallingEdge() — возвращает 1 во время первого чтения, если состояние пина сменилось с 1 на 0.

Библиотечку качаем отсюда. Распаковываем это безобразие в Папку_Arduino/libraries.

Кнопка при нажатии соединяет две ее левые ноги с двумя правыми. Левую ее ногу посадим на +5V, а правую подключим к пину 2. Пин 2 также должен быть притянут к земле через резистор. Светодиод подключаем к пину 8 (мне просто так захотелось) через ограничивающий резистор.

Все очень просто:

//подключаем библиотеку Bounce
#include Bounce .h>
//дефайним значения пинов с кнопкой и со светодиодом
#define BUTTON 2
#define LED 8
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer = Bounce (BUTTON,5);

//задаем начальное состояние светодиода "выключен"
int ledValue = LOW;

void setup () <
//определяем режимы работы пинов
pinMode(BUTTON, INPUT );
pinMode(LED, OUTPUT );
>

void loop () <
//если сменилось состояние кнопки
if ( bouncer. update () ) <
//если считано значение 1
if ( bouncer. read () == HIGH ) <
//если свет был выключен, будем его включать
if ( ledValue == LOW ) <
ledValue = HIGH ;
//если свет был включен, будем выключать
> else <
ledValue = LOW ;
>
//записываем значение вкл/выкл на пин со светодиодом
digitalWrite (LED,ledValue);
>
>
>

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

Теория

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

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

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

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

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

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

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

Читайте также:  Передача звука по локальной сети

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Программное подавление дребезга

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

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

Ниже показано простое программное подавление дребезга контактов для Arduino.

Код выше был написан в Arduino IDE.

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

Этот пример написан MPLAB X с компилятором XC8. Микроконтроллер – это PIC 16F628A, и я использовал внутренний генератор на 4 МГц. Вам необходимо поэкспериментировать с Bouncevalue . У меня лучше всего программа работала со значением 500.

Микроконтроллер без какого-либо подавления дребезга контактов:

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

Микроконтроллер с управлением подавлением дребезга контактов:

Как видите, светодиоды хорошо включаются и выключаются по нажатию кнопки.

Заключение

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

Ссылка на основную публикацию
Троттлинг процессора что это
Простой компьютерный блог для души) Всем привет. Сегодня мы затронем тему процессоров, а если быть точнее, то такое явление как...
Схема indesit wisl 83
Инструкции и файлы Файл Страниц Формат Размер Действие 12 pdf 250.49KB Чтобы ознакомиться с инструкцией выберите файл в списке, который...
Схема блока питания для шуруповерта 12 вольт
Аккумуляторный шуруповерт – удобный и необходимый в хозяйстве инструмент. При эксплуатации «от случая к случаю», он может верой и правдой...
Троянские программы и хакерские утилиты
В данную категорию входят программы, осуществляющие различные несанкционированные пользователем действия: сбор информации и ее передачу злоумышленнику, ее разрушение или злонамеренную...
Adblock detector