- Как бороться с дребезгом контактов в Ардуино?
- Причины дребезга контактов
- Ошибки дребезга кнопки
- Борьба с дребезгом кнопки с помощью библиотеки Ардуино
- Борьба с дребезгом библиотекой «bounce»
- Подавление дребезга с помощью триггера Шмидта
- Дребезг кнопки. Урок 2.3. Ардуино
- Дребезг кнопки
- Debounce.ino
- Полный текст программы
- Заключение
- Дребезг контактов кнопки ардуино и его подавление и удаление
- Причины дребезга кнопок
- Ошибки дребезга кнопки
- Программный способ устранения дребезга кнопок
- Борьба с дребезгом кнопки с помощью библиотеки ардуино
- Аппаратный способ подавления дребезга кнопки
- Подавление дребезга с помощью триггера шмидта
- Заключение
Как бороться с дребезгом контактов в Ардуино?
Ардуино – один из удобнейших и популярнейших микроконтроллеров на сегодняшний день. Всё это благодаря упрощенным механикам эксплуатации, проектировки систем и наличию большого количества библиотек в открытом доступе, что в несколько раз облегчает жизнь инженерам, желающим воплотить свои задумки.
Но даже в такой идеальной, казалось бы, системе, встречаются недочеты и поломки, которые могут мешать работе или просто раздражать пользователей. Давайте же разберёмся с одной из них, а именно, почему в Ардуино встречается дребезг контактов, и что с ним делать.
Причины дребезга контактов
На самом деле, данное явление встречается достаточно часто и является крайне пугающим и неприятным для начинающих ардуинщиков, которые всё ещё не знают, как с ним бороться, и что это вообще такое. С этим «багом» система может работать вполне исправно, вырубаясь лишь на короткие промежутки времени, но именно эти отключения и являются основной причиной недоумения новичков и множества проблем, поэтому справиться с проблемой стараются как можно быстрее.
Чаще всего с дребезгом сталкиваются при подключении кнопки, но почему так происходит? Вот пример при котором это будет:
Кнопка – это один из видов дополнительных модулей под Ардуино, служащих для ввода информации. В основе работы такого механизма лежит простой алгоритм работы – вы надавливаете на механический переключатель, он смыкает контакты, лежащие под оболочкой, и запускается какой-нибудь скрипт. Таким образом, при помощи давления, которое формируется при нажатии, происходит схождение или расхождение металлических пластин, которые и выступают наиболее популярными триггерами.
Программисту остается лишь написать код, который будет как-то засекать данное событие и выполнять определённые действия.
Пример программного решения проблемы:
Алгоритм работы казался бы простым, но всегда стоит помнить, что идеализированные системы не применимы на практике, и на той же практике вам приходится сталкиваться с различными их недочетами, как серьезными, так и мелкими, например, отсутствием гладких поверхностей, неровностями на контактах и, для более продвинутых, паразитной емкостью.
Соответственно, в реальности контакты соприкасаются не моментально, из-за недочетов конструкции и на короткий промежуток времени на границах пластин меняется сопротивление, вместе с взаимной емкостью.
Всё это приводит к разнообразным изменениям уровня тока и напряжения, и вместо идеальной диаграммы в виде равнобедренной прямоугольной трапеции, мы получаем промежуток из максимумов и минимумов, прежде, чем система уравновесится. Все эти процессы называются в электротехнике переходными, и, зачастую, просто незаметны для обывателя. Простейшим примером будет включение света в комнате, ведь лампа накаливания разогревается и меняет свою яркость не моментально. Но наш мозг не способен зарегистрировать всё это сам по себе.
Однако, когда мы сталкиваемся с системами, способными фиксировать состояние объектов вплоть до миллисекунды, все эти процессы становятся заметными и крайне проблемными. А всё дело в том, что каждая строчка кода, которую вы прописываете при программировании системы, каким-то образом должна учитывать и обрабатывать все сигналы, в том числе и тот самый пресловутый «дребезг контактов».
Сделать это не так легко, а неприспособленный код, хоть и скомпилируется, но будет вести себя непредсказуемо, что станет кошмаром для любого инженера. Мы разобрались в причинах, но какие же ошибки нам стоит ожидать из-за дребезга?
Ошибки дребезга кнопки
Проще всего заметить основные проблемы, которые доставляет дребезг контактов на Аrduino, на непосредственном проекте, в котором прописан код для обработки события нажатия кнопки.
Если вы уже работали с подобной задачей, то должны помнить, что для этого используется специальный цикл, дабы постоянно проверять состояние рычага и в нужный момент преобразить систему под необходимые условия, например, подав напряжение на выход. 1 такой цикл проходит за промежуток времени, зависящий от мощности процессора, но, зачастую, не превышающий нескольких миллисекунд.
Этого времени вполне достаточно, чтобы код успел отреагировать на «шумы» при нажатии кнопки. А теперь представьте себе ситуацию – в вашей программе прописано запускать процесс, как только кнопка нажимается, и выключать, как только её отпускают. Для регистрации обоих событий применяется перепад напряжения. В результате цикл будет несколько раз запускать и закрывать функции, пока происходит дребезг контактов. Если всё это происходит ещё и в многопоточном режиме, то нагрузку в стеке микроконтроллера не сложно вообразить.
Борьба с дребезгом кнопки с помощью библиотеки Ардуино
Мы поняли, что проблема чисто аппаратная, но, как ни парадоксально, со стороны «железа» её сложно исправить. Вы же не можете лично под микроскопом отполировать контакты, да ещё и просить пользователя нажимать на кнопку лишь с одной силой и на постоянной основе.
Поэтому нам придется хитрить со стороны кода и пытаться каким-то образом вписать в обработчик событий этот непростой процесс. А так как мы уже знаем природу этого явления, то примерно представляем, как его обойти или хотя бы постараться минимизировать нагрузку на систему в этот момент.
А всё на самом деле просто, ведь перед нами стоит такой перечень условий:
- На срок до 10-100 мС, система пребывает в нестабильном состоянии и может выдавать ошибки.
- Далее идет срок от 1 до 2-ух секунд, что в 10 раз больше от предыдущего, пока кнопку нажимают.
- И вновь, под конец, 10-100 мС, длится дребезг.
Все, кто работал с многопоточностью на Си, уже заприметили очевидные триггеры, от которых мы и будем отталкиваться. Дело в том, что для предотвращения проблем по программной части нам достаточно выдержать тишину на каком-то промежутке времени, пока дребезг не пройдет, то есть достаточно воспользоваться уже готовой функцией delay().
Борьба с дребезгом библиотекой «bounce»
Как вариант борьбы с дребезгом в Ардуино — библиотека Bounce, которую можно скачать на Github.
Название | Назначение |
---|---|
Bounce() | инициализация объекта «Bounce»; |
void interval (мсек) | устанавливает время задержки в миллисекундах; |
void attach (номерПина) | задаёт вывод, к которому подключена кнопка; |
int update() | обновляет объект и возвращает true, если состояние пина изменилось, и false в противном случае; |
int read() | считывает новое состояние пина. |
Подавление дребезга с помощью триггера Шмидта
Хоть аппаратно баг и тяжело правится, но это возможно. Вам потребуется лишь подключить триггер Шмидта.
Это небольшое устройство, которое позволяет «сглаживать» углы трапеции, убирая все скачки напряжения. Делает оно это достаточно просто: устройство ожидает, пока сигнал достигнет определённого уровня и лишь тогда направляет его на контроллер.
На выходе мы получаем аналогию с алгоритмом, описанным выше, но в аппаратной реализации. Оно попросту выжидает те самые скачки, и лишь затем подает напряжение, что позволяет полностью избавиться от дребезга.
Источник
Дребезг кнопки. Урок 2.3. Ардуино
Привет. Продолжаем работать с кнопками. Пожалуй, это одна из самых важных частей в любом устройстве. Ведь, без кнопок, переключателей и переменных резисторов управлять вашим устройством будет намного сложнее.
В прошлый раз мы уже попробовали подключить кнопку к ардуино, настроить пины ардуино на чтение информации и управлять светодиодом с помощью этой кнопки. Если вы уже забыли или пропустили эту статью, пожалуйста, посмотрите её.
Но подключение кнопки не такое простое как кажется на первый взгляд. Особенно, когда речь идет об ардуино и цифровых сигналах.
Так что, сегодня рассмотрим проблему дребезга кнопки и программных способах её решения.
Чтобы выполнить этот урок нам понадобятся.
- Ардуино UNO
- Макетная плата
- Перемычки
- Резистор номиналом 10 кОм
- Кнопка
- Кабель USB
Дребезг кнопки
Обычно кнопка представляет собой механическое устройство с пружиной. При нажатии на кнопку контакт срабатывает не сразу, а на протяжении нескольких миллисекунд меняется от 0 к 1 несколько раз. Соответственно, нельзя просто прочитать значение на контакте ардуино, необходимо избавиться от этого «дребезга».
Дребезг кнопки
Устранить этот эффект можно как аппаратным путем, так и программным. Но поскольку мы имеем в своем распоряжении ардуино, рассмотрим программу, которая решает эту проблему. Тем более, что такая программа уже есть в стандартной библиотеке ардуино ide.
Debounce.ino
Откроем программу из меню File — Examples — Digital — Debounce
Программа уже имеет исчерпывающий комментарий прямо в тексте, но рассмотрим как все работает.
Алгоритм довольно простой. Нам нужно сравнить состояние кнопки несколько раз через небольшой промежуток времени. Чтобы это сделать, необходимо использовать несколько переменных. Инициируем их в области объявления переменных.
Здесь мы ввели переменные buttonState и lastButtonState для проверки и сравнения состояния кнопки. Когда кнопка будет нажата, мы сравним ее состояние с переменной lastButtonState. И если состояние будет отличаться от ранее сохраненного, счетчик lastDebounceTime будет сброшен.
Переменные lastDebounceTime и debounceDelay используют тип unsigned long потому, что время исчисляется в миллисекундах и простого int будет недостаточно.
В функции setup() настроим состояние пинов и светодиода. Пин кнопки на чтение, пин светодиода на вывод, напряжение на пин светодиода = HIGH
Далее в цикле loop() будем постоянно проверять состояние кнопки. И если состояние в момент проверки будет отличаться от предыдущего, запустим процесс повторной проверки.
Здесь мы видим новую функцию millis(). Она возвращает количество миллисекунд с момента начала работы программы на плате Arduino. Это количество сбрасывается в 0, из-за переполнения значения, примерно через 50 дней непрерывной работы.
Принципиальная схема подключения кнопки
Итак, в цикле loop() мы постоянно считываем напряжение на пине 2 и записываем его в переменную reading.
Если reading не равно предыдущему состоянию кнопки, то счетчику lastDebounceTime присваивается значение функции millis().
Через 50 миллисекунд значение переменной reading сравнивается с текущим состоянием кнопки и, если они не равны, то текущее состояние кнопки приравнивается к reading.
И, наконец, если кнопка нажата, то состояние светодиода меняется на противоположное.
После этого на пин светодиода посылаем состояние, которое мы определили, а предыдущее состояние кнопки сохраняем для проверки в следующем витке цикла.
В результате мы получим возможность включать светодиод нажатием кнопки, но не держать кнопку нажатой постоянно. А только менять состояние светодиода нажатием.
Подавление дребезга кнопки
Полный текст программы
Заключение
В этот раз мы рассмотрели программу Debounce из стандартной библиотеки программ ардуино ide. Она позволяет избавиться от дребезга кнопки используя программу ардуино. В следующий раз мы оформим эту программу в отдельную функцию и будем использовать ее для управления группы светодиодов.
Источник
Дребезг контактов кнопки ардуино и его подавление и удаление
Дребезг контактов кнопки ардуино – одно из самых неприятных и непонятных явлений, с которыми сталкивается начинающий ардуинщик. Устранение дребезга необходимо для корректной работы проекта, в противном случае на короткий отрезок времени схема становится практически неуправляемы. В этой статье мы рассмотрим основные причины возникновения и способы подавления дребезга. О том, что такое кнопка, как правильно подключать модуль и писать для него скетч вы можете прочитать в первой статье, посвященной кнопкам в ардуино.
Причины дребезга кнопок
Кнопка ардуино – один из самых популярных и простых видов датчиков. В основе работы любой кнопки лежит механический способ смыкания-размыкания контактов. Нажимая на любую, даже самую простую тактовую кнопку, мы формируем определенное давление на внутренние механизмы (пластины или пружины), в результате чего происходит сближение или расхождение металлических пластин.
Мы люди взрослые и хорошо понимаем, что идеального в мире ничего не существует, в том числе идеально гладких поверхностей, контактов без неровностей, сопротивления и паразитной емкости. В нашем неидеальном мире в момент нажатия на кнопку в месте соединения контакты не соприкасаются мгновенно, микро-неровности на поверхности не позволяют пластинам мгновенно соединиться. Из-за этого в короткий промежуток времени на границе пластинок меняется и сопротивление, и взаимная емкость, из-за чего возникают масса разнообразных изменений уровня тока и напряжения. Другими словами, возникают очень интересные, хотя и не очень приятные процессы, которые в электротехнике называют переходными.
Переходные процессы протекают очень быстро и исчезают за доли миллисекунд. Поэтому мы редко их замечаем, например, когда включаем свет в комнате. Лампа накаливания не может менять свою яркость с такой скоростью, и тем более не может реагировать на изменения наш мозг. Но, обрабатывая сигал от кнопки на таком быстром устройстве, как Arduino, мы вполне можем столкнуться с такими переходными эффектами и должны их учитывать при программировании.
В идеальном мире форма сигнала после нажатия на кнопку должна быть строго прямоугольная. В реальных же условиях вместе резкого перехода мы видим множество пиков и спадов.
Ошибки дребезга кнопки
Как отразится дребезг на нашем проекте? Да самым прямым образом – мы будем получать на входе совершенно случайный набор значений. Ведь если мы считываем значение с кнопки непрерывно, в каждом новом рабочем цикле функции loop, то будем замечать все “всплески” и “падения” сигнала. Потому что пауза между двумя вызовами loop составляет микросекунды и мы измерим все мелкие изменения.
Если мы хотим отследить ситуацию, когда кнопка была отпущена после нажатия, то получим множество ложных сигналов – она будет “нажата-отпущена” десятки раз, хотя мы выполнили лишь однократное нажатие.
Вот пример скетча, в котором непременно обнаружится ошибка дребезга. Мы сможем увидеть в мониторе порта в первые мгновения после нажатия целый набор нулей и единиц в случайной последовательности (не важно, что означает 1 – нажатие или отпускание кнопки, важен сам факт появления хаоса).
Естественно, такое поведение ни к чему хорошему не приведет и нам нужно придумать способ борьбы с дребезгом. В нашем арсенале есть два способа: программный и аппаратный. Первый довольно простой, но не всегда его можно использовать в реальных проектах. Второй – более надежный, но требует существенных изменений в схеме. Давайте рассмотрим оба способа подробнее.
Программный способ устранения дребезга кнопок
Самым простым способом справиться с проблемой дребезга кнопки является выдерживание паузы. Мы просто останавливаемся и ждем, пока переходный процесс не завершится. Для этого можно использовать функцию delay()или millis() (за подробной информации можете обратиться к статье про использование функций delay() и millis() в ардуино). 10-50 миллисекунд – вполне нормальное значение паузы для большинства случаев.
В данном примере мы использовали задержку в программе, чтобы не реагировать на случайные всплески и определить реальную смену сигнала.
Борьба с дребезгом кнопки с помощью библиотеки ардуино
Проблема с дребезгом настолько популярна, что есть специальные библиотеки, в которых вам не надо организовывать ожидание и паузы вручную – это все делается внутри специального класса. Пример популярной библиотеки для борьбы с дребезгом кнопок – библиотека Bounce.
Пример использования библиотеки:
Аппаратный способ подавления дребезга кнопки
Подавление дребезга кнопки с помощью задержек в скетче – способ очень распространенный и не требующий изменения самой схемы. Но далеко не всегда его можно использовать – ведь 10 миллисекунд – это целая вечность для многих процессов в электроном мире. Также программный способ невозможно применять при использовании прерываний – дребезг приведет к многократному вызову функций и повлиять на этот процесс в скетче мы не сможем.
Более правильный (и более сложный) способ борьбы с дребезгом – использование аппаратного решения, сглаживающего импульсы, посылаемые с кнопки. Для этого, правда, придется внести изменения в схему.
Аппаратный способ устранения дребезга основан на использовании сглаживающих фильтров. Сглаживающий фильтр, как следует из названия, занимается сглаживанием всплесков сигналов за счет добавления в схему элементов, имеющих своеобразную “инерцию” по отношению к таким электрическим параметрам как ток или напряжение. Самым распространенным примером таких “инерционных” электронных компонентов является конденсатор. Он может “поглощать” все резкие пики, медленно накапливая и отдавая энергию, точно так же, как это делает пружина в амортизаторах.
За счет инерции устройство как утюгом походит по “мятому” сигналу с большим количеством пиков и впадин, создавая пусть и не идеальную, но вполне гладкую кривую, у которой легче определить уровень срабатывания.
Пример простого фильтра на базе RC-цепочки
Схема подключение фильтра для устранения дребезга:
Пример подключения к плате ардуино
Форма сигнала после использования фильтра:
Как видим, “лес” дребезга сменился достаточно плавной линией, с которой уже можно работать дальше.
Подавление дребезга с помощью триггера шмидта
Сделать квадратную форму сигнала с помощью простой RC цепочки невозможно. Для “огранения” сглаженных форм используется специальный компонент, который называется триггер шмидта. Его особенностью является срабатывание при достижении определенного уровня сигнала. На выходе триггера шмидта мы получим или высокий или низкий уровень сигнала, никаких промежуточных значений. Выход триггера инвертированный: при спаде входного сигнала он выдает на выходе включение и наоборот. Ниже представлена схема и результат работы с триггером шмидта.
Иллюстрация результата работы:
Как видим, мы практически полностью избавились от результатов переходных процессов, сперва превратив хаос в почти гладкую кривую линию, а затем с помощью триггера шмидта “отрубили” хвосты, придав сигналу практически идеальный вид. Подав его на вход ардуино, мы уже можем не беспокоиться о ложных срабатываниях и смело использовать в скетче метод digitalRead и прерывания.
Заключение
Явление дребезга кнопок – распространенная проблема, встающая перед всеми разработчиками ардуино. У нас в арсенале есть несколько возможностей устранения дребезга. Программный метод заключается в добавлении задержки в процессе измерения сигнала. Аппаратный способ подавления дребезга с помощью сглаживающего фильтра и триггера шмидта более сложный, но надежный. Выбирайте подходящий вариант, в зависимости от требований к проекту и ваших возможностей.
Источник