![[Arduino Mega 2560][RFID]12 strefowy czytnik dostępu na magistrali WIEGAND 26/34 [Arduino Mega 2560][RFID]12 strefowy czytnik dostępu na magistrali WIEGAND 26/34](https://obrazki.elektroda.pl/6035825200_1451334791_thumb.jpg)
Witam, w chciałbym się podzielić moim ostatnim tworem jaki powstał z chwili potrzeby.
![[Arduino Mega 2560][RFID]12 strefowy czytnik dostępu na magistrali WIEGAND 26/34 [Arduino Mega 2560][RFID]12 strefowy czytnik dostępu na magistrali WIEGAND 26/34](https://obrazki.elektroda.pl/2685746200_1451434768_thumb.jpg)
![[Arduino Mega 2560][RFID]12 strefowy czytnik dostępu na magistrali WIEGAND 26/34 [Arduino Mega 2560][RFID]12 strefowy czytnik dostępu na magistrali WIEGAND 26/34](https://obrazki.elektroda.pl/2820438100_1451434773_thumb.jpg)
![[Arduino Mega 2560][RFID]12 strefowy czytnik dostępu na magistrali WIEGAND 26/34 [Arduino Mega 2560][RFID]12 strefowy czytnik dostępu na magistrali WIEGAND 26/34](https://obrazki.elektroda.pl/1850987000_1451434777_thumb.jpg)
![[Arduino Mega 2560][RFID]12 strefowy czytnik dostępu na magistrali WIEGAND 26/34 [Arduino Mega 2560][RFID]12 strefowy czytnik dostępu na magistrali WIEGAND 26/34](https://obrazki.elektroda.pl/4784630600_1451434782_thumb.jpg)
![[Arduino Mega 2560][RFID]12 strefowy czytnik dostępu na magistrali WIEGAND 26/34 [Arduino Mega 2560][RFID]12 strefowy czytnik dostępu na magistrali WIEGAND 26/34](https://obrazki.elektroda.pl/2217788700_1451434888_thumb.jpg)
EDIT [AKTUALIZACJA]:
Spoiler:
Zaktualizowałem plik wiegand.zip, jako, że w trybie panic poprzednio nie pokazywana była w konsoli informacja kiedy wciśnięty był przycisk EXIT, naprawiono, teraz w trybie panic pokazuje się w konsoli:
gdzie numer 5 to numer strefy
w trybie normalnym jest tj. było, czyli:
Gdzie:
B - button
O - Output
Code:
#B:5: OFF
gdzie numer 5 to numer strefy
w trybie normalnym jest tj. było, czyli:
Code:
#B:5: ON
#O:5: ON
<po wygaśnięciu>
#O:5:OFF
Gdzie:
B - button
O - Output
Jako kiedyś przeczytałem o biochipach dostępnych do zakupu przez internet od razu pomyślałem, że to coś dla mnie. Program prezentowany poniżej służyć ma praktycznemu wykorzystaniu tagów RFID 125KHz i służyć ma do celów dawania dostępu/otwierania wybranych stref/drzwi oraz usprawiedliwienia dla praktycznego użycia implantu który mam w prawej i lewej ręce (prawa xEMi 125 KHz, lewa xNTi NTAG2)
Założenia były dosyć ogólne, część funkcji doszła w trakcie tworzenia oprogramowania. Jako, że na codzień korzystam z systemu autoryzacji dostępowej dla pracowników w moim zakładzie pracy łącznie z rozliczaniem godzin dość dużo "rozwiązań zdołałem w ten sposób podejrzeć (gdzie już od roku testuje implant)
Na wstępnie muszę powiedzieć, że jest to moja pierwsza przygoda z Arduino oraz Arduino Ide i C dla AVR, jeszcze tydzień temu jedynie się zastanawiałem "jak by to było" aż przyszły zamówione przeze mnie 2x Arduino Mega 2560 (ot taki prezent na święta

Dotychczas programować zdarzało mi się jedynie przy pomocy PHP/JAVA/JAVASCRIPT (ostatnie kilka lat), w czasach szkoły średniej (czyli ponad 10 lat temu) miałem pierwsze raczkowanie w assembler dla 8051, gdzie AVR były poza sferą moich możliwości (na ten czas).
Ogólnie jestem pod niesamowitym wrażeniem tego jak łatwe i proste oraz przyjemne potrafi być programowanie dzisiejszych uP
Aktualny program powstał, gdyż chciałem "dorobić" sobie możliwość otwierania samochodu przy pomocy taga RFID(takie usprawiedliwienie dla implantu w prawej dłoni), jednak nie chciałem poprzestać jedynie na tym fakcie, chciałem móc niezależnie otworzyć same drzwi kierowany, osobno bagażnik, czy wyłącznie drzwi pasażera oraz być może skopiować program na inną płytkę i np zamontować we własnym domu (przykład).
Aktualnie dostępne na rynku rozwiązania są niesamowicie drogie(200 EUR i wiele wiele więcej) i posiadają wiele oczywistych ograniczeń (np tylko 2/4 wejścia/wyjścia, brak elastyczności etc).
Niżej zaprezentowany program posiada aż 12 stref, każda może posiadać 1 lub więcej czytników(po jednym dla każdej ze stron drzwi), przycisk wypuszczenia, sensor alarmowy(czujnik otwarcia drzwi). Całość posiada wejście emergency umożliwiające natychmiastowe otwarcie wszystkich stref (np sygnał z alarmu pożarowego, przycisk w "pokoju ochrony" etc), System posiada 3 stopnie autoryzowania dostępu:
1 najwyższy tzw mastercarta, oprócz zwykłego otwierania drzwi, mozna nią także programować/kasować karty 3 poziomu.
2 20 kart 2 poziomu dostępu, ich programowanie odbywa się wyłącznie za pomocą konsoli UART
3 500 karty najniższego poziomu
Dodana jest linia panic - np w razie wykrycia kradzieży, gdzie do czasu trwania sygnału autoryzacja kart 3 poziomu jest wyłączona, de aktywowane są również przyciski w strefach autoryzacja dostępna jest jedynie za pomocą kart z poziomu 1 lub 2 (uruchomiona np na czas trwania alarmu lub też przy pomocy przycisku z pokoju ochrony)
Przytrzymanie przycisku wyjścia nie blokuje strefy jako otwarta - wyzwalanie jest jedynie zboczem opadającym. Przytrzymanie karty przy czytniku utrzymuje strefę otwartą.
Za pomocą konsoli można:
- sprawdzać stan wejść,
- listować karty,
- kasować poszczególną kartę, dodać jedynie 1 kartę
- sprawdzić czy dana karta jest w systemie i jaki ma poziom,
- podglądać zdarzenia - typu otwarte drzwi bez uprzedniej autoryzacji, użycie autoryzowanej karty lub nie, załączona linia emergency/panic
- można zmienić czas trwania impulsu na wyjściu (wartość long) w ms [domyślnie 150ms]
- otwarcie strefy za pomocą komendy UART
Tryb panic mozna uruchomić za pomocą alarmu lub komendy z UART( komenda "set panic on"), różnica polega na tym, że jeżeli panic uruchomiono za pomocą komendy - należy ją powtarzać nie rzadziej niż co 5 minut. Daje to możliwość autoryzacji i otwarcia strefy przy pomocy komend z konsoli UART (po połączeniu z komputerem -i powrotu do pracy normalnej w przypadku gdyby pc nam sie "zawiesił")
Np. Wysyłane są numer czytnika, ID karty i jeżeli komputer ją autoryzuje otworzy strefę, lub otworzy przy pomocy przycisku wyjścia.
Tryb panic może być włączony na stałe podając sygnał GND na PIN 18 (nawet przed uruchomieniem układu)
Pamiętajcie, że karta poziomu 1 i 2 w trybie panic mogą aktywować daną strefę, warto montować też czytniki z obu stron drzwi w takim przypadku
Karta mastercard jest pierwszą użytą kartą z urządzeniem i jest zapisywana w pamięci eeprom kontrolera. Jej wykasowanie następuje poprzez podanie stanu niskiego na PIN 12 w chwili uruchomienia układu(czyszczona jest jedynie zmienna, nic nie jest kasowane w eeprom) jednak pierwsza użyta karta w dowolnym czytniku spowoduje zapisaniem nowej karty mastercard w eeprom.
Kiedy karta mastercard nie jest zapisana, układ będzie jej wyczekiwał sygnalizując to szybkim miganie diody LED przy PIN 13, jeżeli przytrzymamy kartę mastercard przez dłużej niż 5 cykli odczytu wchodzimy w tryb programowania.
Dioda LED przy PIN 13 miga, choć wolniej. Jeżeli nic nie zrobimy po 10s kontroler wyjdzie z trybu programowania i nie dokona zapisu żadnych zmian(każde odczytanie karty spowoduje wyzerowanie licznika, każda karta dodawana jest do tablicy tylko 1 raz,więc jej przytrzymanie przeciąga programowanie tak długo jak znajduje sie przy czytniku).
Jeżeli karta mastercard będzie trzymana po wejściu w trym programowania przez kolejne 5 cykli odczytu nastąpi całkowite wyczyszczenie wszystkich dodatkowych kart i zmiany zostają zapisane. Jeżeli po wejściu w tryb programowania zaczniemy przykładać kolejno karty to każda karta daje nam dodatkowe 10s okna czasowego od chwili ostatnio użytej karty (limit 500 kart!). Nadpisujemy tablicę kart w pamięci przy pomocy masterkarty.
Tryb programowania mastercartą można wyłączyć w konsoli UART.
Jeżeli mastercarta jest wyczyszczona tryb programowania jest automatycznie przywracany - jeżeli był wyłączony w konsoli - jednorazowo do kolejnego uruhomienia układu.
Poniżej zamieszczam listę opcji (język eng) oraz podstawowa lista komend UART:
Code:
Please feelfree to use/modify below program according to your needs.
Current futures:
- 12 zones/readers with dedicated output per each zone and dedicated exit button,
- panic line - when active only master and admin cards can trigger exit and from pc console
- panic confirmation output - when panic is active this line is active as well (ex. for led)
- emergency line - when active - for example from file alarm it will set all exits to open
- emergency confirmation output- when active emergency line this pin is active as well (ex. for led)
- emergency has priority over panic !!!
- each zone have its exit button, when pressed - it triggers the output
- each zone have alarm trigger, when line gets high then it triggers single alarm line with message on UART with zone number
- very first card used with any readersets this card as mastercard and saved to eeprom (can be reprogrammed)
- mastercard is always validated and triggers the output (despite panic mode on)
- when hold mastercard for 5 reads it switches to program mode (and temporary clear all remembered cards),
when no card will be swiped and master continue to be read for another 5 reads, all cards are erased and changes are saved to eeprom
- when in program mode, every new card swiped against the reader is being remembered, to write to eeprom just swipe mastercard one time as last card in programming process
- you can connect more than 1 reader for every zone (like 1 reader for each side of the doors);
- when nomastercards is set onboard led will blink very fast,
- when in program mode onboard led will blink slow
UART futures:
When 'console on' typed in your UART console, controller temporarily disable event messages, it will time out after 30s from last entered console command
available console commands (capital letters not required):
- at - automatic answer OK
- console on - activates the console mode
- console off / exit - de - activates the console mode
- list master - shows current mastercard ID
- list WIEGAND - shows currently selected WIEGAND mode 26/34 bits - not every reader have 34 bit output!!!
- list cards - list 1 card id per line
- list admin - list 1 card id per line
- list outtime - will show currently set output delay
- list out all - will show all shut sensors state OK for sensor conected with GND, NO for not conected
- list out 5 - will show 5 zone shut sensore state OK for sensor conected with GND, NO for not conected
- list cards space - show currently held ID's in memory as: 10/500
- list admin space - show currently held ID's in memory as: 1/20
- check B86FCC5 - check is card is master/admin or saved in eprom or not in memory
- hex 200 - converts decimal integer to hex number - just left it when tested :)
- clear master - temporary clears mastercard, first card swipped will be permanently saved as mastercard
- clear cards all - permanently removes all cards from eprom (it can take some time)
- clear admin all - permanently removes all admin cards from eprom (it can take some time)
- clear cards B86FCC5 - cleares card with id B86FCC5 from saved cards in eprom - no efect if card is a mastercard
- clear admin B86FCC5 - cleares card with id B86FCC5 from saved admin cards in eprom - no efect if card is a mastercard
- set master B86FCC5 - it will set card B86FCC5 as a mastercard
- set cards B86FCC5 - will add card with id B86FCC5 into first available cards slot in eprom
- set admin B86FCC5 - will add card with id B86FCC5 into first available admin cards slot in eprom
- set WIEGAND 26 - will set WIEGAND standard for 26 bits - all cards will still be stored as 32 bits
- set WIEGAND 34 - will set WIEGAND standard for 34 bits - all cards will still be stored as 32 bits
- set masterprog on/off - will enable/disble ability to run programming mode with mastercard
- set panic on/off - will disble temporary ability to validate cards saved in eprom, always not validated not affecting mastercad and admin cards in eeprom. Command need to be repeated every at least 5m (can be more often)
- set out 5 - will triger output for zone 5 equal with validatet card
- set outtime 3000 - will set output delay for 3000ms (saved in eeprom) [default: 150ms]
- pin 20 when connected to ground will open all doors (ex. trigerred by fire alarm, emergency button etc) - when active pin 21 will go to GND
- pin 18 when connected to ground will activate panic mode - only master card and admin card can trigger doors - panic mode - no in/out mode pin 19 will go to GND
- pin A0...A11 is equal to reader 0... reader 11 output is low when exit is trigerred
- all even pins from 22..44 are lines D1 for each WIEGAND reader
- all odd pins from 23..45 are lines D0 for each WIEGAND reader
- PIN 46..54, A15..A12 will act as a door sensore, when change to high while zone is not triggerred wil send alarm message via UART and triger alarm pin 17 for 100ms down to gnd
external functions:
Pin 18 to GND - panic mode - output trigger is possible oly by pc, mastercard or admin cards. Normal cards are temporary deactivated Pin 19 will go to GND when panic is activated
Pin 20 to GND - emergency exit - all zones are activated as long as Pin 19 is with GND - all doors openned no need to scan any card/reader Pin 21 will go to GND when emergency is activated
- pin PWM2...PWM13 trigers output on pins A2..A13, expeption (PWN0 and PWM1) because of the usbuart are Pin 15 trigers A0, Pin 14 trigers A1
- pin 12 when connected with GND on startup will temporary clear mastercard variable and will set masterprog to enable, it will allow to set very first scanned cacrd as mastercard
Uart event messages:
#MCOK, #MCNO - when boot mastercard loaded or not from eeprom
#READY - initialization is ready
messages which begins with ! are just for informational purpes
messages which begins with ? are results respond for console command
!OK - confirmation message
!NO - error occured - for ex. not enough spaceto add extra card etc
#R:3:86FCC8:OK - mesasage from reader 1 digit is reader number, second hex is TAG ID, last OK - validated, MC - mastercard, AC - Admin card, NO - unrecognized card
#O:3:ON, #O:3:OFF - Message romoutput, first digit is output number, second ON - activated, OFF deactivated
#B:4:ON - button which triggers zone state
#A:4:ON - doors on zone 4 were opened when lockwas not trigered
#PANIC:ON, #PANIC:OFF - panic line signalization
#EMERGENCY:ON, #EMERGENCY:ON - emergency line signalization
Program w wersji pozwalającej jedynie na odczyt danych z magistrali WIEGAND zajmował około 4KB flash oraz ~470B ram. Teraz po rozbudowaniu o wyżej wspomniane opcje zajmuje ~21KB flash oraz ~2KB ram z czego znaczną większość zajmują stringi użyte do konsoli, a ram konsumowany jest przez tablice na karty (1 karta = 4 bajty), przy 31 kartach program zużywa jedynie ~680B ram.
Nie przejmowałem się zbytnio optymalizacją pamięci flash jako, że Arduino mega 2560 posiada 256KB flash, 8KB ram oraz 4KB EEPROM, płytka posiada jedynie 1 ostatni pin który nie znalazł jeszcze zastosowania wszystkie pozostałe są już zagospodarowane na potrzeby sterownika.
Mile widziane komentarze, postaram się dzisiaj dodać film z działania oraz zdjęcia.
Wszystkie pliki dostępne w załączniku - czas pracy około 70h.
Można stosować wszystkie dostępne czytniki posiadające wyjście WIEGAND z liniami D0 oraz D1.
Każda strefa składa się z następujących pinów:
Code:
Strefa 0:
D1 - PIN 22
D0 - PIN 23
SENSOR - PIN 46
OUT - A0
Exit button - PIN 15
Strefa 1:
D1 - PIN 24
D0 - PIN 25
SENSOR - PIN 47
OUT - A1
Exit button - PIN 14
Strefa 2:
D1 - PIN 26
D0 - PIN 27
SENSOR - PIN 48
OUT - A2
Exit button - PWM 2
Strefa 3:
D1 - PIN 28
D0 - PIN 29
SENSOR - PIN 49
OUT - A3
Exit button - PWM 3
Strefa 4:
D1 - PIN 30
D0 - PIN 31
SENSOR - PIN 50
OUT - A4
Exit button - PWM 4
Strefa 5:
D1 - PIN 32
D0 - PIN 33
SENSOR - PIN 51
OUT - A5
Exit button - PWM 5
Strefa 6:
D1 - PIN 34
D0 - PIN 35
SENSOR - PIN 52
OUT - A6
Exit button - PWM 6
Strefa 7:
D1 - PIN 36
D0 - PIN 37
SENSOR - PIN 53
OUT - A7
Exit button - PWM 7
Strefa 8:
D1 - PIN 38
D0 - PIN 39
SENSOR - PIN A15
OUT - A8
Exit button - PWM 8
Strefa 9:
D1 - PIN 40
D0 - PIN 41
SENSOR - PIN A14
OUT - A9
Exit button - PWM 9
Strefa 10:
D1 - PIN 42
D0 - PIN 43
SENSOR - PIN A13
OUT - A10
Exit button - PWM 10
Strefa 11:
D1 - PIN 44
D0 - PIN 45
SENSOR - PIN A12
OUT - A11
Exit button - PWM 11
PIN 17 - impuls 100ms kiedy drzwizo staną otwarte bez uprzedniej autoryzacji (zbocze rosnące sensora strefy)
PIN 18 - gdy stan niski uruchamia tryb PANIC, uaktywnia tostan niski na PIN 19 (potwierdzenie)
PIN 20 - gdy stan niski uaktywnia tryb emergency (np sygnał z czujników ppoż) potwierdza ten stan staniem niskim na PIN 21)
EDIT:
- dodałem, tzw minimum jakie zastosowałem do odczytywania sygnałów z czytnika WIEGAND, należy zmienić jedynie port linii D0 oraz D1 w początkowej sekcji:
Code:
#define d1 44 //mega 2560
#define d0 45 //mega 2560
Wyjście na konsoli to:
Code:
Card detected: ID DEC: 6264216 / ID HEX: 5F9598
Card detected: ID DEC: 6280047 / ID HEX: 5FD36F
pamiętajcie, że konsola UART jest ustawiona na
Code:
Serial.begin (115200);
Program nie korzysta ze sprzętowych przerwań, programowo jest wykrywane zbocze opadające na liniach d0 oraz d1
Wersja minimum będzie bez problemu działała na każdej płytce Arduino, należy ustawić jedynie piny. Ilość RAM użytej W programie to 288bajty, sam program to 5.5KB, nie wiem czemu tak dużo (widocznie znacznie ma też to jakie biblioteki się używa).
Program mimo, że minimum można dużo bardziej zoptymalizować, ale już nie byłby tak czytelny.
Plany na przyszłość(do zrobienia / to do):
- dezaktywacja wybranej strefy (wejście/wyjście),
- obsługa sieci przy pomocy modułu ethernet podłączonego do SPI (może wymagać pewnych kompromisów - np rezygnacja z 1-2 stref, powód - brak dostępnych pinów) - porządny system zarządzania WWW - w końcu zostało ponad 220KB pamięci!.
-możliwość korzystania lub też nie z zewnętrznej bazy danych SQL w celu autoryzacji kart i historii zdarzeń.
- możliwość kaskadowego łączenie modułów.
- dodanie obsługi modułów wifi (np ESP8266).
- dorobienie obsługi 8 bitowej i 4 bitowej komunikacji WIEGAND (stosowana w czytnikach z klawiaturami), gdzie 4 bity są bez żadnej parzystości, a w przypadku 8 bitów pierwsze 4 są negacją pozostałych 4.
Póki co na potrzeby samej możliwości zastosowania układu w samochodzie nie widzę już potrzeby dalszej jego rozbudowy.
Cool? Ranking DIY