Содержание

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 и Adafruit Bus IO.

Библиотека Adafruit PN532 зависит от библиотеки Adafruit Bus IO. Обязательно устанавливайте обе.

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

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

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

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

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

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.

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

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

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

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

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

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

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

Ресурсы