Przyjrzeliśmy się już podłączaniu przycisku do Arduino i poruszyliśmy kwestię „odbijania” styków. Jest to bardzo irytujące zjawisko, które powoduje powtarzające się naciśnięcia przycisków i utrudnia programową obsługę kliknięć przycisków. Porozmawiajmy o tym, jak pozbyć się odbicia kontaktu.
Niezbędny
- - Arduino;
- - przycisk taktu;
- - rezystor o wartości nominalnej 10 kOhm;
- - Dioda LED;
- - przewody łączące.
Instrukcje
Krok 1
Odbijanie styków jest powszechnym zjawiskiem w przełącznikach mechanicznych, przyciskach, przełącznikach dwustabilnych i przekaźnikach. Ze względu na to, że styki są zwykle wykonane z metali i stopów, które są elastyczne, po fizycznym zamknięciu nie tworzą od razu niezawodnego połączenia. W krótkim czasie styki kilkakrotnie zamykają się i odpychają. W rezultacie prąd elektryczny przybiera wartość stanu ustalonego nie od razu, ale po serii wzlotów i upadków. Czas trwania tego efektu przejściowego zależy od materiału styku, rozmiaru i konstrukcji. Ilustracja przedstawia typowy oscylogram, gdy styki przycisku taktowego są zamknięte. Widać, że czas od momentu przejścia do stanu ustalonego wynosi kilka milisekund. Nazywa się to „odbiciem”.
Efekt ten nie jest zauważalny w obwodach elektrycznych do sterowania oświetleniem, silnikami lub innymi czujnikami i urządzeniami bezwładnościowymi. Ale w obwodach, w których następuje szybki odczyt i przetwarzanie informacji (gdzie częstotliwości są tego samego rzędu co impulsy „odbijające” lub wyższe), jest to problem. W szczególności Arduino UNO, który działa z częstotliwością 16 MHz, doskonale radzi sobie z odbijaniem się styków, akceptując sekwencję jedynek i zer zamiast pojedynczego przełącznika 0 do 1.
Krok 2
Zobaczmy, jak odbijanie się styków wpływa na prawidłowe działanie obwodu. Podłączmy przycisk zegara do Arduino za pomocą obwodu rezystora pull-down. Naciskając przycisk zapalimy diodę LED i pozostawimy ją zaświeconą do ponownego naciśnięcia przycisku. Dla jasności podłączamy zewnętrzną diodę LED do cyfrowego pinu 13, choć wbudowanego można zrezygnować.
Krok 3
Aby wykonać to zadanie, pierwszą rzeczą, która przychodzi na myśl:
- zapamiętaj poprzedni stan przycisku;
- porównać z aktualnym stanem;
- jeśli stan się zmienił, to zmieniamy stan diody.
Napiszmy taki szkic i załadujmy go do pamięci Arduino.
Gdy obwód jest włączony, efekt odbijania się styków jest natychmiast widoczny. Przejawia się to w tym, że dioda LED nie zapala się od razu po naciśnięciu przycisku, albo zapala się i potem gaśnie, albo nie gaśnie od razu po naciśnięciu przycisku, ale pozostaje zapalona. Ogólnie obwód nie działa stabilnie. A jeśli w przypadku zadania z włączeniem diody LED nie jest to tak krytyczne, to w przypadku innych, poważniejszych zadań jest to po prostu nie do przyjęcia.
Krok 4
Postaramy się naprawić sytuację. Wiemy, że odbicie kontaktu następuje w ciągu kilku milisekund po zamknięciu kontaktu. Poczekajmy powiedzmy 5ms po zmianie stanu przycisku. Ten czas dla osoby to prawie chwila, a naciśnięcie przez osobę przycisku trwa zwykle znacznie dłużej – kilkadziesiąt milisekund. A Arduino świetnie sprawdza się przy tak krótkich okresach czasu, a te 5ms pozwolą mu odciąć odbijanie styków od wciśnięcia przycisku.
W tym szkicu zadeklarujemy procedurę debounce() ("bounce" w języku angielskim to po prostu "bounce", prefiks "de" oznacza proces odwrotny), na wejście którego podajemy poprzedni stan przycisku. Jeśli naciśnięcie przycisku trwa dłużej niż 5 ms, to naprawdę jest naciśnięciem.
Wykrywając prasę zmieniamy stan diody.
Prześlij szkic na płytkę Arduino. Teraz wszystko jest o wiele lepsze! Przycisk działa bez zarzutu, po naciśnięciu dioda zmienia stan, tak jak chcieliśmy.
Krok 5
Podobną funkcjonalność zapewniają specjalne biblioteki, takie jak biblioteka Bounce2. Możesz go pobrać z linku w sekcji "Źródła" lub na stronie https://github.com/thomasfredericks/Bounce2. Aby zainstalować bibliotekę, umieść ją w katalogu bibliotek środowiska programistycznego Arduino i zrestartuj IDE.
Biblioteka "Bounce2" zawiera następujące metody:
Bounce() - inicjalizacja obiektu "Bounce";
void interval (ms) - ustawia czas opóźnienia w milisekundach;
void attach (numer pinu) - ustawia pin, do którego podłączony jest przycisk;
int update() - aktualizuje obiekt i zwraca true jeśli stan pinu uległ zmianie, a false w przeciwnym wypadku;
int read() - odczytuje nowy stan pinu.
Przepiszmy nasz szkic za pomocą biblioteki. Możesz także zapamiętać i porównać przeszły stan przycisku z obecnym, ale uprośćmy algorytm. Po naciśnięciu przycisku zliczymy naciśnięcia, a każde nieparzyste naciśnięcie włączy diodę LED, a każde parzyste naciśnięcie ją wyłączy. Ten szkic wygląda zwięźle, jest łatwy do odczytania i łatwy w użyciu.