Ми вже розглядали підключення кнопки до Arduino і зачіпали питання "брязкоту контактів. Це дуже неприємне явище, яке викликає повторні натискання кнопки і ускладнює програмну обробку натискань кнопки. Давайте ж поговоримо про те, як позбавитися від брязкоту контактів.
1
"Брязкіт контактів - це явище, властиве механічних перемикачів, кнопок, тумблерів і реле. З-за того, що контакти зазвичай роблять з металів і сплавів, які володіють пружністю, при фізичному замиканні вони не відразу встановлюють надійне з'єднання. Протягом короткого проміжку часу контакти кілька разів змикаються і відштовхуються один від одного. В результаті електричний струм приймає стале значення не моментально, а після низки наростань і спадів. Тривалість цього перехідного ефекту залежить від матеріалу контактів, від їх розміру і конструкції. На ілюстрації показана типова осцилограма при замиканні контактів тактовою кнопки. Видно, що час від моменту перемикання до усталеного стану складає трохи мілісекунд. Це і називається "дребезгом". Цей ефект помітний в електричних ланцюгах управління освітленням, двигунами або іншими інерційними датчиками і приладами. Але в ланцюгах, де йде швидке зчитування та обробка інформації (де частоти того ж порядку, що і імпульси "брязкоту", або вище), це є проблемою. Зокрема, Arduino UNO, який працює на частоті 16 МГц, відмінно ловить "брязкіт контактів, приймаючи послідовність одиниць і нулів замість одиничного перемикання від 0 до 1.
2
Давайте подивимося, як брязкіт контактів впливає на правильну роботу схеми. Підключимо до Arduino тактову кнопку за схемою зі стягуючим резистором. Будемо по натисненню кнопки запалювати світлодіод і залишати включеним до повторного натискання кнопки. Для наочності підключимо до цифрового висновку 13 зовнішній світлодіод, хоча можна обійтися і вбудованим.
3
Щоб реалізувати дану задачу, перше, що приходить в голову:- запам'ятовувати попередній стан кнопки;- порівнювати з поточним станом;- якщо стан змінилося, то змінюємо стан світлодіода.Напишемо такий скетч і завантажимо в пам'ять Arduino.При ввімкненні схеми в роботу, відразу видно ефект від впливу брязкоту контактів. Він проявляється в тому, що світлодіод загоряється не відразу після натискання кнопки, або загоряється і тут же гасне, чи не вимикається відразу після натискання кнопки, а продовжує горіти. Загалом, схема працює не стабільно. І якщо для завдання з включенням світлодіода це не настільки критично, то для інших, більш серйозних завдань, це просто неприйнятно.
4
Спробуємо виправити ситуацію. Ми знаємо, що брязкіт контактів проявляє себе протягом кількох мілісекунд після замикання контактів. Давайте після зміни стану кнопки вичікувати, скажімо, 5 мсек. Це час для людини є практично миттю, і натискання кнопки людиною зазвичай відбувається значно довше - кілька десятків мілісекунд. А Arduino прекрасно працює з такими короткими проміжками часу, і ці 5 мсек дозволять йому відсікти брязкіт контактів від натискання кнопки. В даному скетчі ми оголосимо процедуру debounce() ("bounce" по-англійськи - це як раз "брязкіт", приставка "de" означає зворотний процес), на вхід якої ми подаємо попередній стан кнопки. Якщо натискання кнопки триває більше 5 мсек, значить це дійсно натискання.Визначивши натискання, ми змінюємо стан світлодіода. Завантажимо скетч в плату Arduino. Тепер все набагато краще! Кнопка спрацьовує без збоїв, при натисканні світлодіод змінює стан, як ми і хотіли.
5
Аналогічна функціональність забезпечується спеціальними бібліотеками, наприклад, бібліотекою Bounce2. Завантажити її можна за посиланням у розділі "Джерела" або на сайті https://github.com/thomasfredericks/Bounce2. Для установки бібліотеки поміщаємо її в директорію libraries середовища розробки Arduino і перезапускаємо IDE. Бібліотека "Bounce2" містить наступні методи:Bounce() - ініціалізація об'єкта "Bounce";void interval(мсек) - встановлює час затримки в мілісекундах;void attach (номерПина) - задає висновок, до якого підключена кнопка;int update() - оновлює об'єкт і повертає true, якщо стан піна змінилося, і false у противному разі;int read() зчитує новий стан піна.Перепишемо наш скетч з використанням бібліотеки. Можна також запам'ятовувати і порівнювати минуле стан кнопки з поточним, але давайте спростимо алгоритм. При натисканні кнопки будемо вважати натискання, і кожне непарне натискання будемо включати світлодіод, кожне парне - вимикати. Такий скетч виглядає лаконічно, його легко прочитати і легко застосувати.
В. О. Т.