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

Я работаю над проектом для своего местного Makerspace, у нас ограниченный бюджет, поэтому я надеялся использовать дешевые считыватели RFID/NFC RFID-RC522 на 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();
    }
  }
}

, 👍11

Обсуждение

Вероятно, это не проблема, но ваш массив uid имеет длину 5. Пробовали ли вы использовать массив большего размера, поскольку вам нужен результат размером 10 байт?, @asheeshr

Да, я это сделал, но это не помогло, на самом деле другая программа чтения, похоже, возвращает только 4-байтовые числа, и это другая марка с приличным примером кода, что очень сбивает с толку., @unknowndomain


1 ответ


0

Пятый байт из RC522 — это просто контрольная сумма.

Например, возможное возвращаемое значение (взято из https://github.com/miguelbalboa/rfid /issues/604#issuecomment-1885042556 ) — это:

8Б 65 66 Б9 31

и если вы выполните двоичное ИЛИ первых четырех чисел, вы получите именно пятое:

In [1]: hex(int("8B", 16)^int("65", 16)^int("66", 16)^int("B9", 16))[2:]
Out[1]: '31'

(Действительно, если сравнить первые четыре байта от RC522 с четырьмя байтами от другого считывателя, они должны совпасть)

,