[PROJEKT] Sejf otwierany odciskiem palca oparty o Arduino
Usuwanie zapamiętanych odcisków
Oprócz dodawania przyda się również możliwość usuwania wzorców odcisków. Należy więc dodać do programu funkcję Delete, która będzie odpowiedzialna za usuwanie wzorców linii papilarnych z bazy.
Na początku inicjalizowana jest zmienna ret, a diody ustawiane są w tryb „oddychający” na czerwono. Następnie, podobnie jak w pętli loop, pobierany i sprawdzany jest odcisk palca. Jeżeli weryfikacja przebiegła pomyślnie, czyli zmienna ret ma wartość różną od zera, to wzorzec pasujący do ostatnio zeskanowanego odcisku jest usuwany, a dioda zapala się na zielono. Jeżeli nie udało się dopasować odcisku, dioda zapala się na czerwono.
void Delete() { int ret; fingerprint.ctrlLED(fingerprint.eBreathing, fingerprint.eLEDRed, 0); if ((fingerprint.collectionFingerprint(0)) != ERR_ID809) { fingerprint.ctrlLED(fingerprint.eFastBlink, fingerprint.eLEDYellow, 3); while (fingerprint.detectFinger()); ret = fingerprint.search(); if (ret != 0) { fingerprint.delFingerprint(ret); fingerprint.ctrlLED(fingerprint.eKeepsOn, fingerprint.eLEDGreen, 0); } else fingerprint.ctrlLED(fingerprint.eKeepsOn, fingerprint.eLEDRed, 0); } }
Funkcję trzeba jeszcze wywołać. W tym celu można dodać kolejny przycisk albo skorzystać z przycisku już podłączonego. Ponieważ do usunięcia wzorca i tak trzeba najpierw zeskanować odcisk i odnaleźć go wśród zapisanych, można przyjąć warunek wywołania funkcji jako zeskanowanie błędnego odcisku palca z jednocześnie włączonym przyciskiem.
void loop() { int ret; fingerprint.ctrlLED(fingerprint.eBreathing, fingerprint.eLEDBlue, 0); if ((fingerprint.collectionFingerprint(0)) != ERR_ID809) { fingerprint.ctrlLED(fingerprint.eFastBlink, fingerprint.eLEDYellow, 3); while (fingerprint.detectFinger()); ret = fingerprint.search(); if (ret != 0) { if (digitalRead(Button) == 0) enroll(); else fingerprint.ctrlLED(fingerprint.eKeepsOn, fingerprint.eLEDGreen, 0); } else { if (digitalRead(Button) == 0) Delete(); else fingerprint.ctrlLED(fingerprint.eKeepsOn, fingerprint.eLEDRed, 0); } } delay(1000); }
Efekt działania programu przedstawia się następująco
Rys. 20. Usuwanie wzorców z bazy
Sterowanie serwomechanizmem
Ostatnim krokiem będzie dodanie do programu obsługi serwa. Serwomechanizm będzie służył do zamykania i otwierania sejfu. W tym momencie konieczne będzie zrezygnowanie z biblioteki SoftwareSerial, ponieważ będzie ona kolidować z biblioteką Servo.h.
Pierwszym krokiem będzie zakomentowanie linii importującej bibliotekę SoftwareSerial.h. Można w tym celu skorzystać z skrótu klawiszowego CTRL + /. Następnie należy zaimportować bibliotekę Servo.h.
//#include <SoftwareSerial.h> #include <Servo.h>
Następnie trzeba do FPSerial przypisać Serial zamiast Serial1.
//#define FPSerial Serial1 #define FPSerial Serial
Teraz należy zdefiniować potrzebne wartości. Do Servo_port należy przypisać numer portu, do którego podłączony jest serwomechanizm, czyli 9. Do SafeOpen, a także SafeClose trzeba przypisać wartość kąta serwomechanizmu, przy którym sejf będzie otwarty oraz zamknięty. Jest to odpowiednio 90 i 0.
#define Servo_port 9 #define SafeOpen 90 #define SefeClose 0
Następnie należy utworzyć obiekt servo oraz zainicjalizować zmienną IsSafeClosed typu bool, a także ustawić jej wartość na true. Zmienna IsSafeClosed będzie przechowywać informację czy sejf jest zamknięty czy otwarty.
Servo servo; bool IsSafeClosed = true;
W funkcji setup() należy zainicjować serwo za pomocą funkcji attach() przyjmującej jako argument numer portu, do którego podłączony jest serwomechanizm, czyli Servo_port. Następnie za pomocą funkcji write() należy ustawić kąt SafeClose, czyli pozycję, w której sejf jest zamknięty.
servo.attach(Servo_port); servo.write(SefeClose);
W funkcji loop() w warunku (digitalRead(Button) == 0) w else po funkcji ctrlLED należy dodać obsługę zamykania, a także otwierania skarbonki. Trzeba utworzyć warunek sprawdzający czy sejf jest zamknięty, czyli czy wartość zmiennej IsSafeClosed jest równa true. Jeżeli sejf jest zamknięty, to należy go otworzyć, a gdy jest otwarty – zamknąć. Na koniec zmiennej IsSafeClosed należy przypisać wartość przeciwną niż obecnie.
Ostateczny kod programu
Końcowa wersja programu powinna wyglądać następująco:
//#include <SoftwareSerial.h> #include <Servo.h> #include <DFRobot_ID803.h> //#define FPSerial Serial1 #define FPSerial Serial #define LED 13 #define Button 12 #define Servo_port 9 #define SafeOpen 90 #define SefeClose 0 #define COLLECT_NUMBER 3 //SoftwareSerial Serial1(2, 3); Servo servo; DFRobot_ID809 fingerprint; bool IsSafeClosed = true; void enroll() { int i = 0; int ID = fingerprint.getEmptyID(); if (ID == ERR_ID809) { digitalWrite(LED, HIGH); while (1); } while (i < COLLECT_NUMBER) { fingerprint.ctrlLED(fingerprint.eFastBlink, fingerprint.eLEDMagenta, 0); if ((fingerprint.collectionFingerprint(10)) != ERR_ID809) { fingerprint.ctrlLED(fingerprint.eSlowBlink, fingerprint.eLEDYellow, 0); i++; } while (fingerprint.detectFinger()); } if (fingerprint.storeFingerprint(ID) != ERR_ID809) { fingerprint.ctrlLED(fingerprint.eKeepsOn, fingerprint.eLEDGreen, 0); delay(1000); fingerprint.ctrlLED(fingerprint.eNormalClose, fingerprint.eLEDBlue, 0); delay(1000); } } void Delete() { int ret; fingerprint.ctrlLED(fingerprint.eBreathing, fingerprint.eLEDRed, 0); if ((fingerprint.collectionFingerprint(0)) != ERR_ID809) { fingerprint.ctrlLED(fingerprint.eFastBlink, fingerprint.eLEDYellow, 3); while (fingerprint.detectFinger()); ret = fingerprint.search(); if (ret != 0) { fingerprint.delFingerprint(ret); fingerprint.ctrlLED(fingerprint.eKeepsOn, fingerprint.eLEDGreen, 0); } else fingerprint.ctrlLED(fingerprint.eKeepsOn, fingerprint.eLEDRed, 0); } } void setup() { pinMode(LED, OUTPUT); pinMode(Button, INPUT_PULLUP); digitalWrite(LED, LOW); servo.attach(Servo_port); servo.write(SefeClose); FPSerial.begin(9600); fingerprint.begin(FPSerial); if (fingerprint.isConnected() == false) digitalWrite(LED, HIGH); } void loop() { int ret; fingerprint.ctrlLED(fingerprint.eBreathing, fingerprint.eLEDBlue, 0); if ((fingerprint.collectionFingerprint(0)) != ERR_ID809) { fingerprint.ctrlLED(fingerprint.eFastBlink, fingerprint.eLEDYellow, 3); while (fingerprint.detectFinger()); ret = fingerprint.search(); if (ret != 0) { if (digitalRead(Button) == 0) enroll(); else { fingerprint.ctrlLED(fingerprint.eKeepsOn, fingerprint.eLEDGreen, 0); if (IsSafeClosed == true) servo.write(90); else servo.write(0); IsSafeClosed = !IsSafeClosed; } } else { if (digitalRead(Button) == 0) Delete(); else fingerprint.ctrlLED(fingerprint.eKeepsOn, fingerprint.eLEDRed, 0); } } delay(1000); }
Podłączenie serwomechanizmu i czujnika do fizycznego portu UART
Po wgraniu programu należy podłączyć serwomechanizm zgodnie z tabelą poniżej
Serwo | Arduino/Zasilanie |
Przewód żółty | 9 |
Przewód czerwony | VCC |
Przewód czarny | GND |
Oraz podłączyć czujnik do fizycznego portu UART
Czujnik linii papilarnych SEN0348 | Arduino Pro Mini |
GND (przewód czerwony) | GND |
RX (przewód czarny) | TX |
TX (przewód żółty) | RX |
VIN (przewód zielony) | VCC |
IRQ (przewód niebieski) | Nie podłączone |
3.3V (przewód biały) | VCC |
Rys. 21. Zestaw z dołączonym serwomechanizmem i przełącznikiem dźwigienkowym
Elementy drukowane na drukarce 3D
Do złożenia skarbonki potrzebne są elementy wydrukowane na drukarce 3D. Największy, będący zarazem korpusem sejfu, drukuje się niestety aż 12-13 godzin.
Rys. 22. Korpus sejfu do druku na drukarce 3D
Domyślnie korpus jest drukowany wraz z drzwiczkami, przytwierdzonymi na stałe za pomocą sworznia. Dzięki temu nie można „włamać się” do sejfu poprzez wypchnięcie sworznia. Takie rozwiązanie powoduje jednak, że poprawne wydrukowanie całości jest znacznie trudniejsze. Podczas przygotowywania pliku .gcode należy się upewnić, że sworzeń nie sklei się z korpusem podczas drukowania z powodu zbyt małych luzów. Tą sytuację przedstawiono na wizualizacjach poniżej.
Rys. 23. Sworzeń sklejony z korpusem oraz luźno chodzący w sejfie
Możliwe jest również wydrukowanie sworznia i drzwiczek oddzielnie, co znacznie ułatwi proces oraz umożliwi wydrukowanie elementów na drukarce z małym polem roboczym.
Korpus należy wydrukować z podporami. Aby zmniejszyć ich liczbę warto ustawić minimalny kąt podpieranych powierzchni na 75º.
Pozostałe elementy są proste do wydrukowania, jedynie niektóre wymagają zastosowania podpór.
Montaż
Na początku należy umieścić orczyk serwomechanizmu w wydrukowanym elemencie i połączyć oba elementy za pomocą cienkiego drutu, przekładając go przez otwory tak jak na zdjęciach poniżej.
Rys. 24. Montaż orczyka z wydrukowanym elementem
Następnie należy włączyć zasilanie układu, aby ustawić serwomechanizm w pozycji zamkniętej i założyć na niego orczyk tak, by z obudową tworzył kąt 90º. Po zamontowaniu należy przykręcić orczyk za pomocą śruby.
Rys. 25. Zakładanie orczyka na serwomechanizm
Jeżeli korpus i drzwiczki były drukowane oddzielnie, należy je teraz połączyć za pomocą sworznia.
Kolejnym krokiem jest montaż serwa w korpusie. Serwomechanizm należy zamontować w taki sposób, aby orczyk był blisko spodu sejfu.
Rys. 26. Montowanie serwa w korpusie sejfu
Następnie należy zamontować przełącznik i czytnik w górnej ściance skarbonki.
Rys. 27. Montaż przełącznika i czytnika linii papilarnych
W następnym kroku należy włożyć baterie/akumulatorki do koszyczka
Rys. 28. Wkładanie baterii do koszyczka
Montaż układu elektronicznego w korpusie
A następnie umieścić koszyczek w specjalnej przegródce w korpusie, przełożyć przewody i zamontować uchwyt na elektronikę, który jest jednocześnie górną ścianką przegródki na koszyczek.
Rys. 29. Montaż baterii oraz przegródki w korpusie
Po zamontowaniu koszyczka należy go zabezpieczyć od dołu za pomocą klapki przykręcanej śrubą M3.
Rys. 30. Zabezpieczanie koszyczka na baterie
W kolejnym etapie należy umieścić elektronikę w odpowiedniej przegródce, a także podłączyć serwomechanizm.
Rys. 31. Umieszczanie układu elektronicznego w środku skarbonki
Na koniec trzeba jeszcze podłączyć czytnik oraz zasilanie i przełącznik. Luźne przewody warto schować w przegródce z elektroniką. Po tym można już zamontować górną ściankę w korpusie sejfu.
Rys. 32. Przykręcenie górnej ścianki i zakończenie montażu sejfu
Teraz można przetestować działanie skarbonki. Po włączeniu zasilania za pomocą przełącznika, diody w czytniku powinny świecić na niebiesko, natomiast serwomechanizm powinien ustawić blokadę w pozycji poziomej, równolegle do dolnej ścianki sejfu. Jeżeli tak się nie stało, to należy poprawić ustawienie serwomechanizmu. Można to zrobić na dwa sposoby. Przy niewielkim błędzie ustawienia można je skorygować za pomocą zmiany wartości w programie.
#define SafeOpen 90 #define SefeClose 0
Można również zdemontować serwomechanizm, odkręcić orczyk, odpowiednio go ustawić i przykręcić z powrotem.
Jeżeli serwomechanizm jest już odpowiednio ustawiony, to można zeskanować palec, co sprawi, że serwo ustawi blokadę w pozycji otwartej. Orczyk powinien teraz być w pozycji pionowej, równolegle do ścianek bocznych skarbonki. Jeżeli tak się stało, to sejf jest już gotowy. Można jeszcze dodatkowo go zabezpieczyć przyklejając górną ściankę i uchwyt na elektronikę do korpusu. Warto również zabezpieczyć przewody przed przypadkowym rozłączeniem. Zewnętrzne ścianki wtyczek można pokryć niewielka ilością kleju na gorąco, jednak najlepszym rozwiązaniem będzie zrezygnowanie z wtyczek i przylutowanie wszystkich przewodów.