- napięcie zasilania: 4…5 V,
- prąd obciążenia (średni/maksymalny): 30 mA/110 mA (emisja dźwięku),
- dopuszczalny prąd styków przekaźnika: 10 A @ 30 VDC, 0,3 A @ 125 VAC.
Postanowiłem zbudować prosty zamek kodowy, do którego kod użytkownika wprowadzać będziemy za pomocą elektronicznego pokrętła wydającego dźwięk „tykania”, charakterystyczny dla pokręteł kodowych wielkich sejfów bankowych, znanych chociażby z filmowych produkcji. Ponadto założyłem, że wyświetlane przez zamek kodowy cyfry przesuwać się będą w rytm obracania wspomnianego pokrętła, tak jakbyśmy używali cylindrycznego bębna z nadrukowanymi nań znakami (coś w rodzaju starych liczników w magnetofonach z lat 80.). Jak łatwo się domyślić, w roli wspomnianego wcześniej pokrętła zastosowałem prosty enkoder inkrementalny, zaś funkcję wyświetlacza, za pomocą którego udało się osiągnąć efekt animacji zmiany cyfr, pełni prosta matryca diod LED o organizacji 5×7 punktów. I właśnie na bazie powyższych założeń powstał projekt urządzenia codeLock.
Jak widać, zaprojektowany system mikroprocesorowy jest bardzo prosty, a jego serce stanowi niewielki, ale bardzo nowoczesny mikrokontroler ATtiny1604 firmy Microchip (dawniej Atmel), taktowany wewnętrznym oscylatorem RC o częstotliwości 10 MHz i realizujący całą założoną funkcjonalność urządzenia. Mikrokontroler nasz steruje pracą szeregowego rejestru przesuwnego 74HC4094 (wyprowadzenia PA3/SCK –> Clock, PA0/MOSI –> Data), dzięki któremu realizuje obsługę matrycowego wyświetlacza LED w konfiguracji wspólnej anody (wyprowadzenia PA7…PA4, PA2 mikrokontrolera), obsługuje enkoder inkrementalny z wbudowanym przyciskiem (dzięki zastosowaniu przerwania od zmiany stanu pinów portu PORTB mikrokontrolera – w naszym przypadku pinu PB1), steruje pracą przekaźnika LOAD (poprzez prosty klucz tranzystorowy NPN) oraz odpowiedzialny jest za generowanie dźwięku poprzez wbudowany głośniczek SMD, co realizuje za pomocą wbudowanych w swoją strukturę układów czasowo-licznikowych: TCA0 (pracującego w trybie PWM) oraz TCB0 (pracującego w trybie Periodic Interrupt). Wybór mikrokontrolera ATtiny1604 oraz podłączonego do jego wyprowadzeń rejestru szeregowego 74HC4094 mógłby się wydawać dość wątpliwy, jeśli wziąć pod uwagę, że bez problemu dałoby się tu wybrać mikrokontroler o odpowiedniej liczbie portów wyjściowych, zamiast stosować procesor i rejestr przesuwny. To tylko pozory! Po pierwsze, nie chciałem stosować mikrokontrolera o większej liczbie (niepotrzebnych) wyprowadzeń, a co za tym idzie – o niewygodnej do lutowania dla amatora obudowie (TQFP32). Jeszcze istotniejszy jest jednak fakt, że zastosowanie rejestru przesuwnego 74HC4094 zdecydowanie upraszczało projekt obwodu drukowanego (tak, tak!); nie wspominając już o cenie układu tego rodzaju, wynoszącej około 1 zł. Co warto również zaznaczyć, do sterowania rejestru przesuwnego używany jest wbudowany w strukturę mikrokontrolera interfejs SPI, przez co jego obsługa stała się niezmiernie prosta i szybka (zegar SPISCK=5 MHz).
Wspomniane wcześniej wspólne anody wyświetlacza LED sterowane są poprzez proste klucze tranzystorowe T1…T5 (ze zintegrowanymi w ich strukturze rezystorami: bazowym i podciągającym), z uwagi na dość duże prądy o wartościach rzędu 35 mA (7×5 mA). Z kolei wspólne katody naszych elementów LED obsługiwane są przez wyprowadzenia rejestru przesuwnego i, jak już można się domyślić, do ich obsługi (i obsługi wspólnych anod) zastosowany został doskonale znany mechanizm multipleksowania. Jest to standardowe rozwiązanie problemu tego typu, a polega na sekwencyjnym sterowaniu kolejnych kolumn wyświetlacza LED, w którym przeprowadzane są kolejne i następujące po sobie poniższe operacje:
- wyłączamy wszystkie wspólne anody (a tym samym wszystkie elementy LED),
- na port wspólnych katod wystawiamy (poprzez rejestr przesuwny) „wzór” do wyświetlenia (aktywny stan „0”),
- załączamy wybraną wspólną anodę (aktywny stan „0”), wyświetlając tym samym wcześniejszy „wzór” na wybranej kolumnie diod LED,
- powtarzamy powyższy proces dla kolejnych wspólnych anod.
Opisany proces, wykonywany dostatecznie szybko (w naszym wypadku 60 razy na sekundę dla każdej wspólnej anody), pozwala na obsłużenie 35 elementów LED (diod reprezentujących wyświetlaną treść), przy udziale wyłącznie 7 wyprowadzeń mikrokontrolera. Prawda, że proste? A jakie efektywne! Już teraz uprzedzę Czytelników, że użyty w tym celu zostanie układ czasowo-licznikowy RTC wbudowany w strukturę mikrokontrolera, który pracował będzie w trybie Periodic Interrupt i wywoływał stosowne przerwanie systemowe (od przepełnienia) 300 razy na sekundę (czyli 60 razy dla każdej wspólnej anody), obsługując właściwy mechanizm multipleksowania. Ale wróćmy do schematu ideowego naszego urządzenia, gdyż kilka niezbędnych słów komentarza wymaga blok generujący dźwięk. Jak działa ten mechanizm? Jak już wspomniałem wcześniej, do generowania dźwięku zaprzęgnięto dwa układy czasowo licznikowe: TCA0 pracujący w trybie PWM oraz TCB0 pracujący w trybie Periodic Interrupt. Timer TCA0 generuje na wyprowadzeniu PB2 (WO2) mikrokontrolera 8-bitowy przebieg PWM, którego wypełnienie zależne jest od wartości jego rejestru porównania CMP2.