Arduino와 RFID-RC522를 어떻게 사용합니까?


11

현지 Makerspace의 프로젝트를 진행 중이며 예산이 제한되어 있으므로 eBay에서 RFID-RC522 el'cheap'o RFID / NFC 리더를 사용하고 싶었지만 몇 가지 SPI 기반 보드를 받았지만 작동합니다. 그들에 대한 코드 예제는 제한적입니다.

나는 몇 가지 다른 라이브러리를 발견하고 이것에 정착했다 : https://github.com/ljos/MFRC522

문제는 온라인에서 사용 가능한 모든 코드가 사람들이 번역하고 Arduino 라이브러리에 해킹 한 일부 중국인 Python 코드에서 생성 된 것처럼 보입니다.

코드는 작동하지만 Mifare 카드에는 4, 7 또는 10 바이트 UID가 있으며 예제 / 라이브러리는 5 바이트 일련 번호를 반환합니다.

문서가없고 NXP 데이터 시트 를 이해할 수 없습니다 ... 또한 대부분의 카드에서 작동하는 것 같지만 ISO 14443 표준을 준수하는 Mastercard PayWave 카드에서는 작동하지 않습니다. MFRC500을 기반으로 한 더 비싼 RDM880 리더는 잘 작동하고 멋진 라이브러리가 있지만 비용으로 인해 구현이 불가능합니다.

따라서 누군가 NXP MFRC522 기반 장치가 모든 ISO 14443 카드에서 UID를 읽는 데 도움을 줄 수 있습니까?

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

이것은 문제가되지 않지만 uid배열의 길이는 5입니다. 10 바이트 결과를 원하므로 더 큰 배열을 사용해 보셨습니까?
asheeshr

그렇습니다.하지만 도움이되지 않았습니다. 사실 다른 독자는 4 바이트 숫자 만 반환하는 것처럼 보이며 괜찮은 예제 코드와는 매우 혼란 스럽습니다.
unknowndomain

답변:


6

죄송하지만 'NXP 데이터 시트가 이해할 수 없습니다'에 동의하지 않아야합니다 . MFRC522 데이터 시트의 첫 페이지에서 :

'비고 : MFRC522는 모든 MIFARE Mini, MIFARE 1K, MIFARE 4K, MIFARE Ultralight, MIFARE DESFire EV1 및 MIFARE Plus RF 식별 프로토콜을 지원합니다'

여기 에 MFRC522는 ISO / IEC 14443의 일부만 포함한다고합니다.

* MIFARE DESFire EV1 (AES 암호화 포함)

MIFARE DESFire EV2 (MIsmartApp, Transaction MAC, 무제한 응용 프로그램 포함 MIFARE Classic의 인증 된 보안 수준 (AES 128 기반)을 통한 MIFARE Plus 드롭 인 교체 포함)

MIFARE SAM AV2 (암호화 키 및 암호화 기능의 안전한 저장을 제공하는 보안 액세스 모듈) *

이들은 아마도 은행 카드에 사용 된 것입니다. 다시, MFRC500 데이터 시트의 첫 페이지에서 :

'ISO / IEC 14443 A의 모든 프로토콜 계층이 지원됩니다.'

다른 유형에 대한 ID 바이트 수를 확인하려면 다른 모든 MIFARE / ISO / IEC 14443 사양을 살펴 봐야합니다 (다른 유형이 다른 바이트 수를 반환한다고 생각합니다).

기본적으로, 당신은 망했다. 고가의 MFRC500 기반 리더의 봄. 더 높은 비용으로 고급 API, 문서 및 예제 또는 심지어 기술적 인 지원을받을 수 있다고 가정합니다.

건배


1
MFRC522가이 기능을 지원하지 않는 것은 맞습니다. 그러나 MFRC500이 솔루션이고 장치가 MIFARE Classic, MIFARE 1K (S50) 및 MIFARE 4K (S70) 카드 만 지원한다는 것은 잘못된 것입니다.
unknowndomain

1
또한 MFRC522 모듈은 <£ 3이고 MFRC500은 £ 30입니다.
unknowndomain

1

MFRC522 :: requestTag ()는 두 번째 매개 변수의 첫 두 바이트 ( 위 예제의 데이터) 에서 카드 유형을 리턴합니다 . 어떤 종류의 카드인지 확인하려면이 값을 확인해야합니다. 이 정보를 사용하여 필요한 N 바이트의 ID 를 인쇄하십시오 .

핀치에서 전체 16 바이트 (MAX_LEN)를 덤프하고 다양한 카드 유형으로 테스트하여 결정적인 방식으로 어떤 바이트가 변경되는지 확인하여 올바른 ID 길이를 결정할 수 있습니다.

라이브러리의 자체 테스트 함수-getFirmwareVersion () 및 digitalSelfTestPass ()를 호출하면 시간을 절약 할 수 있습니다. MFRC522 :: begin ()을 다시 호출해야합니다. 그렇지 않으면 (물론 쓰는 시점에서) RFID ID를 읽을 수 없습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.