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
- Метки (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 может использоваться для следующего:
- Режим считывания/записи. NFC-чип работает в активном режиме и считывает пассивную метку. Метка NFC — это пассивное устройство с данными внутри. Информацию можно считать, лишь поднеся к метке активное считывающее устройство.
- Режим peer-to-peer — обмен данными между двумя активными устройствами. Это может быть как файл, передача контакта или приложения.
- Режим эмуляции карты. 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 мм
Ресурсы
- Библиотеки для ардуино: Adafruit Bus IO и Adafruit PN532