Вам, конечно же, знакомы карточки и брелки, которые нужно подносить к считывателю, а они при этом пропускают на работу или дают проехать в метро. Такие брелки и карточки используют технологию под названием RFID — Radio Frequency IDentification. Сегодня мы познакомимся с основами этой технологии, а также узнаем, как использовать ее в своих проектах на базе Arduino.
Работа RFID неплохо расписана в соответствующей статье на Википедии. Если в двух словах, большую часть карточки или брелка, которые далее мы будем называть RFID-метками, занимает антенна. Также в метке содержится очень маленький чип, реализующий всю логику. В ридере также есть антенна, притом регулярно передающая сигнал, и следовательно создающая электромагнитное поле. При поднесении метки в это поле на ее антенне индуцируется ток, который и питает метку. Теперь метка и ридер могут пообщаться друг с другом при помощи радиосигнала, используя какой-то свой протокол и модуляцию сигнала.
Стоит отметить, что это описание касалось пассивных меток. Бывают и активные метки, имеющие собственный источник питания, а также полупассивные. Что же касается радиосигнала, в RFID сигнал типично передается на частоте 125 КГц или 13.56 МГц. Существует множество стандартов передачи сигнала и их реализаций. Довольно распространенным является стандарт ISO/IEC 14443 и его реализация MIFARE от компании NXP Semiconductors. Еще одним известным стандартом является NFC, основанный на ISO 14443. Одна из его реализаций называется NTAG, также от NXP Semiconductors. Стоит отметить, что в общем случае реализации одного стандарта от разных производителей могут быть не вполне совместимы друг с другом и содержать расширения, которых нет в самом стандарте.
Fun fact! В метках MIFARE используется секретный шифр Crypto-1, выжигаемый прямо в железе, что изначально делало невозможным клонирование этих меток. Шифр со временем отреверсили и предали широкой огласке, поэтому последние лет 10 метки MIFARE может свободно клонировать кто угодно. Кое-какие подробности описаны в этих слайдах. Эта история наглядно демонстрирует, почему безопасность через неясность (security by obscurity) не работает.

Для Arduino существует несколько модулей для работы с RFID. Пожалуй, самым дешевым и в то же время самым популярным, является модуль под названием RC522 на базе чипа MFRC522 от NXP. Чип MFRC522 поддерживает технологии MIFARE и NTAG, радиосигнал передается на частоте 13.56 МГц. С микроконтроллером чип общается по SPI. Однако прямо по SPI ходить в чип нам не придется, так как для работы с модулем существует готовая библиотека MFRC522. Ее можно установить прямо из Arduino IDE.
Подключение модуля к Arduino Uno осуществляется так:
- Пины 3.3V и GND Arduino подключаем к аналогичным пинам модуля;
- Пины с 9 по 13 Arduino подключаем к пинам RST, SDA, MOSI, MISO и SCK модуля соответственно;
В итоге должно получиться что-то в таком стиле:
Рассмотрим простейший пример кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); Serial.println("Ready."); } void loop() { if(!mfrc522.PICC_IsNewCardPresent()) return; if(!mfrc522.PICC_ReadCardSerial()) return; mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); } |
Этот код полностью считывает содержимое метки и передает его в компьютер по UART. Если теперь поднести карточку к считывателю, вы увидите что-то вроде:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Card UID: EF FB F6 01 Card SAK: 08 PICC type: MIFARE 1KB Sector Block 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 AccessBits 15 63 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ] 62 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] 14 59 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ] 58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] 57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] ... и так далее ... 0 3 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ] 2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] 1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] 0 EF FB F6 01 E3 08 04 00 62 63 64 65 66 67 68 69 [ 0 0 0 ] |
Отсюда мы можем узнать, что метка имеет 32-х битный идентификатор (UID), а также содержит в себе 1 Кб данных. Также можно заметить, что UID на самом деле представляет собой данные, хранящиеся в нулевом блоке.
Теперь допустим, что у нас есть дверь, и мы хотим открывать ее только тем, кто приложит правильную карточку. Проще всего это сделать, проверяя UID карточки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); const uint8_t valid_uid[] = { 0xEF, 0xFB, 0xF6, 0x01 }; void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); } void loop() { if(!mfrc522.PICC_IsNewCardPresent()) return; if(!mfrc522.PICC_ReadCardSerial()) return; if((mfrc522.uid.size == sizeof(valid_uid)) && (memcmp(&mfrc522.uid.uidByte, &valid_uid, sizeof(valid_uid)) == 0)) { Serial.println("ACCESS GRANTED!"); } else { Serial.println("Access denied."); } } |
Вместо UID можно с тем же успехом использовать другие блоки. Как вариант, в них можно хранить битовую маску, определяющую, какие двери можно открывать с помощью этой карты, а какие нельзя. Чтобы нельзя было так просто изготовить мастер-ключ, открывающий все двери, данные на карте можно подписывать, например, при помощи эллиптической криптографии.
Как видите, пользоваться модулем достаточно просто. С его помощью вы без проблем добавите в ваши проекты аутентификацию по карточкам. Стоит только иметь ввиду, что MIFARE-метки достаточно легко клонируются. Вместе с библиотекой MFRC522 идет еще масса примеров, включая смену UID и полное клонирование карт.
Оригинал статьи в блоге «Записки программиста».
Купить RFID RC522 13.56MHz в интернет-магазине Arduinka.Pro
Купить набор Arduino c модулем RFID RC522 13.56MHz