RFID/NFC-сканер работает с NFC метками стандарта Mifare, картами общественного транспорта, смартфонами и планшетами, поддерживающими технологию Near Field Communication. Модуль считывает данные с меток и записывает на них информацию.
RFID/NFC сканер подключается по протоколу I²C/TWI и использует пин прерывания IRQ
. Для сборки модуля используются три трёхпроводных шлейфа.
При подключении к Arduino или Iskra JS удобно использовать Troyka Shield.
Рассмотрим несколько примеров с работой NFC-сканера.
Для работы сканера с Arduino используйте библиотеку Adafruit PN532 и Adafruit Bus IO.
Библиотека Adafruit PN532 зависит от библиотеки Adafruit Bus IO. Обязательно устанавливайте обе.
#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 выводится уникальный номер карты.
Прочитаем и выведем ID карты в Serial-порт. Для работы RFID/NFC сканера с Iskra JS используйте библиотеку @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 выведен уникальный номер карты
Попробуем управлять тремя светодиодами с помощью RFID/NFC-сканера, каждому светодиоду будет соответствовать своя карта. При поднесении известной карты будет переключаться светодиод. Для удобства контроля работы будем отправлять в Serial-порт название считанной карты.
К ранее собранной схеме добавим три светодиода Пиранья.
Перед загрузкой кода, ранее считанные значения ID Value перенесём в программу, массивы uidFirstCard, uidSecondCard и uidThirdCard предназначены для хранения ID Карт.
#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); } }
Повторим те же операции, что и для 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 является продолжением технологии RFID.
RFID (англ. Radio Frequency IDentification, радиочастотная идентификация) — система однонаправленной связи, в которой данные из метки передаются к бесконтактному считывателю. RFID метки могут быть отсканированы на расстоянии до 100 метров, причём метка может находиться вне прямой видимости ридера.
Перед началом работы системы метка должна быть нанесена или закреплена на предмет, который необходимо контролировать. Объект с меткой должен пройти первичную регистрацию в системе с помощью стационарного или переносного считывателя. В контрольных точках учета перемещения объекта необходимо разместить считыватели с антеннами. На этом подготовительная фаза завершена.
Контроль за перемещением объекта будет заключаться в чтении данных метки в контрольных точках, для чего метке достаточно попасть в электромагнитное поле, создаваемое антенной, подключенной к считывателю. Информация из считывателя передается в систему управления и далее в учетную систему, на основании которой формируется учетный документ.
RFID работает в разных частотах для каждой из которых присвоен свой набор стандартов и протоколов.
Полоса частот RFID | Расстояние сканирования | Применения |
---|---|---|
120–150 кГц (Low Frequency, LF) | до 10 см | Автоматизация производства, СКУД на основе RFID-брелков, браслетов, идентификация животных. |
13.56 МГц (High Frequency, HF) | до 1 м | Идентификации товаров в складских системах и книг в библиотечных системах. |
860–960 МГц (Ultra High Frequency, UHF) | 1–100 м | В системах логистики и учета движения транспорта. |
NFC (англ. Near Field Communication, ближняя бесконтактная связь) — технология беспроводной передачи данных малого радиуса действия, которая дает возможность обмена данными между устройствами, находящимися на расстоянии до 10 сантиметров. NFC работает на частоте 13,56 МГц и является продолжением высокочастотного RFID стандарта.
Чип NFC состоит из катушки индуктивности, которая создаёт определённое радиочастотное поле и воздействует на другое такое же поле по заданному сценарию с различным уровнем кодирования. В таком процессе технология NFC имеет два режима работы: активный и пассивный.
С учетом двух режимов технология NFC может использоваться для следующего:
NFC-метки отличаются объемом и структурой памяти. Наиболее важные параметры популярных NFC меток мы собрали в сравнительную таблицу.
PN532 — это микросхема трансивера для бесконтактной передачи данных на частоте 13,56 МГц. Ядро схемы – микроконтроллер 80C51. Микросхема взаимодействует с управляющей электроникой по протоколу I2C.
G
) — соедините с пином GND
микроконтроллера;V
) — соедините с пином 5V
микроконтроллера;Q
) — пин прерывания. Подключите к цифровому пину микроконтроллера.D
) — подключите к SDA
пину микроконтроллера;С
) — подключите к SCL
пину микроконтроллера;Модуль приёмник и антенна соединяются трёхпроводным шлейфом. Полярность подключения не имеет значения.