System oparty o RPi 3b+, czytnik rfid 125khz rdm6300, czujnik ruchu PIR HC-SR501, przekaźnik oraz posiadaną wsześniej syrenę z modulatorem. Całość zasilana jest z 12 voltowego akumulatora z przetwornicą do zasilania RPi
| Element | Szczegóły | Przykładoy artykuł |
|---|---|---|
| Mikrokomputer | Raspberry Pi 3B+ | https://cutt.ly/QwBooHAO |
| Czytnik kart 125kHz | RDM6300 | https://cutt.ly/mwBoo0Vw |
| Czujnik ruchu | PIR HC-SR501 | https://cutt.ly/UwBoo5fg |
| Przekaźnik | napięcie 3.3V | https://cutt.ly/uwBopiY6 |
| Dioda LED | Opcjonalne | https://cutt.ly/fwBomeOj |
| Rezystor | 2x 1kΩ | https://cutt.ly/GwBopXaX |
| Syrena | Opcjonalne | Jakakolwiek syrena 12V |
Powyższe linki nie są linkami sponsorowanymi a wskazują tylko na przykładowy egzemplarz części zastosowanej w projekcie
https://mad-tinkerer-me.medium.com/rfid-with-raspberry-pi-on-the-cheap-766ae0b6c97e
- Podłączenie czytnika
-
Podłączenie czunika ruchu
- Pin GND połączyc z masą RPi
- Pin VCC połączyć z magistralą 5v
- Pin OUT podłączyć do 26 pinu RPi
-
Podłączenie przekaźnika
- Podłączyć pin "+" do pinu pinu 3.3v
- Podłączyc pin "-" do masy
- Podłączyc pin "S" do w naszym przypadku pinu 18
-
Podłączyc diode sygnalizującą
- Pin "-" do masy
- Pin "R" do pinu 38
- Pin "G" do pinu 40
Od pojawienia się pomysł wielkorotnie ewoluował. Zaczęlo się od prostego proojektu ze switch case opartym o czytnik rdm6300 i arduino nano.
-
Schemat pierwszego zamysłu:
Zakładał on zasilenie arduino przez pin vinoraz komunikacje za pomoca portu szeregowego przy użyciu skrętki, dodatkowo przewodem tym miało lecieć zasilanie syreny -
Po analizie szkicu doszliśmy do wniosku iż plan jest nie optymalny oraz zaczęliśmy analizowac dodatkowe funkcje które mogły by byc przydatne:
Na tym etapie rozważaliśmy użycie NodeMCU by zastąpić arduino oraz zyskać komunikacje bezprzewodową dzięki modułowi ESP8266 -
Nastepnie biąrąc pod uwage oczekiwane rezulataty zdecydowaliśmy o przejsciu na wykorszystanie mikrokomputera raspberry PI w wersji posiadanej (3b+):
Model RPi użyty w projekcie -
Po dostosowaniu projektu całość została złożona w jeden układ:
Złożony jeszcze prototypowo lecz w pełni układ alarmu
Schemat ideowy połączeń
- Czujnik ruchu wykrywa ruch
- Program odpytuje serwer o to czy alarm jest uzbrojony
- Jeśli alarm jest uzborjony uruchamia się czytnik kart
- W przeciwnym przypadku przekaźnik od syrwny jesy wyłączany
- Jeśli kartę przyłożono, zczytane ID jest wysyłane na serwer i walidowane
- W przypadku pozytywnej weryfikacji program zasypia na 2 minuty, po ich upływie wydaje dźwięk i czeka jescze 30s przed ponowym sprawdzeniem stanu alarmu na serwerze
- Jeśli walidacja nie przeszła pomyślnie alarm uruchamia sie na 30s
- Program działa w pętli
Uruchomienie czytnika na RPi miało być bajecznie proste, ot pobierasz bibliotekę, uruchamiasz przykład i działa. Lecz nie tym razem, w konsoli wita nas komunikat:
Komunikat błędu wyświetlany w konsoliWARNING:root:[/dev/ttyS0] got trash resetting rfid read to assume we are at the beginning
Poszukiwanie błędów rozpocząłem od sprawdzenia baud-u portu szeregowego. Zgodnie z dokumentacją modułu rdm6300 baud to 9600. Po sprawdzeniu biblioteki – ślepy trop, biblioteka sama ustawia prawidłową częstotliwość.
-
Funkcja z biblioteki rdm6300
-
Po kilku próbach sukces – udaje się, jest odczyt. Niestety działa raz:
Pojedyńczy prawidłowy odczyt w morzu błędów
Kolejny etap to dalsza analiza biblioteki. Wynika z niej, że oczekuje ona na odczytanie 0x02 – oznacza ono początek ID karty i 0x03, które oznacza koniec transmisji. Wszystko co zostało odebrane pomiędzy zamieniane jest na znaki zgodnie z tablicą ASCII. Skoro więc otrzymujemy błąd oznacza to, że odczytujemy coś co nie pasuje do patternu biblioteki.
-
Aby podejrzeć co odbieramy użyjemy narzędzia minicom (pip install minicom) z poleceniem
minicom -b 9600 -H -o -D /dev/ttyS0
-
Prawidłowy odczyt udany za którymś razem:
Sukces, mamy to czego poszukiwaliśmy
Przy dalszej obserwacji okazało się, że skrypt działa poprawnie tylko i wyłącznie, gdy na raspberry świeci się czerwona dioda pwr:
Rozwiązaniem okazało sie przełączenie zasilania na zasilacz podający na wyjściu 5.35v, lecz było to nie w pełni poprawne rozwiązanie. Prawdziwą przyczyną były spadki napięcia na przewodzie zasilającym, dopiero na przewodzie o większym przekroju raspberry ruszyło przy prawidłowym napięciu 5v
-
Po przyłożeniu karty do czytnika odczytany powienen zostac identyfikator (tag) karty
Prawidłowo odczytany i zdekodowany tag karty -
Odczytany tag powinien zostac wysłany zapytaniem POST do serwera i na podstawie kodu odpowiedzi powinna zostac podjęta decyzja o dalszym postępowaniu
- Kod 204 - Użytkownik uwierzetelniony w systemie
- Kod 422 - Użytkownik nie znajduje się w bazie danych, błąd
- W naszym przypadku odpowiedzią był kod 415
415 Unsupported Media Type
Oznacza on, że serwer odmawia przyjęcia żądania, ponieważ format ładunku jest w nieobsługiwanym formacie.
Po krótkich poszukiwaniach znalazłem informację, że:
Problem z formatem może wynikać ze wskazanego Content-Type lub Content-Encoding żądania lub w wyniku bezpośredniej inspekcji danych.
-
Po wypisaniu dokładniejszej informacji pokazuje się taki zapis:
Zapis błędu zwracanego przez serwerNa nasze szczęście pokazuje on główną przyczyne błędu i rozwiązanie, trzbe zmienić header
content-typezapplication/jsonnaapplication/ld+json. -
Po zmianie nagłówka zapytanie zaczęło działać.
Prawidłowa odpowiedź uzyskana z serwera
- Dodanie logów osób autoryzowanych
- Wysyłanie maila w momencie błędnej autoryzacji/wywołania alarmu
- BOT_Siwy
- paffcio
- rbml
- mz







