Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

RFID-модуль RC522

Библиотека MFRC522
Вход по пропускам
Запись и чтение пользовательских данных
Подключение к плате ESP32

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

Метки бывают двух типов: активные и пассивные (без встроенного источника энергии, питаются от тока, индуцированного в антенне сигналом от ридера). Метки работают на разной частоте: LF (125 - 134 кГц), HF (13.56 МГц), UHF (860 - 960 МГц). Метки бывают только для чтения или на них можно заносить информацию (изменять существующие данные). В Arduino в качестве считывателя используют популярный модуль RFID-RC522. Модуль выполнен на микросхеме MFRC522 фирмы NXP, которая обеспечивает работу с метками HF (на частоте 13,56 МГц). В комплекте с модулем RFID-RC522 идут две метки, одна в виде карты, другая в виде брелока.

RC-522

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

Карточки и брелоки можно купить отдельно. Также можно использовать для опытов обычные билеты московского транспорта (наземный транспорт и метро), которые также используют технологию RFID.

Технические характеристики

  • Напряжение питания: 3.3V
  • Потребляемый ток :13-26mA
  • Рабочая частота: 13.56MHz
  • Дальность считывания: до 6 см
  • Интерфейс: SPI
  • Скорость передачи: максимальная 10МБит/с
  • Размер: 40мм х 60мм

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

RC-522

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

  • SDA – выбор ведомого
  • SCK – сигнал синхронизации
  • MOSI – передача от master к slave
  • MISO – передача от slave к master
  • IRQ – вывод прерывания
  • GND – земля;
  • RST – вывод для сброса
  • Vcc –питание 3.3 В

Выводы модуля подключаются к цифровым пинам Arduino


RC-522 | Arduino 
----------------
   SDA | D
   SCK | D
  MOSI | D
  MISO | D
   IRQ | N/A
   GND | GND
   RST | D
  3.3V | 3.3V  

На платах Arduino есть разъём ICSP, который можно использовать для работы с интерфейсом SPI.

RFID RC-522

Библиотека 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

Вход по пропускам

Каждая карточка имеет свой идентификатор, который можно узнать после запуска скетча библиотеки DumpInfo. Запомним идентификатор и напишем свой скетч для проверки. Если идентификатор совпадает, то выводим сообщение (включаем светодиод, открываем ворота и т.д.). Если идентификатор не совпадает, то выводим сообщение о запрете. Карточку с правом доступа отдаём коту (вешаем на шею) и проверяем.


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

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

MFRC522 mfrc522(SS_PIN, RST_PIN);

// Разрешённый идентификатор Card UID
byte uidCard[4] = {0x77, 0xE7, 0xBC, 0x3A};

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

  mfrc522.PCD_Init();
}

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

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

  for (byte i = 0; i < 4; i++) {
    // Если идентификатор не совпадает с заданным номером
    if (uidCard[i] != mfrc522.uid.uidByte[i]) {
      Serial.println("У вас нет доступа");
      return;
    }else{
      Serial.println("Проходите, Мурзик");
    }
  }
}

Меня программа не пустила на порог собственного дома, а кота пустили. "Умный дом" - угроза человечеству.

MFRC522

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

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

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

Write RFID

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

Read RFID

Подключение к плате ESP32

У платы ESP32 расположение выводов отличается от Arduino Uno, поэтому схема подключения будет следующей.


-----------------
 MFRC522 | ESP32
-----------------
     SDA | 21
     SCK | 18
    MOSI | 23
    MISO | 19
     IRQ | N/A
     GND | GND
     RST | 22
    3.3V | 3.3V

Библиотека MFRC522 должна работать без проблем.

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

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

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

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

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

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

PICC_GetTypeName - имя карты

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

Дополнительное чтение

Чтение данных транспортных карточек (RFID)

Реклама