Nfc эмуляция arduino

Arduino — RFID/NFC

In this tutorial, we are going to learn how to use RFID/NFC with Arduino. The RFID/NFC system includes two components: reader and tag. There are two popular RFID/NFC readers: RC522 and PN532 RFID/NFC reader. This tutorial focuses on RC522 RFID/NFC reader. PN532 RFID/NFC reader will be presented in an upcoming tutorial.

RC522 RFID/NFC reader (also called RFID-RC522 Module) can:

In above capabilities, for Arduino, reading the UID is the most widely-used. This tutorial focuses on reading the UID of RFID/NFC tag. The other will be present in next tutorials

Hardware Required

About RFID-RC522 Module

RFID-RC522 Module Pinout

RFID-RC522 has 8 pins, some of them are common pins, the others are shared among three communication modes: SPI, I2C, UART. At a time, only one communication mode can be used. The pin are:

How RFID/NFC Works

RFID/NFC includes two components: reader and tag.

To read the information on a tag, the tag must be in close proximity to the reader (does not require the direct line-of-sight). The reading processes:

Wiring Diagram between RFID-RC522 Module and ESP32

Image is developed using Fritzing. Click to enlarge image

If you use the male-to-female jumper wires, you can connect Arduino UNO directly to RFID-RC522 module. If you use the male-to-male jumper wires, you need to connect Arduino UNO to RFID-RC522 module via a breadboard

Источник

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

Воспользуемся платой 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

Важно, чтобы 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() .

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

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

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

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

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

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

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

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

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

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

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

Источник

Эмулятор RFID на Arduino

Многие читали мой пост «Эмулятор RFID», где я в деталях рассказывал об устройстве EM Marine, о том как намотать антенну, и как сделать RFID-эмулятор из трёх деталей. Но, будем честны, несмотря на гениальную простоту того устройства, оно достаточно сложно для повторения. Не каждый имеет дома осциллограф, для того чтобы поймать резонанс, да и для прошивки ATtiny85 требуется отдельный программатор.

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

Аппаратное обеспечение

Как я уже сказал, эмулятор должен быть собран на доступных комплектующих, которые можно легко достать. Для начала рассмотрим схему эмулятора.

У нас есть колебательный контур, который мы будем замыкать в определённое время транзистором и таким образом в считывателе будет изменяться ток, и он будет получать передаваемые данные.
Самым сложным для нас в этой связке остаётся настроенный на частоту 125 кГц колебательный контур. И есть очень простое решение, откуда его можно взять. В продаже существует считыватель RFID-меток для Arduino RDM6300. Считыватель стоит сущие копейки, а у него в комплекте уже идёт антенна, а резонансный конденсатор уже распаян на плате. Таким образом, по сути считыватель нам нужен только для двух деталей: катушки и резонанстного конденсатора.

Считыватель RDM6300 и расположение резонансного конденсатора.

Я купил этот считыватель за какие-то копейки, которые несоизмеримы с трудами по намотке и настройке антенны. Самая сложная операция у нас — это отпаять данный конденсатор и припаять его на монтажную плату. Верю, что с ней справиться даже школьник младших классов.
В результате собираем всё на макетной плате. У меня два резистора в параллели стоит только лишь потому, что на 10кОм резисторов у меня не было под рукой, а были только на 20кОм.

Ну и посмотрим крупным планом, как это всё выглядит. Я специально под конденсатор выделил отдельную платку, там он припаян прямо на монтажные иголки, которые вставлены в этот матрац.

Для того, чтобы проверять работу эмулятора, изначально я думал использовать тот же RDM6300 (купил их два). И даже по началу так и делал, но потом решил, что это как-то не серьёзно, одной Ардуиной отлаживать другую, и разорился на заводской считыватель.

Взводим таймер

Наиболее полно всю физику процесса и принцип работы я рассказал в своей предыдущей статье, поэтому настоятельно рекомендую с ней ознакомиться. Однако для понимания того, что я делаю немного освежу некоторые моменты.

Напомню, что у EM4102 используется схема Манчестерского кодирования. Когда идёт модуляция EM4102 протокола, время передачи одного бита может составлять 64, 32 или 16 периодов несущей частоты (125 кГц).

Проще говоря, при передаче одного бита, у нас меняется значение либо единицы на нуль (при передаче нуля), либо с нуля на единицу (при передаче единицы). Соответственно, если мы выбираем для передаче одного бита информации 64 периода несущей частоты, то для передачи “полубита” нам нужно будет 32 периода несущей частоты. Таким образом каждый полубит должен меняться с частотой:

Период этого “полубита” будет равен 256 мкс.

Теперь нам нужно посчитать таймер, чтобы он нам дёргал ногу с данной частотой. Но я стал так ленив, что открыв даташит и начав зевать, решил найти какое-то готовое решение. И оказалось, что есть готовые расчёты таймеров, только вбивай свои данные. Встречайте: калькулятор таймера для Ардуино.

Нам необходимо только забить частоту таймера 3906 Гц, и нам сразу сгенерируют готовый к использованию код. Ну не чудо ли!

Обратите внимание, что частоту я вводил целыми, а он её посчитал дробными и именно ту, которая нам и нужна. Код инициализации таймера у меня получился следующий:

Гениально, просто, лаконично.

Вектор прерывания для вывода устроен тоже очень просто. Напоминаю, что нам необходимо делать переход с единицы на нуль в случае передачи нуля, и с нуля на единицу, в случае передачи единицы (смотрите рисунок для понимания). Поэтому смотрим, что мы сейчас передаём и в каком месте “полубита” находимся, постепенно считывая из массива data все данные.

Перевод данных для передачи

Тут тоже следует освежить в памяти форматы данных, хранимые на карте. То, в каком виде они записаны. Давайте на живом примере.

Предположим у нас есть карта, но нет ридера. На карте написан номер 010,48351.

Реальная карта с номером 010, 48351.

Как этот номер нам перевести в тот серийный номер, который записан на карте? Достаточно просто. Вспоминаем формулу: переводим две части числа отдельно:

Итого, серийный номер у нас получается: 0xABCDF. Проверим его, считываем карточку считывателем (он читает в десятичном формате), получаем число:

Переводим его любым калькулятором в хекс-формат и получаем снова: 0xABCDF.
Вроде пока просто, погодите, сейчас мозги придётся поднапрячь. Напомню формат данных, которые лежат на самой карте.

  1. Вначале идут девять единиц заголовка.
  2. Младшие пол байта ID клиента.
  3. В конце бит чётности.
  4. Вторые пол байта ID клиента.
  5. Бит чётности.
  6. Младшие пол байта нулевого байта серийного номера.
  7. Бит чётности
  8. Старшие пол байта данных байта нулевого байта серийного номера.
  9. Точно так же все остальные данные, передаются ниблами и оканчиваются битом чётности
  10. Самое сложное. Теперь все эти 10 нибблов по вертикали точно так же вычисляется бит чётности (прямо как в таблице).
  11. Завершает всё это безобразие стоп бит, который равен всегда нулю.

Итого у нас получается 64 бита данных (это из пяти байт!). В качестве ремарки, мой считыватель не читает ID-клиента, и я его принимаю равным нулю.

Что такое бит чётности? Это количество единиц в посылке: если оно чётное, то бит чётности равен нулю, если нет, то единице. Проще всего рассчитать его, просто обычным XOR.

На самом деле я долго думал, как элегантнее сделать пересчёт серийного номера в посылку, да так чтобы это занимало меньше места в микроконтроллере. Поэтому набросал небольшую програмку, которая это делает. Программу можно посмотреть под спойлером.

Самое важное для нас, это то как будет выглядеть биты чётности. Для удобства я сделал вывод на экран точно так же, как в этой табличке. В результате получилось вот так.

card_id — это серийный номер карты (о котором мы говорили выше).

Первый столбец — это ниблы, второй — их битовое представление, третий — это бит чётности. Третья строка снизу — это биты чётности всех ниблов. Как я уже сказал, они рассчитываются просто операцией XOR.

Протестировав расчёты, сверив иx визуально, я проверил получившиеся данные в программе на Arduino (последняя строка специально для вставки в код). Всё отработало отлично. В результате наброска этой программы, я получил готовую функцию пересчёта. Раньше, расчёты битов были чужими программами на компе и мне не нравилась их монструозная реализация. Таким образом функция пересчёта серийного номера в формат передачи выглядит так:

Всё, можно переходить к полевым испытаниям. Исходный код проекта обитает тут.

Испытания

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

Выводы

Очень надеюсь, что подобные статьи подстегнуть новичков изучать программирование и электронику. А так же они поспособствуют уходу с рынка такого типа карт, как самых незащищённых и небезопасных, поскольку теперь их может скопировать и эмулировать даже ребёнок.

Выражаю благодарность Michal Krumnikl за его терпение много-много лет назад, когда он мне по icq разъяснял работу подобного эмулятора, а так же помощь с разработкой кода. В некотором смысле это его идеи и наработки 13-ти летней давности.

Источник

Adblock
detector