Модуль RFID PN532 NFC V3 позволяет не только считывать и записывать информацию RFID-карт Mifare , меток и брелков работающих на частоте 13,56 МГц , но и обменивается данными с другими устройствами, поддерживающими технологию NFC (Near Field Communication). Модуль основан на микросхеме PN532 и поддерживает беспроводные протоколы ISO14443 Type A/B. Его можно использовать в системах контроля доступа в помещения, охранных системах, в составе умного дома, системах позиционирования роботов и т.д. Для подключения модуля используется интерфейсы UART, I2C или SPI. При использовании сигнала прерывания при подключении модуля используются всего три контакта контроллера.
Основные характеристики:
-
Микросхема: PN532
-
Логика: КМОП, 3.3В
-
Напряжение питания: 3.3-5В
-
Максимальный потребляемый ток: 150 мА
-
Потребляемый ток в режиме ожидания: 100 мА
-
Потребляемый ток в режиме считывания: 120 мА
-
Потребляемый ток в режиме записи: 120 мА
-
Дальность считывания: 5 - 7 см
-
Антенна: встроенная, на плате
-
Размеры: 42.7 х 40.4 мм
-
Поддержка интерфейсов: I2C / SPI / HSU (High Speed UART - 115200 kbps)
Поддерживаемые режимы работы:
-
RFID (чтение/запись)
-
P2P соединения
-
NFC для работы со смартфонами на платформе Android
Поддержка чипов:
-
ISO 14443 Type A - NXP Mifare 1k, 4k, Ultralight, Desfire
-
ISO 14443 Type B
-
ISO/IEC 14443-4-совместимые чипы
-
FeliCa
-
Jewel
-
TopaZ
Модуль поддерживает работу по нескольким интерфейсам. для того, чтобы подключить модуль по шине I2C, измените положение переключателя согласно таблице возле него.
Подключение по I2C(для Arduino):
-
SDA — к выводу A4
-
SCL — к выводу A5
-
VCC — 5V
-
GND — GND
-
IRQ — к цифровому выводу 2
-
RSTO — к цифровому выводу 3
Подключение по SPI(для Arduino):
-
SS — 10
-
MOSI — 11
-
MISO — 12
-
SCK — 13
-
VCC — 5V
-
GND — GND
Ссылки:
Даташит на микросхему
Библиотека Adafruit PN532
Библиотека Adafruit NFCShield I2C
Пример кода Arduino:
#include // подключаем библиотеку для работы по I2C
#include // подключаем библиотеку для работы с модулем
#define PN532_IRQ (2) // указываем вывод, к которому подключен контакт IRQ
#define PN532_RESET (3) // указываем вывод, к которому подключен контакт RST
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); // назначаем имя модулю
void setup() {
Serial.begin(115200); // инициируем передачу данных в монитор последовательного порта на скорости 115200 бод
Serial.println("Hello!"); // выводим в монитор порта текст
nfc.begin(); // инициируем работу с модулем
uint32_t versiondata = nfc.getFirmwareVersion(); // считываем версию прошивки модуля в переменную
if (! versiondata) { // если переменная пуста, то
Serial.print("Didn't find PN53x board"); // выводим текст в монитор порта
while (1); // прерываем дальнейшее выполнение блока setup
}
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); // выводим запятую и версию прошивки после запятой
nfc.setPassiveActivationRetries(0xFF); // указываем количество попыток на считывание карты
nfc.SAMConfig(); // настраиваем модуль на чтение RFID-меток
Serial.println("Waiting for an ISO14443A card"); // выводим текст в монитор порта
}
void loop() {
boolean success; // задаём переменную для считывания номера карты
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // задаём переменную для хранения номера считанной карты
uint8_t uidLength; // длина номера карты (4 или 7 байт в зависимости от типа карты)
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: "); // выводим текст в монитор порта
for (uint8_t i = 0; i < uidLength; i++) { // выводим номер карты (в зависимости от длины номера будет меняться и количество раз, которые должен выполнить цикл)
Serial.print(" 0x"); Serial.print(uid[i], HEX); // выводим текст и побитовый номер карты
}
Serial.println(""); // добавляем символ новой строки
delay(1000); // ждём 1 секунду
}
else { // если карта была не прочитана, то
Serial.println("Timed out waiting for a card"); // выводим текст в монитор порта о том, что время ожидания карты истекло
}
}