В этой статье мы рассмотрим плату на базе Arduino+PN532 NFC под названием Maduino Zero NFC. Maduino Zero NFC — это решение IoT (Интернет вещей), основанное на 32-битном микроконтроллере SAMD21 от Atmel и контроллере связи ближнего поля NXP PN532. Эта плата разработки может использоваться для платежных приложений, систем входа и проектов систем безопасности.
Плата Maduino Zero NFC основана на Arduino и поэтому пользователи могут программировать ее с помощью Arduino IDE. Это руководство поможет вам с базовым использованием Maduino Zero NFC, а также обзором оборудования и программированием.
В то время как технология RFID может использоваться на больших расстояниях, технология NFC ограничена небольшими расстояниями. NFC лучше всего использовать для безопасной передачи различных данных на короткие расстояния, отсюда ее распространенность в приложениях контроля доступа и оплаты. С другой стороны, RFID больше подходит для быстро движущихся сред с большим количеством движущихся частей и чаще всего используется для контроля доступа транспортных средств и управления активами.
Прежде чем двигаться дальше, ознакомьтесь с некоторыми из наших проектов на основе RFID, такими как система безопасности RFID , а также проект системы контроля посещаемости RFID. Вы также можете ознакомиться с обзором модуля NFC PN532 и его взаимодействием с Arduino в режимах UART, I2C и SPI.
Необходимые компоненты
- Плата Maduino Zero NFC (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 с интерфейсом I2C (купить на AliExpress).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Что такое NFC?
NFC, или ближняя беспроводная связь, относится к технологии, которая позволяет подключенным устройствам, находящимся рядом друг с другом, обмениваться данными по беспроводной связи. Технология NFC произошла от технологии радиочастотной идентификации (RFID) и является более точно настроенной.
NFC работает по принципу индуктивной связи, по крайней мере, для реализаций на коротких расстояниях. По сути, это включает в себя считывающее устройство, генерирующее магнитное поле путем пропускания электрического тока через катушку. Когда метка (с собственной катушкой) подносится близко, поле индуцирует электрический ток внутри метки. Затем, после завершения первоначального рукопожатия, любые сохраненные на метке данные передаются по беспроводной связи на считыватель.
Индивидуальная плата NFC (Maduino Zero NFC)
Maduino Zero NFC — это совместимая с Arduino небольшая плата разработки с NFC (Near-Field Communication). Она разработана с использованием контроллера ATSAMD21G18, который на самом деле является платой Arduino Zero, и чипа PN532 NFC.
Эту плату можно приобрести у Makerfabs (или на Aliexpress) и использовать ее для многоцелевых приложений.
Эта плата станет мостом, который поможет вам взаимодействовать с окружающей средой по беспроводной связи, управлять двигателями, разблокировать замки, управлять реле, считывать данные с датчика температуры. Это потому, что она имеет встроенное подключение NFC, прямо из коробки.
Эта плата имеет порт micro USB для последовательной связи и питания. Мы можем подключить вход питания 5 В или солнечную панель для зарядки литий-полимерной батареи. Она также имеет разъем для литий-полимерной батареи 3,7 В и выключатель питания для включения /выключения модуля. Антенна NFC с интерфейсом IPX используется для сканирования тега NFC. Светодиод индикации состояния подключен к D2 вместе со светодиодом индикации питания. На плате имеется переключатель SWD для загрузки загрузчика. Вы можете нажать кнопку сброса на плате, чтобы сбросить контроллер ATSAMD21G18.
На задней стороне платы находится разъем для SD-карты. В разъем можно вставить SD-карту и сохранить необходимые данные в текстовом формате.
Функции
- ATMEL SAMD21G18A: 32-битный ARM® Cortex®-M0 до 48 МГц, 256 КБ флэш-памяти, 32 КБ SRAM, LQFP48.
- Питание от литиевой батареи (3,4-4,2 В) или MicroUSB.
- NXP PN532, контроллер беспроводной связи ближнего действия (NFC).
- Бесконтактная связь на частоте 13,56 МГц.
- Режим PCD для карт FeliCa, ISO/IEC14443-3 Type-A, Mifare, ISO/IEC14443-4 Type-A и Innovision Jewel.
- Интерфейсы: I2C/SPI/UART/АЦП/ЦАП/I2S/38*GPIO.
- Совместимость с Arduino: можно программировать с помощью Arduino IDE.
- Более экономичная и качественная чем Arduino Zero.
- Скорость передачи данных по умолчанию: 115200 бит/с.
Предупреждение: Не работайте при включенном питании (то есть не подключайте и не отключайте антенну, SD-карту, так как в случае короткого замыкания может выйти из строя ИС).
Как использовать плату Maduino NFC?
Плата Maduino NFC имеет контроллер Arduino Zero PN532 NFC Chip. Чтобы использовать эту плату с Arduino IDE, нам сначала нужно настроить Arduino IDE.
Настройка Arduino IDE
Плата ATSAMD21G18A не предустановлена в Arduino IDE. Поэтому нам нужно установить «Arduino Zero Board» из Board Manager (менеджера плат).
Откройте Boards Manager. В верхнем меню Arduino IDE выберите Tools-> Board-> Boards Manager …, чтобы открыть диалоговое окно Boards Manager. Затем установите платы Arduino SAMD (32-бит ARM Cortex-M0+).
После завершения установки вы можете выбрать плату Arduino Zero, как показано на рисунке ниже. Для программирования этой платы вам необходимо подключить кабель передачи данных Micro USB.
Аппаратные соединения
Сначала подключите антенну NFC к обозначению, которое показывает ANT1. Затем подключите кабель Micro USB к Maduino Zero NFC. Вы можете подключить 0,96″ I2C OLED-дисплей к плате через 4-контактный разъем.
Вы можете подать питание от литиевой батареи 3,7 В после загрузки программы на плату, поскольку она работает в диапазоне от 3,4 В до 4,2 В. Для питания можно использовать как батарею, так и MicroUSB. Пока подключен MicroUSB, плата будет питаться от MicroUSB, при извлечении MicroUSB она автоматически переключится на батарею.
Исходный код и программирование
Выберите плату Arduino Zero(Native USB port) из меню плат в Arduino IDE. Затем выберите правильный номер порта, так как Native USB port появится в COM-порте. Теперь вы можете загрузить приведенный ниже код на плату Maduino.
Но Arduino IDE требует некоторые библиотеки для компиляции. Загрузите следующие библиотеки и добавьте их в Arduino IDE через Library Manager (менеджер библиотек):
1. Библиотека Adafruit PN532: Загрузить
2. Библиотека Adafruit GFX: https://github.com/adafruit/Adafruit-GFX-Library
3. Библиотека SSD1306 OLED: Загрузить
Это полный код интерфейса Arduino PN532 NFC.
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 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
#include <Wire.h> #include <SPI.h> #include "Adafruit_PN532.h" #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define PN532_SS (9) #define PN532_IRQ (2) #define PN532_RESET (11) // 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_SS); Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #if defined(ARDUINO_ARCH_SAMD) #define Serial SerialUSB #endif #define STA_LED 2 //D2 void setup(void) { pinMode(STA_LED, OUTPUT); digitalWrite(STA_LED, HIGH); // turn the LED off (HIGH is the voltage level) #ifndef ESP8266 while (!Serial); // for Leonardo/Micro/Zero #endif Serial.begin(115200); SerialUSB.begin(115200); if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;); // Don't proceed, loop forever } nfc.begin(); uint32_t versiondata = nfc.getFirmwareVersion(); if (! versiondata) { SerialUSB.print("Didn't find PN53x board"); while (1); // halt } // Got ok data, print it out! SerialUSB.print("Found chip PN5"); SerialUSB.println((versiondata >> 24) & 0xFF, HEX); SerialUSB.print("Firmware ver. "); SerialUSB.print((versiondata >> 16) & 0xFF, DEC); SerialUSB.print('.'); SerialUSB.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(); SerialUSB.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 result_success = 0; 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) result_success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength); if (result_success) { SerialUSB.println("Found a card!"); SerialUSB.print("UID Length: "); SerialUSB.print(uidLength, DEC); SerialUSB.println(" bytes"); SerialUSB.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++) { SerialUSB.print("0x"); SerialUSB.print(uid[i], HEX); display.print(" 0x"); display.print(uid[i], HEX); display.display(); } SerialUSB.println(""); digitalWrite(STA_LED, LOW);// turn the LED on (LOW is the voltage level) result_success = 0; // Wait 1 second before continuing delay(1000); } else { // PN532 probably timed out waiting for a card SerialUSB.println("Timed out waiting for a card"); } digitalWrite(STA_LED, HIGH); // turn the LED off (HIGH is the voltage level) } |
Тестирование и результаты
После успешной загрузки кода вы можете начать процесс тестирования. OLED-дисплей отобразит версию прошивки 1.6 и попросит отсканировать карты.
Теперь поднесите несколько карт NFC к антенне Maduino Zero Board. Карта NFC может включать вашу банковскую карту или проездной или, может быть, какую-нибудь тестовую карту NFC.
Когда вы помещаете карту в верхнюю часть антенны, она считывает длину байта вместе со значением UID и отображает их на OLED-экране.
Иногда длина байта может составлять 4 байта или 7 байтов в зависимости от типа карты NFC.
Если вам не нужен OLED-дисплей для проекта, вы можете отобразить значение UID и длину байта на последовательном мониторе.
Вот как можно использовать плату Maduino Zero NFC на базе Arduino и PN532 NFC для приложений систем оплаты, входа и безопасности.