- zasilanie: 5 V DC,
- dwa tryby pracy: bistabilny i monostabilny z programowalną długością impulsu,
- prosta konstrukcja oparta na mikrokontrolerze PIC12F675,
- wyjście przekaźnikowe,
- wbudowany przełącznik antysabotażowy (tamper),
- sygnalizacja stanu pracy urządzenia za pomocą dwukolorowej diody LED i buzzera.
Budowa układu
Układ wyposażony jest w klawiaturę numeryczną o 12 przyciskach i architekturze matrycowej 3×4. Można sądzić, że do obsługi takiej klawiatury należy użyć 7 linii GPIO mikrokontrolera. W tym jednak wypadku zastosowano 8-pinowy mikrokontroler PIC12F675, który dokonuje odczytu klawiatury za pomocą... pojedynczego wejścia przetwornika analogowo-cyfrowego! Nie zawsze trzeba więc używać wielordzeniowego „giganta” o zatrważającej liczbie wyprowadzeń. Przy odpowiednim zagospodarowaniu dostępnych komponentów można czasem stworzyć coś użytecznego na bazie skromnego mikrokontrolera, oferującego jedynie 1 kB pamięci Flash. Na rysunku 1 znajduje się schemat ideowy opisywanego układu.
Do wyprowadzeń klawiatury podłączono dzielnik składający się z sześciu rezystorów – w ten sposób, że do rezystora R6, podłączonego do zasilania +5 V, dołączany jest drugi rezystor dzielnika przez przyciśnięcie klawiatury. W ten sposób na wejściu przetwornika analogowo-cyfrowego mikrokontrolera (IC1, pin nr 7) pojawia się napięcie w zakresie od 0 V do +5 V odpowiadające kolejnym przyciskom klawiatury. Odczyt +5 V oznacza, że wszystkie przyciski klawiatury są zwolnione, a 0 V oznacza naciśnięcie przycisku „#” klawiatury. Przy zastosowaniu rezystorów o tolerancji 1% i użyciu wszystkich dostępnych 10 bitów przetwornika ADC można rozróżnić 12 różnych stanów. Nie należy martwić się odchyłkami napięcia zasilania, ponieważ to samo napięcie stanowi także odniesienie dla przetwornika ADC. Wartości rezystorów dobrano na tyle wysokie, aby płynący przez obwód prąd nie uszkadzał węglowego styku klawiatury.
W tabeli 1 zebrano kody poszczególnych przycisków, wraz z odpowiadającymi im napięciami i odchyłkami wynikającymi z tolerancji rezystorów (te zaś opisano w tabeli 2).
Jak widać, wystarczy przeanalizować tylko 8 najstarszych bitów wyniku pomiaru pozyskiwanego z przetwornika. Wartością tą, w przypadku mikrokontrolerów PIC, można wygodnie zarządzać przez bity sterujące, które justują wynik w lewo lub prawo, dzięki temu „na gotowo” otrzymujemy 8 najstarszych bitów w jednym rejestrze.
Od tego już łatwa droga do stworzenia reguły, która umożliwi poprawne dekodowanie wszystkich 12 przycisków:
Jeśli FF ⇔ no key
Jeśli D.7=1 ⇔ 2
Jeśli ADC-076h > 0 ⇔ 5
Jeśli ADC-071h > 0 ⇔ 8
Jeśli ADC-06Ah > 0 ⇔ 0
Jeśli ADC-060h > 0 ⇔ 1
Jeśli ADC-04Ah > 0 ⇔ 3
Jeśli ADC-03Fh > 0 ⇔ 4
Jeśli ADC-033h > 0 ⇔ 7
Jeśli ADC-026h > 0 ⇔ *
Jeśli ADC-019h > 0 ⇔ 6
Jeśli ADC-08h > 0 ⇔ 9
else ⇔ #
Może nieco dziwić stosowanie odejmowania w tej funkcji, ale należy pamiętać, że rdzeń PIC oferuje tylko 25 instrukcji i nie ma wśród nich operacji porównania dwóch bajtów – dlatego łatwiej jest odjąć od wyniku konwersji ADC pokazane powyżej wartości (w odpowiedniej, malejącej kolejności) i obserwować bit carry w rejestrze status.
Do portów GPIO2 i GPIO4 mikrokontrolera (wyprowadzenia 5 i 4) podłączone są anody dwukolorowej diody LED. Do wyprowadzenia GPIO5 (pin nr 2 mikrokontrolera) podłączony jest sygnalizator piezoelektryczny bez generatora. Port GPIO1 (pin nr 6) mikrokontrolera stanowi „wyjście” układu – poprzez tranzystor T1 steruje przekaźnikiem PX1, otwierającym np. elektrozaczep chronionych drzwi. Instalator sam może wybrać, czy potrzebna jest mu konfiguracja styku NO czy NC – obie opcje dostępne są na kostce łączeniowej. Port GPIO3 mikrokontrolera nie jest ustawiony jako tradycyjne wejście zerujące MCLR, ale jako wejście, do którego podłączono goldpin Z1 (współpracujący z opcjonalną zworką) oraz rezystor podciągający R7.
Cały układ zasilany jest napięciem stałym 12 V (jest to typowe napięcie dostępne w systemach kontroli dostępu, stosowane najczęściej np. do wysterowania elektrozaczepu rygla drzwi). Napięcia +5 V (do mikrokontrolera) dostarcza stabilizator IC2.
Dodatkowo układ wyposażony jest w wyłącznik krańcowy SW1, który zmienia swój stan w chwili otwarcia obudowy lub odchylenia jej od płaszczyzny, do której jest przymocowana (np. ściany) – to standardowe zabezpieczenie antysabotażowe, stosowane w systemach kontroli dostępu. Jeśli chcielibyśmy stworzyć swój własny system kontroli dostępu, to wyłącznikiem tym można na przykład wyłączać trwale napięcie zasilania układu tak, aby uniemożliwić sterowanie rygla drzwi przez zwieranie wyjść przekaźnika.
Program
Program został napisany w asemblerze. Funkcja obsługująca odczyt klawiatury została już właściwie omówiona – warto jedynie dodać, że po wykryciu przyciśnięcia klawiatury mikrokontroler aktywuje sygnalizator piezoelektryczny na czas 50 ms. Funkcja generowania przebiegu o częstotliwości 2,5 kHz na porcie GPIO5 jest obsługiwana przez przerwanie od timera sprzętowego.
Po włączeniu zasilania układu mikrokontroler sprawdza zawartość pamięci EEPROM. W pierwszych czterech komórkach przechowywany jest kod aktywujący przekaźnik – są to 4 cyfry z zakresu 0...9. Jeśli pamięć jest czysta (po wgraniu programu do mikrokontrolera), to w pierwszej komórce pamięci znajdujemy wartość FFh. Wówczas wpisywane są tam początkowe ustawienia według tabeli 3.
Jeśli pojawi się potrzeba przywrócenia ustawień „fabrycznych” (np. jeżeli zapomnimy kodu), możemy użyć „tajemniczej” zwory Z1. Jeśli założymy ją na złącze goldpin (zwierając w ten sposób port GPIO3 do GND) i włączymy zasilanie, to mikrokontroler w pierwszej kolejności wpisze do pamięci EEPROM umieszczone w powyższej tabeli wartości.
Podczas normalnej pracy mikrokontroler oczekuje na podanie 4 cyfr kodu i zatwierdzenie ich przyciskiem „#’. Jeśli kod jest zgodny z zapisanym w pamięci EEPROM, mikrokontroler aktywuje przekaźnik według jednego z dwóch trybów pracy. Tryb bistabilny działa w ten sposób, że po wpisaniu poprawnego kodu przekaźnik zmienia swój stan i pozostaje w nim do czasu ponownego wpisania poprawnego kodu. W trybie monostabilnym przekaźnik znajduje się po włączeniu zasilania w stanie nieaktywnym aż do chwili wpisania poprawnego kodu. Wówczas styki są przełączane na czas określony przez użytkownika (1...12 sekund), po czym układ powraca do trybu nieaktywnego.
Wykrycie poprawnego kodu generuje 3 krótkie dźwięki, a błędny kod skutkuje wydaniem 2 długich sygnałów akustycznych. W czasie, gdy przekaźnik jest aktywny, zaświeca się zielona dioda LED, a gdy pozostaje w stanie nieaktywnym – włączona jest czerwona struktura diody LED. Można było oczywiście użyć tego samego portu mikrokontrolera do sterowania przekaźnikiem i zieloną diodą LED, ale nie zdecydowałem się na to rozwiązanie, ponieważ podczas programowania ustawień urządzenia włączane są obydwie diody jednocześnie, co skutkuje wytworzeniem światła żółtego.
Programowanie ustawień użytkownika
Użytkownik znający poprawny kod ma możliwość zmiany „hasła” i trybu pracy (bistabilny/monostabilny) oraz ustawienia czasu trwania stanu aktywnego przekaźnika w trybie monostabilnym.
Zmiana kodu
Aby zmienić kod, należy wprowadzić sekwencję:
* [4 cyfry kodu] # 1 [4 cyfry nowego kodu] # [4 cyfry nowego kodu – powtórzenie] #
Tryb pracy monostabilnej
Aby ustawić tryb monostabilny, należy wprowadzić sekwencję:
* [4 cyfry kodu] # 2 1
Tryb pracy bistabilnej
Aby ustawić tryb bistabilny, należy wprowadzić sekwencję:
* [4 cyfry kodu] # 2 2
Po przywróceniu ustawień fabrycznych (zwora Z1 lub wgranie programu Flash do mikrokontrolera) – układ pracuje w trybie pracy bistabilnej.
Czas aktywny w trybie pracy monostabilnej
Jeżeli układ ma pracować w trybie pracy monostabilnej, należy ustalić pożądany czas aktywacji wyjścia po wpisaniu kodu. Po resecie do ustawień fabrycznych będzie to 15 sekund (komórka pamięci EEPROM o adresie 05h przyjmuje wartość FFh – cztery najmłodsze bity tej komórki określają ów czas wyrażony sekundach). Parametr ten można zmieniać w zakresie od 1 do 12 sekund poprzez zastosowanie sekwencji:
* [4 cyfry kodu] # 3 [jeden przycisk z klawiatury określający czas]
Przycisk klawiatury „0” – czas 10 sekund
Przycisk klawiatury „*” – czas 11 sekund
Przycisk klawiatury „#” – czas 12 sekund
Stosując różne typy klawiatury, można natrafić na pewne problemy. Klawiatury mechaniczne (w których styk stanowi miedziana blaszka) można spotkać w starych telefonach stacjonarnych – mają one niską rezystancję styku. W przypadku klawiatury ze stykiem napylanym (węglowym) sytuacja jest inna i rezystancja styku nie pozostaje bez znaczenia. W razie kłopotów z uruchomieniem (gdy układ nie przyjmuje kodu 1111#) można posłużyć się „zaszytą” w programie funkcją decoder. Uruchamiając tę funkcję, po każdym przyciśnięciu klawiatury usłyszymy jeden dźwięk potwierdzający przyciśnięcie oraz – po krótkiej przerwie – kilka dźwięków odpowiadających wartości przyciśniętego przycisku. Przykładowo: przyciśnięcie klawisza „3” wywoła trzy krótkie dźwięki. W ten sposób można łatwo sprawdzić, czy mikrokontroler poprawnie odczytuje klawiaturę i w razie potrzeby zweryfikować wartości, które są odejmowane w funkcji odczytu klawiatury (KEY_RD). Aby uruchomić funkcję decoder, wystarczy „odkomentować” kilka linii programu (listingi 1 i 2).
clrwdt
call delay10
call KEY_RD
btfsc key_cod, 7
goto MENU
call delay100ms
;*******************************
; call decoder ;od-komentowac!
; call delay1s ;od-komentowac!
; goto MENU ;od-komentowac!
;*******************************
Listing 1. Fragment programu, który należy zmodyfikować w celu uruchomieni funkcji „decoder”
movlw h’ff’ ;key-cod – brak nacisniecia klawisza
movwf key_cod
bcf status, c
movf adresh, 0
sublw h’78’ ; bylo 76!!!
btfsc status, c ;
goto KEY_RD11
movlw h’05’ ;key-cod – 5
Listing 2. Fragment funkcji „KEY_RD” – przykład korekty wartości odejmowanych od wyniku przetwarzania ADC
Łatwo wyobrazić sobie sytuację, w której został naciśnięty jeden przycisk, a układ rozpoczął oczekiwanie na kolejne cyfry kodu i... tak w nieskończoność. Osoba, która będzie chciała następnie wpisać kod, nie będzie świadoma, że ktoś już coś wcześniej nacisnął. Dlatego w programie została zaimplementowana obsługa układu watchdog, wyposażonego w wewnętrzny oscylator, którego okres taktowania to 18 ms. Przy maksymalnym podziale częstotliwości (prescaler 1/128) watchdog będzie restartował układ po czasie około 2,3 sekundy. Tyle czasu mamy po pierwszym przyciśnięciu klawiatury na wprowadzenie drugiej oraz kolejnych cyfr kodu – każdorazowo czas ten jest liczony od wciśnięcia poprzedniego klawisza.
Microchip nie przewidział możliwości blokowania działania układu watchdog i jeśli uruchomi się go na początku programu, to potem nie ma już możliwości jego wyłączenia. Dlatego też trzeba pilnować, aby zerowanie licznika WDT następowało częściej niż co 2,3 sekundy. Jeśli nie wyzerujemy licznika WDT (tj. minie czas przewidziany na wprowadzenie kolejnej cyfry kodu), nastąpi reset (3 krótkie dźwięki), a układ powróci do stanu początkowego, oczekując na wprowadzenie kodu. W tej sytuacji pojawia się nowa komplikacja. Jeśli wyjście układu znajduje się w stanie aktywnym (przekaźnik włączony, świeci zielona LED), układ pracuje w trybie bistabilnym, a ktoś naciśnie klawiaturę i nie wprowadzi całego kodu, to po czasie 2,3 sekundy od zwolnienia klawiatury nastąpi reset układu i przekaźnik wróci do stanu początkowego (przekaźnik nieaktywny, dioda świeci światłem czerwonym). Aby uniknąć takiej sytuacji, w chwili wpisania poprawnego kodu (w trybie pracy bistabilnej) stan układu (przekaźnika i diody LED) zostaje zapamiętany w pamięci EEPROM pod adresem 0x0Fh. Po resecie wartość ta jest pobierana z pamięci i układ przełącza się w stan sprzed resetu.
Montaż i uruchomienie
Układ składa się z minimalnej liczby elementów i zmontowany jest na niewielkim, dwustronnym obwodzie drukowanym o wymiarach 50×40 mm (rysunki 2 i 3). Montaż należy rozpocząć od mikrokontrolera w obudowie SO-8, przy czym można przylutować zaprogramowany wcześniej układ lub wgrać program już po zamontowaniu mikrokontrolera na PCB. Programowanie mikrokontrolera przed montażem wymaga jednak kosztownej podstawki, dlatego dużo łatwiej jest przeprowadzić ten proces już po przylutowaniu mikrokontrolera – wystarczy w tym celu przylutować 4 przewody z programatora do punktów GND, MCLR, GPIO0, GPIO1 i wgrać program.
Po zamontowaniu mikrokontrolera należy przylutować pozostałe elementy SMD. Trzeba przy tym pamiętać, że rezystory R1...R6 muszą mieć 1-procentową tolerancję. W przeciwnym wypadku mogą zdarzyć się przekłamania odczytu klawiatury. Na końcu należy zamontować pozostałe elementy wraz ze złączem klawiatury. Ja użyłem klawiatury membranowej typu STD34-07, ale można zastosować np. klawiaturę ze starego aparatu telefonicznego. Podczas normalnej pracy zwora Z1 powinna być otwarta. Przy pierwszym uruchomieniu kod to 1111.
Prosta konstrukcja urządzenia nie powinna stwarzać kłopotów nawet niedoświadczonym elektronikom.
Grzegorz Mazur
- R1: 750 Ω
- R2: 1,5 kΩ
- R3: 4,7 kΩ
- R4: 2,2 kΩ
- R5: 7,5 kΩ
- R6: 10 kΩ
- C1: 100 nF (SMD 1206)
- C2: 100 μF/10 V (elektrolityczny, THT)
- C3: 47 μ/16 V (elektrolityczny, THT)
- C4: 22 pF (SMD 1206 – patrz tekst)
- D1: BAS16 (SOT-23)
- LED: dioda LED dwukolorowa (R/G, wspólna katoda)
- IC1: PIC12F675 (SO-8)
- IC2: LM78L05 (TO-92)
- T1: BSS138 (SOT-23)
- KEY: klawiatura membranowa STD34-07 ze złączem goldpin 7 pin.
- BUZ: buzzer piezo bez generatora
- SW1: przełącznik krańcowy do montażu THT
- PX1: przekaźnik (patrz opis w tekście)
- Z1: goldpin 2 pin. ze zworką