Вече разгледахме свързването на бутон към Arduino и засегнахме въпроса за „подскачащите“контакти. Това е много досадно явление, което причинява многократно натискане на бутони и затруднява програмното боравене с щракванията на бутоните. Нека да поговорим за това как да се отървем от отскока от контакт.
Необходимо
- - Arduino;
- - бутон за такт;
- - резистор с номинална стойност 10 kOhm;
- - Светодиод;
- - свързващи проводници.
Инструкции
Етап 1
Скачането на контакта е често срещано явление при механичните превключватели, бутоните, превключвателите и релетата. Поради факта, че контактите обикновено са направени от метали и сплави, които имат еластичност, когато са физически затворени, те не установяват веднага надеждна връзка. В рамките на кратък период от време контактите се затварят няколко пъти и се отблъскват. В резултат на това електрическият ток придобива стабилно състояние не моментално, а след поредица от възходи и падения. Продължителността на този преходен ефект зависи от материала на контакта, размера и дизайна. Илюстрацията показва типична осцилограма, когато контактите на бутона за такт са затворени. Вижда се, че времето от момента на превключване в стабилно състояние е няколко милисекунди. Това се нарича "скачане".
Този ефект не се забелязва в електрическите вериги за управление на осветлението, двигателите или други инерционни сензори и устройства. Но във вериги, където има бързо четене и обработка на информация (където честотите са от същия ред като импулсите "отскачащи" или по-високи), това е проблем. По-специално, Arduino UNO, който работи на 16 MHz, отлично улавя отскока на контакта, като приема последователност от единици и нули вместо единичен превключвател 0 до 1.
Стъпка 2
Нека да видим как отскокът на контакта влияе върху правилната работа на веригата. Нека свържем бутона на часовника към Arduino с помощта на падаща резисторна верига. С натискане на бутона ще запалим светодиода и ще го оставим включен, докато бутонът не бъде натиснат отново. За по-голяма яснота свързваме външен светодиод към цифров щифт 13, въпреки че вграденият може да се откаже.
Стъпка 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 () - чете новото състояние на щифта.
Нека пренапишем скицата си, използвайки библиотеката. Можете също така да запомните и сравните миналото състояние на бутона с текущото, но нека опростим алгоритъма. Когато бутонът бъде натиснат, ще преброим натисканията и всяко нечетно натискане ще включи светодиода и всяко четно натискане ще го изключи. Тази скица изглежда кратка, лесна за четене и лесна за използване.