Как да се отървете от отскока на контакт при свързване на бутон към Arduino

Съдържание:

Как да се отървете от отскока на контакт при свързване на бутон към Arduino
Как да се отървете от отскока на контакт при свързване на бутон към Arduino

Видео: Как да се отървете от отскока на контакт при свързване на бутон към Arduino

Видео: Как да се отървете от отскока на контакт при свързване на бутон към Arduino
Видео: Программатор USBASP | Загрузчик Optiboot | Таймер WatchDog для Arduino Pro Mini и Arduino Nano 2024, Може
Anonim

Вече разгледахме свързването на бутон към Arduino и засегнахме въпроса за „подскачащите“контакти. Това е много досадно явление, което причинява многократно натискане на бутони и затруднява програмното боравене с щракванията на бутоните. Нека да поговорим за това как да се отървем от отскока от контакт.

Ефект на отскачане на контакт
Ефект на отскачане на контакт

Необходимо

  • - Arduino;
  • - бутон за такт;
  • - резистор с номинална стойност 10 kOhm;
  • - Светодиод;
  • - свързващи проводници.

Инструкции

Етап 1

Скачането на контакта е често срещано явление при механичните превключватели, бутоните, превключвателите и релетата. Поради факта, че контактите обикновено са направени от метали и сплави, които имат еластичност, когато са физически затворени, те не установяват веднага надеждна връзка. В рамките на кратък период от време контактите се затварят няколко пъти и се отблъскват. В резултат на това електрическият ток придобива стабилно състояние не моментално, а след поредица от възходи и падения. Продължителността на този преходен ефект зависи от материала на контакта, размера и дизайна. Илюстрацията показва типична осцилограма, когато контактите на бутона за такт са затворени. Вижда се, че времето от момента на превключване в стабилно състояние е няколко милисекунди. Това се нарича "скачане".

Този ефект не се забелязва в електрическите вериги за управление на осветлението, двигателите или други инерционни сензори и устройства. Но във вериги, където има бързо четене и обработка на информация (където честотите са от същия ред като импулсите "отскачащи" или по-високи), това е проблем. По-специално, Arduino UNO, който работи на 16 MHz, отлично улавя отскока на контакта, като приема последователност от единици и нули вместо единичен превключвател 0 до 1.

Отскачането на контакта при натискане на бутон
Отскачането на контакта при натискане на бутон

Стъпка 2

Нека да видим как отскокът на контакта влияе върху правилната работа на веригата. Нека свържем бутона на часовника към Arduino с помощта на падаща резисторна верига. С натискане на бутона ще запалим светодиода и ще го оставим включен, докато бутонът не бъде натиснат отново. За по-голяма яснота свързваме външен светодиод към цифров щифт 13, въпреки че вграденият може да се откаже.

Свързване на бутон към Arduino с помощта на изтегляща резисторна верига
Свързване на бутон към Arduino с помощта на изтегляща резисторна верига

Стъпка 3

За да се изпълни тази задача, първото нещо, което идва на ум:

- запомнете предишното състояние на бутона;

- сравнете с текущото състояние;

- ако състоянието се е променило, тогава ние променяме състоянието на светодиода.

Нека напишем такава скица и я заредим в паметта на Arduino.

Когато веригата е включена, ефектът от подскачането на контакта се вижда веднага. Проявява се във факта, че светодиодът не светва веднага след натискане на бутона, или светва и след това изгасва, или не се изключва веднага след натискане на бутона, а остава включен. Като цяло веригата не работи стабилно. И ако за задача с включване на светодиода това не е толкова критично, то за други, по-сериозни задачи, това е просто неприемливо.

Скица на натискане на бутона за обработка, без да се взема предвид отскокът на контакта
Скица на натискане на бутона за обработка, без да се взема предвид отскокът на контакта

Стъпка 4

Ще се опитаме да поправим ситуацията. Знаем, че отскокът на контакта се случва в рамките на няколко милисекунди след затварянето на контакта. Нека изчакаме, да речем, 5 ms след промяна на състоянието на бутона. Това време за човек е почти миг и натискането на бутон от човек обикновено отнема много повече време - няколко десетки милисекунди. И Arduino работи чудесно с толкова кратки периоди от време и тези 5 ms ще му позволят да прекъсне отпадането на контактите от натискане на бутон.

В тази скица ще декларираме процедурата debounce () („bounce“на английски е просто „bounce“, префиксът „de“означава обратния процес), на входа на който доставяме предишното състояние на бутона. Ако натискането на бутон трае повече от 5 мсек, това наистина е натискане.

Откривайки пресата, ние променяме състоянието на светодиода.

Качете скицата на дъската на Arduino. Сега всичко е много по-добре! Бутонът работи безотказно, при натискане светодиодът променя състоянието, както искахме.

Скица за обработка на натискане на бутон, като се вземе предвид отскокът на контакта
Скица за обработка на натискане на бутон, като се вземе предвид отскокът на контакта

Стъпка 5

Подобна функционалност се предоставя от специални библиотеки като библиотеката Bounce2. Можете да го изтеглите от връзката в раздела "Източници" или от уебсайта https://github.com/thomasfredericks/Bounce2. За да инсталирате библиотеката, поставете я в директорията на библиотеките на средата за разработка на Arduino и рестартирайте IDE.

Библиотеката "Bounce2" съдържа следните методи:

Bounce () - инициализация на обекта "Bounce";

void interval (ms) - задава времето на закъснение в милисекунди;

void attach (pin number) - задава щифта, към който е свързан бутонът;

int update () - актуализира обекта и връща true, ако състоянието на пина се е променило, и false в противен случай;

int read () - чете новото състояние на щифта.

Нека пренапишем скицата си, използвайки библиотеката. Можете също така да запомните и сравните миналото състояние на бутона с текущото, но нека опростим алгоритъма. Когато бутонът бъде натиснат, ще преброим натисканията и всяко нечетно натискане ще включи светодиода и всяко четно натискане ще го изключи. Тази скица изглежда кратка, лесна за четене и лесна за използване.

Препоръчано: