====== RFID/NFC-сканер ======
[[amp>product/troyka-rfid-nfc-1356?utm_source=man&utm_campaign=nfc&utm_medium=wiki|RFID/NFC-сканер]] работает с [[amp>product/rfid-card-1356-mifare-ultralight?utm_source=man&utm_campaign=nfc&utm_medium=wiki|NFC метками стандарта Mifare]], картами общественного транспорта, смартфонами и планшетами, поддерживающими технологию Near Field Communication. Модуль считывает данные с меток и записывает на них информацию.
{{ :продукты:nfc:nfc_overview.jpg?nolink |}}
===== Видеообзор =====
{{youtube>LsspyGJ0sTw?large}}
===== Подключение и настройка ======
RFID/NFC сканер подключается по протоколу [[Видеоуроки:7-i2c-и-processing|I²C/TWI]] и использует пин прерывания ''IRQ''. Для сборки модуля используются три [[amp>product/3-wire-cable-digital-troyka?utm_source=man&utm_campaign=nfc&utm_medium=wiki|трёхпроводных шлейфа]].
При подключении к [[amp>collection/arduino?utm_source=man&utm_campaign=nfc&utm_medium=wiki|Arduino]] или [[amp>product/iskra-js?utm_source=man&utm_campaign=nfc2812&utm_medium=wiki|Iskra JS]] удобно использовать [[amp>/product/arduino-troyka-shield?utm_source=man&utm_campaign=nfc&utm_medium=wiki|Troyka Shield]].
{{ :продукты:nfc:troyka-rfid-nfc-1356_scheme_troyka_shield.png?nolink |}}
===== Примеры работы =====
Рассмотрим несколько примеров с работой NFC-сканера.
==== Пример программы для Arduino ====
Для работы сканера с Arduino используйте библиотеку [[https://github.com/adafruit/Adafruit-PN532|Adafruit PN532]] и [[https://github.com/adafruit/Adafruit_BusIO|Adafruit Bus IO]].
Библиотека [[https://github.com/adafruit/Adafruit-PN532|Adafruit PN532]] зависит от библиотеки [[https://github.com/adafruit/Adafruit_BusIO|Adafruit Bus IO]]. Обязательно устанавливайте обе.
#include
#include
// библиотека для работы с RFID/NFC
#include
// пин прерывания
#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 выводится уникальный номер карты.
{{ :продукты:nfc:screen_nfc_rfid_troyka_led_4.jpg?nolink |}}
==== Пример программы для Iskra JS ====
Прочитаем и выведем ID карты в Serial-порт. Для работы RFID/NFC сканера с Iskra JS используйте библиотеку [[:js:nfc|@amperka/nfc]]. Она обеспечивает простую работу с модулем и прячет в себе все тонкости протокола обмена данными между сканером и управляющей платой.
// настраиваем 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:screen_nfc_rfid_troyka_led_js_4.jpg?nolink |}}
===== NFC-пульт =====
Попробуем управлять тремя светодиодами с помощью RFID/NFC-сканера, каждому светодиоду будет соответствовать своя карта. При поднесении известной карты будет переключаться светодиод. Для удобства контроля работы будем отправлять в Serial-порт название считанной карты.
==== Схема подключения ====
К ранее собранной схеме добавим три светодиода [[amp>product/troyka-led-module|Пиранья]].
{{ :продукты:nfc:rfid_nfc_module_with_3_troyka_led_schematic_1.png?nolink |}}
==== Пример программы для Arduino ====
Перед загрузкой кода, ранее считанные значения ID Value перенесём в программу, массивы uidFirstCard, uidSecondCard и uidThirdCard предназначены для хранения ID Карт.
#include
#include
// библиотека для работы с RFID/NFC
#include
// пин прерывания
#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 Карт.
// настраиваем 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 =====
{{ :продукты:nfc:troyka-rfid-nfc-1356_technologies.png?nolink |}}
RFID и NFC — это две тесно связанные технологии беспроводной связи, которые используются во всем мире для контроля доступа, отслеживания грузов, в системах безопасности и бесконтактных платежей. NFC является продолжением технологии RFID.
==== Технология RFID ====
RFID (англ. //Radio Frequency IDentification//, радиочастотная идентификация) — система однонаправленной связи, в которой данные из метки передаются к бесконтактному считывателю. RFID метки могут быть отсканированы на расстоянии до 100 метров, причём метка может находиться вне прямой видимости ридера.
=== Состовляющие RFID ===
{{ :продукты:nfc:troyka-rfid-nfc-1356_rfid_scheme.png?nolink |}}
* Метки (tag) — устройства, способные хранить и передавать данные. В памяти меток содержится их уникальный идентификационный код. Метки некоторых типов имеют перезаписываемую память.
* Антенны используются для наведения электромагнитного поля и получения информации от меток.
* Считыватели (reader) — приборы, которые с помощью антенн получают информацию из меток, а также записывают в них данные.
* Система управления — программное обеспечение, которое формирует запросы на чтение или запись меток, управляет считывателями, объединяя их в группы, накапливает и анализирует полученную с RFID-меток информацию, а также передает эту информацию в учетные системы.
=== Принцип работы ===
Перед началом работы системы метка должна быть нанесена или закреплена на предмет, который необходимо контролировать. Объект с меткой должен пройти первичную регистрацию в системе с помощью стационарного или переносного считывателя. В контрольных точках учета перемещения объекта необходимо разместить считыватели с антеннами. На этом подготовительная фаза завершена.
Контроль за перемещением объекта будет заключаться в чтении данных метки в контрольных точках, для чего метке достаточно попасть в электромагнитное поле, создаваемое антенной, подключенной к считывателю. Информация из считывателя передается в систему управления и далее в учетную систему, на основании которой формируется учетный документ.
{{ :продукты:nfc:troyka-rfid-nfc-1356_system_operation.gif?nolink |}}
=== Частоты и стандарты ===
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 может использоваться для следующего:
- Режим считывания/записи. NFC-чип работает в активном режиме и считывает пассивную метку. Метка NFC — это пассивное устройство с данными внутри. Информацию можно считать, лишь поднеся к метке активное считывающее устройство.
- Режим peer-to-peer — обмен данными между двумя активными устройствами. Это может быть как файл, передача контакта или приложения.
- Режим эмуляции карты. NFC-чип прикидывается картой (пассивным устройством), например пропуском или платежной картой.
{{ :продукты:nfc:nfc_mode_operation.png?nolink |}}
=== Виды NFC-меток ===
NFC-метки отличаются объемом и структурой памяти. Наиболее важные параметры популярных NFC меток мы собрали в сравнительную таблицу.
{{ :продукты:nfc:troyka-rfid-nfc-1356_nfc_card_mode.png?nolink |}}
===== Элементы платы =====
{{ :продукты:nfc:troyka-rfid-nfc-1356_annotation.png?nolink |}}
==== Микросхема PN532 ====
[[http://files.amperka.ru/datasheets/pn532.pdf|PN532]] — это микросхема трансивера для бесконтактной передачи данных на частоте 13,56 МГц. Ядро схемы – микроконтроллер 80C51. Микросхема взаимодействует с управляющей электроникой по протоколу I2C.
==== Контакты подключения трёхпроводных шлейфов ====
=== Контакты питания ===
* земля (''G'') — соедините с пином ''GND'' микроконтроллера;
* питание (''V'') — соедините с пином ''5V'' микроконтроллера;
* сигнальный (''Q'') — пин прерывания. Подключите к цифровому пину микроконтроллера.
=== Контакты шины I²C ===
* сигнальный (''D'') — подключите к ''SDA'' пину микроконтроллера;
* сигнальный (''С'') — подключите к ''SCL'' пину микроконтроллера;
* не используется.
=== Контакты подключения антенны ===
Модуль приёмник и антенна соединяются трёхпроводным шлейфом. Полярность подключения не имеет значения.
===== Принципиальная и монтажная схемы =====
{{:продукты:nfc:nfc_schematic.png?direct&350 |}}
{{ :продукты:nfc:nfc_layout.png?direct&300|}}
===== Характеристики =====
* Расстояние срабатывания: до 5 см
* Напряжение питания: 3,3–5 В
* Потребляемый ток: 100–150 мА
* Интерфейс: I²C
* Габариты сканера: 50,8×25,4 мм
* Габариты антенны: 50,8×50,8 мм
===== Ресурсы =====
* [[:js:nfc|Библиотека для Iskra JS]]
* [[https://github.com/adafruit/Adafruit_NFCShield_I2C|Библиотека для Arduino]]
* Библиотеки для ардуино: [[https://github.com/adafruit/Adafruit_BusIO|Adafruit Bus IO]] и [[https://github.com/adafruit/Adafruit-PN532|Adafruit PN532]]
* [[http://files.amperka.ru/datasheets/pn532.pdf|Datasheet на микросхему PN532]]