Bagaimana cara menggunakan RFID-RC522 dengan Arduino?


11

Saya sedang mengerjakan proyek untuk Makerspace lokal saya, kami memiliki anggaran terbatas, jadi saya berharap dapat menggunakan pembaca RFID / NFC el'cheap'o RFID-RC522 di eBay, saya menerima beberapa papan berbasis SPI, mereka bekerja, namun, contoh kode untuk mereka terbatas.

Saya telah menemukan beberapa perpustakaan yang berbeda dan memilih yang ini: https://github.com/ljos/MFRC522

Masalahnya adalah bahwa semua kode yang tersedia secara online tampaknya muncul dari beberapa kode Python orang Cina yang telah diterjemahkan orang, dan diretas ke perpustakaan Arduino.

Kode berfungsi, tetapi kartu Mifare dimaksudkan untuk memiliki 4, 7 atau 10 byte UID dan contoh / pustaka mengembalikan nomor seri 5 byte.

Tidak ada dokumentasi dan lembar data NXP tidak dapat dipahami ... Selain itu tampaknya berfungsi dengan sebagian besar kartu, tetapi tidak berfungsi dengan kartu Mastercard PayWave yang sesuai dengan standar ISO 14443. Pembaca RDM880 yang lebih mahal yang didasarkan pada MFRC500 berfungsi dengan baik dan memiliki perpustakaan yang bagus tetapi biaya membuat implementasi tidak mungkin.

Jadi, dapatkah seseorang membantu saya untuk mendapatkan unit berbasis NXP MFRC522 ini membaca UID dari semua kartu 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();
    }
  }
}

Ini mungkin bukan masalah, tetapi uidpanjang array Anda 5. Apakah Anda mencoba menggunakan array yang lebih besar karena Anda menginginkan hasil 10 byte?
asheeshr

Ya, saya lakukan tetapi itu tidak membantu, pada kenyataannya pembaca lain tampaknya hanya mengembalikan angka 4 byte dan itu berbeda dengan contoh kode yang baik, sangat bingung.
unknowndomain

Jawaban:


6

Maaf, tapi saya harus tidak setuju dengan 'lembar data NXP Anda tidak dapat dipahami' . Dari HALAMAN PERTAMA dari lembar data MFRC522:

'Keterangan: MFRC522 mendukung semua varian MIFARE Mini, MIFARE 1K, MIFARE 4K, MIFARE Ultralight, MIFARE DESFire EV1 dan protokol identifikasi RF MIFARE Plus'

Di sini dikatakan bahwa MFRC522 hanya mencakup sebagian dari ISO / IEC 14443. Berikut ini tidak ada pada NXP RC522:

* MIFARE DESFire EV1 (termasuk enkripsi AES)

MIFARE DESFire EV2 (termasuk MIsmartApp, MAC Transaksi, Aplikasi Tak Terbatas. Pengganti drop-in MIFARE Plus untuk MIFARE Classic dengan tingkat keamanan bersertifikat (berbasis AES 128))

MIFARE SAM AV2 (modul akses aman yang menyediakan penyimpanan kunci kriptografi dan fungsi kriptografi yang aman) *

Ini mungkin yang digunakan dalam kartu bank. Sekali lagi, dari HALAMAN PERTAMA dari lembar data MFRC500:

'Semua lapisan protokol ISO / IEC 14443 A didukung.'

Anda harus membajak semua spesifikasi MIFARE / ISO / IEC 14443 yang berbeda untuk mengetahui berapa banyak byte ID yang ada untuk tipe yang berbeda (saya menduga tipe yang berbeda mengembalikan jumlah byte yang berbeda).

Jadi, pada dasarnya, Anda kacau. Pegas untuk pembaca berbasis MFRC500 yang mahal. Saya berasumsi bahwa dengan biaya yang lebih tinggi Anda juga mendapatkan API kelas tinggi, dokumentasi, dan contoh atau bahkan dukungan teknis (terkesiap!).

Bersulang


1
Anda benar bahwa MFRC522 tidak mendukung ini, tetapi Anda salah bahwa MFRC500 adalah solusinya, bahwa perangkat hanya mendukung kartu MIFARE Classic, MIFARE 1K (S50) dan MIFARE 4K (S70).
unknowndomain

1
Modul MFRC522 juga <£ 3 dan MFRC500 adalah £ 30.
unknowndomain

1

MFRC522 :: requestTag () mengembalikan jenis kartu dalam dua byte pertama dari parameter ke-2 ( data dalam contoh Anda di atas). Anda perlu melihat nilai ini untuk menentukan jenis kartu itu. Gunakan informasi ini untuk mencetak diperlukan N byte dari ID.

Dalam keadaan darurat, Anda dapat membuang 16 byte penuh (MAX_LEN), dan mengujinya dengan berbagai jenis kartu Anda untuk melihat byte mana yang berubah secara deterministik, sehingga memungkinkan Anda untuk menentukan panjang ID yang benar.

Dan kalau-kalau itu menghemat waktu Anda, jika Anda memanggil fungsi swa-uji pustaka itu - getFirmwareVersion () dan digitalSelfTestPass (); perlu untuk memanggil MFRC522 :: begin () lagi, jika tidak, tidak mungkin untuk membaca ID RFID (pada saat penulisan tentunya.)


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.