To jest stara wersja strony!
Kontrola dostępu rfid do warsztatu
Założenia ogólne
Potrzebujemy systemu kontroli dostępu do pomieszczenia coowork i warsztatu opartego na kartach RFID. Wybór standardu 125khz podyktowany jest kompatybilnością z istniejącym systemem alarmowym/kontroli dostępu Satel. System musi być możliwie dyskretny, nie możemy ingerować w drzwi ani ściany pomieszczeń. W założeniu jest użycie przekaźników WiFi z rodziny ESP, co pozwoli na weryfikację dostępu do poszczególnych stref z poziomu bazy danych serwera oraz potencjalną możliwość szyfrowania lub wymiany certyfikatów zapisywanych w pamięci karty w celu poprawienia bezpieczeństwa. Dla zabawy, i tak mamy szklane drzwi.
Okoliczności działania
W HS są drzwi i ościeżnice, w które nie możemy za bardzo ingerować. Ogranicza to znacznie wybór rozwiązań technicznych, możliwych do zastosowania w naszym przypadku. Możemy albo
- ograniczyć się do gotowych rozwiązań
- zmodyfikować gotowy system
- "wyrzucić" cały system kontroli dostępu na zewnątrz
- zaprojektować coś, co pozwoli nam ukryć ingerencję.
Opcja 4 jest najlepsza bo pozwala nam na pełną kontrolę i nie bije po oczach ani portfelu.
Proponowanie rozwiązanie
Między futryną a otworem w ścianie jest sporo miejsca, co daje nam możliwość ukrycia systemu korzystając z dostępu przez powiększone światło frezowań ukrytych za blachą czołową na futrynie. Takie podejście pozwala na całkowite ukrycie mechaniki i elektroniki. Problemem było odryglowywanie drzwi, z racji docelowej obecności gałki, nie za bardzo dało się operować elementami mechanicznymi po stronie skrzydła. Rozwiązanie, przynajmniej w teorii przyniosła wkładka magnetyczna, której położenie może zmieniać się pod wpływem pola magnetycznego a nie dużej siły mechanicznej. Jeśli po stronie futryny udałoby się umieścić elektromagnes ze możliwością zmiennej polaryzacji, to dałoby nam to możliwość odryglowywania drzwi.
Teoria vs. praktyka
Jak się okazało po montażu, zapadka nie poddaje się wyłącznie działaniu magnesu po stronie futryny, ale również metalowej płyty czołowej. Skutkuje to zatrzaśnięciem zapadki "by default". Oddziaływanie elektromagnesu od strony futryny nie jest wystarczające do przeciwstawienia się przyciąganiu pomiędzy zapadką a płytą czołową. Oczywistym rozwiązaniem byłoby zastosowanie silniejszego magnesu, nie ma niestety takiej możliwości z uwagi na ograniczone miejsce. Nawet gdyby było, takie rozwiązanie nastręcza problemów związanych z nagrzewaniem cewki w niewielkiej przestrzeni z płyty HDF (i potencjalne spontaniczne ognisko) i konieczności doprowadzenia źródła zasilania (do zrobienia, ale to sporo roboty).
Worklog
* 09.11.2017 - prototyp uruchamiania przekaźnika za pomocą karty RFID 13.56MHz na Atmelu. Mieliśmy akurat te czytniki, robota w sumie na stracenie a oprogramowanie tego nie było łatwe * 10.11.2017 - zamówienie prawilnych czytników 125kHz od majfrendów. Pomiary wkładki. * 15.11.2017 - zamówienie wkładki magnetycznej do drzwi * 17.11.2017 - montaż wkładki i dostosowanie ościeżnicy, przy okazji okazało się, że wcale nie potrzebujemy magnesu od strony ościeżnicy. I że pomysł z solenoidem nie wypali. * 21.11.2017 - zmiana planów na mechanizm wypychający zapadkę servomotorem. Pierwsza iteracja drukowanej ramki na servo i ręczne poprawki. * 22.11.2017 - druga iteracja ramki i oprogramowanie nowego układu RFID wraz z servo. * 25.11.2017 - trzecia iteracja ramki.
Kod
Czytnik 7941e
Wersja prototypowa kodu, na razie tagi są obsługiwane z poziomu programowania, docelowo będą porównywane z bazą danych na serwerze.
#include <Servo.h> #include <SoftwareSerial.h> SoftwareSerial RFID(10, 11); // RX and TX Servo myservo; //#define CHECKID int i; int pos = 0; #ifdef CHECKID void setup() { RFID.begin(9600); // start serial to RFID reader Serial.begin(9600); // start serial to PC } void loop() { if (RFID.available() > 0) { i = RFID.read(); Serial.print(i, DEC); Serial.print(" "); } } #endif #ifndef CHECKID int data1 = 0; int ok = -1; int yes = 13; int no = 12; int tag1[10] = {2, 10, 2, 113, 0, 126, 243, 46, 218, 3}; int tag2[10] = {2, 10, 2, 109, 0, 9, 224, 126, 242, 3}; int tag3[10] = {2, 10, 2, 30, 0, 43, 119, 231, 173, 3}; int tag4[10] = {2, 10, 2, 30, 0, 43, 120, 91, 30, 3}; int newtag[14] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // used for read comparisons void setup() { myservo.attach(9); RFID.begin(9600); // start serial to RFID reader Serial.begin(9600); // start serial to PC pinMode(yes, OUTPUT); // for status LEDs pinMode(no, OUTPUT); } boolean comparetag(int aa[10], int bb[10]) { boolean ff = false; int fg = 0; for (int cc = 0 ; cc < 10 ; cc++) { if (aa[cc] == bb[cc]) { fg++; } } if (fg == 10) { ff = true; } return ff; } void checkmytags() { // compares each tag against the tag just read ok = 0; // this variable helps decision-making, // if it is 1 we have a match, zero is a read but no match, // -1 is no read attempt made if (comparetag(newtag, tag1) == true) { ok++; } if (comparetag(newtag, tag2) == true) { ok++; } if (comparetag(newtag, tag3) == true) { ok++; } if (comparetag(newtag, tag4) == true) { ok++; } } void readTags() { ok = -1; if (RFID.available() > 0) { // read tag numbers delay(100); // needed to allow time for the data to come in from the serial buffer. for (int z = 0 ; z < 10 ; z++) { // read the rest of the tag data1 = RFID.read(); newtag[z] = data1; } RFID.flush(); // stops multiple reads // do the tags match up? checkmytags(); } // now do something based on tag type if (ok > 0) { // if we had a match Serial.println("Accepted"); ok = -1; for (pos = 0; pos <= 180; pos += 1) { myservo.write(pos); delay(2); } delay(2000); for (pos = 180; pos >= 50; pos -= 1) { myservo.write(pos); delay(2); } } else if (ok == 0) { // if we didn't have a match Serial.println("Rejected"); digitalWrite(no, HIGH); delay(1000); digitalWrite(no, LOW); ok = -1; } } void loop() { readTags(); } #endif
Czytnik MFRC522
Kod na ten czytnik był o tyle fajny, że ma adresowalny mikrokontroler co pozwalało na wykrywanie obecności karty samym czytnikiem. Niestety ta częstotliwość nie będzie miała u nas zastosowania.
#include <SPI.h> #include <MFRC522.h> #define RST_PIN 9 #define SW 8 MFRC522 mfrc522(10); void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); pinMode(SW, OUTPUT); digitalWrite(SW, HIGH); } void loop() { if ( !mfrc522.PICC_IsNewCardPresent()) { delay(100); if (mfrc522.PICC_IsNewCardPresent()) { digitalWrite(SW, HIGH); //Serial.println("on"); } else { digitalWrite(SW, LOW); //Serial.println("off"); } } }