В данной статье мы рассмотрим взаимодействие NFC RFID модуля PN532 с платой Arduino во всех трех режимах: UART, I2C и SPI. PN532 — это модуль NFC RFID, популярный для поддержки мобильных платежей и служащий инструментом для других коммуникаций на вашем смартфоне. Его можно найти встроенным в модули, которые позволяют легко подключаться к вашим проектам Arduino.
Модуль RC522, безусловно, является самым известным модулем RFID для проектов Arduino. Но считыватель PN532 NFC RFID имеет определенные преимущества перед RC522, особенно с точки зрения возможностей связи. Здесь мы увидим, как использовать модуль PN532 NFC RFID с Arduino в соответствии с различными методами связи - UART, SPI и I2C. Позже мы отобразим номера UID карты NFC на 0,96″ OLED-дисплее.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Модуль RFID NFC PN532 (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 с интерфейсом I2C (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Введение в технологию NFC
Прежде чем разобраться с модулем PN532, давайте узнаем, что такое технология NFC и как она работает.
Что такое NFC?
Near Field Communication (NFC) — это технологический стандарт, основанный на радиочастотной идентификации (RFID), позволяющий передавать информацию по беспроводной связи на короткие расстояния.
Технология NFC упрощает и делает более удобной жизнь потребителей по всему миру, упрощая совершение транзакций, обмен цифровым контентом и подключение электронных устройств одним касанием. NFC совместима с сотнями миллионов бесконтактных карт и считывателей, уже используемых по всему миру.
Как работает NFC?
NFC работает по принципу индуктивной связи, по крайней мере, для реализаций на коротких расстояниях. По сути, это подразумевает, что считывающее устройство генерирует магнитное поле, пропуская электрический ток через катушку.
Когда метка (с собственной катушкой) подносится поблизости, поле индуцирует электрический ток внутри метки — без каких-либо проводов или даже физического контакта. Затем, после завершения первоначального рукопожатия, любые сохраненные на метке данные передаются по беспроводной связи на считыватель.
Разница между RFID и NFC
Ключевое различие между RFID и NFC заключается в их дальности передачи. RFID часто используется на больших расстояниях. Например, некоторые регионы автоматически взимают плату за проезд по дорогам с помощью RFID. Связь может осуществляться на еще больших расстояниях, если RFID-метка оснащена источником питания.
Однако NFC имеет максимальный радиус действия всего несколько сантиметров, не более. И в большинстве приложений, связанных со смартфонами, вы обнаружите, что программное обеспечение инициирует связь только при наличии физического контакта. Устройства NFC могут выступать в качестве считывателя или метки. Эта двунаправленная возможность позволяет вам использовать одно устройство, например, ваш смартфон, для всех видов различных приложений.
Основные применения NFC
- Мобильные платежи; Apple Pay NFC, Google Wallet.
- Tap-to-Pair; сопряжение устройств Bluetooth простым касанием вместо ручного ввода.
- Внедрение цифрового опыта в физические продукты; малый форм-фактор NFC позволяет встраивать его в физические продукты, обеспечивая уникальный опыт взаимодействия.
- Безопасность.
- Замена пароля.
- Аутентификация продукта.
Модуль NFC PN532
PN532 — это контроллер NFC от NXP на базе микроконтроллера 80C51, обеспечивающий бесконтактную связь на частоте 13,56 МГц. Кроме того, поддержка карт MIFARE Classic 1K/MIFARE Classic 4K позволяет увеличить скорость передачи данных до 424 кбит/с в обоих направлениях.
Имеет 40 Кб ПЗУ и 1 Кб ОЗУ. Используется для эмуляции карт ISO14443. Серия стандартов ISO/IEC 14443 описывает параметры идентификационных карт или объектов для международного обмена.
Функции
- Ядро микроконтроллера 80C51 с 40 КБ ПЗУ и 1 КБ ОЗУ.
- Высокоинтегрированный демодулятор и декодер.
- Интегрированный детектор уровня радиочастот.
- Поддерживает ISO/IEC 14443A/MIFARE.
- Поддерживает ISO/IEC 14443B (только режим чтения/записи).
- Рабочее расстояние до 50 мм в режиме считывания/записи для связи с картами ISO/IEC 14443A/MIFARE, ISO/IEC 14443B или FeliCa.
- Дальность действия до 50 мм в NFCIP-1 в зависимости от размера антенны, настройки и источника питания.
- Приблизительно 100 мм рабочего расстояния в режиме эмуляции карты ISO/IEC 14443A/MIFARE или FeliCa.
- Возможность связи по радиочастотному интерфейсу со скоростью выше 424 кбит/с с использованием внешних аналоговых компонентов.
- Прерывания выделенного хоста.
- Режимы пониженного энергопотребления
- Режим жесткого выключения питания
- Режим мягкого выключения питания
- Программируемые таймеры.
- Кварцевый генератор.
- Рабочий диапазон напряжения питания от 2,7 до 5,5 В.
Поскольку полный список функций PN532 может быть исчерпывающим, я выделю только ключевые из них. Полный список функций и преимуществ вы можете посмотреть в техническом описании PN532.
Выбор режима связи
Одним из больших преимуществ модуля PN532 NFC является то, что он может использовать различные протоколы для связи с Arduino, такие как UART, I2C или SPI. Эти различные протоколы используют определенные контакты и библиотеки микроконтроллера.
Для выбора режима связи PN532 необходимо настроить с помощью DIP-переключателей (0-низкий, 1-высокий):
Карты NFC RFID
NFC-метки работают как любые другие RFID-метки для связи по радиоволнам. Два устройства — NFC-метка и NFC-считыватель обмениваются информацией в формате обмена данными NFC. NFC-меткой может быть ваша карта банкомата, проездная карта, карта метро или какая-то другая карта.
NFC-метка посылает радиоволны для активации антенны в принимающем устройстве. Получатель проверяет информацию для завершения обмена информацией. Технология работает на очень коротком расстоянии — примерно 4 дюйма. NFC-метки работают без батареи и получают питание от другого устройства, например, смартфона.
Взаимодействие PN532 с Arduino в режиме UART
Давайте сначала прочитаем данные NFC в высокоскоростном режиме UART (через последовательную связь). Подключите PN532 к Arduino следующим образом. Контакты GND, VCC, Tx и Rx обозначены на задней стороне модуля.
- GND (земля) <-> GND
- Vcc (питание) <-> 5 В
- Tx (Clock) <-> D3
- Прием (Data) <-> D2
Исходный код программы
Для PN532 доступны различные варианты связи, поэтому в каждом случае необходимо использовать правильную библиотеку. Самая продвинутая библиотека, которая поддерживает все протоколы связи, находится в библиотеке PN532 Elechouse. Загрузите zip-папку и извлеките все библиотеки, а затем добавьте ее в папку библиотеки Arduino.
В случае связи по UART используются следующие библиотеки.
Скопируйте следующий код и загрузите его на плату Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#include <SoftwareSerial.h> #include <PN532_SWHSU.h> #include <PN532.h> SoftwareSerial SWSerial( 3, 2 ); // RX, TX PN532_SWHSU pn532swhsu( SWSerial ); PN532 nfc( pn532swhsu ); String tagId = "None", dispTag = "None"; byte nuidPICC[4]; void setup(void) { Serial.begin(115200); Serial.println("Hello Maker!"); // Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2); nfc.begin(); uint32_t versiondata = nfc.getFirmwareVersion(); if (! versiondata) { Serial.print("Didn't Find PN53x Module"); while (1); // Halt } // Got valid data, print it out! Serial.print("Found chip PN5"); Serial.println((versiondata >> 24) & 0xFF, HEX); Serial.print("Firmware ver. "); Serial.print((versiondata >> 16) & 0xFF, DEC); Serial.print('.'); Serial.println((versiondata >> 8) & 0xFF, DEC); // Configure board to read RFID tags nfc.SAMConfig(); //Serial.println("Waiting for an ISO14443A Card ..."); } void loop() { readNFC(); } void readNFC() { boolean success; uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type) success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength); if (success) { Serial.print("UID Length: "); Serial.print(uidLength, DEC); Serial.println(" bytes"); Serial.print("UID Value: "); for (uint8_t i = 0; i < uidLength; i++) { nuidPICC[i] = uid[i]; Serial.print(" "); Serial.print(uid[i], DEC); } Serial.println(); tagId = tagToString(nuidPICC); dispTag = tagId; Serial.print(F("tagId is : ")); Serial.println(tagId); Serial.println(""); delay(1000); // 1 second halt } else { // PN532 probably timed out waiting for a card Serial.println("Timed out! Waiting for a card..."); } } String tagToString(byte id[4]) { String tagId = ""; for (byte i = 0; i < 4; i++) { if (i < 3) tagId += String(id[i]) + "."; else tagId += String(id[i]); } return tagId; } |
После загрузки кода вы можете открыть последовательный монитор и начать тестирование модуля, поднеся несколько карт NFC к PN532.
В случае режима High-Speed UART чип смог прочитать данные только 4 байта. Модуль не может прочитать 7 байт данных с карт NFC.
Взаимодействие PN532 с Arduino в режиме I2C
Теперь давайте прочитаем данные NFC в режиме I2C. Подключите модуль PN532 к Arduino следующим образом.
- GND (земля) <-> GND
- VCC (питание) <-> 5 В
- SDA (Data) <-> A4
- SCL (Clock) <-> A5
Исходный код программы
В случае связи с модулем по интерфейсу I2C загрузите и добавьте библиотеку PN532_I2C.h в папку с библиотеками.
Скопируйте следующий код и загрузите его на плату Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <Wire.h> #include <PN532_I2C.h> #include <PN532.h> #include <NfcAdapter.h> PN532_I2C pn532_i2c(Wire); NfcAdapter nfc = NfcAdapter(pn532_i2c); String tagId = "None"; byte nuidPICC[4]; void setup(void) { Serial.begin(115200); Serial.println("System initialized"); nfc.begin(); } void loop() { readNFC(); } void readNFC() { if (nfc.tagPresent()) { NfcTag tag = nfc.read(); tag.print(); tagId = tag.getUidString(); } delay(5000); } |
После загрузки кода вы можете открыть Serial Monitor (окно монитора последовательной связи) и начать тестирование модуля, поднеся несколько карт NFC к PN532. В режиме I2C чип способен считывать как 4 байта, так и 7 байт данных с различных меток NFC.
Взаимодействие PN532 с Arduino в режиме SPI
Теперь давайте прочитаем данные NFC в режиме SPI. В случае режима SPI слишком много соединений. Поэтому подключите PN532 к Arduino следующим образом.
- VCC (питание) <-> 5 В
- RST (Сброс) <-> 9
- GND (земля) <-> GND
- MISO (главный вход, подчиненный выход) <-> 11
- MOSI (главный выход, подчиненный вход) <-> 12
- SCK (последовательные часы) <-> 13
- SS (выбор ведомого) <-> 10
Исходный код программы
В случае связи по протоколу SPI загрузите и добавьте библиотеку PN532_SPI.h в папку с библиотеками.
Скопируйте следующий код и загрузите его на плату Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// for SPI Communication #include <SPI.h> #include <PN532_SPI.h> #include <PN532.h> #include <NfcAdapter.h> PN532_SPI interface(SPI, 10); // create a PN532 SPI interface with the SPI CS terminal located at digital pin 10 NfcAdapter nfc = NfcAdapter(interface); // create an NFC adapter object String tagId = "None"; void setup(void) { Serial.begin(115200); Serial.println("System initialized"); nfc.begin(); } void loop() { readNFC(); } void readNFC() { if (nfc.tagPresent()) { NfcTag tag = nfc.read(); tag.print(); tagId = tag.getUidString(); } delay(5000); } |
В этом режиме также хорошо работают 4-байтовые и 7-байтовые карты NFC.
Создание портативного сканера NFC с OLED-дисплеем
Мы можем сделать портативный модуль сканера NFC, используя модуль PN532 и плату Arduino. Для отображения данных мы можем добавить 0,96″ I2C OLED-дисплей к схеме ниже.
Подключите модуль PN532 и OLED-дисплей к Arduino согласно принципиальной схеме.
- GND (земля) <-> GND
- VCC (питание) <-> 5 В
- SDA (Данные) <-> A4
- SCL (синхронизация) <-> A5
Исходный код программы
Для этого портативного NFC-ридера мы не будем использовать указанную выше библиотеку. Вместо этого мы предпочтем последнюю библиотеку Adafruit PN532. Библиотека написана для плат Adafruit PN532 NFC/RFID и работает с платой Arduino UNO/Nano только в режиме I2C или SPI.
Помимо этого нам также понадобится еще одна библиотека для компиляции. Загрузите следующие библиотеки и добавьте их в Arduino IDE через Library Manager (менеджер библиотек):
1. Библиотека Adafruit PN532: Загрузить
2. Библиотека Adafruit GFX: https://github.com/adafruit/Adafruit-GFX-Library
3. Библиотека SSD1306 OLED: Загрузить
Скопируйте следующий код и загрузите его на плату Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
#include <Wire.h> #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Adafruit_PN532.h> #define PN532_IRQ (2) #define PN532_RESET (3) // Not connected by default on the NFC Shield #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32; Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup(void) { Serial.begin(115200); while (!Serial) delay(10); // for Leonardo/Micro/Zero Serial.println("Hello!"); nfc.begin(); if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;); // Don't proceed, loop forever } uint32_t versiondata = nfc.getFirmwareVersion(); if (! versiondata) { Serial.print("Didn't find PN53x board"); while (1); // halt } // Got ok data, print it out! Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC); display.clearDisplay(); display.setCursor(0, 0); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.print("Found chip PN5"); display.print((versiondata >> 24) & 0xFF, HEX); display.setCursor(0, 20); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.print("Firmware ver. "); display.print((versiondata >> 16) & 0xFF, DEC); display.print("."); display.print((versiondata >> 8) & 0xFF, DEC); nfc.setPassiveActivationRetries(0xFF); // configure board to read RFID tags nfc.SAMConfig(); Serial.println("Waiting for an ISO14443A card"); display.setCursor(0, 40); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.print("Waiting for NFC Card"); display.display(); } void loop(void) { boolean success; uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type) success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength); if (success) { Serial.println("Found a card!"); Serial.print("UID Length: "); Serial.print(uidLength, DEC); Serial.println(" bytes"); Serial.print("UID Value: "); display.clearDisplay(); display.setCursor(10, 0); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.print("UID Length:"); display.print(uidLength, DEC); display.print(" bytes"); display.setCursor(35, 20); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.println("UID Value: "); display.setCursor(5, 35); //oled display for (uint8_t i=0; i < uidLength; i++) { Serial.print(" 0x"); Serial.print(uid[i], HEX); display.print(" 0x"); display.print(uid[i], HEX); display.display(); } Serial.println(""); // Wait 1 second before continuing delay(1000); } else { // PN532 probably timed out waiting for a card Serial.println("Timed out waiting for a card"); } } |
После успешной загрузки кода вы можете начать процесс тестирования сканера. OLED-дисплей отобразит версию прошивки 1.6 и попросит отсканировать карты.
Теперь поднесите несколько карт NFC к плате NFC PN532. Карта NFC может включать вашу банковскую карту или проездной или, может быть, какую-нибудь тестовую карту NFC. Модуль PN532 считывает длину байта вместе со значением UID и отображает их на OLED-экране.
Иногда объем информации на карте может составлять 4 байта или 7 байтов в зависимости от типа карты NFC.
Если вам не нужен OLED-дисплей для проекта, вы можете отобразить значение UID и длину байта на последовательном мониторе.
Видео с демонстрацией работы проекта
Вот как мы подключаем модуль PN532 NFC RFID к Arduino в режимах UART, I2C и SPI. Готовый модуль NFC доступен на рынке под названием Maduino Zero NFC board, который можно использовать для проектов платежных, входных и охранных систем.
347 просмотров