RFID/NFC-сканер

RFID/NFC-сканер работает с NFC метками стандарта Mifare, картами общественного транспорта, смартфонами и планшетами, поддерживающими технологию Near Field Communication. Модуль считывает данные с меток и записывает на них информацию.

Видеообзор

Подключение и настройка

RFID/NFC сканер подключается по протоколу I²C/TWI и использует пин прерывания IRQ. Для сборки модуля используются три трёхпроводных шлейфа.

При подключении к Arduino или Iskra JS удобно использовать Troyka Shield.

Примеры работы

Рассмотрим несколько примеров с работой NFC-сканера.

Пример программы для Arduino

Для работы сканера с Arduino используйте библиотеку Adafruit PN532.

nfc.ino
#include <Wire.h>
#include <SPI.h>
// библиотека для работы с RFID/NFC
#include <Adafruit_PN532.h>
 
// пин прерывания
#define PN532_IRQ   9
// создаём объект для работы со сканером и передаём ему два параметра
// первый — номер пина прерывания
// вторым — число 100
// от Adafruit был программный сброс шилда 
// в cканере RFID/NFC 13,56 МГц (Troyka-модуль) этот пин не используется
// поэтому передаём цифру, большая чем любой пин Arduino
Adafruit_PN532 nfc(PN532_IRQ, 100);
 
void setup(void)
{
  Serial.begin(9600);
  // инициализация RFID/NFC сканера
  nfc.begin();
  int versiondata = nfc.getFirmwareVersion();
  if (!versiondata) {
    Serial.print("Didn't find RFID/NFC reader");
    while(1) {
    }
  }
 
  Serial.println("Found RFID/NFC reader");
  // настраиваем модуль
  nfc.SAMConfig();
  Serial.println("Waiting for a card ...");
}
 
void loop(void)
{
  uint8_t success;
  // буфер для хранения ID карты
  uint8_t uid[8];
  // размер буфера карты
  uint8_t uidLength;
  // слушаем новые метки
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
  // если найдена карта
  if (success) {
    // выводим в консоль полученные данные
    Serial.println("Found a card");
    Serial.print("ID Length: ");
    Serial.print(uidLength, DEC);
    Serial.println(" bytes");
    Serial.print("ID Value: ");
    nfc.PrintHex(uid, uidLength);
    Serial.println("");
    delay(1000);
  }
}

Откройте Serial-порт и прикладывайте по очереди карты к считывателю. В строке ID Value выводится уникальный номер карты.

Пример программы для Iskra JS

Прочитаем и выведем ID карты в Serial-порт. Для работы RFID/NFC сканера с Iskra JS используйте библиотеку @amperka/nfc. Она обеспечивает простую работу с модулем и прячет в себе все тонкости протокола обмена данными между сканером и управляющей платой.

nfc-test.js
// настраиваем I2C1 для работы модуля
I2C1.setup({sda: SDA, scl: SCL, bitrate: 400000});
 
// подключаем модуль к I2C1 и пину прерывания
var nfc = require('@amperka/nfc').connect({i2c: I2C1, irqPin: P9});
 
// активируем модуль
nfc.wakeUp(function(error) {
  if (error) {
    print('NFC wake up error', error);
  } else {
    print('NFC wake up OK');
    // слушаем новые метки
    nfc.listen();
  }
});
 
nfc.on('tag', function(error, data) {
  if (error) {
    print('tag read error');
  } else {
    // выводим в консоль полученные данные
    print(data);
  }
 
  // каждые секунду слушаем новую метку
  setTimeout(function () {
    nfc.listen();
  }, 1000);
});

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

NFC-пульт

Попробуем управлять тремя светодиодами с помощью RFID/NFC-сканера, каждому светодиоду будет соответствовать своя карта. При поднесении известной карты будет переключаться светодиод. Для удобства контроля работы будем отправлять в Serial-порт название считанной карты.

Схема подключения

К ранее собранной схеме добавим три светодиода Пиранья.

Пример программы для Arduino

Перед загрузкой кода, ранее считанные значения ID Value перенесём в программу, массивы uidFirstCard, uidSecondCard и uidThirdCard предназначены для хранения ID Карт.

nfc_rfid_three_led_arduino.ino
#include <Wire.h>
#include <SPI.h>
 
// библиотека для работы с RFID/NFC
#include <Adafruit_PN532.h>
 
// пин прерывания
#define PN532_IRQ   9
 
// создаём объект для работы со сканером и передаём ему два параметра
// первый — номер пина прерывания
// вторым — число 100
// от Adafruit был программный сброс шилда
// в cканере RFID/NFC 13,56 МГц (Troyka-модуль) этот пин не используется
// поэтому передаём цифру, большая чем любой пин Arduino
Adafruit_PN532 nfc(PN532_IRQ, 100);
 
// пины к которым подключены светодиоды Troyka_led
#define LED_FIRST   A0
#define LED_SECOND  A1
#define LED_THIRD   A2
 
 
// Массивы в которые необходимо записать ID карт:
uint8_t uidFirstCard[] = {0x04, 0x40, 0xA9, 0xDA, 0xA3, 0x40, 0x80};
uint8_t uidSecondCard[] = {0x04, 0xAB, 0xB4, 0xDA, 0xA3, 0x40, 0x80};
uint8_t uidThirdCard[] = {0x04, 0x71, 0xC1, 0xDA, 0xA3, 0x40, 0x81};
 
// функция которая сравнивает два переданных ID
// при совпадении возвращает значение true
// и значение false если ID разные
boolean comparisonOfUid(uint8_t uidRead[8], uint8_t uidComp[8], uint8_t uidLen) {
  for (uint8_t i = 0; i < uidLen; i++) {
    if (uidRead[i] != uidComp[i]) {
      return false;
    }
    if (i == (uidLen)-0x01) {
      return true;
    }
  }
}
 
// функция переключающая светодиод, получает входные параметры:
// номер светодиода led
void toggleLed(int led) {
if (digitalRead(led) == LOW) {
  digitalWrite(led, HIGH);
  } else {
    digitalWrite(led, LOW);
  }
}
 
void setup(void) {
  // инициализация пинов Led
  pinMode(LED_FIRST, OUTPUT);
  pinMode(LED_SECOND, OUTPUT);
  pinMode(LED_THIRD, OUTPUT);
 
  // инициализация Serial - порта
  Serial.begin(9600);
  // инициализация RFID/NFC сканера
  nfc.begin();
  int versiondata = nfc.getFirmwareVersion();
  if (!versiondata) {
    while (1) {
      Serial.print("Didn't find RFID/NFC reader");
      delay(1000);
    }
  }
  Serial.println("Found RFID/NFC reader");
  // настраиваем модуль
  nfc.SAMConfig();
  Serial.println("Waiting for a card ...");
}
 
void loop(void) {
  uint8_t success;
  // буфер для хранения ID карты
  uint8_t uid[8];
  // размер буфера карты
  uint8_t uidLength;
  // слушаем новые метки
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
  // если найдена карта
  if (success) {
    // Переключаем первый светодиод если функция сравнения
    // ID вернёт true иначе оставляем всё как есть
    if (comparisonOfUid(uid, uidFirstCard, uidLength)) {
      toggleLed(LED_FIRST);
      Serial.println("FirstTAG");
    } else {
      // Переключаем второй светодиод если функция сравнения
      // ID вернёт true иначе оставляем всё как есть
      if (comparisonOfUid(uid, uidSecondCard, uidLength)) {
        toggleLed(LED_SECOND);
        Serial.println("SecondTAG");
      } else {
        // Переключаем третий светодиод если функция сравнения
        // ID вернёт true иначе оставляем всё как есть
        if (comparisonOfUid(uid, uidThirdCard, uidLength)) {
          toggleLed(LED_THIRD);
          Serial.println("ThirdTAG");
        } else {
          Serial.println("NoTAG");
        }
      }
    }
  delay(1000);
  }
}

Пример программы для IskraJS

Повторим те же операции, что и для Arduino. Перед загрузкой кода, ранее считанные значения uid перенесём в программу, массивы uidFirstCard, uidSecondCard и uidThirdCard предназначены для хранения ID Карт.

nfc_rfid_three_led_iskrajs.js
// настраиваем I2C1 для работы модуля
I2C1.setup({sda: SDA, scl: SCL, bitrate: 400000});
 
// подключаем модуль к I2C1 и пину прерывания
var nfc = require('@amperka/nfc').connect({i2c: I2C1, irqPin: P9});
// подключаем 3 светодиода
var ledFirst = require('@amperka/led').connect(A0);
var ledSecond = require('@amperka/led').connect(A1);
var ledThird = require('@amperka/led').connect(A2);
 
// ID-карт, при поднисенни которых буду переключаться светодиоды.
// считываем их примером из console:
const uidFirstCard  = [4, 113, 193, 218, 163, 64, 129];
const uidSecondCard = [4, 64, 169, 218, 163, 64, 128];
const uidThirdCard  = [4, 171, 180, 218, 163, 64, 128];
 
// активируем модуль
nfc.wakeUp(function(error) {
  if (error) {
    print('wake up error', error);
  } else {
    print('wake up OK');
    // слушаем новые метки
    nfc.listen();
  }
});
 
nfc.on('tag', function(error, data) {
  if (error) {
    print('tag read error');
  } else {
    // выводим в консоль полученные данные
    print(data.uid);
    // переводим массив-байт в строку для удобства сравнения
    // вызываем функцию-обработчик метки
    factoryLedLight(data.uid);
  }
  // каждые 1000 миллисекунд слушаем новую метку
  setTimeout(function() {
    nfc.listen();
  }, 1000);
});
 
// функция-обработчик, сравнивает массивы и при совпадении возвращает true
function comparisonOfUid(uid, card) {
  // переменная хранящая длину массива
  var leng = uid.length;
  // цикл поэлементно проверяет равенство значений
  for (var i = 0; i < leng; i++){
    // сравнение элементов между собой
    if (uid[i] != card[i]){
      // если элементы не равны прекращаем работу функции и возвращаем false
      return false;
    }
    // если все элементы массива равны возвращаем true
    if ( i == uid.length - 1){
      return true;
    }
  }
}
 
// функция сравнивает ID текущей метки с ID меток в константах
// при совпадении переключает светодиод
function factoryLedLight(id) {
  if (comparisonOfUid(id, uidFirstCard)) {
    console.log('FirstTAG');
    ledFirst.toggle();
  }else {
    if (comparisonOfUid(id, uidSecondCard)) {
      console.log('SecondTAG');
      ledSecond.toggle();
    } else {
      if (comparisonOfUid(id, uidThirdCard)) {
        console.log('ThirdTAG');
        ledThird.toggle();
      } else {
        console.log('NoTAG');
      }
    }
  }
}

Технология RFID/NFC

RFID и NFC — это две тесно связанные технологии беспроводной связи, которые используются во всем мире для контроля доступа, отслеживания грузов, в системах безопасности и бесконтактных платежей. NFC является продолжением технологии RFID.

Технология RFID

RFID (англ. Radio Frequency IDentification, радиочастотная идентификация) — система однонаправленной связи, в которой данные из метки передаются к бесконтактному считывателю. RFID метки могут быть отсканированы на расстоянии до 100 метров, причём метка может находиться вне прямой видимости ридера.

Состовляющие RFID

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

Принцип работы

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

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

Частоты и стандарты

RFID работает в разных частотах для каждой из которых присвоен свой набор стандартов и протоколов.

Полоса частот RFID Расстояние сканирования Применения
120–150 кГц
(Low Frequency, LF)
до 10 см Автоматизация производства, СКУД на основе RFID-брелков, браслетов, идентификация животных.
13.56 МГц
(High Frequency, HF)
до 1 м Идентификации товаров в складских системах и книг в библиотечных системах.
860–960 МГц
(Ultra High Frequency, UHF)
1–100 м В системах логистики и учета движения транспорта.

Технология NFC

NFC (англ. Near Field Communication, ближняя бесконтактная связь) — технология беспроводной передачи данных малого радиуса действия, которая дает возможность обмена данными между устройствами, находящимися на расстоянии до 10 сантиметров. NFC работает на частоте 13,56 МГц и является продолжением высокочастотного RFID стандарта.

Режим работы NFC-чипов

Чип NFC состоит из катушки индуктивности, которая создаёт определённое радиочастотное поле и воздействует на другое такое же поле по заданному сценарию с различным уровнем кодирования. В таком процессе технология NFC имеет два режима работы: активный и пассивный.

С учетом двух режимов технология NFC может использоваться для следующего:

  1. Режим считывания/записи. NFC-чип работает в активном режиме и считывает пассивную метку. Метка NFC — это пассивное устройство с данными внутри. Информацию можно считать, лишь поднеся к метке активное считывающее устройство.
  2. Режим peer-to-peer — обмен данными между двумя активными устройствами. Это может быть как файл, передача контакта или приложения.
  3. Режим эмуляции карты. NFC-чип прикидывается картой (пассивным устройством), например пропуском или платежной картой.

Виды NFC-меток

NFC-метки отличаются объемом и структурой памяти. Наиболее важные параметры популярных NFC меток мы собрали в сравнительную таблицу.

Элементы платы

Микросхема PN532

PN532 — это микросхема трансивера для бесконтактной передачи данных на частоте 13,56 МГц. Ядро схемы – микроконтроллер 80C51. Микросхема взаимодействует с управляющей электроникой по протоколу I2C.

Контакты подключения трёхпроводных шлейфов

Контакты питания

  • земля (G) — соедините с пином GND микроконтроллера;
  • питание (V) — соедините с пином 5V микроконтроллера;
  • сигнальный (Q) — пин прерывания. Подключите к цифровому пину микроконтроллера.

Контакты шины I²C

  • сигнальный (D) — подключите к SDA пину микроконтроллера;
  • сигнальный (С) — подключите к SCL пину микроконтроллера;
  • не используется.

Контакты подключения антенны

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

Принципиальная и монтажная схемы

Характеристики

  • Расстояние срабатывания: до 5 см
  • Напряжение питания: 3,3–5 В
  • Потребляемый ток: 100–150 мА
  • Интерфейс: I²C
  • Габариты сканера: 50,8×25,4 мм
  • Габариты антенны: 50,8×50,8 мм

Ресурсы