Подключение RFID к Arduino с помощью RC522 и RDM3600

Что такое rfid

RFID (радиочастотная идентификация) – это метод обеспечения передачи, записи и хранения данных при помощи радиосигналов. Каждая RFID-система включает в себя считыватель/ридер и RFID-метку, в которой хранятся данные. Метки состоят из двух частей – интегральной схемы и антенны. Интегральная схема позволяет хранить и обрабатывать данные, антенна – принимать и передавать информацию.

Все RFID-системы можно разделить по дальности действия:

  • Ближней идентификации – расстояние не более 20 см;
  • Средней идентификации – расстояние от 20 см до 5 м;
  • Дальней идентификации – максимум 300 м.

С точки зрения частот можно выделить:

  • Системы, работающие в низкочастотном диапазоне (125 кГц, 134 кГц);
  • Работающие в среднечастотном диапазоне (13,56 МГц);
  • Работающие в высокочастотном диапазоне (800 МГц – 2, 4 ГГц).

Наиболее популярным диапазоном является среднечастотным – он широко используется в транспортных приложениях и других проектах, где требуется перезаписывание карт. Основными стандартами являются ISO 14443, ISO 15693 и EPC. На основе стандарта ISO 14443 изготавливаются смарт-карты. ISO 15693 используется для перезаписывания меток. EPC – аналог штрихкодов, имеет более простую и понятную структуру.

ВЧ диапазон начали использовать недавно, в основном его применяют для складских приложений. Для этого диапазона используются стандарты ISO 18000 и EPC. Стандарты ISO 18000 вызывают наибольший интерес, они используются в приложениях с метками с увеличенной дальностью. Для ISO 18000 также можно выделить несколько стандартов, различающихся по  частоте:

  • ISO 18000-1 (определение тех параметров, которые необходимо стандартизировать);
  • ISO 18000-2 (для параметров с бесконтактным интерфейсом связи менее 135 кГц);
  • ISO 18000-3 (для бесконтактного интерфейса на частоте 13,56 МГц);
  • ISO 18000-4 (для частоты 2, 45 ГГц);
  • ISO 18000-6 (для частоты 860-930МГц);
  • ISO 18000-7 (для частоты 433 МГц).

Что внутри тега?

С технической точки зрения NFC-тег — это микрокомпьютер наподобие тех, что находятся внутри SIM и банковских карт. Здесь есть свой процессор, оперативная и постоянная память, но нет традиционного источника питания. Электрический ток он получает посредством электромагнитной индукции, которая возникает между антеннами считывателя и метки, так же как это происходит в беспроводных зарядных устройствах и пассивных радиоприемниках.

Антенна занимает около 99% площади метки и передает данные на частоте 13,56 МГц со скоростью 106, 212, или 424 Кбит/с. Стандарты NFC определяют несколько протоколов передачи данных, в том числе несколько реализаций протокола обмена данными (они обозначаются буквами A, B и так далее), которые могут быть дополнены производителем самой метки.

Безопасность данных обеспечивается несколькими путями:

  • Малая дальность действия. Десять сантиметров — очень приватная зона.
  • Защита от клонирования с помощью уникального серийного номера.
  • Возможность защиты от перезаписи и защиты данных паролем.
  • Опциональное шифрование данных в памяти и при передаче.

Ведущий производитель NFC-тегов — компания NXP Semiconductors. Они производят теги семейства Mifare, которые стали настолько популярны, что совместимость с ними обеспечивают не только другие производители тегов, но и производители NFC-чипов для смартфонов (на уровне эмуляции тегов).

Что такое технология rfid и как она работает?

RFID или система радиочастотной идентификации состоит из двух основных компонентов: транспондера или метки, прикрепленной к идентифицируемому объекту, и приемопередатчика, также известного как интеррогатор (interrogator) или считыватель.

Рисунок 1 Как работает технология RFID
Рисунок 1 – Как работает технология RFID

Считыватель состоит из радиочастотного модуля и антенны, которая генерирует высокочастотное электромагнитное поле. Метка, напротив, обычно является пассивным устройством, то есть она не содержит батареи. Вместо этого она содержит микрочип, который хранит и обрабатывает информацию, и антенну для приема и передачи сигнала.

Для считывания информации, закодированной в метке, она размещается в непосредственной близости от считывателя (она не обязательно должна находиться в пределах прямой видимости от считывателя). Считыватель генерирует электромагнитное поле, которое заставляет электроны проходить через антенну метки и обеспечивать чип питанием.

Рисунок 2 Как работает технология RFID
Рисунок 2 – Как работает технология RFID

Обеспеченная питанием микросхема внутри метки затем отвечает отправкой своей сохраненной информации обратно считывателю в виде другого радиосигнала. Это называется обратным рассеянием (backscatter). Обратное рассеяние или изменение электромагнитной/радиочастотной волны обнаруживается и интерпретируется считывателем, который затем отправляет данные на компьютер или микроконтроллер.

Nfc taginfo

Для начала разберемся, что за теги нам достались. Китайцы обычно никаких подробностей на этот счет не сообщают, а уж о картах метро я вообще молчу. Запускаем NFC TagInfo и подносим смартфон к тегу. Далее тапаем по пункту Tag Information и смотрим (скриншот «Читаем NFC-тег»), что мы имеем:

  • UID — уникальный идентификатор тега;
  • RF Technology — стандарт, поддерживаемый тегом. В данном случае это ISO/IEC 14443 Type A, то есть обычный RFID-тег c поддержкой первой версии протокола обмена данными (Type A);
  • Tag Type — тип (или, лучше сказать, «модель») тега. В данном случае NTAG203 — это Mifare Ultralight C, самый дешевый на данный момент тег. Буква C означает поддержку криптозащиты данных. Еще бывает Topaz 512, который вмещает 450 байт информации, и Mifare Classic 1K (716 байт), используемый в тегах TecTile и нередко в картах метро;
  • Manufacturer — производитель тега. NXP Semiconductors — 90% всех NFC-тегов делают они (семейство Mifare).
Читаем NFC-тег
Читаем NFC-тег

Rfid система контроля доступа для дверного замка

Давайте создадим небольшой проект на Arduino, чтобы продемонстрировать, как простой модуль RFID считывателя RC522 можно использовать для создания RFID системы контроля доступа для дверного замка. Наша программа будет сканировать уникальный идентификатор каждой RFID метки, когда она достаточно близко, чтобы запитываться от считывателя RC522.

Так выглядит результат.

Рисунок 13 Демонстрация работы RFID системы контроля доступа для дверного замка
Рисунок 13 – Демонстрация работы RFID системы контроля доступа для дверного замка

Конечно, этот проект можно привязать к открытию дверей, включению реле, включению светодиода или к чему-то еще.

Если вы не знакомы с символьными LCD дисплеями размером 16×2, то взгляните на эту статью.

Прежде чем мы перейдем к загрузке кода и сканированию меток, давайте посмотрим на принципиальную схему проекта.

Рисунок 14 RFID система контроля доступа для дверного замка. Подключение RFID считывателя RC522 и LCD дисплея к Arduino
Рисунок 14 – RFID система контроля доступа для дверного замка. Подключение RFID считывателя RC522 и LCD дисплея к Arduino

Всё! Теперь попробуйте приведенный ниже скетч в работе.

#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>

#define RST_PIN 9
#define SS_PIN 10

byte readCard[4];
String MasterTag = "20C3935E";	// ЗАМЕНИТЕ этот ID метки на ID своей метки!!!
String tagID = "";

// Создание объектов
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //Параметры: (rs, enable, d4, d5, d6, d7) 

void setup() 
{
  // Инициализация
  SPI.begin();        // SPI шина
  mfrc522.PCD_Init(); // MFRC522
  lcd.begin(16, 2);   // LCD дисплей

  lcd.clear();
  lcd.print(" Access Control ");
  lcd.setCursor(0, 1);
  lcd.print("Scan Your Card>>");
}

void loop() 
{
  
  // Ждем, пока не будет доступна новая метка
  while (getID()) 
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    
    if (tagID == MasterTag) 
    {
      lcd.print(" Access Granted!");
      // Вы можете написать здесь любой код, например, открывание дверей,
      // включение реле, зажигание светодиода или что-то другое, что взбредет вам в голову.
    }
    else
    {
      lcd.print(" Access Denied!");
    }
    
    lcd.setCursor(0, 1);
    lcd.print(" ID : ");
    lcd.print(tagID);
      
    delay(2000);

    lcd.clear();
    lcd.print(" Access Control ");
    lcd.setCursor(0, 1);
    lcd.print("Scan Your Card>>");
  }
}

// Чтение новой метки, если она доступна
boolean getID() 
{
  // Получение готовности для чтения PICC карт
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  { // Продолжать, если к RFID считывателю поднесена новая карта
    return false;
  }
  
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  { // Когда карта поднесена, считать серийный номер и продолжить
    return false;
  }
  
  tagID = "";
  for ( uint8_t i = 0; i < 4; i  ) 
  { // Карты MIFARE, кторые мы используем, содержат 4-байтовый UID
    //readCard[i] = mfrc522.uid.uidByte[i];
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Сложить эти 4 байта в одну переменную String
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA(); // остановить чтение
  return true;
}

Программа довольно проста. Сначала мы включаем необходимые библиотеки, определяем выводы Arduino, создаем объекты LCD и MFRC522 и определяем главную метку.

#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>

#define RST_PIN 9
#define SS_PIN 10

byte readCard[4];
String MasterTag = "20C3935E";	// ЗАМЕНИТЕ этот ID метки на ID своей метки!!!
String tagID = "";

// Создание объектов
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //Параметры: (rs, enable, d4, d5, d6, d7) 

В функции setup() мы инициализируем интерфейс SPI, объект MFRC522 и LCD дисплей. После этого мы печатаем на LCD дисплее приветственное сообщение.

void setup() 
{
  // Инициализация
  SPI.begin();        // SPI шина
  mfrc522.PCD_Init(); // MFRC522
  lcd.begin(16, 2);   // LCD дисплей

  lcd.clear();
  lcd.print(" Access Control ");
  lcd.setCursor(0, 1);
  lcd.print("Scan Your Card>>");
}

В функции loop() мы ждем, пока не будет отсканирована новая метка. Как только это будет сделано, мы сравним неизвестную метку с мастер-меткой, определенной в функции setup(). Всё! Если ID метки совпадает с ID мастера, доступ предоставляется, в противном случае в доступе будет отказано.

void loop() 
{
  
  // Ждем, пока не будет доступна новая метка
  while (getID()) 
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    
    if (tagID == MasterTag) 
    {
      lcd.print(" Access Granted!");
      // Вы можете написать здесь любой код, например, открывание дверей,
      // включение реле, зажигание светодиода или что-то другое, что взбредет вам в голову.
    }
    else
    {
      lcd.print(" Access Denied!");
    }
    
    lcd.setCursor(0, 1);
    lcd.print(" ID : ");
    lcd.print(tagID);
      
    delay(2000);

    lcd.clear();
    lcd.print(" Access Control ");
    lcd.setCursor(0, 1);
    lcd.print("Scan Your Card>>");
  }
}

Ключевым моментом в проекте является пользовательская функция getID(). Как только она просканирует новую карту, внутри цикла for она преобразует 4 байта UID в строки и объединяет их для создания одной строки.

boolean getID() 
{
  // Получение готовности для чтения PICC карт
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  { // Продолжать, если к RFID считывателю поднесена новая карта
    return false;
  }
  
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  { // Когда карта поднесена, считать серийный номер и продолжить
    return false;
  }
  
  tagID = "";
  for ( uint8_t i = 0; i < 4; i  ) 
  { // Карты MIFARE, кторые мы используем, содержат 4-байтовый UID
    //readCard[i] = mfrc522.uid.uidByte[i];
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Сложить эти 4 байта в одну переменную String
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA(); // остановить чтение
  return true;
}

Оригинал статьи:

Автомобильная автоматизация

NFC-теги будут очень полезны тем, кто использует смартфон в качестве автомобильного навигатора. Достаточно наклеить тег на держатель смартфона и записать в него инструкцию для запуска навигатора — и вуаля. Все стало намного проще. Тем не менее я бы рекомендовал пойти несколько другим путем и усложнить настройку, добавив к ней автоматическое включение Bluetooth (для гарнитуры), GPS и отключение Wi-Fi.

Чтобы сделать это, нам вновь понадобится Trigger. Запускаем, добавляем задание, в качестве триггера выбираем NFC. Добавляем действие «Bluetooth -> Bluetooth Вкл/Выкл -> Включить». Добавляем еще одно действие: «Беспроводные и локальные сети ->

GPS Вкл/Выкл -> Включить». И еще одно: «Беспроводные и локальные сети -> WiFi Вкл/Выкл -> Выключить». Наконец, добавляем действие «Приложение и ярлыки -> Открыть приложение -> выбираем приложение». Пропускаем экран добавления переключателей, на следующем экране подносим смартфон к тегу.

Теперь после установки смартфона в держатель мы получим полностью настроенный для использования в автомобиле смартфон.

Библиотека mfrc522

Установим через менеджер библиотек вариант MFRC522 (домашняя страница).

MFRC522

В состав библиотеки входят несколько примеров, а также компонент для Fritzing. Для первого знакомства запустите скетч DumpInfo. В комментариях указаны варианты подключения для разных плат. Стандартный вариант для Arduino Uno/Nano.


-------------------------------------
            MFRC522      Arduino    
            Reader/PCD   Uno/101/Nano    
Signal      Pin          Pin        
-------------------------------------
RST/Reset   RST          9          
SPI SS      SDA(SS)      10         
SPI MOSI    MOSI         11
SPI MISO    MISO         12
SPI SCK     SCK          13

При поднесении карточки в мониторе порта увидите большую таблицу данных. Дождитесь полной загрузки данных и обратите внимание на данные в блоке 0 – там можно увидеть идентификатор.

RFID

Но у вас нет необходимости вручную считывать информацию из массива данных, идентификатор можно получить через вызов функции. В начале есть отдельная строка Card UID: 77 E7 BC 3A.

Рассмотрим упрощённый пример. Суть в следующем. Инициализируем объект класса MFRC522 и проверяем различные условия. Если к ридеру не поднесли карточку, то выходим из функции loop(), если прочитать карточку не можем, то также выходим из функции. Если оба условия всё же выполнились (есть карта и данные с неё), то выполняем уже нужный код.


#include <SPI.h>
#include <MFRC522.h>

// контакты
#define SS_PIN 10
#define RST_PIN 9

// Создание экземпляра объекта MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Создание экземпляра MFRC522

void setup() {
  Serial.begin(9600);
  SPI.begin();

  // инициализация MFRC522
  mfrc522.PCD_Init();
  // выводим номер версии прошивки ридера
  mfrc522.PCD_DumpVersionToSerial();
}

void loop() {
  // Ожидание
  if ( ! mfrc522.PICC_IsNewCardPresent())
    return;

  // чтение
  if ( !mfrc522.PICC_ReadCardSerial())
    return;

  // вывод данных
  Serial.print("UID = ");
  view_data(mfrc522.uid.uidByte, mfrc522.uid.size);
  Serial.println();
  Serial.print("type = ");
  byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  Serial.print(mfrc522.PICC_GetTypeName(piccType));
  Serial.println();
  delay(1000);
}

// преобразование в HEX
void view_data (byte *buf, byte size) {
  for (byte j = 0; j < size; j  ) {
    Serial.print(buf [j]);
    Serial.print(buf [j], HEX);
  }
}

Подносим карточку и брелок из комплекта (MIFARE 1 KB), а также карточки московского транспорта (MIFARE Ultralight or Ultralight C). Идентификатор карточки выводится в десятичном формате.

MFRC522

Визитка

NFC-теги можно использовать в комбинации с визитками. На рынке есть несколько компаний, которые занимаются их выпуском, однако их ценники таковы, что проще самостоятельно наклеить теги на обыкновенные визитки, и в кармане еще останется куча денег. В тег можно записать любую информацию, включая контактные данные (TagWriter поддерживает такой формат), адрес веб-сайта или даже географические координаты своего офиса (смартфон автоматически откроет карты для показа положения). А самое главное — визитку совсем не обязательно отдавать человеку, достаточно, чтобы он ее отсканировал.

Домашняя автоматизация

Наиболее простой и очевидный способ использования тегов — это просто расклеить их по дому с целью получить своего рода систему автоматизации. Здесь существует множество различных вариантов. Приведу наиболее интересные и полезные.

  • Пароль от домашнего Wi-Fi. Клеим тег на роутер и записываем в него пароль с помощью приложения InstaWifi. Пригодится не только тем, кто часто принимает гостей, но и любителям экспериментов с прошивками.
  • Запуск автосинхронизации или приложения для обмена данными с ПК. Тег можно приклеить на ноутбук или системник и прописать в него запуск приложения для синхронизации данных (AirDroid, WiFi ADB и другие).
  • Включение точки доступа. Опять же клеим тег на ноутбук, далее устанавливаем приложение Trigger. В нем добавляем новое задание, в качестве триггера выбираем NFC, пропускаем выбор ограничений, в качестве действия выбираем «Беспроводные и локальные сети -> Wifi-зона», пропускаем следующий экран (добавление переключателя) и на последнем экране подносим к NFC-тегу.
  • Включение режима полета на ночь. Клеим метку куда-нибудь ближе к кровати. Запускаем Trigger, новое задание -> триггер: NFC -> действие: «Экспериментальные -> Режим в самолете». Как вариант, вместо включения режима самолета можно настроить отключение передачи данных и Wi-Fi, добавив соответствующие действия в задание.

Запись и чтение пользовательских данных

Рассмотрим два примера, которые входят в состав библиотеки – rfid_write_personal_data и rfid_read_personal_data. Они позволяют записать, а потом считать данные с карточки.

Сначала загрузим скетч для записи данных. После прошивки подносим карточку к ридеру, в мониторе порта просят ввести фамилию, которую нужно завершить символом решётки. После успешной записи нужно ввести имя и опять с завершающим символом решётки.

Write RFID

Затем прошиваем плату вторым примером и снова подносим карточку. Ридер считает данные и выведет их в монитор порта.

Read RFID

Как это работает

Вот что происходит, когда пользователь аутентифицируется в сервисе или веб-приложении, для которого включена передача аутентификации:

  1. Вызывается рутина ZAUTHENTICATE. Код этой рутины пишется пользователем и может быть любым Caché ObjectScript кодом, в том числе и $ZF вызовы.
  2. Следующий шаг зависит от того, был ли успешным вызов ZAUTHENTICATE:
  3. Если для инстанса и сервиса включена двухфакторная аутентификация, то производится поиск номера телефона пользователя и оператора. Если они заданы, происходит двухфакторная аутентификация, если нет — юзер не аутентифицируется.
  4. Делегированный пользователь отображается в таблице пользователей.

Объяснение кода:

Скетч начинается с включения библиотек MFRC522 и SPI, определения выводов Arduino, к которым подключен RC522, и создания объекта считывателя MFRC522.

#include <SPI.h>      // включить библиотеку шины SPI
#include <MFRC522.h>  // включить библиотеку считывателя RFID

#define SS_PIN 10  //slave select pin
#define RST_PIN 5  //reset pin

MFRC522 mfrc522(SS_PIN, RST_PIN);  // создание объекта считывателя MFRC522
MFRC522::MIFARE_Key key;           // создать структуру MIFARE_Key с именем 'key', которая будет хранить информацию о карте

Далее нам нужно определить блок, в котором мы собираемся хранить наши данные. Здесь выбран сектор 0, блок 2. Помните, никогда не выбирайте блок 3 в любом секторе. Запись в блок Sector Trailer может сделать блок непригодным для использования.

Пишем данные

Для записи данных будем использовать NFC TagWriter. Пользоваться приложением довольно просто. Запускаем, тапаем по пункту Create, write and store, выбираем New, далее выбираем тип записываемых данных. Наиболее полезные типы: контакт, простой текст, телефонный номер, данные для Bluetooth-соединения, URI и приложение. В списке есть даже закладка веб-браузера и email-сообщение, но для чего они нужны, не совсем понятно.

Главный экран NFC TagWriter
Главный экран NFC TagWriter

Далее заполняем необходимые поля (например, адрес веб-сайта в случае с URI), нажимаем Next и попадаем на экран опций (скриншот «NFC TagWriter: опции сообщения»). Здесь можно указать приложение, которое будет запущено после прочтения метки (Add launch application) и установить защиту на перезапись сторонним устройством (Apply Soft Protection).

NFC TagWriter: опции сообщения
NFC TagWriter: опции сообщения

Вновь нажимаем Next и подносим смартфон к тегу. Вуаля, наши данные в нем. Теперь их можно прочитать любым смартфоном с поддержкой NFC. Но что это в конечном итоге дает?

Поддержка в смартфонах

Первым телефоном с интегрированной поддержкой NFC был Nokia 6131, выпущенный еще в 2006 году. Тогда встроенный NFC-чип был всего лишь игрушкой для демонстрации возможностей созданной два года назад технологии. Смартфон был оснащен софтом для считывания NFC-меток, но ввиду их тогдашней дороговизны и почти нулевой популярности технологии ни на какое серьезное применение данная особенность смартфона не претендовала.

После некоторого затишья популяризацией NFC занялась компания Google, выпустившая в 2021 году смартфон Samsung Nexus S и приложение Google Wallet, которое позволяло расплачиваться виртуальными кредитками, используя NFC. На следующий год Google стала ведущим участником NFC Forum и представила Android 4.

Сегодня NFC оснащаются почти все выпускаемые смартфоны. Соответствующий модуль есть даже в сверхбюджетных чипах Mediatek, так что большая часть новых китайских смартфонов стоимостью 5000 рублей тоже им оснащены. В любом случае присутствие чипа NFC легко проверить по наличию пункта «Беспроводные сети -> NFC» в настройках.

Подключение

Некоторые столкнуться с проблемой – название пинов в большинстве уроков и руководств может не соответствовать распиновке на вашем модуле. Если в скетчах указан пин SS, а на вашем модуле его нет, то скорее всего он помечен как SDA. Ниже я приведу таблицу подключения модуля для самых распространенных плат.

MFRC522Arduino UnoArduino MegaArduino Nano v3

Arduino Leonardo/Micro

Arduino Pro Micro
RST95D9RESET/ICSP-5RST
SDA(SS)1053D101010
MOSI11 (ICSP-4)51D11ICSP-416
MISO12 (ICSP-1)50D12ICSP-114
SCK13 (ICSP-3)52D13ICSP-315
3.3V3.3V3.3VСтабилизатор 3,3ВСтабилизатор 3,3ВСтабилизатор 3,3В
GNDGNDGNDGNDGNDGND

Пины управления SS(SDA) и RST задаются в скетче, так что если ваша плата отличается от той, что я буду использовать в своих примерах, а использую я UNO R3, указывайте пины из таблицы в начале скетча:

#define SS_PIN 10
#define RST_PIN 9

Подключение rc522 к ардуино

Для подключения понадобятся плата Ардуино, считыватель RC522, компьютер, провода и беспроводная RFID метка.

Подключается модуль RC522 к ардуино по следующей схеме:

Напряжение питания обеспечивается от 2,5 до 3,3 В. Выход RST подключается к D9 пину на ардуино, SDA – к D10, MOSI – D11, MISO – D12, SCK – D13. В данном случае рассмотрены платы Arduino Nano v3 и Arduino Uno. После того как все будет подключено, на RC522 загорится индикатор.

Плата Ардуино оснащена дополнительным разъемом ICSP, который используется для работы по интерфейсу  SPI. Распиновка для него изображена на рисунке, выводы с модуля RC522 можно подключить к этому разъему.

Для работы с модулем нужно установить библиотеку RFID Library for MFRC522. После установки нужно загрузить тестовый скетч для считывания номера карты cardRead, включить мониторинг последовательного порта. Затем метку нужно поднести к ридеру, произойдет инициализация метки и на мониторе появится следующее:

В данном примере произведено считывание трех различных меток.

Можно выбрать другой пример – DumpInfo, который также считает данные с карты. В результате на экране появятся тип карты и информация, которая состоит из 16 сектором памяти по 4 блока.

Предназначение дубликатора домофонных ключей

С помощью микроконтроллера Arduino можно копировать домофонный ключ, если случайно его потерял.

RFID – радиочастотная идентификация. Устройство выполняет ту же функцию, что и штрих-код или магнитная полоска на задней стороне кредитной карты. Он предоставляет уникальный идентификатор для этого объекта. И так же, как штрих-код или магнитная полоса, RFID должен быть отсканирован для получения информации.

RFID используется в этом проекте для чтения данных из RFID-меток и отправки информации в энергонезависимую память MCU.

Идентификатор, считываемый из тегов, сравнивается с хранимой информацией, и если он совпадает, то дверь открывается.

Преимущества rfid

  • Не требуется прямая видимость;
  • Практически 100% идентификация сигнала;
  • Возможность применения в агрессивной среде;
  • Долгий срок службы;
  • RFID-метку трудно подделать;
  • Возможность хранения и передачи большого объема информации.

Области применения RFID идентификации

RFID-технология часто используется в розничной торговле, библиотеках и архивах, логистике, системах контроля и управления доступом (СКУД), инициализации людей, удостоверении подлинности товаров.

Для идентификации персонала самым популярным форматом являются пластиковые бесконтактные карты и бесконтактные брелки. С их помощью можно регистрировать вход/выход объектов на территории через точки прохода – ворота, КПП. Основной задачей СКУД является управление доступом – например, ограничение в доступе на какую-либо территорию, идентификация лиц, которые могут попадать на территорию.

RFID-брелки используются и для подъездных домофонов. Для открытия дверей чаще всего используются брелки Proximity, то есть брелки ближнего действия, работающие на расстоянии 10-15 см.  Proximity также делятся на несколько форматов – наиболее популярные на сегодняшний день EM-Marin, HID для бесконтактных ключей и MIFARE, к которым относятся бесконтактные смарт карты.

Пример №1: считывание номера карты

Рассмотрим пример из библиотеки RFID  – cardRead. Он не выдает данные из карты, а только ее номер, чего обычно бывает достаточно для многих задач.

#include 
#include 

#define SS_PIN 10
#define RST_PIN 9

RFID rfid(SS_PIN, RST_PIN); 

// Данные о номере карты храняться в 5 переменных, будем запоминать их, чтобы проверять, считывали ли мы уже такую карту
    int serNum0;
    int serNum1;
    int serNum2;
    int serNum3;
    int serNum4;

void setup()
{ 
  Serial.begin(9600);
  SPI.begin(); 
  rfid.init();
  
}

void loop()
{    
    if (rfid.isCard()) {
        if (rfid.readCardSerial()) { // Сравниваем номер карты с номером предыдущей карты
            if (rfid.serNum[0] != serNum0
                && rfid.serNum[1] != serNum1
                && rfid.serNum[2] != serNum2
                && rfid.serNum[3] != serNum3
                && rfid.serNum[4] != serNum4
            ) {
                /* Если карта - новая, то считываем*/
                Serial.println(" ");
                Serial.println("Card found");
                serNum0 = rfid.serNum[0];
                serNum1 = rfid.serNum[1];
                serNum2 = rfid.serNum[2];
                serNum3 = rfid.serNum[3];
                serNum4 = rfid.serNum[4];
               
                //Выводим номер карты
                Serial.println("Cardnumber:");
                Serial.print("Dec: ");
  Serial.print(rfid.serNum[0],DEC);
                Serial.print(", ");
  Serial.print(rfid.serNum[1],DEC);
                Serial.print(", ");
  Serial.print(rfid.serNum[2],DEC);
                Serial.print(", ");
  Serial.print(rfid.serNum[3],DEC);
                Serial.print(", ");
  Serial.print(rfid.serNum[4],DEC);
                Serial.println(" ");
                        
                Serial.print("Hex: ");
  Serial.print(rfid.serNum[0],HEX);
                Serial.print(", ");
  Serial.print(rfid.serNum[1],HEX);
                Serial.print(", ");
  Serial.print(rfid.serNum[2],HEX);
                Serial.print(", ");
  Serial.print(rfid.serNum[3],HEX);
                Serial.print(", ");
  Serial.print(rfid.serNum[4],HEX);
                Serial.println(" ");
             } else {
               /* Если это уже считанная карта, просто выводим точку */
               Serial.print(".");
             }
          }
    }
    
    rfid.halt();
}

Скетч залился, светодиод питания на модуле загорелся, но модуль не реагирует на карту? Не стоит паниковать, или бежать искать “правильные” примеры работы. Скорее всего, на одном из пинов просто нет контакта – отверстия на плате немного больше чем толщина перемычки, так что стоит попробовать их переставить.

Допустим, все у вас заработало. Тогда, считывая модулем RFID метки, в мониторе последовательного порта увидим следующее:

Здесь я считывал 3 разных метки, и как видно все 3 он успешно считал.

Пример №3: запись нового идентификатора на карту

В этом примере мы рассмотрим смену идентификатора карты (UID). Важно знать, что далеко не все карты поддерживают смену идентификатора. Карта может быть перезаписываемой, но это означает лишь перезаписываемость данных. К сожалению, те карты, которые были у меня на руках, перезапись UID не поддерживали, но код скетча я здесь на всякий случай приведу.

#include 
#include 

/* Задаем здесь новый UID */
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}
#define SS_PIN 10
#define RST_PIN 9

MFRC522 mfrc522(SS_PIN, RST_PIN);       
MFRC522::MIFARE_Key key;

void setup() {
        Serial.begin(9600);        
        while (!Serial);          
        SPI.begin();               
        mfrc522.PCD_Init();      
        Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!"));
        for (byte i = 0; i < 6; i  ) {
                key.keyByte[i] = 0xFF;
        }
}
void loop() {
        if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
            delay(50);
            return;
        }     
        // Считываем текущий UID
        Serial.print(F("Card UID:"));
        for (byte i = 0; i < mfrc522.uid.size; i  ) {
                Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
                Serial.print(mfrc522.uid.uidByte[i], HEX);
        } 
        Serial.println();        
        // Записываем новый UID
        byte newUid[] = NEW_UID;
        if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
            Serial.println(F("Wrote new UID to card."));
        }
        
        // Halt PICC and re-select it so DumpToSerial doesn't get confused
        mfrc522.PICC_HaltA();
        if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
                return;
        }
        
        // Считываем данные с карты
        Serial.println(F("New UID and contents:"));
        mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
        
        delay(2000);
}

Принцип работы дубликатора на ардуино

Каждый ключ имеет внутреннюю связь с домофонной дверью – этот номер и служит ключевым идентификатором. Этот номер интерком-ключа решает, нужный ли вы приложили ключ. Поэтому принцип работы дубликатора домофонных ключей на Arduino довольно прост: сначала нужно проверить «разрешенный» ключ, а затем присвоить тот же номер другому ключевому клону.

Проверяя номер из своей базы данных разрешенных скоростей передачи данных, он откроет дверь. Ключи для внутренней связи, которые мы будем подключать к Arduino дубликатору (иногда называемому iButton или Touch Memory), считываются и записываются в 1-проводной интерфейс. Поэтому схема подключения очень проста.

Программная часть

Мы подключим клавиатуру для отображения номеров на ЖК-дисплее для Arduino и скопируем ключ, который вводим с клавиатуры.

Keypad.h – это библиотека, которая позволяет Arduino читать клавиатуру с матричным типом.

В этом проекте используется клавиатура 4 × 4.

В таблице показано соединение между платой Arduino и клавиатурой. Штыри клавиатуры подключены к цифровым выходным выводам Arduino. Pin D6 использовался для зуммера, потому что это был штырь ШИМ.

Вывод клавиатурыКонтакт Arduino
1D2
2D3
3D4
4D5
5A0
6D7
7D8
Соединение между Arduino, LCD и клавиатурой
Соединение между Arduino, LCD и клавиатурой

Затем добавим RFID. В этом случае плата RFID использует протокол связи SPI, где Arduino будет действовать, как ведущий и считыватель RFID в качестве подчиненного. Считыватель карт и теги предназначены для связи с частотой, равной 13,56 МГц.

Это важный шаг, поскольку он помогает нам считывать данные с карты, и он будет решать, соответствует ли идентификатор информации, хранящейся в EEPROM. Если он соответствует, он даст нам доступ и отобразит «Unlocked». В противном случае на ЖК-дисплее отобразится «Заблокировано».

Соединение между Arduino, LCD и RFID
Соединение между Arduino, LCD и RFID

Следующий шаг – добавить зуммер и 2 светодиода для имитации системы контролируемого доступа. Ознакомьтесь с приведенной ниже диаграммой. Зуммер установлен так, что он гудит всякий раз, когда мы получаем доступ (разблокирован). Красный светодиод всегда горит, когда он заблокирован, но зеленый светодиод загорается, когда он разблокирован.

Чтобы защитить модули, нужно использовать 3D-печать корпуса. Если у вас нет 3D-принтера, вы можете просто использовать пластиковый корпус, который позволяет вам вставлять все компоненты внутрь. Это очень полезно, потому что модули будут размещены внутри, а единственными частями вне коробки будут светодиоды, клавиатура и ЖК-дисплей.

Схема соединений, показывающая соединение между Nano, LCD, клавиатурой, RFID и звуковым сигналом
Схема соединений, показывающая соединение между Nano, LCD, клавиатурой, RFID и звуковым сигналом

Код для загрузки на микропроцессор доступен по ссылке:

Разблокировка смартфона

У Motorola есть довольно интересный аксессуар для смартфонов под названием Motorola Skip. Это клипса на одежду для быстрой разблокировки смартфона без необходимости введения PIN-кода или графического ключа. Аксессуар в некоторых случаях довольно полезный, но работает он только со смартфонами той же компании. К счастью, аналогичную штуковину можно собрать на коленке.

Не буду рассказывать, как сделать саму клипсу, — тут каждый волен проявить свою фантазию, NFC-тег можно и на руку наклеить, — а вместо этого скажу, как настроить разблокировку смартфона при ее касании. Есть несколько способов, но самый простой и эффективный — это Xposed-модуль NFC LockScreenOff Enabler.

Дело в том, что в целях безопасности Android запрещает использовать NFC до тех пор, пока экран не будет разблокирован (не просто включен, а именно разблокирован), что сводит на нет многие эффективные приемы его использования. NFC LockScreenOff Enabler решает эту проблему.

NFC LockScreenOff Enabler: разблокировка NFC-тегом
NFC LockScreenOff Enabler: разблокировка NFC-тегом

Распиновка rfid модуля rc522

Модуль RC522 имеет всего 8 контактов, соединяющих его с внешним миром.

Рисунок 4 Распиновка RFID модуля считывателя RC522
Рисунок 4 – Распиновка RFID модуля считывателя RC522

VCC обеспечивает питание для модуля. Напряжение питания может быть в диапазоне от 2,5 до 3,3 вольт. Вы можете подключить его к выходу 3.3V вашей платы Arduino. Помните, что подключение его к выводу 5V, скорее всего, выведет модуль из строя!

RST – вход для сброса и отключения питания. Когда на этот вывод подается низкий логический уровень, запускается жесткое отключение питания. Оно отключает всех внутренних потребителей тока, включая генератор, и входные выводы отключаются от внешних цепей. Во время нарастающего фронта на этом выводе модуль сбрасывается.

GND вывод земли, должен быть подключен к выводу GND на Arduino.

IRQ – вывод прерывания, который может предупредить микроконтроллер, когда поблизости будет RFID метка.

Вывод MISO / SCL / Tx действует либо как Master-In-Slave-Out (вход ведущего – выход ведомого) при включенном интерфейсе SPI, либо как последовательный тактовый сигнал при включенном интерфейсе I2C, либо как выход последовательных данных при включенном интерфейсе UART.

MOSI (Master Out Slave In) – вход SPI для модуля RC522.

SCK (Serial Clock) принимает тактовые импульсы, предоставляемые мастером на шине SPI, то есть Arduino.

Вывод SS / SDA / Rx действует либо как вход, когда включен интерфейс SPI, либо как линия последовательных данных, когда включен интерфейс I2C, либо как вход последовательных данных, когда включен интерфейс UART.

Распределение памяти mifare classic 1k

Память метки 1 КБ организована в 16 секторов (от 0 до 15). Каждый сектор дополнительно делится на 4 блока (блоки 0–3). Каждый блок может хранить 16 байтов данных (от 0 до 15).

Это говорит нам, что у нас точно

16 секторов x 4 блока x 16 байтов данных = 1024 байта = 1 КБ памяти

Весь 1 килобайт памяти с секторами, блоками и данными показан ниже.

Рисунок 9 Вывод скетча DumpInfo. Структура памяти
Рисунок 9 – Вывод скетча DumpInfo. Структура памяти

Блок 3 каждого сектора называется Sector Trailer и содержит информацию, называемую Access Bits (биты доступа), для предоставления доступа на чтение и запись к остальным блокам в секторе. Это означает, что в каждом секторе на самом деле для хранения данных доступны только 3 нижних блока (блоки 0, 1 и 2), а это означает, что в 64 байтовом секторе у нас есть только 48 байтов, доступных для нашего собственного использования.

Создание дубликатора своими руками

ЖК-дисплей имеет 16 контактов, что слишком много для Arduino Nano домофона, поэтому важно иметь адаптер I2C. Это позволяет управлять дисплеем только из двух сигнальных штырей на Ардуино. Это полезно из-за небольшого числа контактов, которые нужно будет контролировать из MCU.

ЖК-контакты
ЖК-контакты

ЖК-дисплеи имеют параллельный интерфейс, а это означает, что MCU должен одновременно управлять несколькими контактами интерфейса для управления дисплеем. В приведенной ниже таблице дается описание каждого из контактов на английском языке:

Спецификация контактов
Спецификация контактов

Для начала сделаем связи между ЖК-дисплеем и I2C. Для этого нужен адаптер ЖК-дисплея I2C (LCD1602). Адаптер преобразует ЖК-дисплей формата 16 x 2 в серийный ЖК-дисплей I2C, которым можно управлять через Arduino всего посредством 2-х проводов.

Соединения между Arduino и LCD
Соединения между Arduino и LCD

Технические характеристики модуля rfid rc522:

  • Напряжение питания 3,3 В;
  • Максимальный потребляемый ток 30 мА;
  • Частотная полоса 13,55-13,57 МГц;
  • Расстояние считывания до 25 мм;
  • Рабочая температура от -20С до 80 С.

Распиновка модуля изображена на рисунке. Контакт SDA (SS, CS, NSS) отвечает за выбор ведомого устройства. Выход SCK является тактовым сигналом SPI. MOSI – отвечает за передачу данных от мастера к ведомому, MISO – от ведомого к мастеру. IRQ – выполняет прерывание. RST – выполняет прерывание.

RDM6300 – бесконтактный считыватель, который используется для дистанционного считывания номера RFID брелка и передачи номера через UART на микроконтроллер, управляющий замком в системах доступа. Устройство обладает несколькими преимуществами – невысокая цена и простота в установке.

Чаще всего используется в системах контроля доступа в дома, гаражи, офисы, квартиры и другие здания с электромеханическим замком.  Считыватель используется для чтения карт EM4100/TK4100. RDM6300 может монтироваться в стену или в корпус. В качестве микроконтроллера обычно применяется Ардуино.

Функции библиотеки

PCD_DumpVersionToSerial() – выводит версию прошивки ридера в монитор порта

PICC_IsNewCardPresent() – проверяет наличие поднесённой метки

PICC_ReadCardSerial() – считывает данные с метки

PICC_DumpToSerial() – выводит данные метки в монитор порта

PICC_GetType() – тип карты

PICC_GetTypeName – имя карты

Купить модуль RC-522 на AliExpress

Шаг 2: rfid-считыватель rc522

В каждой метке RFID есть небольшой чип (на фото белая карточка). Если направить фонарик на эту RFID-карту, можно увидеть маленький чип и катушку, которая его окружает. У этого чипа нет батареи для получения мощности. Он получает питание от считывателя беспроводным образом используя эту большую катушку. Можно прочитать RFID-карту, подобную этой, с расстояния до 20 мм.

Тот же чип существует и в тегах RFID-брелка.

Каждый тег RFID имеет уникальный номер, который идентифицирует его. Это UID, который показывается на OLED-дисплее. За исключением этого UID, каждый тег может хранить данные. В этом типе карт можно хранить до 1 тысячи данных. Впечатляет, не так ли? Эта функция не будет использована сегодня.

Шаг 5: код проекта

Чтобы код проекта был скомпилирован, нам нужно включить некоторые библиотеки. Прежде всего, нам нужна библиотека MFRC522 Rfid.

Чтобы установить её, перейдите в Sketch -> Include Libraries -> Manage libraries (Управление библиотеками). Найдите MFRC522 и установите её.

Нам также нужна библиотека Adafruit SSD1306 и библиотека Adafruit GFX для отображения.

Установите обе библиотеки. Библиотека Adafruit SSD1306 нуждается в небольшой модификации. Перейдите в папку Arduino -> Libraries, откройте папку Adafruit SSD1306 и отредактируйте библиотеку Adafruit_SSD1306.h. Закомментируйте строку 70 и раскомментируйте строку 69, т.к. дисплей имеет разрешение 128×64.

Сначала мы объявляем значение метки RFID, которую должен распознать Arduino. Это массив целых чисел:

int code[] = {69,141,8,136}; // UID

Затем мы инициализируем считыватель RFID и дисплей:

rfid.PCD_Init();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

После этого в функции цикла мы проверяем тег на считывателе каждые 100 мс.

Если на считывателе есть тег, мы читаем его UID и печатаем его на дисплее. Затем мы сравниваем UID тега, который мы только что прочитали, со значением, которое хранится в кодовой переменной. Если значения одинаковы, мы выводим сообщение UNLOCK, иначе мы не будем отображать это сообщение.

if(match)
    {
      Serial.println("nI know this card!");
      printUnlockMessage();
    }else
    {
      Serial.println("nUnknown Card");
    }

Конечно, вы можете изменить этот код, чтобы сохранить более 1 значения UID, чтобы проект распознал больше RFID-меток. Это просто пример.

Код проекта:

#include <MFRC522.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>


#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define SS_PIN 10
#define RST_PIN 9
 
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class

MFRC522::MIFARE_Key key; 

int code[] = {69,141,8,136}; //This is the stored UID
int codeRead = 0;
String uidString;
void setup() {
  
  Serial.begin(9600);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522 
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)

  // Clear the buffer.
  display.clearDisplay();
  display.display();
  display.setTextColor(WHITE); // or BLACK);
  display.setTextSize(2);
  display.setCursor(10,0); 
  display.print("RFID Lock");
  display.display();
  
}

void loop() {
  if(  rfid.PICC_IsNewCardPresent())
  {
      readRFID();
  }
  delay(100);

}

void readRFID()
{
  
  rfid.PICC_ReadCardSerial();
  Serial.print(F("nPICC type: "));
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.println(rfid.PICC_GetTypeName(piccType));

  // Check is the PICC of Classic MIFARE type
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("Your tag is not of type MIFARE Classic."));
    return;
  }

    clearUID();
   
    Serial.println("Scanned PICC's UID:");
    printDec(rfid.uid.uidByte, rfid.uid.size);

    uidString = String(rfid.uid.uidByte[0]) " " String(rfid.uid.uidByte[1]) " " String(rfid.uid.uidByte[2])  " " String(rfid.uid.uidByte[3]);
    
    printUID();

    int i = 0;
    boolean match = true;
    while(i<rfid.uid.size)
    {
      if(!(rfid.uid.uidByte[i] == code[i]))
      {
           match = false;
      }
      i  ;
    }

    if(match)
    {
      Serial.println("nI know this card!");
      printUnlockMessage();
    }else
    {
      Serial.println("nUnknown Card");
    }


    // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}

void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i  ) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], DEC);
  }
}

  void clearUID()
  {
    display.setTextColor(BLACK); // or BLACK);
    display.setTextSize(1);
    display.setCursor(30,20); 
    display.print(uidString);
    display.display();
  }

  void printUID()
  {
    display.setTextColor(WHITE); // or BLACK);
    display.setTextSize(1);
    display.setCursor(0,20); 
    display.print("UID: ");
    display.setCursor(30,20); 
    display.print(uidString);
    display.display();
  }

  void printUnlockMessage()
  {
    display.display();
    display.setTextColor(BLACK); // or BLACK);
    display.setTextSize(2);
    display.setCursor(10,0); 
    display.print("RFID Lock");
    display.display();
    
    display.setTextColor(WHITE); // or BLACK);
    display.setTextSize(2);
    display.setCursor(10,0); 
    display.print("Unlocked");
    display.display();
    
    delay(2000);
    
    display.setTextColor(BLACK); // or BLACK);
    display.setTextSize(2);
    display.setCursor(10,0); 
    display.print("Unlocked");

    display.setTextColor(WHITE); // or BLACK);
    display.setTextSize(2);
    display.setCursor(10,0); 
    display.print("RFID Lock");
    display.display();
  }

Интерфейсы и назначение выводов

Микросхема MFRC522 поддерживает интерфейсы SPI, UART и I2C (см. рисунок 2). Выбор интерфейса осуществляется установкой логических уровней на определенных выводах микросхемы. На данном модуле выбран интерфейс SPI.

Рисунок 2. RFID модуль RC522 – назначение выводов

Назначение выводов интерфейса SPI:

Сигнал сброса RST – это сигнал, поступающий от цифрового выхода контроллера. При поступлении сигнала LOW происходит перезагрузка считывателя. Также ридер установкой на RST низкого уровня  сообщает, что находится в режиме сна, для вывода модуля из режима сна необходимо подать на данный вывод сигнал HIGH.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *