[013] Rozprawka o pstryczkach - część pierwsza

[013] Rozprawka o pstryczkach - część pierwsza

Wyłącznik, przełącznik, przycisk, mikrostyk, switch czy potocznie: pstryczek, to jedno z tych urządzeń, które w zasadzie do elementów stricte elektronicznych się nie zalicza, ale rzadko zdarza się znaleźć urządzenie elektroniczne, w którym czegoś takiego nie znajdziemy. Elementy te mogą wyglądać bardzo różnie – od typowych wyłączników ściennych, przez różnego rodzaju przyciski, po klawiatury o zróżnicowanych konstrukcjach, bo i ta rzecz to przecież zestaw przełączników. Mało tego, należałoby tam także wrzucić różnego rodzaju krańcówki i kontaktrony, które z założenia są przełączane nie ludzką ręką, a mechaniką urządzeń. Wszystkie te elementy mają jedno zadanie: przewodzić prąd albo nie. Diabeł tkwi w szczegółach, a szczegółem jest właśnie bezwzględność tej definicji, gdy tymczasem w świecie rzeczywistym pojawia się jeszcze stan trzeci: stan nieustalony.


Przyjrzyjmy się takim typowym mikroprzełącznikom. Są one produkowane w miliardach i spotyka się je dosłownie wszędzie. Na górze znajduje się element wciskany, nad którym najczęściej tkwi jeszcze kapturek dopasowany kształtem i kolorem do konkretnego urządzenia. Element ten dociska znajdującą się wewnątrz okrągłą sprężystą blaszkę, która w stanie spoczynkowym jest lekko wygięta do góry. Gdy ciężar nacisku pokona pewien próg, blaszka ugina się w sposób skokowy. Krawędzie blaszki spoczywają na metalowej podstawie. Na środku także znajduje się metalowe wyprowadzenie, ale w pozycji spoczynkowej przycisku blaszka jest wygięta do góry, więc między nią, a tym wyprowadzeniem mamy milimetrową szczelinę. Gdy blaszka ugnie się wskutek dociśnięcia, zewrze metalową podstawę z wyprowadzeniem na środku. Elementy te są połączone z nóżkami mikroprzełącznika. Nóżki są cztery, lecz to tak naprawdę dwa elementy, wygięte tak, by całość można było łatwo przylutować. Zatem gdy przycisk jest wciśnięty, pary nóżek są ze sobą zwarte, gdy nie – zwarcia nie ma.

W praktyce opór nigdy nie jest nieskończony, ale możemy założyć, że tak jest. W drugą stronę już nie bardzo, zwarcie to nie zerowy opór, tylko jakiś tam niewielki. Dla metalowych przełączników są to ułamki oma lub pojedyncze omy, co należy uwzględnić, gdybyśmy chcieli w ten sposób sterować np. żarówką samochodową. Te małe mikrostyki nadają się najwyżej do przełączania prądów rzędu kilkudziesięciu miliamperów, przy większych szybko się zdegradują. W przypadku użycia gumek przewodzących opór zwarcia sięga kiloomów i w zasadzie tam prądy przepływające nie będą większe od miliampera. Poznaliśmy zatem statyczną naturę przełączników. Czas poznać jeszcze naturę dynamiczną, bo to ona głównie sprawia problemy.

Wciskając te blaszki – tutaj akurat z kalkulatora Brda, gdzie znajdziemy klawiaturę działającą na tej samej zasadzie, tylko zestawioną w 24 bliźniacze zespoły – będzie nam się wydawać, że działają natychmiastowo. Przykładamy jakąś siłą, następuje klik, przycisk się lekko zapada i urządzenie karmi się kolejnymi cyferkami. W praktyce jednak wcale tak prosto nie jest. Proces zapadania się blaszki swoje trwa – to zwykle kilkanaście milisekund. Tyleż czasu trwa zamykanie obwodu. Powierzchnia styku powiększa się, opór maleje, ale i rośnie chwilami, zanim blaszka nie ułoży się stabilnie na stykach. Czasem, podczas tego układania, w ogóle tworzy się przerwa trwającą pojedyncze milisekundy. O ile w ten sposób sterujemy dzwonkiem do drzwi albo żarówką, nikt nic nie zauważy i wszystko będzie w porządku. Jednak milisekundy dla mikroprocesorów, to jak godziny dla ludzi. Komputer o włączaniu pstryczka może napisać całą epopeję.

Bez praktyki trzeba wiary, zatem na wypadek, gdyby wśród czytelników znalazł się jakiś niewierny Tomasz, zrobię doświadczenie. Nie użyję jednak oscyloskopu, a urządzenia, które ma każdy, by każdy także mógł sobie je przeprowadzić samemu. Użyjemy wejścia mikrofonowego w komputerze. Jest to bardzo przydatne urządzenie, które potrafi rejestrować zmiany zmiennych sygnałów o niewielkich poziomach i na dodatek jest spolaryzowane napięciem kilku woltów. Jeśli teraz włączmy nagrywanie sygnałów tam wchodzących, których źródłem zwykle jest mikrofon, wszystko zarejestruje się z częstotliwością ponad 44 tysięcy próbek na sekundę. Ale nie podłączajmy mikrofonu, a zwierajmy spolaryzowane wejście do masy, by dostać taki wykres, gdzie te wyskakujące poziomy to zwieranie i rozłączanie wejścia. Podłączmy teraz kilka przełączników, popstrykajmy nieco i nagrajmy naszą zabawę. Teraz przyjrzymy się nagraniom, powiększmy tę chwilę, gdy przycisk został wciśnięty. Te kwadraciki to kolejne próbki, czyli odległość w poziomie wynosi jedną czterdziestoczterotysięczną sekundy.

Idealny przycisk dałby wykres znajdujący się na dole, a od momentu zwarcia – na górze. Nasz zachowuje się różnie. Tutaj na przykład tuż przed zwarciem nastąpił niewielki przepływ prądu, po czym na chwilę prąd przestał płynąć, by za chwilę popłynąć już mocno. Innym razem, bo przyciski nie zachowują się w tych chwilach powtarzalnie, niestabilność trwała dłużej.

Tutaj mamy wręcz katastrofę, przycisk na chwilę zaczął przewodzić jak należy, ale potem się wyłączył i znowu włączył, już na stałe. Mikroprocesor zinterpretuje to jako dwukrotne naciśnięcie przycisku, co jest oczywiście niedopuszczalne. Dlaczego? Proszę, oto kolejny dowód.

const byte pstryczek = 12;  // Adres pstryczka.
const byte dioda = 13;      // Adres didody świecącej.
boolean stan = LOW;         // Przełącznik stanu diody świecącej.

void setup() {
  pinMode(pstryczek, INPUT_PULLUP);  // Zadeklaruj pstryczek jako wejście podciągnięte wewnętrznie.
  pinMode(dioda, OUTPUT);            // Zadeklaruj diodę jako wyjście.
}

void loop() {
  if (digitalRead(pstryczek) == LOW) {        // Wykonaj tylko, gdy wciśnięto pstryczek.
    stan = !stan;                             // Zmień zmienną stanu diody.
    digitalWrite(dioda, stan);                // Zmień stan diody.
    while (digitalRead(pstryczek) == LOW) {}  // Czekaj dopóki pstryczek nie zostanie puszczony.
  }
}

Dziś programowanie będzie proste, a sam szkic wręcz nudny. Deklarujemy sobie pstryczek, podłączony do pinu 12 i masy oraz diodę świecącą, znajdującą się na pinie 13. Jak już kiedyś pisałem, większość płytek Arduino ma tam na stałe podłączoną diodę, więc nie będziemy musieli jej tutaj osadzać. Przycisk będzie raz włączał diodę, a raz wyłączał – i to wszystko. Jak taki przycisk w lampce przy łóżku, który wciska się, a za każdym razem lampka zmienia stan.

Program jest żałośnie prosty: jeśli stan na wejściu, na którym siedzi przycisk (pin 12) będzie niski niski, czyli przycisk zostanie wciśnięty i zewrze to wejście do masy, zmieni się stan pewnej zmiennej dwustanowej, którą nazwałem nomen omen „stan”. Następnie zgodnie ze stanem „stanu” świecimy albo gasimy diodę i czekamy aż przycisk zostanie puszczony.

Innymi słowy, za każdym razem gdy przycisk zostanie wciśnięty, stan zmiennej „stan” zmieni się, a za nią stan świecenia diody: włączy się albo zgaśnie. Ostatnia instrukcja potrzebna jest po to, by podczas trzymania przycisku wciśniętego program nie wpadł w pętlę, w kółko zmieniając stan diody, bo ze sterowania wyszłaby figa. Pętla ta kręci się tak szybko, że nie dalibyśmy rady w odpowiedniej chwili puścić przycisku.

Po skompilowaniu i wysłaniu programu okaże się, że wcale to tak dobrze nie działa. Albo dioda zostaje zaświecona, albo zgaszona, albo coś tam mrugnie. Im lepszej klasy przycisk, tym pewniej pracuje, lecz generalnie nie można liczyć na pełną niezawodność. Problem ten rozwiązuje się różnie i zarazem jest to chyba najczęściej źle rozwiązany problem, zwłaszcza w niemarkowych urządzeniach. Ogólnie, problem rozwiązuje się programowo, sprzętowo albo w sposób mieszany – najlepszy. Oczywiście gdy w rachubę wchodzi tania produkcja masowa, używa się sposobów programowych, bo nic nie kosztują. Metod jest wiele, ale bazują głównie na jednym założeniu – ale o tym za chwilę.

Wróćmy do naszego wykresu. Mikroprocesor interpretuje poziom na wejściu jako wysoki, gdy zostanie przekroczony pewien próg napięcia – oznaczyłem go na czerwono. Jaki – to już jest opisane w dokumentacji i zwykle wynosi on co najmniej połowę napięcia zasilania. Zatem w tym krótkim początkowym impulsie mikroprocesor każe wejść w pętlę. Ale zaraz napięcie znowu spada do zera i mikroprocesor każe wyjść z pętli. I znowu po chwili napięcie osiągnie stan wysoki, już na dłużej i ponownie wejdziemy w pętlę. Zatem dioda zaświeci się przy pierwszym impulsie, a potem zgaśnie, choć dla człowieka wciskające przycisk oba impulsy będą jednym wciśnięciem. Dioda błyśnie tylko krótko i pozostanie ciemna.

Metoda programowa polega na ignorancji. Po wykryciu wciśnięcia procesor zrobi swoje, ale będzie ignorował analizę pstryczka przez jakiś – ten, który wyczerniłem. Czas ten dobiera się do kondycji przycisków, jednocześnie biorąc pod uwagę ograniczenie najszybszej reakcji człowieka. W klawiaturach komputerowych na przykład założono, że nikt nie będzie pisał szybciej niż 32 znaki na sekundę. Zatem szybsze zmiany są ignorowane. Po wciśnięciu klawisza klawiatura przestaje być odczytywana na 1/32 sekundy. Jak to zrealizować w praktyce, to już inna historia. Ja tylko pokażę przykład najprostszy.

void loop() {
  if (digitalRead(pstryczek) == LOW) {        // Wykonaj tylko, gdy wciśnięto pstryczek.
    stan = !stan;                             // Zmień zmienną stanu diody.
    digitalWrite(dioda, stan);                // Zmień stan diody.
    while (digitalRead(pstryczek) == LOW) {}  // Czekaj dopóki pstryczek nie zostanie puszczony.
  }
  delay(20);  // Zaczekaj 20 milisekund.
}

W pętlę odczytu klawiatury wrzucam słynną funkcję delay, która zawiesza działanie programu na 20 ms. To jest oczywiście straszne marnotrawstwo, bo marnuje się tu zasoby na nicnierobienie. Wprowadzając takie przerwy na przykład za pomocą przerwań albo zlecając w tym miejscu inne czynności, dostaniemy funkcjonalnie to samo, tylko już bez marnowania środków. Ale o tym nie dziś. Okazuje się, że ta jedna tylko linijka w programie jest bardzo skuteczna i właściwie można by tutaj tematykę zakończyć, lecz wspomniałem jeszcze o metodach sprzętowych. Ale o nich napiszę kolejną historię.

Powiązane tematy

Płytka edukacyjna TME-EDU-ARD-2Płytka edukacyjna TME-EDU-ARD-2Sprawdź tutaj

Przeczytaj również

Nasi partnerzy

TMETech Master EventTME EducationPoweredby
Copyright © 2024 arduino.pl