Schemat ideowy proponowanego rozwiązania zamka szyfrowego pokazano na rysunku 1. Jest to nieskomplikowany system mikroprocesorowy, którego sercem jest niewielki mikrokontroler ATtiny2313 realizujący całą założoną funkcjonalność. Mikrokontroler steruje pracą 7-segmentowego wyświetlacza LED (ze wspólną anodą), wykorzystując w tym celu wbudowany w strukturę układ czasowo-licznikowy Timer0 oraz przerwanie od porównania wartości licznika z wartością rejestru OCR0A, dzięki czemu zapewniono realizację dobrze znanego mechanizmu multipleksowania kolejnych cyfr wyświetlacza (częstotliwość przerwania wynosi 240 Hz, co daje 60 Hz/cyfrę), realizuje obsługę elementu regulacyjnego, jakim jest enkoder z wbudowanym przyciskiem, wykorzystując w tym celu przerwanie zewnętrzne INT0 inicjowane wystąpieniem zbocza opadającego na wyprowadzeniu PD2/INT0 mikrokontrolera oraz steruje pracą przekaźnika REL (za pomocą tranzystora) stanowiącego element wykonawczy. Jak wspomniano, sterowanie pracą wyświetlacza LED odbywa się sekwencyjnie, dzięki czemu do realizacji tej funkcjonalności niezbędna stała się mniejsza liczba wyprowadzeń mikrokontrolera. W tym rozwiązaniu katody wyświetlacza LED podłączono, poprzez rezystory ograniczające prąd, bezpośrednio do portu PORTB mikrokontrolera, zaś cztery wspólne anody, poprzez typowe stopnie tranzystorowe (PNP), do portu PORTD. W przerwaniu od porównania wartości licznika Timer0 z wartością rejestru OCR0A wywoływanym co 4,167 ms (ok. 240 Hz) wysyłana jest przez PORTB wartość kolejnej cyfry przeznaczonej do wyświetlenia, po czym jest załączana (poprzez stopień tranzystorowy sterujący portem PORTD) odpowiednia wspólna anoda wyświetlacza LED i proces powtarza się sekwencyjnie dla każdej z cyfr. To typowe rozwiązanie stosowane powszechnie w systemach mikroprocesorowych. Niemniej jednak, poniżej przedstawię bardzo czytelną realizację programową wspomnianego mechanizmu. Na początek niezbędne definicje, które pokazano na listingu 1. Dwie tablice umieszczone w pamięci Flash upraszczają funkcję obsługi przerwania odpowiedzialnego za mechanizm multipleksowania, jednocześnie zwiększając czytelność samego kodu. Pierwsza z tablic (DIGITS[17]) przechowuje kombinację segmentów wyświetlacza LED (A…G) odpowiadających obrazom poszczególnych cyfr oraz liter A…F (plus kombinacja odpowiedzialna za wygaszenie wyświetlacza LED), natomiast druga (COMS[4]) przechowuje wartości, których przepisanie na port wspólnych anod wyświetlaczy LED, PORTD powoduje załączenie odpowiedniej cyfry wyświetlacza (0…3, liczone od prawej). Dodatkowo zadeklarowano niewielką tablicę w pamięci RAM Digit[4], która przechowuje wartość kolejnych cyfr przeznaczonych do wyświetlenia na wyświetlaczu LED. Definicje, o których mowa powyżej, pokazano na listingu 2.
Mamy już niezbędne definicje – pora na pierwszą funkcję, której zadaniem jest inicjalizacja procesu multipleksowania składająca się z konfiguracji portów sterujących oraz konfiguracji i uruchomienia układu czasowo-licznikowego Timer0, w tym jego przerwania od porównania wartości licznika z wartością rejestru OCR0A. Wspomnianą funkcję inicjalizacyjną zamieszczono na listingu 3. Pora na ostatni element „układanki”, tj. funkcję obsługi przerwania układu Timer0 odpowiedzialną za realizację mechanizmu multipleksowania wyświetlaczy LED, którą pokazano na listingu 4.
Zgodnie z tym, co obiecałem we wstępie, dzięki wprowadzeniu zmiennych DIGITS[17] i COMS[4] (w szczególności) wspomniana funkcja stała się bardzo krótka i czytelna, co powinno być główną zasadą w wypadku implementacji jakichkolwiek funkcji obsługi przerwań systemowych. Co więcej, wprowadzono dodatkową funkcjonalność w postaci obsługi migania cyfr wyświetlacza LED wykorzystywaną w programie obsługi urządzenia do sygnalizacji faktu edycji wybranej pozycji. Funkcjonalność tę uruchamiamy niezależnie dla każdej z cyfr wyświetlacza poprzez ustawienie najbardziej znaczącego bitu odpowiadającej jej zmiennej Digit[4].
To tyle, jeśli chodzi o szczegóły implementacyjne mechanizmu multipleksowania cyfr wyświetlacza LED. Z jednej strony jest to zagadnienie dość nieskomplikowane, z drugiej, nie zawsze rozumiane przez początkujących elektroników.
Na rysunku 2 pokazano schemat montażowy płytki zamka elektronicznego. Montaż należy rozpocząć od wlutowania 4 zworek, których położenie zaznaczono graficznie na obwodzie drukowanym. Następnie lutujemy rezystory i kondensatory, kolejno elementy półprzewodnikowe, a na samym końcu elementy mechaniczne, jak złącza PWR i LOCK, przekaźnik REL oraz enkoder CODE. Podczas montażu wyświetlacza LED należy odsunąć go od powierzchni płytki urządzenia o około 2 mm, aby górna powierzchnia jego obudowy znajdowała się na tym samym poziomie, co górna powierzchna obudowy przekaźnika REL.
Poprawnie zmontowane z użyciem zaprogramowanego mikrokontrolera urządzenie nie wymaga żadnej regulacji i powinno działać od razu po włączeniu zasilania. W zależności od zastosowanego koloru wyświetlacza LED niezbędnym może okazać się dobór wartości rezystorów ograniczających prąd poszczególnych jego segmentów (R3…R10). Domyślny kod użytkownika wynosi „0000”. Kod ten możemy awaryjnie przywrócić przez zwarcie wyprowadzenia nr 5 mikrokontrolera (oznaczonego na płytce jako DEF) do masy zasilania podczas włączania urządzenia (wyłącznie).
Obsługa
Tworząc oprogramowanie, starałem się maksymalnie uprościć obsługę zamka, jednocześnie zachowując wymaganą funkcjonalność. Ma to o tyle znaczenie, że jedynym elementem regulacyjnym jest enkoder z wbudowanym przyciskiem, więc dla uzyskania dużej ergonomii obsługi stosowne założenia musiały być dobrze przemyślane. Po pierwsze, wprowadzony tryb konfiguracyjny, którego uruchomienie jest możliwe wyłącznie podczas włączania urządzenia dzięki wciśnięciu przycisku wbudowanego w ośkę enkodera. Ten tryb pozwala na ustawienie czasu załączenia (0…5 sekund) przekaźnika towarzyszącego odblokowaniu/zablokowaniu zamka szyfrowego. W wypadku ustawienia czasu 0 s przekaźnik pozostaje cały czas załączony po zablokowaniu zamka szyfrowego, zaś wyłączony po odblokowaniu. W wypadku ustawienia wartości z zakresu 1…5 s przekaźnik jest załączany chwilowo na czas odpowiadający ustawieniu (1…5 s) przy każdym zablokowaniu/odblokowaniu naszego zamka szyfrowego.
Wyjście z trybu konfiguracyjnego jest możliwe dzięki ponownemu wciśnięciu przycisku wbudowanego w ośkę enkodera. W tym momencie przechodzimy do trybu bezczynności urządzenia (wyświetlacz wygaszony). Co ważne, domyślnie, po włączeniu zasilania (lub wyjściu z trybu konfiguracyjnego) zamek pozostaje odblokowany.
Wciśnięcie ośki enkodera powoduje wejście w tryb wprowadzania kodu użytkownika w celu zablokowania zamka. Towarzyszy temu miganie pierwszej cyfry od prawej oraz możliwość jej zmiany dzięki kręceniu ośką enkodera (w zakresie „0”…„9”, „A”…„F”). Zatwierdzenia wprowadzanej cyfry dokonujemy poprzez wciśnięcie przycisku wbudowanego w ośkę enkodera. W tym momencie cyfra ta przesunie się w lewo o jedną pozycję i przestanie migać, zaś cyfra pierwsza od prawej, jak poprzednio, zacznie ponownie migać, sugerując możliwość jej edycji. Innymi słowy, kod wprowadzamy od lewej do prawej (patrząc na kod, zaczynając od cyfry bardziej znaczącej), przy czym bieżąco edytowana cyfra jest wyświetlana zawsze na pozycji pierwszej od prawej, zaś poprzednio wprowadzone cyfry przesuwane o odpowiednią liczbę pozycji w lewo. Kroki te powtarzamy 4 razy, aż do momentu wprowadzenia całego kodu, po którym nastąpi zablokowanie zamka szyfrowego (i stosowna reakcja przekaźnika), zapamiętanie kodu w nieulotnej pamięci EEPROM mikrokontrolera oraz przejście w tryb bezczynności urządzenia.
Fakt zablokowania zamka jest sygnalizowany przez świecenie kropki dziesiętnej na pozycji 0 wyświetlacza nawet w czasie bezczynności urządzenia. Warto również podkreślić, że dla wygody użytkownika wprowadzono dodatkowy mechanizm, dzięki któremu możemy pominąć wprowadzanie kodu użytkownika służącego do zablokowania zamka, przyjmując domyślnie wcześniej używany i zapamiętany kod blokady. W tym celu po wejściu w tryb wprowadzania kodu użytkownika (ze stanu bezczynności) należy przycisnąć i przytrzymać na dłużej ośkę enkodera, po czym nastąpi zablokowanie zamka szyfrowego (i stosowna reakcja przekaźnika) oraz przejście w tryb bezczynności. W tym momencie (po zablokowaniu zamka) wciśnięcie ośki enkodera powoduje wejście w tryb wprowadzania kodu użytkownika (jak poprzednio), lecz tym razem w celu odblokowania zamka.
Wprowadzenie poprawnego kodu powoduje odblokowanie zamka (i stosowną reakcję przekaźnika), zaś błędnego, przejście do trybu bezczynności urządzenia w oczekiwaniu na wprowadzanie nowego kodu odblokowującego. Pozostawanie w trybie wprowadzania kodu użytkownika (migająca pierwsza cyfra od prawej) i nieukończenie tego procesu w czasie 5 s powoduje wyjście do trybu bezczynności urządzenia. Czas ten liczony jest każdorazowo od nowa po dokonaniu jakiejkolwiek edycji. Ponadto, w celu sygnalizacji stanu pracy, urządzenie wyświetla kilka informacji tekstowych, których zestawienie, łącznie z ich znaczeniem, umieszczono w tabeli 1.
Robert Wołgajew, EP