Ми вже розглядали підключення кнопки до Arduino і зачіпали питання “брязкоту контактів. Це дуже неприємне явище, яке викликає повторні натискання кнопки і ускладнює програмну обробку натискань кнопки. Давайте ж поговоримо про те, як позбавитися від брязкоту контактів.

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

Вам знадобиться

  • – Arduino;
  • – тактова кнопка;
  • – резистор номіналом 10 кОм;
  • – світлодіод;
  • – з’єднувальні дроти.

Інструкція

1. “Брязкіт контактів – це явище, властиве механічних перемикачів, кнопок, тумблерів і реле. З-за того, що контакти зазвичай роблять з металів і сплавів, які володіють пружністю, при фізичному замиканні вони не відразу встановлюють надійне з’єднання. Протягом короткого проміжку часу контакти кілька разів змикаються і відштовхуються один від одного. В результаті електричний струм приймає стале значення не моментально, а після низки наростань і спадів. Тривалість цього перехідного ефекту залежить від матеріалу контактів, від їх розміру і конструкції. На ілюстрації показана типова осцилограма при замиканні контактів тактовою кнопки. Видно, що час від моменту перемикання до усталеного стану складає трохи мілісекунд. Це і називається “дребезгом”.
Цей ефект помітний в електричних ланцюгах управління освітленням, двигунами або іншими інерційними датчиками і приладами. Але в ланцюгах, де йде швидке зчитування та обробка інформації (де частоти того ж порядку, що і імпульси “брязкоту”, або вище), це є проблемою. Зокрема, Arduino UNO, який працює на частоті 16 МГц, відмінно ловить “брязкіт контактів, приймаючи послідовність одиниць і нулів замість одиничного перемикання від 0 до 1.

Дребезг контактов при нажатии на кнопку

2. Давайте подивимося, як брязкіт контактів впливає на правильну роботу схеми. Підключимо до Arduino тактову кнопку за схемою зі стягуючим резистором. Будемо по натисненню кнопки запалювати світлодіод і залишати включеним до повторного натискання кнопки. Для наочності підключимо до цифрового висновку 13 зовнішній світлодіод, хоча можна обійтися і вбудованим.

Подключение кнопки к Arduino по схеме с подтягивающим резистором

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() зчитує новий стан піна.Перепишемо наш скетч з використанням бібліотеки. Можна також запам’ятовувати і порівнювати минуле стан кнопки з поточним, але давайте спростимо алгоритм. При натисканні кнопки будемо вважати натискання, і кожне непарне натискання будемо включати світлодіод, кожне парне – вимикати. Такий скетч виглядає лаконічно, його легко прочитати і легко застосувати.

Скетч обработки нажатия на кнопку с использованием библиотеки

НАПИСАТИ ВІДПОВІДЬ

Please enter your comment!
Please enter your name here