Làm cách nào để sử dụng RFID-RC522 với Arduino?


11

Tôi đang làm việc trong một dự án cho Makerspace địa phương của mình, chúng tôi có ngân sách hạn chế nên tôi hy vọng sẽ sử dụng trình đọc RFID / RC522 trên đầu đọc trên eBay, tôi đã nhận được một vài bảng dựa trên SPI, tuy nhiên chúng hoạt động các ví dụ mã cho chúng bị hạn chế.

Tôi đã tìm thấy một số thư viện khác nhau và giải quyết trên thư viện này: https://github.com/ljos/MFRC522

Vấn đề là tất cả các mã có sẵn trực tuyến dường như sinh ra từ một số người Trung Quốc mã Python mà mọi người đã dịch và hack vào thư viện Arduino.

Mã này hoạt động, nhưng thẻ Mifare có nghĩa là có UID 4, 7 hoặc 10 byte và ví dụ / thư viện đang trả về một số sê-ri 5 byte.

Không có tài liệu và bảng dữ liệu NXP là không thể hiểu được ... Ngoài ra, nó dường như hoạt động với hầu hết các thẻ, nhưng nó không hoạt động với thẻ Mastercard PayWave phù hợp với tiêu chuẩn ISO 14443. Trình đọc RDM880 đắt hơn dựa trên MFRC500 hoạt động tốt và có một thư viện đẹp nhưng chi phí khiến việc triển khai không thể thực hiện được.

Vì vậy, ai đó có thể giúp tôi lấy đơn vị dựa trên NXP MFRC522 này đọc UID từ tất cả các thẻ 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();
    }
  }
}

Đây có lẽ không phải là vấn đề, nhưng uidmảng của bạn có độ dài 5. Bạn đã thử sử dụng một mảng lớn hơn vì bạn muốn có kết quả 10 byte?
asheeshr

Vâng, tôi đã làm nhưng nó không giúp được gì, trên thực tế, trình đọc khác dường như chỉ trả về các số 4 byte và đó là một cách làm khác với mã ví dụ đàng hoàng, rất bối rối.
unknndomain

Câu trả lời:


6

Xin lỗi, nhưng tôi không đồng ý với 'Bảng dữ liệu NXP của bạn là không thể hiểu được' . Từ TRANG ĐẦU TIÊN của bảng dữ liệu MFRC522:

'Ghi chú: MFRC522 hỗ trợ tất cả các biến thể của giao thức nhận dạng MIFARE Mini, MIFARE 1K, MIFARE 4K, MIFARE Ultralight, MIFARE DESFire EV1 và MIFARE Plus RF'

Ở đây, nó nói rằng MFRC522 chỉ là một phần của ISO / IEC 14443. Sau đây là thiếu NXP RC522:

* MIFARE DESFire EV1 (bao gồm mã hóa AES)

MIFARE DESFire EV2 (bao gồm MIsmartApp, MAC giao dịch, Ứng dụng không giới hạn Thay thế thả xuống MIFARE Plus cho MIFARE Classic với mức bảo mật được chứng nhận (dựa trên AES 128))

MIFARE SAM AV2 (mô-đun truy cập an toàn cung cấp lưu trữ an toàn các khóa mật mã và chức năng mã hóa) *

Đây có lẽ là những người được sử dụng trong thẻ ngân hàng. Một lần nữa, từ TRANG ĐẦU TIÊN của biểu dữ liệu MFRC500:

'Tất cả các lớp giao thức của ISO / IEC 14443 A đều được hỗ trợ.'

Bạn sẽ phải tìm hiểu tất cả các thông số kỹ thuật MIFARE / ISO / IEC 14443 khác nhau để tìm ra có bao nhiêu byte ID cho các loại khác nhau (tôi nghi ngờ các loại khác nhau trả về số lượng byte khác nhau).

Vì vậy, về cơ bản, bạn đang say sưa. Mùa xuân cho đầu đọc dựa trên MFRC500 đắt tiền. Tôi giả định rằng với chi phí cao hơn, bạn cũng có được API, tài liệu và ví dụ cao cấp hoặc thậm chí hỗ trợ kỹ thuật (gasp!).

Chúc mừng


1
Bạn đã đúng rằng MFRC522 không hỗ trợ điều này, nhưng bạn đã sai rằng MFRC500 là giải pháp, thiết bị đó chỉ hỗ trợ thẻ MIFARE Classic, MIFARE 1K (S50) và MIFARE 4K (S70).
unknndomain

1
Ngoài ra, mô-đun MFRC522 là <£ 3 và MFRC500 là £ 30.
unknndomain

1

MFRC522 :: requestTag () trả về loại thẻ trong hai byte đầu tiên của tham số thứ 2 ( dữ liệu trong ví dụ của bạn ở trên). Bạn sẽ cần xem xét giá trị này để xác định loại thẻ nào. Sử dụng thông tin này để in ra N byte ID cần thiết .

Tại một nhúm, bạn có thể loại bỏ toàn bộ 16 byte (MAX_LEN) và kiểm tra chúng với các loại thẻ khác nhau của bạn để xem byte nào đang thay đổi theo cách xác định, do đó cho phép bạn xác định độ dài chính xác của ID.

Và trong trường hợp nó giúp bạn tiết kiệm thời gian, nếu bạn gọi các hàm tự kiểm tra của thư viện đó - getFirmwareVersion () và digitalSelfTestPass (); bạn cần phải gọi lại MFRC522 :: started (), nếu không thì không thể đọc ID RFID (tại thời điểm viết khóa học.)


1

Hãy thử sử dụng một trong những phổ biến nhất.

https://github.com/miguelbalboa/rfid

Đây là làm việc cho tôi. Nó trả về uID như những gì bạn mong muốn. Chỉ cần loại bỏ các chức năng khác chỉ là nhận được uid từ ví dụ của nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.