Comment utiliser RFID-RC522 avec un Arduino?

11

Je travaille sur un projet pour mon Makerspace local, nous avons un budget limité alors j'espérais utiliser les lecteurs RFID / NFC RFID-RC522 el'cheap'o sur eBay, j'ai reçu quelques cartes basées sur SPI, elles fonctionnent cependant les exemples de code pour eux sont limités.

J'ai trouvé plusieurs bibliothèques différentes et je me suis installé sur celle-ci: https://github.com/ljos/MFRC522

Le problème est que tout le code disponible en ligne semble provenir du code Python de certains chinois que les gens ont traduit et piraté dans une bibliothèque Arduino.

Le code fonctionne, mais les cartes Mifare sont censées avoir des UID de 4, 7 ou 10 octets et l'exemple / bibliothèque renvoie un numéro de série de 5 octets.

Il n'y a pas de documentation et la fiche technique NXP est incompréhensible ... De plus, elle semble fonctionner avec la plupart des cartes, mais elle ne fonctionne pas avec les cartes Mastercard PayWave qui sont conformes à la norme ISO 14443. Le lecteur RDM880 plus cher qui est basé sur le MFRC500 fonctionne bien et a une belle bibliothèque mais le coût rend l'implémentation impossible.

Alors, quelqu'un peut-il m'aider à obtenir cette unité basée sur NXP MFRC522 lisant l'UID de toutes les cartes 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();
    }
  }
}
domaine inconnu
la source
Ce n'est probablement pas le problème, mais votre uidtableau est de longueur 5. Avez-vous essayé d'utiliser un tableau plus grand car vous voulez un résultat de 10 octets?
asheeshr
Oui, mais cela n'a pas aidé, en fait, l'autre lecteur ne semble renvoyer que des nombres de 4 octets et c'est une marque différente avec un exemple de code décent, très confus.
unknowndomain

Réponses:

6

Désolé, mais je dois être en désaccord avec votre 'fiche technique NXP est incompréhensible' . De la PREMIÈRE PAGE de la fiche technique du MFRC522:

'Remarque: le MFRC522 prend en charge toutes les variantes des protocoles d'identification RF MIFARE Mini, MIFARE 1K, MIFARE 4K, MIFARE Ultralight, MIFARE DESFire EV1 et MIFARE Plus RF'

Ici, il est dit que le MFRC522 ne couvre qu'une partie de l'ISO / CEI 14443. Il manque ce qui suit sur le NXP RC522:

* MIFARE DESFire EV1 (inclut le cryptage AES)

MIFARE DESFire EV2 (inclut MIsmartApp, Transaction MAC, Unlimited Applications Remplacement de MIFARE Plus pour MIFARE Classic avec un niveau de sécurité certifié (basé sur AES 128))

MIFARE SAM AV2 (module d'accès sécurisé qui fournit le stockage sécurisé des clés cryptographiques et des fonctions cryptographiques) *

Ce sont probablement ceux utilisés dans les cartes bancaires. Encore une fois, à partir de la PREMIÈRE PAGE de la fiche technique du MFRC500:

«Toutes les couches de protocole de l'ISO / CEI 14443 A sont prises en charge.»

Vous devrez parcourir toutes les différentes spécifications MIFARE / ISO / IEC 14443 pour savoir combien il y a d'octets d'identification pour les différents types (je soupçonne que différents types renvoient une quantité d'octets différente).

Donc, fondamentalement, vous êtes foutu. Ressort pour le cher lecteur basé sur MFRC500. Je suppose qu'avec le coût plus élevé, vous obtenez également une API, une documentation et des exemples de haut niveau ou même un support technique (haletant!).

À votre santé

staqUUR
la source
1
Vous avez raison de dire que le MFRC522 ne prend pas en charge cela, mais vous avez tort que le MFRC500 est la solution, cet appareil ne prend en charge que les cartes MIFARE Classic, MIFARE 1K (S50) et MIFARE 4K (S70).
unknowndomain
1
De plus, le module MFRC522 est <£ 3 et le MFRC500 est £ 30.
unknowndomain
1

Le MFRC522 :: requestTag () renvoie le type de carte dans les deux premiers octets du 2e paramètre ( données dans votre exemple ci-dessus). Vous devrez regarder cette valeur pour déterminer de quel type de carte il s'agit. Utilisez ces informations pour imprimer les N octets d'ID requis .

À la rigueur, vous pouvez extraire les 16 octets complets (MAX_LEN) et les tester avec vos différents types de cartes pour voir quels octets changent de manière déterministe, vous permettant ainsi de déterminer la longueur correcte de l'ID.

Et au cas où cela vous ferait gagner du temps, si vous appelez les fonctions d'autotest de cette bibliothèque - getFirmwareVersion () et digitalSelfTestPass (); il est nécessaire d'appeler à nouveau MFRC522 :: begin (), sinon il n'est pas possible de lire les identifiants RFID (au moment de l'écriture bien sûr.)

Kingsley
la source
1

Essayez d'utiliser le plus populaire.

https://github.com/miguelbalboa/rfid

Cela fonctionne pour moi. Il renvoie l'uID comme vous le souhaitez. Supprimez simplement les autres fonctions juste pour obtenir l'uid de son exemple.

Jeff Valerio
la source