Arduino ile RFID-RC522'yi nasıl kullanabilirim?


11

Yerel Makerspace'im için bir proje üzerinde çalışıyorum, sınırlı bütçemiz var, bu yüzden eBay'de RFID-RC522 el'cheap'o RFID / NFC okuyucuları kullanmayı umuyordum, birkaç SPI tabanlı tahta aldım, çalışıyorlar, ancak çalışıyorlar kod örnekleri sınırlıdır.

Birkaç farklı kütüphane buldum ve bu kütüphaneye yerleştim: https://github.com/ljos/MFRC522

Sorun şu ki, çevrimiçi mevcut tüm kodlar, insanların çevirdiği ve bir Arduino kütüphanesine hacklendiği bazı Çinli çocuklar Python kodundan doğuyor gibi görünüyor.

Kod çalışır, ancak Mifare kartlarının 4, 7 veya 10 bayt UID'si olması gerekir ve örnek / kütüphane 5 bayt seri numarası döndürür.

Doküman yok ve NXP veri sayfası anlaşılmaz ... Ayrıca çoğu kartla çalışıyor gibi görünüyor, ancak ISO 14443 standardına uygun Mastercard PayWave kartlarıyla çalışmıyor. MFRC500 tabanlı daha pahalı RDM880 okuyucu iyi çalışıyor ve hoş bir kütüphaneye sahip ancak maliyet uygulamayı imkansız hale getiriyor.

Yani, birisi bu NXP MFRC522 tabanlı birimi tüm ISO 14443 kartlarından UID'yi okumama yardımcı olabilir.

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

Bu muhtemelen bir sorun değildir, ancak uiddiziniz 5 uzunluktadır. 10 baytlık bir sonuç istediğiniz için daha büyük bir dizi kullanmayı denediniz mi?
asheeshr

Evet, yaptım ama yardımcı olmadı, aslında diğer okuyucu sadece 4 baytlık sayılar döndürüyor ve iyi örnek kod ile farklı bir marka, çok karışık.
unknowndomain

Yanıtlar:


6

Üzgünüm, ama 'NXP veri sayfanız anlaşılmaz' diye katılmıyorum . MFRC522 veri sayfasının İLK SAYFASINDAN:

Not: MFRC522, MIFARE Mini, MIFARE 1K, MIFARE 4K, MIFARE Ultralight, MIFARE DESFire EV1 ve MIFARE Plus RF tanımlama protokollerinin tüm çeşitlerini destekler '

Burada MFRC522'nin ISO / IEC 14443'ün sadece bir kısmını kapsadığını söylüyor. NXP RC522'de aşağıdakiler eksik:

* MIFARE DESFire EV1 (AES şifrelemesi içerir)

MIFARE DESFire EV2 (MIsmartApp, İşlem MAC, Sınırsız Uygulamalar MIFARE Classic onaylı güvenlik seviyesine sahip MIFARE Plus drop-in değiştirme içerir (AES 128 tabanlı)

MIFARE SAM AV2 (şifreleme anahtarlarının ve şifreleme işlevlerinin güvenli bir şekilde saklanmasını sağlayan güvenli erişim modülü) *

Bunlar muhtemelen banka kartlarında kullanılanlardır. Yine, MFRC500 veri sayfasının İLK SAYFASINDAN:

'ISO / IEC 14443 A'nın tüm protokol katmanları desteklenmektedir.'

Farklı türler için kaç tane bayt bulunduğunu öğrenmek için tüm farklı MIFARE / ISO / IEC 14443 özelliklerini incelemeniz gerekecektir (Farklı türlerin farklı miktarda bayt döndürdüğünden şüpheleniyorum).

Yani, temelde, berbatsın. Pahalı MFRC500 tabanlı okuyucu için yay. Daha yüksek maliyetle, üst sınıf bir API, dokümantasyon ve örnekler veya hatta (gasp!) Teknik destek aldığınızı varsayıyorum.

Şerefe


1
MFRC522'nin bunu desteklemediğinden haklısınız, ancak MFRC500'ün çözüm olduğu yanılıyorsunuz, bu cihaz sadece MIFARE Classic, MIFARE 1K (S50) ve MIFARE 4K (S70) kartlarını destekliyor.
unknowndomain

1
Ayrıca MFRC522 modülü <3 £ ve MFRC500 30 £ 'dur.
unknowndomain

1

MFRC522 :: requestTag (), 2. parametrenin ilk iki baytındaki kart türünü döndürür ( yukarıdaki örneğinizdeki veriler ). Ne tür bir kart olduğunu belirlemek için bu değere bakmanız gerekir. Gerekli N ID baytını yazdırmak için bu bilgileri kullanın .

Bir tutamda, 16 baytın tamamını (MAX_LEN) dökebilir ve hangi baytların belirleyici bir şekilde değiştiğini görmek için çeşitli kart türlerinizle test edebilirsiniz, böylece kimliğin doğru uzunluğunu belirlemenizi sağlar.

Ve biraz zaman kazandırırsa, o kütüphanenin kendi kendini test işlevlerini çağırırsanız - getFirmwareVersion () ve digitalSelfTestPass (); MFRC522 :: begin () öğesini tekrar aramak gerekir, aksi takdirde RFID kimliklerini okumak mümkün değildir (elbette yazılırken).


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.