====== 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]]