如何在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 2014年

是的,我做到了,但没有帮助,实际上,其他阅读器似乎只返回4个字节的数字,并且它与体面的示例代码完全不同,非常混乱。
unknowndomain

Answers:


6

抱歉,但我必须不同意您的“ NXP数据表令人费解”。从MFRC522数据表的第一页:

“备注:MFRC522支持MIFARE Mini,MIFARE 1K,MIFARE 4K,MIFARE Ultralight,MIFARE DESFire EV1和MIFARE Plus RF识别协议的所有变体”

这里它说,MFRC522仅涉及ISO / IEC 14443是缺少从资本家NXP RC522下面的部分:

* MIFARE DESFire EV1(包括AES加密)

MIFARE DESFire EV2(包括MIsmartApp,事务MAC,无限应用程序,MIFARE Plus替代品,具有经过认证的安全级别(基于AES 128)的MIFARE Classic。

MIFARE SAM AV2(安全访问模块,可安全存储加密密钥和加密功能)*

这些可能是银行卡中使用的那些。同样,从MFRC500数据表的第一页:

“支持ISO / IEC 14443 A的所有协议层。”

您必须仔细研究所有不同的MIFARE / ISO / IEC 14443规范,以找出不同类型的ID字节数(我怀疑不同类型返回的字节数也不同)。

因此,基本上,您很困惑。适用于昂贵的基于MFRC500的阅读器的春天。我认为,以较高的成本,您还将获得高级的API,文档和示例甚至技术支持。

干杯


1
您是正确的,MFRC522不支持此功能,但是您错误的是MFRC500是解决方案,该设备仅支持MIFARE Classic,MIFARE 1K(S50)和MIFARE 4K(S70)卡。
unknowndomain 2014年

1
同样,MFRC522模块的价格为3英镑,而MFRC500模块的价格为30英镑。
unknowndomain 2014年

1

MFRC522 :: requestTag()在第二个参数的前两个字节(以上示例中的数据)中返回卡类型。您将需要查看此值以确定它是哪种卡。使用此信息可打印出所需的N个字节的ID。

紧要关头,您可以转储完整的16个字节(MAX_LEN),并使用各种卡类型对其进行测试,以查看哪些字节正在确定性地变化,从而使您可以确定ID的正确长度。

而且,如果您调用该库的自检函数-getFirmwareVersion()和digitalSelfTestPass(),可以节省一些时间。有必要再次调用MFRC522 :: begin(),否则将无法读取RFID ID(在撰写本文时)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.