2016-06-18 91 views
0

我正在使用嵌入8种不同玩件的Mifare标签创建游戏。我将使用带MFRC522的Arduino NANO(库https://github.com/miguelbalboa/rfid)来实际读取标签,并使用ER301读写器(带有电子阅读器软件)为其分配播放片段编号。我将创造每件作品的倍数,以解决由于破损或盗窃而导致的任何问题(由于这些是相当独特的玩法)。由于将会有8个不同的部分和每个部分4个副本,这将是32个UID的跟上。我宁愿给每件作品分配一个不同的数字,每件作品的重复数量也相同 - 所以只有8个数字要跟上。MFRC522和特定扇区/块阅读

我的问题是 - 如何读取MFRC522的某个块和扇区?

具体而言,扇区2,块8 - 因为这是播放片段编号的Hex等价物出现的位置(当它被指定为带有电子阅读器软件和ER301书写器的产品名称)时。我理解使用MFRC522的库来读取UID,但这比我的理解要深入一些。

我已经为Arduino写了几个草图,但是这是我进入RFID世界的时候,比我以前的Arduino项目更加广泛。一旦我可以读取特定扇区&模块,Arduino NANO将输出其中放置了棋子的二进制表示(在数字I/O的4个上)。

+0

我将使用这个库:https://github.com/miguelbalboa/rfid我还没有尝试过任何东西,因为我还在收集零件。到目前为止,我发现的所有内容都指向阅读UID - 但我只想阅读特定的部门(Sector2 Block8)。我已经有一位作家(ER301和eReader软件),可以将我的信息写入此扇区和区块,并且已经验证了这一点。一旦信息被MFRC和NANO读取,我将使NANO输出与4个数字I/O上的数字相等的二进制数。 – JMortonSalt

+0

此游戏将涉及4个相同的Arduino NANO和MFRC522阅读器。当每人读取游戏片时,它将在4个数字I/O上输出二进制等价物(片段1到8)。这16个总输出将被输入到Arduino MEGA的16个数字I/O中,该输入/输出将跟踪哪些棋子位于4个'位置'(4个NANO设置)。 – JMortonSalt

回答

0

您正在使用的库提供的专用方法对MIFARE标签进行读写操作:

StatusCode MIFARE_Read(byte blockAddr, byte *buffer, byte *bufferSize); 
StatusCode MIFARE_Write(byte blockAddr, byte *buffer, byte bufferSize); 

由于你的描述(部门2块8)建议您使用MIFARE经典标签,你会还需要对标签进行身份验证才能执行读取/写入操作。因此,您还需要验证方法:

StatusCode PCD_Authenticate(byte command, byte blockAddr, MIFARE_Key *key, Uid *uid); 

正如你会使用这个库来读取UID

if (mfrc522.PICC_ReadCardSerial()) { 
    Serial.print(F("Card UID:")); 
    dump_bytes(mfrc522.uid.uidByte, mfrc522.uid.size); 
} 

你也可以访问这些读/写方法:

MFRC522::StatusCode status; 
MFRC522::MIFARE_Key key; 
byte buffer[18]; 
byte size = sizeof(buffer); 
for (byte i = 0; i < MFRC522::MF_KEY_SIZE; ++i) { 
    key.keyByte[i] = 0xFF; 
} 

if (mfrc522.PICC_ReadCardSerial()) { 
    status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 8, &key, &(mfrc522.uid)); 
    if (status == MFRC522::STATUS_OK) { 
     status = mfrc522.MIFARE_Read(8, buffer, &size); 
     if (status == MFRC522::STATUS_OK) { 
      Serial.print(F("Data (block = 8): ")); 
      dump_bytes(buffer, 16); 
     } 
    } 
} 

请注意,我假设使用密钥A将块8(=扇区2,块0)设为readbale,并且将密钥A设置为默认传输密钥FF FF FF FF FF FF。如果您的其他读者更改了这些值,则需要相应地调整代码。此外,我使用伪方法dump_bytes(array, length)来表示有趣的值是array的第一个length字节。实际打印这些值的实现取决于您。

Btw。一个关于如何使用该库进行读/写操作的完整示例实际上与该库一起出货!所以你可以看看ReadAndWrite.ino关于如何使用这个库。

+0

谢谢Michael!正如我所说,所有这些对我来说都是新的,任何帮助都非常感谢。您完全正确地说我使用的是Mifare Classic标签,并且默认传输键是FF FF FF FF FF FF。 – JMortonSalt

+0

我实际上不会打印该值,但实际上将读取的值分配给整数pieceNum。我发现给标签分配一个数字“1”导致“3100000000000000”被写入块8,“2”的块数导致“3200000000000000”。我将如何将这些转换为存储在pieceNum中的简单“1”或“2”?对新手问题抱歉。 – JMortonSalt