Вам, конечно же, знакомы карточки и брелки, которые нужно подносить к считывателю, а они при этом пропускают на работу или дают проехать в метро. Такие брелки и карточки используют технологию под названием 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 ( даташит [PDF] ). На eBay комплект из такого модуля вместе с метками в виде карточки и брелка можно приобрести за 2$ . Чип MFRC522 поддерживает технологии MIFARE и NTAG, радиосигнал передается на частоте 13.56 МГц. С микроконтроллером чип общается по SPI. Однако прямо по SPI ходить в чип нам не придется, так как для работы с модулем существует готовая библиотека MFRC522 . Ее можно установить прямо из Arduino IDE.

Подключение модуля к Arduino Uno осуществляется так:

  • Пины 3.3V и GND Arduino подключаем к аналогичным пинам модуля;
  • Пины с 9 по 13 Arduino подключаем к пинам RST, SDA, MOSI, MISO и SCK модуля соответственно;

В итоге должно получиться что-то в таком стиле:

RFID-модуль для Arduino

Рассмотрим простейший пример кода:

#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. Если теперь поднести карточку к считывателю, вы увидите что-то вроде:

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 карточки:

#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-метками и если да, то каковы ваши последние достижения на этом поприще?

EnglishRussianUkrainian