Como uso o RFID-RC522 com um Arduino?

11

Estou trabalhando em um projeto para o meu Makerspace local, temos um orçamento limitado, então eu esperava usar os leitores RFID / RC522 el'cheap'o RFID / NFC no eBay, recebi algumas placas baseadas em SPI, mas elas funcionam, no entanto os exemplos de código para eles são limitados.

Encontrei várias bibliotecas diferentes e resolvi esta: https://github.com/ljos/MFRC522

O problema é que todo o código disponível on-line parece originar-se de alguns códigos Python chineses que as pessoas traduziram e invadiram uma biblioteca do Arduino.

O código funciona, mas os cartões Mifare devem ter UIDs de 4, 7 ou 10 bytes e o exemplo / biblioteca está retornando um número de série de 5 bytes.

Não há documentação e a folha de dados do NXP é incompreensível ... Além disso, parece funcionar com a maioria dos cartões, mas não funciona com cartões Mastercard PayWave que estão em conformidade com o padrão ISO 14443. O leitor RDM880, mais caro, baseado no MFRC500, funciona bem e possui uma boa biblioteca, mas o custo torna a implementação impossível.

Então, alguém pode me ajudar a obter essa unidade baseada no NXP MFRC522 lendo o UID de todos os cartões 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();
    }
  }
}
desconhecido
fonte
Provavelmente esse não é o problema, mas sua uidmatriz é de comprimento 5. Você tentou usar uma matriz maior porque deseja um resultado de 10 bytes?
precisa saber é o seguinte
Sim, sim, mas não ajudou, na verdade o outro leitor parece retornar apenas números de 4 bytes e é uma marca diferente com código de exemplo decente, muito confuso.
Unknowndomain

Respostas:

6

Desculpe, mas devo discordar da sua 'Folha de dados do NXP é incompreensível' . Na PRIMEIRA PÁGINA da folha de dados do MFRC522:

'Observação: o MFRC522 suporta todas as variantes dos protocolos de identificação MIFARE Mini, MIFARE 1K, MIFARE 4K, MIFARE Ultralight, MIFARE DESFire EV1 e MIFARE Plus RF'

Aqui, ele diz que o MFRC522 cobre apenas uma parte da ISO / IEC 14443. O seguinte é o NXP RC522:

* MIFARE DESFire EV1 (inclui criptografia AES)

MIFARE DESFire EV2 (inclui MIsmartApp, Transaction MAC, substituição ilimitada de aplicativos MIFARE Plus, substituição ilimitada do MIFARE Classic com nível de segurança certificado (com base no AES 128))

MIFARE SAM AV2 (módulo de acesso seguro que fornece o armazenamento seguro de chaves criptográficas e funções criptográficas) *

Estes são provavelmente os usados ​​em cartões bancários. Novamente, na PRIMEIRA PÁGINA da folha de dados do MFRC500:

'Todas as camadas de protocolo da ISO / IEC 14443 A são suportadas.'

Você precisará examinar todas as especificações diferentes do MIFARE / ISO / IEC 14443 para descobrir quantos bytes de ID existem para os diferentes tipos (eu suspeito que tipos diferentes retornem uma quantidade diferente de bytes).

Então, basicamente, você está ferrado. Primavera para o caro leitor baseado no MFRC500. Suponho que, com o custo mais alto, você também obtenha uma API, documentação e exemplos de alta classe ou mesmo suporte técnico (suspiro!).

Felicidades

staqUUR
fonte
1
Você está certo que o MFRC522 não suporta isso, mas está errado que o MFRC500 é a solução, esse dispositivo suporta apenas os cartões MIFARE Classic, MIFARE 1K (S50) e MIFARE 4K (S70).
unknowndomain
1
Além disso, o módulo MFRC522 é <£ 3 e o MFRC500 é £ 30.
unknowndomain
1

O MFRC522 :: requestTag () retorna o tipo de cartão nos dois primeiros bytes do segundo parâmetro ( dados no seu exemplo acima). Você precisará examinar esse valor para determinar que tipo de cartão é. Use essas informações para imprimir os N bytes de ID necessários.

Em uma pitada, você pode despejar os 16 bytes completos (MAX_LEN) e testá-los com seus vários tipos de cartões para ver quais bytes estão mudando de maneira determinística, permitindo assim determinar o comprimento correto do ID.

E caso poupe algum tempo, se você chamar as funções de autoteste dessa biblioteca - getFirmwareVersion () e digitalSelfTestPass (); é necessário chamar MFRC522 :: begin () novamente, caso contrário, não é possível ler os IDs de RFID (no momento da escrita, é claro).

Kingsley
fonte
1

Tente usar o mais popular.

https://github.com/miguelbalboa/rfid

Isso está funcionando para mim. Ele retorna o uID como você deseja. Apenas remova as outras funções apenas da obtenção do uid do seu exemplo.

Jeff Valerio
fonte