Проект 28: Зчитувач RFID на прикладі RC522. Принцип роботи, підключення

В цьому експерименті ми покажемо, як плата Arduino отримує доступ до даних RFID-карт і брелоків Mifare за допомогою RFID-зчитувача RC522C.

Необхідні компоненти:

Радіочастотна ідентифікація (RFID) - це технологія автоматичної безконтактної ідентифікації об'єктів за допомогою радіочастотного каналу зв'язку. Базова система RFID складається з:

Ідентифікація об'єктів проводиться за унікальним цифровому коду, який зчитується з пам'яті електронної мітки, що прикріплюється до об'єкта ідентифікації. Зчитувач містить в своєму складі передавач і антену, за допомогою яких випромінюється електромагнітне поле певної частоти. Потрапили в зону дії пристрою, що зчитує поля радіочастотні мітки «відповідають» власним сигналом, що містить інформацію (ідентифікаційний номер товару, призначені для користувача дані і т. Д.). Сигнал вловлюється антеною зчитувача, інформація розшифровується і передається в комп'ютер для обробки. Переважна більшість сучасних систем контролю доступу (СКД) використовує в якості засобів доступу ідентифікатори, що працюють на частоті 125 кГц. Це проксіміті-карти доступу (тільки читання), найпоширенішими є карти EM-Marin, а також HID, Indala. Карти цього стандарту є зручним засобом відкривання дверей і турнікетів. Але не більше. Ці карти не володіють ніякої захищеністю, легко копіюються і підробляються і, відповідно, нічого не дають для захисту об'єкта від несанкціонованого проникнення.

Справжню захист від копіювання та підробки забезпечують такі ідентифікатори, в чіпах яких реалізована криптографічний захист. Це безконтактні смарт-карти, що працюють на частоті 13,56 МГц, найбільш поширеними з них є карти Mifare®. У картах цих стандартів криптозащита організована на високому рівні, і підробка таких карт практично неможлива.

Модуль RC522 - RFID-модуль 13,56 МГц з SPI-інтерфейсом. У комплекті до модуля йдуть 2 RFID-мітки - у вигляді карти і брелока.

Основні характеристики:

Схема підключення модуля до плати Arduino показана на рис. 28.1.


Рис. 28.1. Схема підключення модуля RFID-зчитувача RC522C до Arduino

Напишемо скетч зчитування з карти і виведення в послідовний порт Arduino UID (унікальний ідентифікаційний номер) RFID-мітки (карти або брелока). При написанні скетчу будемо використовувати бібліотеку MFRC522 (https://github.com/miguelbalboa/rfid). Вміст скетчу показано в лістингу 28.1.


// Підключення бібліотек
#include <SPI.h>
#include <MFRC522.h>
// константи підключення контактів SS і RST
#define RST_PIN 9
#define SS_PIN 10
// Ініціалізація MFRC522
MFRC522 mfrc522 (SS_PIN, RST_PIN); // Create MFRC522 instance.
void setup ()
{
Serial.begin (9600); // ініціалізація послідовного порту
SPI.begin (); // ініціалізація SPI
mfrc522.PCD_Init (); // ініціалізація MFRC522
}
void loop ()
{
if (! mfrc522.PICC_IsNewCardPresent ())
return;
// читання карти
if (! mfrc522.PICC_ReadCardSerial ())
return;
// показати результат читання UID і тип мітки
Serial.print (F ( "Card UID:"));
dump_byte_array (mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println ();
Serial.print (F ( "PICC type:"));
byte piccType = mfrc522.PICC_GetType (mfrc522.uid.sak);
Serial.println (mfrc522.PICC_GetTypeName (piccType));
delay (2000);
}
// вивід результату читання даних в HEX-вигляді
void dump_byte_array (byte * buffer, byte bufferSize)
{
for (byte i = 0; i <bufferSize; i ++)
{
Serial.print (buffer [i] <0x10? "0": "");
Serial.print (buffer [i], HEX);
}
}

Порядок підключення:

  1. Підключаємо модулі RFID-зчитувача RC522 до плати Arduino за схемою на рис. 28.1.
  2. Завантажуємо в плату Arduino скетч з лістингу 28.1. Відкриваємо монітор послідовного порта.
  3. Підносимо мітку (карту або брелок) до зчитувача і бачимо вивід в послідовний порт даних мітки UID і тип (рис. 28.2).

Рис. 28.2. Вивід в послідовний порт інформації про мітки

Мітки Mirafe дозволяють записувати на них інформацію. У наступному скетчі ми організуємо на мапі лічильник, який буде інкрементіровать при піднесенні картки до зчитувача. В послідовний порт будемо виводити показання лічильника. Вміст скетчу показано в лістингу 28.2.


// Підключення бібліотек
#include <SPI.h>
#include <MFRC522.h>
// константи підключення контактів SS і RST
#define RST_PIN 9
#define SS_PIN 10
// Ініціалізація MFRC522
MFRC522 mfrc522 (SS_PIN, RST_PIN); // Create MFRC522 instance.
MFRC522: MIFARE_Key key;
byte sector = 1;
byte blockAddr = 4;
byte dataBlock [] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte trailerBlock = 7;
byte status;
byte buffer [18];
byte size = sizeof (buffer);
void setup ()
{
Serial.begin (9600); // ініціалізація послідовного порту
SPI.begin (); // ініціалізація SPI
mfrc522.PCD_Init (); // ініціалізація MFRC522
// Значення ключа (A або B) - FFFFFFFFFFFFh значення з заводу
for (byte i = 0; i <6; i ++)
key.keyByte [i] = 0xFF;
}
void loop ()
{
if (! mfrc522.PICC_IsNewCardPresent ())
return;
// читання карти
if (! mfrc522.PICC_ReadCardSerial ())
return;
// показати результат читання UID і тип мітки
Serial.print (F ( "Card UID:"));
dump_byte_array (mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println ();
Serial.print (F ( "PICC type:"));
byte piccType = mfrc522.PICC_GetType (mfrc522.uid.sak);
Serial.println (mfrc522.PICC_GetTypeName (piccType));
// Читання даних з блоку 4
Serial.print (F ( "Reading data from block"));
Serial.print (blockAddr);
Serial.println (F ( "..."));
Serial.print (F ( "Data for count")); Serial.print (blockAddr);
Serial.println (F ( ":"));
dump_byte_array (buffer, 2); Serial.println ();
Serial.println ();
for (byte i = 0; i <16; i ++) // запис в buffer []
dataBlock [i] = buffer [i];
// отримання байт лічильника (0 і 1)
int count1 = (buffer [0] << 8) + buffer [1];
Serial.print ( "count1 ="); Serial.println (count1);
count1 = count1 + 1; // інкремент лічильника
dataBlock [0] = highByte (count1);
dataBlock [1] = lowByte (count1);
// Аутентификация key B
Serial.println (F ( "Authenticating again using key B ..."));
// Запис даних в блок
Serial.print (F ( "Writing data into block"));
Serial.print (blockAddr);
Serial.println (F ( "..."));
dump_byte_array (dataBlock, 2); Serial.println ();
}
// вивід результату читання даних в HEX-вигляді
void dump_byte_array (byte * buffer, byte bufferSize)
{
for (byte i = 0; i <bufferSize; i ++)
{
Serial.print (buffer [i] <0x10? "0": "");
Serial.print (buffer [i], HEX);
}
}

Порядок підключення:


Рис. 28.3. Вивід в послідовний порт інформації про лічильнику на мітках