Wie verwende ich RFID-RC522 mit einem Arduino?


11

Ich arbeite an einem Projekt für meinen lokalen Makerspace. Wir haben ein begrenztes Budget. Ich hatte gehofft, die RFID-RC522 el'cheap'o RFID / NFC-Lesegeräte bei eBay verwenden zu können. Ich habe ein paar SPI-basierte Boards erhalten, sie funktionieren jedoch Die Codebeispiele für sie sind begrenzt.

Ich habe mehrere verschiedene Bibliotheken gefunden und mich für diese entschieden: https://github.com/ljos/MFRC522

Das Problem ist, dass der gesamte online verfügbare Code aus dem Python-Code einiger Chinesen zu stammen scheint, den die Leute übersetzt und in eine Arduino-Bibliothek gehackt haben.

Der Code funktioniert, aber Mifare-Karten sollen 4-, 7- oder 10-Byte-UIDs haben, und das Beispiel / die Bibliothek gibt eine 5-Byte-Seriennummer zurück.

Es gibt keine Dokumentation und das NXP-Datenblatt ist unverständlich ... Außerdem scheint es mit den meisten Karten zu funktionieren, aber es funktioniert nicht mit Mastercard PayWave-Karten, die dem ISO 14443-Standard entsprechen. Der teurere RDM880-Leser, der auf dem MFRC500 basiert, funktioniert einwandfrei und verfügt über eine schöne Bibliothek, aber die Kosten machen die Implementierung unmöglich.

Kann mir jemand helfen, dass dieses auf NXP MFRC522 basierende Gerät die UID von allen ISO 14443-Karten liest?

#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();
    }
  }
}

Dies ist wahrscheinlich nicht das Problem, aber Ihr uidArray hat die Länge 5. Haben Sie versucht, ein größeres Array zu verwenden, da Sie ein 10-Byte-Ergebnis wünschen?
Asheeshr

Ja, ich habe es getan, aber es hat nicht geholfen. Tatsächlich scheint der andere Leser nur 4-Byte-Zahlen zurückzugeben, und es ist eine andere Marke mit anständigem Beispielcode, sehr verwirrt.
Unbekannte Domäne

Antworten:


6

Entschuldigung, aber ich muss Ihrem "NXP-Datenblatt ist unverständlich" nicht zustimmen . Aus der ERSTEN SEITE des MFRC522-Datenblattes:

'Anmerkung: Der MFRC522 unterstützt alle Varianten der Protokolle MIFARE Mini, MIFARE 1K, MIFARE 4K, MIFARE Ultralight, MIFARE DESFire EV1 und MIFARE Plus RF.

Hier heißt es, dass der MFRC522 nur einen Teil von ISO / IEC 14443 abdeckt. Beim NXP RC522 fehlt Folgendes:

* MIFARE DESFire EV1 (einschließlich AES-Verschlüsselung)

MIFARE DESFire EV2 (einschließlich MIsmartApp, Transaction MAC, unbegrenzte Anwendungen MIFARE Plus-Ersatz für MIFARE Classic mit zertifizierter Sicherheitsstufe (AES 128-basiert))

MIFARE SAM AV2 (sicheres Zugriffsmodul zur sicheren Speicherung von kryptografischen Schlüsseln und kryptografischen Funktionen) *

Dies sind wahrscheinlich diejenigen, die in Bankkarten verwendet werden. Wieder aus der ERSTEN SEITE des MFRC500-Datenblattes:

"Alle Protokollschichten der ISO / IEC 14443 A werden unterstützt."

Sie müssen alle verschiedenen MIFARE / ISO / IEC 14443-Spezifikationen durchgehen, um herauszufinden, wie viele ID-Bytes für die verschiedenen Typen vorhanden sind (ich vermute, dass verschiedene Typen eine unterschiedliche Anzahl von Bytes zurückgeben).

Also, im Grunde bist du beschissen. Frühling für den teuren MFRC500-basierten Leser. Ich gehe davon aus, dass Sie mit den höheren Kosten auch eine hochwertige API, Dokumentation und Beispiele oder sogar (keuch!) Technischen Support erhalten.

Prost


1
Sie haben Recht, dass der MFRC522 dies nicht unterstützt, aber Sie haben Unrecht, dass der MFRC500 die Lösung ist. Dieses Gerät unterstützt nur MIFARE Classic-, MIFARE 1K- (S50) und MIFARE 4K- (S70) Karten.
Unbekannte Domäne

1
Auch das MFRC522-Modul kostet <£ 3 und das MFRC500 kostet £ 30.
Unbekannte Domäne

1

Der MFRC522 :: requestTag () gibt den Kartentyp in den ersten beiden Bytes des 2. Parameters zurück ( Daten in Ihrem obigen Beispiel). Sie müssen sich diesen Wert ansehen, um festzustellen, um welche Art von Karte es sich handelt. Verwenden Sie diese Informationen, um die erforderlichen N ID-Bytes auszudrucken .

Zur Not könnten Sie die vollen 16 Bytes (MAX_LEN) ausgeben und sie mit Ihren verschiedenen Kartentypen testen, um festzustellen, welche Bytes sich deterministisch ändern, sodass Sie die richtige Länge der ID bestimmen können.

Und falls Sie Zeit sparen, wenn Sie die Selbsttestfunktionen dieser Bibliothek aufrufen - getFirmwareVersion () und digitalSelfTestPass (); Es ist notwendig, MFRC522 :: begin () erneut aufzurufen, da es sonst nicht möglich ist, RFID-IDs zu lesen (zum Zeitpunkt des Schreibens natürlich).


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.