Чтение и запись NFC меток с помощью Arduino

Добавлено 7 марта 2017 в 23:00

Воспользуемся платой Arduino для чтения NFC меток и записи на них информации!

Что такое NFC?

NFC (near field communication, связь в ближнем поле) – это протоколы, которые используют электронные устройства для связи и передачи данных между собой. NFC устройства должны быть расположены очень близко друг к другу, как правило, в пределах 10 см, но этот диапазон может варьироваться в зависимости от устройства, которое передает данные, и размеров метки. NFC метки не требуют подвода никакого питания. Они используют магнитную индукцию между двумя маленькими петлевыми антеннами. В настоящее время метки переносят от 96 до 4096 байт информации.

Список комплектующих

  • Arduino Uno R3;
  • плата расширения Adafruit PN532 RFID/NFC Shield (или аналог);
  • Arduino IDE;
  • перезаписываемые NFC метки.
Плата расширения Adafruit PN532 RFID/NFC Shield
Плата расширения Adafruit PN532 RFID/NFC Shield

Важно, чтобы NFC метки были перезаписываемыми, иначе код не заработает.

Для проверки того, успешно ли мы записали данные на метки, мы можем использовать Arduino или телефон с NFC. Большинство смартфонов на Android могут читать NFC метки, я буду использовать для тестов Nexus 5. К сожалению, для пользователей iPhone, поддержка NFC началась с iPhone 6 и 6s, но они не поддерживают чтение NFC меток, поэтому можно воспользоваться платой Arduino для проверки того, что записано на вашей NFC метке. iPhone использует свои NFC возможности только для Apple Pay, следовательно вы не можете использовать их для чтения меток или чего-то другого.

Когда у нас будут все необходимые комплектующие, нам будет необходимо установить две библиотеки, которые делают возможным чтение и запись меток. Это библиотеки don/NDEF и Seeedstudio’s, мы будем в основном использовать первую из них. Библиотека Seeedstudio’s используется, если у вас есть плата расширения Seeedstudio NFC shield. Мы установим ее просто на всякий случай. Вам необходимо скачать и установить обе библиотеки, используя в Arduino IDE пункт «Добавить .zip библиотеку» (Add .zip Library) в меню «Скетч (Sketch) → Добавить библиотеку (Include Library)». Не забудьте установить обе библиотеки по отдельности и в каталог Arduino по умолчанию, иначе у вас будут ошибки компиляции.

Ошибка при импорте библиотеки Seeed-Studio/PN532 (PN532_I2C.h: No such file or directory). (upd. 20 октября 2019)

Проблема заключается в структуре каталогов "PN532/PN532/файлы_исходников" (должно быть "PN532/файлы_исходников"). При копировании четырех подкаталогов (по инструкции к библиотеке) PN532, PN532_SPI, PN532_I2C and PN532_HSU ошибка будет появляться уже на этапе компиляции, так как в самих исходниках пути к другим файлам указаны с учетом изначальной структуры каталогов.

Решение: скопировать каталоги из архива с отредактированными исходниками в каталог библиотек Arduino (например, "C:\Users\Имя_пользователя\Documents\Arduino\libraries").

Запустите IDE, у вас должен создасться файл нового скетча. Сохраните новый файл под любым именем, например, "Read NFC Tag". Сперва необходимо добавить в него заголовочные файлы. Они должны идти до void setup().

#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>   // Следующие файлы включают установленные библиотеки
#include <NfcAdapter.h>

PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);  // Указываем, что используем плату расширения

Чтение NFC метки

Эти заголовочные файлы очень важны, и проект не будет без них работать. Далее пишем следующий код.

#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>   // Следующие файлы включают установленные библиотеки
#include <NfcAdapter.h>

PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);  // Указываем, что используем плату расширения

void setup(void) 
{
  Serial.begin(9600);
  Serial.println("NFC TAG READER"); // Заголовок, используемый в мониторе последовательного порта
  nfc.begin();
}

void loop(void) 
{
  Serial.println("\nScan your NFC tag on the NFC Shield\n");  // Команда, чтобы вы знали, что делать дальше 

  if (nfc.tagPresent())
  {
    NfcTag tag = nfc.read();
    Serial.println(tag.getTagType());
    Serial.print("UID: ");
    Serial.println(tag.getUidString()); // Извлекает уникальный идентификатор из вашей метки

    if (tag.hasNdefMessage()) // Если у метки есть сообщение
    {

      NdefMessage message = tag.getNdefMessage();
      Serial.print("\nThis Message in this Tag is ");
      Serial.print(message.getRecordCount());
      Serial.print(" NFC Tag Record");
      if (message.getRecordCount() != 1) 
      { 
        Serial.print("s");
      }
      Serial.println(".");

      // Если у вас более 1 сообщения, то проходим по ним в цикле
      int recordCount = message.getRecordCount();
      for (int i = 0; i < recordCount; i++)
      {
        Serial.print("\nNDEF Record ");
        Serial.println(i+1);
        NdefRecord record = message.getRecord(i);

        int payloadLength = record.getPayloadLength();
        byte payload[payloadLength];
        record.getPayload(payload);


        String payloadAsString = ""; // Обработать сообщение, как строку
        for (int c = 0; c < payloadLength; c++) 
        {
          payloadAsString += (char)payload[c];
        }
        Serial.print("  Information (as String): ");
        Serial.println(payloadAsString);


        String uid = record.getId();
        if (uid != "") 
        {
          Serial.print("  ID: ");
          Serial.println(uid); // Напечатать уникальный идентификатор NFC метки
        }
      }
    }
  }
  delay(10000);
}

После того, как вы сохранили и загрузили этот код в свою плату Arduino с подключенной платой расширения, вы можете начать проверять, какие сообщения есть у ваших меток, если они есть. Когда вы загрузите программу в Arduino, откройте монитор последовательного порта, там вы увидите сообщение “NFC TAG Reader”, а ниже инструкции, говорящие вам сканировать вашу NFC метку на своей плате расширения NFC (“Scan your NFC tag on your NFC Shield”). Когда я сделал это, то получил в мониторе последовательного порта следующее:

Вывод в мониторе последовательного порта Arduino IDE при чтении NFC метки
Вывод в мониторе последовательного порта Arduino IDE при чтении NFC метки

Обратите внимание, что он дает уникальный идентификатор NFC метки и сообщает, какую информацию я записал в метки. В этой конкретной метке у меня простое приветственное сообщение и ссылка на Twitter Arduino. Arduino успешно считывает информацию с моей метки. Видео ниже показывает, как мой Nexus 5 читает метку и показывает сообщения.

Запись на NFC метку

Теперь, чтобы записать сообщение на метку, необходимо выполнить похожий процесс, за исключением небольших изменений в коде. Заголовок перед функцией void setup() будет таким же, а ниже приведен код, который необходимо загрузить в Arduino.

#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>   // Следующие файлы включают установленные библиотеки
#include <NfcAdapter.h>

PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);  // Указываем, что используем плату расширения

void setup() 
{
  Serial.begin(9600);
  Serial.println("NFC Tag Writer"); // Сообщение в монитор последовательного порта
  nfc.begin();
}

void loop() 
{
  Serial.println("\nPlace an NFC Tag that you want to Record these Messages on!"); // Команда в мониторе последовательного порта
  if (nfc.tagPresent()) 
  {
    NdefMessage message = NdefMessage();
    message.addTextRecord("My First NFC Tag Write");     // Текстовое сообщение, которое хотим записать
    message.addUriRecord("http://allaboutcircuits.com"); // Вебсайт, который хотим записать
    message.addTextRecord("Way to Go, It Worked!");      // Завершающее сообщение, которое хотим записать
    boolean success = nfc.write(message);
    if (success) 
    {
      Serial.println("Good Job, now read it with your phone!"); // если всё работает, то мы увидим это сообщение 
    } 
    else 
    {
      Serial.println("Write failed"); // если запись завершилась неудачей, то увидим это сообщение
    }
  }
  delay(10000);
}

Этот код сохраняет в метке три сообщения: вводный текст, говорящий “My First NFC Tag Write”, затем ссылка на сайт AllAboutCircuits и, наконец, завершающее сообщение, говорящее “Way to Go, It Worked!”.

Чтение результата записи, произведенной на NFC метку платой Arduino, с помощью Nexus 5
Чтение результата записи, произведенной на NFC метку платой Arduino, с помощью Nexus 5

Когда я сканирую эту метку своим телефоном, то получаю два сообщения и ссылку. Вы можете изменить код, чтобы написать в сообщениях всё, что хотите, и перенаправить пользователя по другой ссылке. При внесении любых изменений перепроверьте информацию на метке с помощью Arduino или смартфона.

Интересных вам проектов на Arduino с использованием NFC! Надеюсь, статья оказалась полезной. Оставляйте, комментарии!

Теги

ArduinoNFC

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.


  • 2019-10-20antzol

    Проблема с библиотекой Seeed-Studio/PN532.
    Решение описано в статье перед кодом для Arduino.

  • 2019-10-20Алексей

    Arduino: 1.8.2 (Windows XP), Плата:"Arduino/Genuino Uno"

    C:\Documents and Settings\Admin\Мои документы\Arduino\sketch_oct20c\sketch_oct20c.ino:2:10: fatal error: PN532_I2C.h: No such file or directory

    compilation terminated.

    exit status 1

    Ошибка компиляции для платы Arduino/Genuino Uno.

    Этот отчёт будет иметь больше информации с

    включенной опцией Файл -> Настройки ->

    "Показать подробный вывод во время компиляции"