
Якщо ви коли-небудь проходили касу самообслуговування в супермаркеті та бачили, як, коли ви кладете всі свої товари на піднос, вони автоматично з'являються на екрані , ви вже бачили RFID у дії. Це не магія чи технологічна телепатія: це система на основі радіочастот, яка дозволяє ідентифікувати об'єкти без прямого контакту, і ви можете відтворити її вдома за допомогою простого Arduino та недорогого зчитувача, такого як RC522.
У цьому посібнику ви крок за кроком дізнаєтеся, як використовувати Arduino та RFID-зчитувач RC522 для зчитування та запису міток, зрозумієте, що таке RFID, які типи систем існують, як живляться пасивні картки, як організована пам'ять картки MIFARE Classic 1K та як створювати реальні проекти, такі як система контролю доступу або перезаряджувана транспортна картка. Влаштовуйтесь зручніше, бо ми збираємося ретельно, але зрозуміло та доступно розкрити цю тему.
Що таке технологія RFID та як вона працює?
Радіочастотна ідентифікація, або RFID, – це система, яка дозволяє розпізнавати об’єкти за допомогою унікального ідентифікатора, що передається по радіо. Цей ідентифікатор зазвичай називається UID (унікальний ідентифікатор) і може розглядатися як ідентифікатор мітки. Повна система складається з двох основних елементів: RFID-мітки (або транспондера) та RFID-зчитувача (трансивера).
RFID-мітки бувають різних форматів: пластикові картки, схожі на кредитні картки, брелоки, клейкі наклейки , що приклеюються до продуктів для запобігання крадіжці, і навіть чіпи, імплантовані під шкіру тварин для ідентифікації. Всередині всі вони мають однакові компоненти: антену та невеликий чіп, який зберігає інформацію та зв'язується зі зчитувачем.
Існують мітки лише для читання, UID яких запрограмовано на заводі та не може бути змінений, та мітки для читання/запису, дані на які може як зчитувати, так і записувати відповідний зчитувач, такий як модуль RC522 . Це дозволяє використовувати такі додатки, як перезаряджувані транспортні картки, системи контролю доступу з передплаченими балансами, системи обліку робочого часу та відвідуваності тощо.
З іншого боку, у нас є RFID-зчитувач або приймач-передавач. Цей пристрій не тільки приймає дані, але й випромінює радіочастотне електромагнітне поле . Це поле є ключовим для розуміння того, як живляться пасивні мітки та як відбувається обмін інформацією між карткою та зчитувачем.
Блок живлення та принцип роботи RFID-міток
Дуже поширене питання: якщо RFID-наклейки на товарах супермаркетів або картках доступу не мають батарейок, звідки вони беруть енергію для роботи? Ключ у тому, що багато з цих міток є пасивними та живляться електромагнітною індукцією від поля, що генерується зчитувачем.
Коли ви підносите пасивну мітку близько до зчитувача, її антена потрапляє в електромагнітне поле, що генерується модулем (наприклад, на частоті 13,56 МГц у випадку RC522). Це поле індукує струм в антені мітки, який використовується для миттєвого живлення внутрішнього чіпа . Після «пробудження» чіп модулює сигнал, який він надсилає назад до зчитувача (це називається зворотним розсіюванням), кодуючи UID та, якщо це можливо, інші дані, що зберігаються в пам'яті.
На відміну від таких технологій, як інфрачервоне випромінювання, пряма лінія зору між міткою та зчитувачем не потрібна : радіочастота може проникати крізь певні матеріали, хоча її поведінка залежить від частоти, наявності металу, води тощо. Зчитувач фіксує зворотно розсіяний сигнал, інтерпретує його, а потім надсилає дані на мікроконтролер (наприклад, Arduino, ESP8266 або ESP32) або комп'ютер.
Типи RFID-систем за частотою
Спектр радіочастот дуже широкий, і радіохвилі поводяться не однаково на всіх частотах . Тому в RFID використовуються різні діапазони залежно від застосування. Зчитувач і мітка повинні бути розроблені для роботи на одній частоті, так само як радіоприймач повинен налаштуватися на правильну станцію.
Загалом, ми можемо розділити системи RFID на три основні категорії залежно від використовуваного ними діапазону:
- Низька частота (НЧ)приблизно 125-134 кГц.
- Висока частота (ВЧ): близько 13,56 МГц, що включає такі технології, як MIFARE та NFC.
- Ультрависока частота (УВЧ): приблизно від 433 МГц до 860-960 МГц.
Низькочастотні (LF) RFID-системи
Низькочастотні RFID-системи мають відносно довгу довжину хвилі, що дозволяє їм краще проникати крізь тонкі матеріали та об'єкти з високим вмістом води , такі як фрукти чи напої. Вони також досить добре працюють поблизу тонких металів.
Однак ця перевага має значні обмеження: типовий діапазон становить лише кілька сантиметрів, а швидкість передачі даних низька, що призводить до зменшення обсягу пам'яті та підвищення вартості міток . Ці системи зазвичай використовуються для простого контролю доступу, старіших ключів наближення та мічення тварин.
Високочастотні (HF) системи RFID та NFC
Високочастотний діапазон, 13,56 МГц, ймовірно, є найпопулярнішим на рівні «мейкерів» та проектів «зроби сам», оскільки саме там знаходяться картки MIFARE та технологія NFC (Near-Field Communication) , які багато мобільних телефонів використовують для безконтактних платежів.
ВЧ-системи добре працюють поблизу металу та за наявності помірного або високого рівня води, зазвичай забезпечуючи радіус дії від кількох сантиметрів до приблизно одного метра за ідеальних умов. Швидкість передачі даних залишається помірною, але достатньою для ідентифікації, доступу та невеликих застосувань передачі даних. Багато світових стандартів базуються на ВЧ, що сприяє сумісності обладнання та карток.
Системи ультрависокої частоти (UHF) RFID
На протилежному кінці спектра знаходяться системи УВЧ, здатні досягати відстаней від кількох сантиметрів до понад 20 метрів. Вони ідеально підходять, коли потрібно швидко та на відстані зчитувати багато міток , наприклад, для управління запасами на складах, підрахунку людей на заходах або відстеження часу спортсменів під час перетину ними фінішної прямої у гонках.
Недоліком є те, що, маючи коротшу довжину хвилі, сигнал більше послаблюється та менш ефективно проникає крізь метал і воду . Незважаючи на це, вони широко використовуються в системах оплати за проїзд, контролі доступу до паркування та відстеженні великомасштабної логістики.
RFID-модуль RC522: характеристики та контакти
Для проектів Arduino одним із найпопулярніших зчитувачів є RC522, заснований на мікросхемі NXP MFRC522. Це дуже доступний та широко використовуваний модуль, який працює на високій частоті (13,56 МГц) з картами MIFARE та дозволяє як читати, так і записувати дані на сумісні мітки.
Зазвичай він продається в комплекті, що включає сам зчитувач, кредитну картку та RFID-брелок. Ці картки, як правило, є картками MIFARE Classic 1K або 4K, надзвичайно популярним стандартом у транспорті, контролі доступу та недорогих рішеннях. RC522 генерує високочастотне електромагнітне поле, і на практиці його корисний діапазон становить близько 3-5 см, хоча теоретично він може досягати дещо більшої відстані.
Щодо зв'язку з мікроконтролером, RC522 в основному інтегрований через SPI (послідовний периферійний інтерфейс) та підтримує швидкість до 10 Мбіт/с. Він також підтримує I2C та UART, хоча в більшості проектів Arduino використовується SPI через його більшу швидкість та простоту в цьому контексті.
Електрично модуль працює від напруги живлення від 2,5 В до 3,3 В. Плата зазвичай має чітко позначений контакт VCC для підключення до 3,3 В. Не подавайте на неї безпосередньо 5 В , інакше ви ризикуєте пошкодити її. З позитивного боку, логічні рівні зазвичай толерантні до 5 В, тому його можна підключити до цифрових контактів Arduino UNO без перетворювачів рівнів для базового тестування, хоча в професійному дизайні доцільна адаптація рівнів.
Підключення модуля RC522
Типовий RC522 має 8 контактів для підключення до мікроконтролера:
- VCC: джерело живлення, від 2,5 В до 3,3 В.
- RST: контакт скидання; дозволяє вимикати та перезапускати модуль, встановлюючи рівень на НИЗЬКИЙ/ВИСОКИЙ.
- GNDмаса або відлікова точка Землі.
- IRQ: контакт переривання, який може сповіщати мікроконтролер, коли мітка потрапляє в поле зчитування.
- MISO / SCL / TXбагатофункціональний контакт; такий як MISO в SPI, такий як SCL в I2C або такий як TX в UART.
- МОЗІ: вихідна лінія даних від головного до підлеглого пристрою в SPI.
- SCK: Тактовий генератор інтерфейсу SPI.
- СС / СДА / RX: контакт вибору підлеглого в SPI, SDA в I2C або RX в UART.
На Arduino UNO та інших платах на базі ATmega328P контакти SPI вже визначені апаратно, тому типова схема підключення для використання SPI виглядає так:
- VCC → 3,3 В від Arduino.
- GND → Заземлення Ардуїно.
- SCK → контакт 13 на UNO/Nano.
- МОЗІ → контакт 11 на UNO/Nano.
- МІСО → контакт 12 на UNO/Nano.
- СС (ПДР) → контакт 10 (або той, який ви оберете як SS, але вам потрібно вказати його в коді).
- RST → наприклад, контакт 9 Arduino.
- IRQ → Необов'язково, можна залишити непідключеним, якщо переривання не використовується.
На платах, таких як Arduino Mega, Leonardo або Micro, лінії SPI можуть бути на різних контактах або на роз'ємі ICSP, тому важливо перевірити таблицю еквівалентності в офіційній документації, перш ніж щось підключати.
Встановлення бібліотеки MFRC522 та базове зчитування тегів
Хоча MFRC522 можна запрограмувати з нуля, його внутрішня комунікація досить складна, тому поширеною практикою є використання бібліотеки, розробленої Мігелем Бальбоа , доступної на GitHub та в менеджері бібліотек Arduino IDE. Ця бібліотека інкапсулює всі операції, необхідні для ініціалізації зчитувача, виявлення карт, автентифікації секторів та читання або запису блоків.
Щоб встановити його з середовища розробки Arduino IDE, просто відкрийте менеджер бібліотек, знайдіть «MFRC522» та виберіть версію, що підтримується спільнотою (спільнота GitHub) . Вам також потрібно підключити бібліотеку SPI, яка вже включена до IDE.
Після встановлення типовий процес зчитування UID мітки в простому ескізі виглядає так:
- Включити книгарні SPI.hy MFRC522.h.
- Визначте контакти RST та SS, які використовуватиме зчитувач.
- Створіть об'єкт MFRC522, передавши йому ці контакти.
- У setup() ініціалізуйте послідовний порт, SPI та зчитувач за допомогою PCD_Init().
- У циклі loop() використовуйте PICC_IsNewCardPresent() щоб дізнатися, чи є поруч картка, і PICC_ReadCardSerial() щоб прочитати ваші основні дані.
- Отримайте доступ до UID за допомогою mfrc522.uid.uidByte та до розміру за допомогою mfrc522.uid.size.
- Завершіть зв'язок з міткою, викликавши PICC_HaltA().
Цей тип ескізу ідеально підходить для отримання UID кількох карток або брелоків та проведення швидких тестів, наприклад, для простого контролю доступу, де лише зчитаний UID порівнюється зі списком авторизованих UID.
Структура пам'яті в картках MIFARE Classic 1K
Картки, що зазвичай постачаються з RC522, зазвичай є MIFARE Classic 1K . Ці картки пропонують 1 КБ пам'яті, ієрархічно організованої в сектори та блоки, з досить своєрідною системою ключів та дозволів, яку слід розуміти, перш ніж щось писати.
Загальна пам'ять розділена на 16 секторів, пронумерованих від 0 до 15. Кожен сектор містить 4 блоки, позначені від 0 до 3 у межах цього сектора. Кожен блок зберігає 16 байтів даних , тобто 16 позицій, пронумерованих від 0 до 15, таким чином, кожен сектор пропонує 64 байти.
З цих чотирьох блоків на сектор лише три призначені для зберігання даних користувача: блоки 0, 1 та 2 кожного сектора (за винятком сектора 0, який має особливі характеристики). Останній блок кожного сектора, блок 3, відомий як блок- трейлер . Він зберігає ключі шифрування та біти доступу, що контролюють, які операції дозволені в цьому секторі.
У трейлері 16 байтів розділені наступним чином:
- Ключ А: 6 байт.
- Умови доступу: 3 байти, що визначають дозволи на читання/запис, автентифікацію та видимість ключа.
- Невикористаний байт (U): 1 байт, який не використовується.
- Клавіша B: 6 байт.
Картки, що постачаються з заводу з модулями, зазвичай мають ключ A та ключ B, ініціалізовані як FF FF FF FF FF FF , що є вкрай небезпечним, оскільки будь-хто, хто знає стандарт, може автентифікувати та змінювати вміст картки. Досить поширеною практикою в DIY-проектах є використання однакових ключів у всіх секторах, хоча для справжньої безпеки було б краще диверсифікувати їх.
Крім того, блок 0 сектора 0 є особливим: він зберігає UID картки (зазвичай 4 байти в цих картках MIFARE Classic) та дані виробника. На практиці цей блок вважається доступним лише для читання; спроба його зміни може безповоротно пошкодити картку.
Змініть клавіші A та B у секторі
Якщо ви хочете використовувати карту MIFARE в проекті Arduino та RC522 будь-яким осмисленим чином, перше, що вам слід зробити, це змінити ключі за замовчуванням . Це запобігає втручанню будь-кого, хто має зчитувач та стандартну бібліотеку, без дозволу.
Основна ідея оновлення ключів певного сектора (наприклад, сектора 15) полягає в наступному:
- Визначте поточні ключі в коді (заводські значення за замовчуванням, якщо вони не були змінені).
- Визначте нові ключові слова Ключ А та Ключ Б, які ви хочете використовувати в цьому секторі.
- Обчисліть номер блоку причепа для цього сектора, який дорівнює сектор * 4 + 3 (для сектора 15, блоку 63).
- Спочатку проведіть автентифікацію за допомогою поточного ключа A, використовуючи PCD_Authenticate() щодо блоку причепа.
- Зчитайте блок трейлера за допомогою MIFARE_Read() щоб отримати його зміст.
- Змінити байти, що відповідають новим ключам у буфері.
- За потреби пройдіть автентифікацію ще раз (наприклад, за допомогою ключа B).
- Запишіть оновлений блок трейлера за допомогою MIFARE_Write().
Під час цього процесу вкрай важливо не виймати картку зі зчитувача, доки операція не буде завершена , оскільки перерваний запис у трейлерний блок може зробити сектор недоступним. Після зміни ключів вам також потрібно буде оновити код Arduino, щоб використовувати ці нові ключі в майбутніх операціях з цим сектором.
Блоки читання та письма: моделювання транспортної картки
Дуже ілюстративним застосуванням читання та письма за допомогою MIFARE Classic є симуляція поведінки перезаряджуваної картки громадського транспорту . Ідея проста: картка зберігає певну кількість поїздок у певному блоці, а система дозволяє завантажувати поїздки (поповнювати їх) або використовувати їх (валідація під час посадки в автобус чи трамвай).
Для цього сектор 15 можна було б зарезервувати, наприклад, для даних користувача, а один з його блоків даних (наприклад, блок 60) можна було б використовувати для зберігання лічильника відключень. Кількість доступних відключень зберігається в байті 0 блоку. Решту байтів блоку можна було б використовувати для інших даних або просто залишити на нулі.
Типовий потік коду для частини перезавантаження буде таким:
- Визначати Клавіша A та клавіша B чинні правила, що захищають відповідний сектор (наприклад, ті, що ми змінили на попередньому кроці).
- Визначте номер сектора, блок даних (60) та блок-трейлер (63).
- Оголосіть 16-байтовий масив (blockData), де перший байт представлятиме кількість поїздок.
- Щоразу, коли картку підносять до зчитувача, Зчитати блок 60 використання MIFARE_Read() для отримання поточних поїздок.
- Додайте до зчитаного значення кількість поїздок для підзарядки (наприклад, 10).
- Оновіть дані. Заблокуйте з новою кількістю поїздок.
- Аутентифікуйте за допомогою ключа A у відповідному блоці трейлера.
- Запишіть блок 60 за допомогою MIFARE_Write().
- Перечитайте ще раз, щоб перевірити, чи значення було оновлено правильно.
Для частини споживання поїздок (валідація на шині) код практично ідентичний, але замість додавання, з лічильника віднімається одиниця. Перед відніманням перевіряється, чи зчитане значення дорівнює нулю: якщо поїздок не залишилося, доступ забороняється, і користувачеві пропонується перезавантажити лічильник . Якщо лічильник більше нуля, він зменшується, блок перезаписується, і на екрані відображається кількість поїздок, що залишилися.
В обох випадках важливо правильно обробляти коди повернення функцій бібліотеки MFRC522 (наприклад, помилки автентифікації або запису) та завжди зупиняти зашифрований зв'язок за допомогою PCD_StopCrypto1() та саму карту за допомогою PICC_HaltA() в кінці кожного циклу.
Простий контроль доступу на основі UID
Ще один класичний проект з використанням RC522 та Arduino — це базова система контролю доступу, де вхід дозволено або заборонено на основі UID представленої плати. Цей підхід не використовує внутрішню пам'ять плати, а лише її унікальний ідентифікатор, і тому має досить обмежений рівень безпеки, але він служить швидким прикладом.
Типовий підхід такий:
- Зчитайте UID картки за допомогою основних функцій бібліотеки (PICC_IsNewCardPresent, PICC_ReadCardSerial тощо).
- Скопіюйте байти зчитаного UID до тимчасового масиву (наприклад, ActualUID).
- Визначте в коді кілька масивів з UID авторизованих карток (наприклад, User1, User2).
- Створіть функцію порівняння масивів байтів, яка повертає істинно, якщо обидва однакові.
- Порівняйте ActualUID з кожним авторизованим UID та, якщо такі збігаються, активуйте цифровий вихід, відобразіть повідомлення «Доступ надано» або активуйте електричний замок.
- Якщо жодному з них не відповідає, відобразіть повідомлення «Доступ заборонено» та залиште систему закритою.
У реальному середовищі така система вразлива до клонування міток, оскільки багато недорогих зчитувачів дозволяють копіювати або емулювати UID. Для підвищення безпеки необхідно використовувати внутрішню пам'ять картки, користувацькі ключі та, можливо, більш надійні криптографічні механізми, ніж ті, що використовуються в MIFARE Classic, безпека якого наразі широко ставиться під сумнів. Незважаючи на це, це чудовий педагогічний приклад для вивчення робочого процесу зчитування карток та інтеграції з фізичними виконавчими механізмами.
З огляду на все вищесказане, ви тепер добре розумієте основні концепції RFID, розумієте, як поводяться різні діапазони частот, знаєте внутрішню роботу картки MIFARE Classic 1K, освоїли базове підключення та використання модуля RC522 з Arduino, а також детально розглянули, як зчитувати та записувати блоки для створення реальних систем, таких як контроль доступу або транспортні картки . Звідси наступним природним кроком є поєднання RFID з іншими модулями (РК-екрани, реле, Wi-Fi, хмарні бази даних) та вивчення того, як керувати розумними лампочками для створення більш комплексних рішень, які ще більше наближені до професійних систем, які ви бачите щодня в магазинах, громадському транспорті та пристроях безконтактної оплати.
