Jak korzystać z RFID-RC522 z Arduino?

11

Pracuję nad projektem dla mojej lokalnej Makerspace, mamy ograniczony budżet, więc liczyłem na użycie czytników RFID / NFC RFID-RC522 el'cheap'o na eBayu, otrzymałem kilka płyt opartych na SPI, działają jednak jednak przykłady kodów dla nich są ograniczone.

Znalazłem kilka różnych bibliotek i zdecydowałem się na tę: https://github.com/ljos/MFRC522

Problem polega na tym, że cały kod dostępny online wydaje się pochodzić od chińskiego kodu Python, który ludzie tłumaczyli i włamali się do biblioteki Arduino.

Kod działa, ale karty Mifare mają mieć 4, 7 lub 10 bajtowe identyfikatory UID, a przykład / biblioteka zwraca 5-bajtowy numer seryjny.

Nie ma dokumentacji, a arkusz danych NXP jest niezrozumiały ... Ponadto wydaje się, że działa z większością kart, ale nie działa z kartami Mastercard PayWave zgodnymi ze standardem ISO 14443. Droższy czytnik RDM880 oparty na MFRC500 działa dobrze i ma ładną bibliotekę, ale koszt uniemożliwia wdrożenie.

Czy ktoś może mi pomóc w uzyskaniu tego urządzenia opartego na NXP MFRC522 odczytującego UID ze wszystkich kart ISO 14443.

#include <SPI.h>
#include <MFRC522.h>

#define RFID_SS  10
#define RFID_RST 5

MFRC522 rfid( RFID_SS, RFID_RST );

void setup() {
  SPI.begin();
  Serial.begin(115200);
  rfid.begin();
}

void loop() {
  byte data[MAX_LEN];
  byte uid[5];

  if ( rfid.requestTag( MF1_REQIDL, data ) == MI_OK ) {
    if ( rfid.antiCollision( data ) == MI_OK ) {
      memcpy( uid, data, 5 );
      for ( int i = 0; i < 5; i++ ) {
        Serial.print( uid[i], HEX );
        Serial.print( ' ' );
      }
      Serial.println();
    }
  }
}
nieznana domena
źródło
Prawdopodobnie nie jest to problem, ale uidtablica ma długość 5. Czy próbowałeś użyć większej tablicy, ponieważ chcesz uzyskać wynik 10 bajtów?
asheeshr
Tak, zrobiłem, ale to nie pomogło, w rzeczywistości drugi czytnik wydaje tylko 4-bajtowe liczby i jest to odmienna marka z porządnym przykładowym kodem, bardzo pomieszana.
nieznana domena

Odpowiedzi:

6

Przepraszam, ale muszę się nie zgodzić z twoim „arkuszem danych NXP jest niezrozumiały” . Z PIERWSZEJ STRONY arkusza danych MFRC522:

„Uwaga: MFRC522 obsługuje wszystkie warianty protokołów identyfikacyjnych MIFARE Mini, MIFARE 1K, MIFARE 4K, MIFARE Ultralight, MIFARE DESFire EV1 i MIFARE Plus RF”

Tutaj napisano, że MFRC522 obejmuje tylko część ISO / IEC 14443. W NXP RC522 brakuje następujących elementów:

* MIFARE DESFire EV1 (zawiera szyfrowanie AES)

MIFARE DESFire EV2 (obejmuje MIsmartApp, MAC transakcji, nieograniczoną liczbę aplikacji Zamiennik MIFARE Plus do MIFARE Classic z certyfikowanym poziomem bezpieczeństwa (oparty na AES 128))

MIFARE SAM AV2 (bezpieczny moduł dostępu, który zapewnia bezpieczne przechowywanie kluczy kryptograficznych i funkcji kryptograficznych) *

Prawdopodobnie są to te używane w kartach bankowych. Ponownie z PIERWSZEJ STRONY karty danych MFRC500:

„Wszystkie warstwy protokołu ISO / IEC 14443 A są obsługiwane.”

Będziesz musiał przeszukać wszystkie różne specyfikacje MIFARE / ISO / IEC 14443, aby dowiedzieć się, ile bajtów ID jest dla różnych typów (podejrzewam, że różne typy zwracają inną liczbę bajtów).

Zasadniczo jesteś pieprzony. Wiosna dla drogiego czytnika opartego na MFRC500. Zakładam, że przy wyższych kosztach otrzymujesz również wysokiej klasy interfejs API, dokumentację i przykłady, a nawet wsparcie techniczne.

Twoje zdrowie

staqUUR
źródło
1
Masz rację, że MFRC522 tego nie obsługuje, ale mylisz się, że MFRC500 jest rozwiązaniem, że urządzenie obsługuje tylko karty MIFARE Classic, MIFARE 1K (S50) i MIFARE 4K (S70).
nieznana domena
1
Również moduł MFRC522 kosztuje mniej niż 3 £, a MFRC500 kosztuje 30 £.
nieznana domena
1

MFRC522 :: requestTag () zwraca typ karty w pierwszych dwóch bajtach drugiego parametru ( dane w powyższym przykładzie). Będziesz musiał spojrzeć na tę wartość, aby ustalić, jaki to rodzaj karty. Skorzystaj z tych informacji, aby wydrukować wymagane N bajtów ID.

W mgnieniu oka możesz zrzucić pełne 16 bajtów (MAX_LEN) i przetestować je przy użyciu różnych typów kart, aby zobaczyć, które bajty zmieniają się w sposób deterministyczny, umożliwiając w ten sposób określenie prawidłowej długości identyfikatora.

A jeśli zaoszczędzi ci to trochę czasu, jeśli wywołasz funkcje autotestu tej biblioteki - getFirmwareVersion () i digitalSelfTestPass (); konieczne jest ponowne wywołanie MFRC522 :: begin (), w przeciwnym razie nie będzie możliwe odczytanie identyfikatorów RFID (oczywiście w momencie pisania).

Kingsley
źródło
1

Spróbuj użyć najpopularniejszego.

https://github.com/miguelbalboa/rfid

To działa dla mnie. Zwraca identyfikator użytkownika, jak chcesz. Po prostu usuń inne funkcje tylko pobieranie identyfikatora użytkownika z jego przykładu.

Jeff Valerio
źródło