Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Mega2560 - RFID,SD-card i sterowanie większą ilością wyjść.

28 Gru 2016 22:23 975 14
  • Poziom 22  
    Witam
    Dopiero zaczynam w Arduino i z stąd moje pytanie na które w necie nie znalazłem odpowiedzi.

    Buduje zamek RFID i chciałbym wykorzystać w projekcie kartę SD.
    Chciałbym zrobić coś takiego. Czytnik po odczytaniu identyfikatora porównuje go z listą zawartą w pliku na karcie SD ( to akurat umiem )
    Jeżeli znajdzie tam odpowiedni zapis to na określonych portach wystawi sygnał.

    Przykładowy plik na karcie
    users.txt
    3n3he33j3n3b3 22,23,25,27,29;
    3k33j33ju3j3j3v 21,25,47,34,43;
    .................... ....................

    pierwsza sekcja to numer karty a druga to numery pinów które muszą zostać wystawione.
    Jak bym to zaszył w kodzie to nie było by problemu ale jak chcę to umieścić na karcie SD.

    Rozwiązanie 1
    Program po odczytaniu karty sprawdza czy jest w pliku. Jeżeli jest to wystawia przypisane do niej porty.
    Rozwiązanie 2
    Pod czas uruchamianiu sterownika ładujemy dane z karty SD do zmiennych. W sumie można by było bo domyślnie kart RFID nie będzie więcej niż 25. Ale to takie mało eleganckie rozwiązanie.

    Na razie ani w pierwszym ani w drugim rozwiązaniu nie umiem klepnąć szkicu.
    Może mi ktoś pomóc w rozwiązaniu tej zagwozdki ?
  • Poziom 22  
    Dzięki za zainteresowanie

    No cóż ta pamięć też może zniknąć więc co za różnica
    Ponadto jak kartę ktoś zniknie to wyjścia się nie będą uzbrajać. Można przecież sprawdzać switch samej karty.
  • Poziom 31  
    Ale karta to nic innego jak pamięć Flash tylko tyle że będziesz miał krótszy algorytm.
    I trudniej ją wyciągnąć z układu.
    Możesz nią zarządzać na zasadzie powtarzalnych rekordów.
    Czyli w trakcie sprawdzania nr karty wykonujesz stałe skoki adresowe po pamięci.
    I przy dużej pamięci wepchniesz masę nr kart.
  • Poziom 22  
    Masz oczywiście rację ale decydując się na kartę SD poszedłem na wygodę.
    Jeżeli chcę zrobić jakąś zmianę to biorę zapasową kartę SD, dokonuje modyfikacji na kompie, idę do mojego urządzenia otwieram zamykane drzwiczki na których mam krańcówkę odłączającą zasilanie, podmieniam kartę i zamykam drzwi. I już.
    Można oczywiście pokombinować że można coś na jakimś i2c i zrobić przystawkę do kompa programowalną choćby za pomocą terminala ale sam przyznasz że jak to dobrze oprogramować to wersja z plikiem na SD jest dużo prostsza.
  • Poziom 31  
    Tak masz rację.

    Ja bym dodał to twojego sterownika możliwość dodawania i usuwania kart i nie trzeba nic wyjmować.
    A jak upłynie sporo czasu to będziesz musiał szuka "info" jak to robiłeś, chyba że zrobisz program na PC od obróbki danych na karcie.
    Osobiście wolałbym to tak zrobić bym nie musiał już o tym pamiętać.
  • Poziom 22  
    Też o tym myślałem ale nie chcę tam montować wyświetlacza i w ogóle obsługa ma być łopatologiczna.
    Jeśli masz pomysł na realizację mojego pomysłu to mogę ci dokładnie opisać na PW po co mi to. Nie chcę pisać tego na otwartym forum bo elektroda zeszła ostatnio na psy i za źle dobrany rezystor do leda można zostać ukrzyżowanym.
    Cały projekt po realizacji zamierzam przedstawić i pozostawić dla potomności ale kawałków wolałbym nie.

    Moderowany przez And!:


    Proszę poważnie traktować wszystkich uczestników dyskusji i komunikować się w temacie tak aby nie naruszać punktu 3.1.15 regulaminu,
    dyskusja będzie rozwijała się lepiej jeżeli jej uczestnicy nie będą podzieleni na grupę poinformowaną na PW i pozostałych...



    Dodano po 4 [minuty]:

    ad ditomek
    Siemka.
    Ethernet tam będzie bo sterownik po wykonaniu funkcji wyrzuci to do Mysql-a.
    Jak pisałem,jeśli chodzi o arduino jestem jeszcze za słaby na tą realizację.
    Oczywiście fajnie by było nadać uprawnienia przez www ale nie załatwia to jak zbudować szkic który po rozpoznaniu karty wystawi określone wyjścia na HIGH.
  • Admin grupy Projektowanie
    @Dariusz Goliński zauważ proszę, że podany przykład (do którego chętnie zobaczę link) "ukrzyżowania za źle dobrany rezystor" jest efektem wypowiedzi pojedynczej osoby w jakimś temacie i trudno mówić o "schodzeniu na psy" portalu z tak błahego powodu. Każdy ma prawo do swojego zdania i inni mogą się z nim nie zgadzać tak jak ja nie zgadzam się z Twoją wypowiedzią o schodzeniu elektrody "na psy".

    Druga sprawa, aby efektywnie korzystać z forum daj szansę wszystkim poznać szczegóły swojego pomysłu i zamiast prowadzić z wieloma osobami korespondencję na PW skorzystaj po prostu z możliwości wypowiedzi w temacie aby nie naruszać 3.1.15 regulaminu.
    Jeżeli natomiast nie możesz pisać publicznie o szczegółach i chcesz zlecić wykonanie układu określonej osobie to skorzystaj z działu ogłoszeniowego.

    Natomiast wracając do tematu, nie jest to banalne zadanie i stawia dość ciekawe wyzwania. Temat dotyka zarówno optymalizacji jak i skalowalności jak również bezpieczeństwa.

    Jeżeli chcesz zastosować kartę SD to oczywiście można, ale tak jak już zostało wspomniane wprowadza to dodatkową złożoność, zwiększa czas odpowiedzi i może skutkować większą awaryjnością. W praktyce użytkownicy bardzo przyzwyczajają się do natychmiastowego działania systemu kontroli dostępu po przyłożeniu karty bezstykowej. Gdy liczba wpisów będzie rosła to jest szansa na wzrost czasu odpowiedzi do zauważalnego poziomu (operacje opakowane dostępem do systemu plików na karcie). Oczywiście jeżeli zdecydujesz się na to rozwiązanie warto zaprezentować uzyskane efekty.

    Proponowane przez dasej zastosowanie pamięci EEPROM to bardzo dobre (i stosowane w praktyce) rozwiązanie, masz pełną kontrolę nad strukturą danych, mało jest operacji nadmiarowych. Można to też łatwo optymalizować na różne sposoby (chociażby bufor kołowy w RAM dla najczęściej czytanych kart). Aby programować nowe karty oczywiście można połączyć się z PC ale równie dobrze można dodawać karty poprzez zbliżenie (poprzedzone przyłożeniem karty "master"), z usuwaniem również można sobie poradzić bez PC ale jest to mniej wygodne. Na PC nie koniecznie trzeba pisać oprogramowanie, może wystarczy połączenie UART i "narysowanie" menu w np. putty, następnie sterowanie komendami z klawiatury PC (tak jak to często bywa przy połączeniu konsolowym z przełącznikiem sieciowym routerem itp.)

    Pomysł z siecią połączonych urządzeń wykorzystujących do komunikacji np. ethernet lub rs-485 (tutaj potrzeba mniej zasobów) itp. jest bardzo ciekawy i przyszłościowy. Urządzenie końcowe może być "głupie" i jego kradzież/uszkodzenie nie wpłynie na pozostałe elementy systemu. Do przesyłania danych można wykorzystać kryptografię (oczywiście tutaj potrzebujemy już więcej zasobów), która zapewni zarówno poufność ale co dość istotne może dać nam pewność że komunikujemy się z "naszym" urządzeniem. Jednostka centralna może trzymać bazę uprawnień i odbierać od terminali autoryzacje kart i wysyłać komunikaty do urządzeń wykonawczych. Urządzenia wykonawcze i terminale to może być coś "klasy" arduino, natomiast jednostka centralna (lub jednostki dla redundancji) to może być coś "klasy" RaspberryPi (aby ułatwić np. panel WWW, wykorzystanie bazy itp.).

    Liczę na to, że zdecydujesz się zaprezentować swoje osiągnięcia w DIY, podejrzewam że po ukończeniu pierwszej wersji pojawi się wiele pomysłów na sposoby ulepszenia takiej konstrukcji.
  • Administrator Systemowy
    And! napisał:
    @Dariusz Goliński zauważ proszę, że podany przykład (do którego chętnie zobaczę link) "ukrzyżowania za źle dobrany rezystor" jest efektem wypowiedzi pojedynczej osoby w jakimś temacie i trudno mówić o "schodzeniu na psy" portalu z tak błahego powodu. Każdy ma prawo do swojego zdania i inni mogą się z nim nie zgadzać tak jak ja nie zgadzam się z Twoją wypowiedzią o schodzeniu elektrody "na psy".


    Dodam jeszcze, że jak moderator czy użytkownik zwrócił uwagę na błędy merytoryczne czy błędne obliczenia rezystora, to chyba dobrze, niż jakby pozostały informacje błędne i inni użytkownicy się tymi błędami sugerowali. Natomiast żaden z moderatorów czy użytkownicy nigdy nikogo nie "ukrzyżowali" z powodu źle dobranego rezystora.
  • Admin grupy Projektowanie
    Zgadza się, samo wykrycie błędu i poinformowanie o tym jak najbardziej pozytywne, szczególnie że zastosowanie wspomnianego "rezystora do LED" o np. wartości zbyt małej o rzędy wielkości i zasilenie np. z akumulatora żelowego może wywołać dość "rozrywkowe" efekty które wprawdzie pasują do nadchodzącego Sylwestra ale mogą wywołać dość nieprzyjemne skutki.

    Wracając do tematu, czy w grę wchodzą karty unique czy też np. mifare?
  • Poziom 22  
    Przepraszam wszystkich za umieszczony przeze mnie komentarz dotyczący forum. Nie chciałem nikogo obrazić. Chodziło mi całkowicie o coś innego.

    Przejdźmy do meritum
    Dziękuję wszystkim za cenne uwagi.
    Myślałem że obsługa karty SD jest w arduino dużo łatwiejsza.
    A można zrobić coś takiego że pod czas startu przenoszone są dane z karty SD do EEprom ?

    Jak rozwiązalibyście softwerowo temat przypisania uprawnień do karty RFID ?
  • Admin grupy Projektowanie
    Programowanie sterownika kartą SD to ciekawy pomysł, kartę można sobie przygotować na PC umieszczając na niej plik, później wystarczy włożyć ją do slotu, uruchomić procedurę serwisową i "zaprogramować" sterownik przenosząc dane do eeprom, następnie kartę wyciągnąć, nie spotkałem się z takim rozwiązaniem ale jest ono ciekawe.
    Obsługa SD w Arduino jest banalna https://www.arduino.cc/en/reference/SD dla użytkownika, jednak "pod spodem" sporo się dzieje.

    Co do uprawnień, najprościej biała lista, czyli karta jest na liście otwieram zamek,
    jeżeli akcji ma być więcej niż otwarcie zamka to lista z numerami i przypasaną czynnością,
    jeżeli możliwa jest aktywacja więcej niż jednego wyjścia to np. maska bitowa.

    W systemie sieciowym można logować też np. nieautoryzowane próby, czasy dostępu itp.
  • Poziom 22  
    And
    Dokładnie o coś takiego mi chodziło o czym właśnie wspomniałeś.
    Tylko fajnie by było jak by to ktoś pomógł mi sklepać w kod.
    1 - Potrzebował bym odczyt z karty i wrzutka do np: eeprom
    2 - Jak to zrobić że po odczytaniu karty zostanie ona porównana z listą i jeśli znaleziona to przypisane jej odpowiedni zestaw pinów.

    Odczyt karty, raportowanie, i z resztą powinienem sobie poradzić.
  • Admin grupy Projektowanie
    Co do odczytu karty SD, ten przykład jest dobry do pierwszych eksperymentów: https://www.arduino.cc/en/Tutorial/ReadWrite
    wyniki wysyłane na konsolę szeregową pozwalają na łatwe dalsze eksperymenty.

    Aby ruszyć z tematem trzeba ustalić jaka stała struktura będzie przechowywać dane o kartach,
    przykładowo 40 bitów odczytanych z karty + 8bitów przechowujących dowolną konfigurację stanów na 8 wyjściach do ustawieniu po odczytaniu karty. Z tego wychodzi 5 bajtów + 1 bajt czyli 6 bajtów zapisanych w eeprom dla każdej karty bezstykowej.

    EEPROM można podłączyć jako osobny układ na I2C lub wykorzystać wbudowany EEPROM w Arduino, np. Arduino Mini Pro z Atmega323 posiada 1KB EEPROM. W 1KB można zapisać nawet 170 struktur złożonych z 6 bajtów.
    Oczywiście w EEPROM warto przechowywać także np. ilość zaprogramowanych kart i inne parametry.

    Obsługa EEPROM w Arduino jest również banalna: https://www.arduino.cc/en/Reference/EEPROMRead odczytujemy lub zapisujemy bajt z pod wybranego adresu. Można też przyjrzeć się bardziej zaawansowanej funkcji put().

    Co do weryfikacji karty to jest to dość proste, wystarczą dwie pętle (jedna w drugiej). Pętla zewnętrzna będzie przeskakiwać od adresu startowego co 6 bajtów do kolejnych adresów struktur 6-bajtowych. Pętla wewnętrzna będzie sprawdzać kolejne 5 bajtów w aktualnie zaadresowanej strukturze. Gdy pętla wewnętrzna natrafi na dwie różne wartości to przerywa działanie i pętla zewnętrzna kontynuuje. Może to zakończyć się na dwa sposoby:
    -numer karty nie zostanie znaleziony i pętla zewnętrzna zakończy się
    -numer karty zostanie znaleziony i pętla wewnętrzna z sukcesem porówna 5 bajtów oraz odczyta 6-sty bajt z konfiguracją stanów wyjść przypisanych do karty

    Pętle wewnętrzną można zoptymalizować zapisując w pamięci numery kart od końca, gdyż początki 40 bitowych numerów mogą być podobne dla kart z tej samej serii. Tym sposobem wyszukiwanie kart może być krótsze.

    Pętla zewnętrzna powinna wiedzieć ile numerów kart jest zapisanych (powinno to być zapisane w EEPROM), aby nie odczytywać "pustego" obszaru EPROM.

    W zależności od rodzaju sterowania wyjściami, bajt konfiguracyjny może przechowywać maskę bitową dla portu, lub numer kombinacji jeden-z-n (jeżeli pojedyncza karta zmienia stan tylko jednego wyjścia).