Как использовать RFID-RC522 с Arduino?

11

Я работаю над проектом для моего местного Makerspace, у нас ограниченный бюджет, поэтому я надеялся использовать RFID-RC522 el'cheap'o RFID / NFC-ридеры на eBay, я получил пару плат на основе SPI, они работают, однако примеры кода для них ограничены.

Я нашел несколько разных библиотек и остановился на этой: https://github.com/ljos/MFRC522

Беда в том, что весь код, доступный в Интернете, создается из кода Python некоторых китайских парней, который люди перевели и взломали в библиотеку Arduino.

Код работает, но карты Mifare должны иметь 4, 7 или 10-байтовые UID, а пример / библиотека возвращает 5-байтовый серийный номер.

Документации нет, а таблица данных NXP непонятна ... Кроме того, кажется, что она работает с большинством карт, но не работает с картами Mastercard PayWave, которые соответствуют стандарту ISO 14443. Более дорогой считыватель RDM880, основанный на MFRC500, работает нормально и имеет приятную библиотеку, но стоимость делает реализацию невозможной.

Итак, может кто-нибудь помочь мне получить этот модуль на базе NXP MFRC522, считывающий UID со всех карт 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();
    }
  }
}
unknowndomain
источник
Вероятно, это не проблема, но ваш uidмассив имеет длину 5. Вы пытались использовать массив большего размера, поскольку хотите получить 10-байтовый результат?
asheeshr
Да, я сделал, но это не помогло, фактически другой читатель, кажется, возвращает только 4-байтовые числа, и это другая модель с приличным примером кода, очень запутанная.
unknowndomain

Ответы:

6

Извините, но я должен не согласиться с вашей «таблицей NXP непостижимо» . С ПЕРВОЙ СТРАНИЦЫ MFRC522:

«Примечание: MFRC522 поддерживает все варианты протоколов идентификации MIFARE Mini, MIFARE 1K, MIFARE 4K, MIFARE Ultralight, MIFARE DESFire EV1 и MIFARE Plus»

Здесь говорится, что MFRC522 покрывает только часть ISO / IEC 14443. Для NXP RC522 не хватает следующего:

* MIFARE DESFire EV1 (включает шифрование AES)

MIFARE DESFire EV2 (включает в себя MIsmartApp, Transaction MAC, неограниченные приложения MIFARE Plus для замены MIFARE Classic с сертифицированным уровнем безопасности (на основе AES 128))

MIFARE SAM AV2 (модуль безопасного доступа, обеспечивающий безопасное хранение криптографических ключей и криптографических функций) *

Это, вероятно, те, которые используются в банковских картах. Опять же, с ПЕРВОЙ СТРАНИЦЫ спецификации MFRC500:

«Поддерживаются все уровни протокола ISO / IEC 14443 A».

Вам нужно будет просмотреть все различные спецификации MIFARE / ISO / IEC 14443, чтобы узнать, сколько байтов идентификатора существует для разных типов (я подозреваю, что разные типы возвращают разное количество байтов).

Так что, в принципе, ты облажался. Spring для дорогого ридера на базе MFRC500. Я предполагаю, что с более высокой стоимостью вы также получите высококлассный API, документацию и примеры или даже (задыхайтесь!) Техническую поддержку.

ура

staqUUR
источник
1
Вы правы в том, что MFRC522 не поддерживает это, но вы не правы в том, что решение MFRC500 является тем, что устройство поддерживает только карты MIFARE Classic, MIFARE 1K (S50) и MIFARE 4K (S70).
неизвестно
1
Кроме того, модуль MFRC522 стоит менее £ 3, а MFRC500 - £ 30.
неизвестно,
1

MFRC522 :: requestTag () возвращает тип карты в первых двух байтах второго параметра ( данные в вашем примере выше). Вам нужно будет посмотреть на это значение, чтобы определить тип карты. Используйте эту информацию, чтобы распечатать необходимые N байтов идентификатора.

В крайнем случае, вы можете выгрузить все 16 байтов (MAX_LEN) и протестировать их с различными типами карт, чтобы увидеть, какие байты изменяются детерминистическим образом, что позволяет вам определить правильную длину идентификатора.

И в случае, если это экономит ваше время, если вы вызываете функции самопроверки этой библиотеки - getFirmwareVersion () и digitalSelfTestPass (); необходимо снова вызвать MFRC522 :: begin (), иначе невозможно прочитать RFID-идентификаторы (на момент написания, конечно.)

Кингсли
источник
1

Попробуйте использовать самый популярный.

https://github.com/miguelbalboa/rfid

Это работает для меня. Он возвращает UID как то, что вы хотите. Просто удалите другие функции, только получив uid из его примера.

Джефф Валерио
источник