Як я можу використовувати 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();
    }
  }
}

Це, мабуть, не проблема, але ваш uidмасив має довжину 5. Чи намагалися ви використовувати більший масив, оскільки вам потрібен 10-байтний результат?
asheeshr

Так, я це зробив, але це не допомогло, адже інший читач, здається, повертає лише 4 байтові числа, і це інша марка з гідним прикладом коду, дуже заплутана.
невідомий

Відповіді:


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, що випадає на MIFARE Classic із сертифікованим рівнем безпеки (на базі AES 128))

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

Це, мабуть, ті, які використовуються в банківських картках. Знову з першої сторінки таблиці MFRC500:

"Всі протоколи шарів ISO / IEC 14443 A підтримуються."

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

Отже, в основному, ви накручені. Весна для дорогого читача на базі MFRC500. Я припускаю, що при більшій вартості ви також отримаєте API високого класу, документацію та приклади або навіть технічну підтримку.

Ура


1
Ви праві, що MFRC522 не підтримує це, але ви помиляєтеся, що MFRC500 - це рішення, який підтримує лише карти MIFARE Classic, MIFARE 1K (S50) та MIFARE 4K (S70).
невідомо домен

1
Також модуль MFRC522 становить <£ 3, а MFRC500 - £ 30.
невідомий

1

MFRC522 :: requestTag () повертає тип картки в перших двох байтах 2-го параметра ( дані у вашому прикладі вище). Вам потрібно буде переглянути це значення, щоб визначити, що це за картка. Використовуйте цю інформацію для друку необхідних N байт ідентифікатора.

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

І якщо ви заощадите певний час, якщо ви зателефонуєте на функції самоперевірки цієї бібліотеки - getFirmwareVersion () та digitalSelfTestPass (); потрібно зателефонувати MFRC522 :: begin () ще раз, інакше читати ідентифікатори RFID неможливо (на момент написання курсу.)


1

Спробуйте використовувати найпопулярніший.

https://github.com/miguelbalboa/rfid

Це працює для мене. Він повертає uID як те, що ви хочете. Просто видаліть інші функції, лише отримавши uid зі свого прикладу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.