Как сделать считыватель rfid
Эмулятор 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.
Вроде пока просто, погодите, сейчас мозги придётся поднапрячь. Напомню формат данных, которые лежат на самой карте.
Что такое бит чётности? Это количество единиц в посылке: если оно чётное, то бит чётности равен нулю, если нет, то единице. Проще всего рассчитать его, просто обычным XOR.
На самом деле я долго думал, как элегантнее сделать пересчёт серийного номера в посылку, да так чтобы это занимало меньше места в микроконтроллере. Поэтому набросал небольшую програмку, которая это делает. Программу можно посмотреть под спойлером.
Самое важное для нас, это то как будет выглядеть биты чётности. Для удобства я сделал вывод на экран точно так же, как в этой табличке. В результате получилось вот так.
card_id — это серийный номер карты (о котором мы говорили выше).
Первый столбец — это ниблы, второй — их битовое представление, третий — это бит чётности. Третья строка снизу — это биты чётности всех ниблов. Как я уже сказал, они рассчитываются просто операцией XOR.
Протестировав расчёты, сверив из визуально, я проверил получившиеся данные в программе на Arduino (последняя строка специально для вставки в код). Всё отработало отлично. В результате наброска этой программы, я получил готовую функцию пересчёта. Раньше, расчёты битов были чужими программами на компе и мне не нравилась их монструозная реализация. Таким образом функция пересчёта серийного номера в формат передачи выглядит так:
Всё, можно переходить к полевым испытаниям. Исходный код проекта обитает тут.
Испытания
Как говориться, лучше один раз увидеть, чем тысячу раз прочитать. Специально для вас записал кино о работе этого эмулятора. Хотел его протестировать на реальном железе, и попробовать пробраться в офис с помощью Arduino, но с проклятой пандемией туда не пускают. Поэтому натурные испытания придётся смотреть на столе, в лабораторных условиях.
Выводы
Очень надеюсь, что подобные статьи подстегнуть новичков изучать программирование и электронику. А так же они поспособствуют уходу с рынка такого типа карт, как самых незащищённых и небезопасных, поскольку теперь их может скопировать и эмулировать даже ребёнок.
Выражаю благодарность Michal Krumnikl за его терпение много-много лет назад, когда он мне по icq разъяснял работу подобного эмулятора, а так же помощь с разработкой кода. В некотором смысле это его идеи и наработки 13-ти летней давности.
Антенна RFID своими руками или Ключи в ремешке часов.
В этом обзоре я поделюсь способом изготовления бескаркасных антенн для RFID меток и установки пропуска и ключа от домофона в кожаный ремешок наручных часов.
Вот он, мой второй обзор на Муське. Решил я поведать вам о том, как я упростил свое передвижение на работе, а именно вшил дубликат пропуска в ремешок часов, в который позже добавил и ключ от домофона. Далее я буду параллельно рассказывать об изготовлении антенн для 125 кГц пропуска и 13,56 МГц домофона.
Началось все, когда на работе установили СКУД почти на всех дверях. Пользоваться карточкой мне не понравилось с самого начала и я начал искать пути облегчения прохода с пропуском.
Вначале был куплен силиконовый RFID браслет, но он мне не понравился, знаете ли, ощущения «не те». В дальнейшем оказалось, что такие браслеты не долговечны и рвутся из-за частых растяжений. В продаже есть и более удобные браслеты.
У меня же появилась идея скрестить наручные часы, которые я каждый день одеваю и пропуск, тем более, что два браслета на руке — это перебор.
Карточку-пропуск я ломать не стал, а купил дубликатор и перезаписываемые брелоки для домофона. В моем случае рабочая частота пропуска на работе 125 кГц, а домофона — 13,56 МГц.
Просто извлечь метку из брелока и установить в ремешок не получилось. Размеры антенны довольно большие. Я попробовал сжать антенну — сильно уменьшилось расстояние считывания. Замеры индуктивности антенны показали, что при изменении формы катушки, естественно, меняется и индуктивность. Я подозреваю, что антенна метки представляет собой колебательный LC контур и изменение индуктивности к хорошему не приведет.
Отсюда выход один — изготовить антенну нужных формы и размеров с требуемой индуктивностью. Максимальное расстояние считывания достигается при одинаковых размерах антенн метки и считывателя. Т.е. самодельная метка будет считываться на меньшем расстоянии, чем карта.
Сразу хочу предупредить, что намотка антенны на 125 кГц занятие довольно сложное из-за большого количества витков и малой толщины провода.
Измеренная индуктивность антенны метки на 125 кГц составила около 3,57 мГн (миллиГенри), а на 13,56 Мгц — около 5 мкГн (микроГенри). Измерения нужно проводить так, чтобы исключить влияние других предметов на индуктивность.
Для пропуска на 125 кГц может понадобиться около 450 витков провода 0,05-0,07 с внутренним диаметром 7 мм и толщиной антенны в 1 мм. Провод сматывал с 24в реле. Намотку я производил шуруповертом. Где-то с пятой попытки получилось что нужно ).
Для ключа домофона на 13,56 МГц ушло около 1,5 метра провода 0,1-0,15 с внутренним диаметром 7 мм и толщиной около 1,5 мм. Намотка производилась вручную, витки не считал. Получилось со второй попытки.
Чип для домофона был аккуратно извлечен из брелока. Брелок хитрый и в переходе не получилось его скопировать. Все было залито нерастворяемым компаундом. Пришлось аккуратно все разламывать.
Для намотки бескаркасной катушки нам потребуется оснастка. Я нашел пару пластиковых крышек не известно от чего. Две пластиковые крышки или другие желательно круглые и плоские детали скрепляются посередине винтом с гайкой, который образует ось вращения. Между крышками устанавливается картонная прокладка. Намотка производится в промежуток между пластиковых крышек. Провод фиксируется эпоксидной смолой или лаком.
Методика намотки следующая: сначала нужно вырезать из картона шайбу, которая будет задавать внутреннюю форму антенны и ее толщину. Далее смазываем поверхности оснастки (пластиковых крышек) тонким слоем силикона, вставляем винт и одеваем картонную шайбу. Конец провода нужно закрепить в отверстии винта. Наносим немного «пятиминутной эпоксидки» вокруг картонной вставки, одеваем вторую крышку, скрепляем все вместе и незамедлительно производим намотку.
Я изготавливал антенны овальной формы. Точно рассчитать индуктивность мне показалось невозможным, поэтому я мотал побольше… После неполного застывания эпоксидной смолы оснастку аккуратно разбираем. Катушка должна легко отделиться от смазанной оснастки. Измеряем индуктивность и отматываем провод до получения необходимой индуктивности. При приближении к требуемому значению я производил замеры через каждый виток.
Таким методом можно мотать антенны любой формы и размеров.
Так же всегда можно купить мелкие RFID метки (раз, два, три) и припаять свой или перезаписываемый чип.
После изготовления антенны припаиваем к ней чистый чип (TK5577 на 125 кГц) и производим копирование или паяем заведомо рабочий чип.
Как же теперь все интегрировать в ремешок часов?
Варианта три: первый — купить кожаный ремешок с прошивкой по краю, расшить, подготовить нишу, вставить метку и зашить обратно. Второй — найти изготовление ремешков под заказ, отправить метки, указать место установки и получить готовый результат. Третий вариант — есть нейлоновые ремешки типа миланской петли. Метку можно установить внутри ремешка на клей. Я заказал ремешок у мастера (ищите в комментариях) и получил отменный результат.
Сейчас, после всего полученного опыта могу сказать, что мотать антенны на 125 кГц — занятие довольно сложное. Большое количество витков, тонкий провод для малых габаритов делают изготовление таких антенн очень тонкой работой.
Но изготовить антенну для 13,56 мГц оказалось не сложно. Витков мало, провод можно не совсем тонкий. Работает не хуже штатной антенны брелока.
Еще были идеи добавить в ремешок карту метро и банковскую карту. Только в Украине нет возможности пополнить метро бесконтактно. По крайней мере я не нашел. Да и достать кошелек два раза в день не трудно. Вмонтировать банковскую карту тоже, считаю, реально. Люди уже такое делали. Заказываем карту с бесконтактной оплатой, растворяем в ацетоне, а дальше пайка и т.п. Пополнить ее можно в онлайн банкинге. Но это уже другая история…
Для себя решил, что пропуска и ключа от домофона пока достаточно. Вшивать RFID под кожу пока не время, а вот расположить их в удобных местах вполне возможно.
На этом спасибо, что дочитали до конца. Прошу прощения за возможные ошибки и неточности. В общем как умею…
Всем добра!
RFID-модуль RC522
Товары
Радиочастотная идентификация (RFID) — это технология бесконтактной идентификации объектов при помощи радиочастотного канала связи. Идентификация объектов производится по уникальному идентификатору, который имеет каждая электронная метка.
Содержание
Обзор RFID модуля RC522
Рисунок 1. RFID модуль RC522
Технические характеристики RFID-модуля RC522
Интерфейсы и назначение выводов
Микросхема MFRC522 поддерживает интерфейсы SPI, UART и I2C (см. рисунок 2). Выбор интерфейса осуществляется установкой логических уровней на определенных выводах микросхемы. На данном модуле выбран интерфейс SPI.
Рисунок 2. RFID модуль RC522 – назначение выводов
Подключение модуля к плате Arduino
Рисунок 3. Схема соединений для подключения RFID модуль RC522 к плате Arduino
На платах Arduino есть разъём ICSP. Он используется для работы по интерфейсу SPI. Назначение контактов разъёма ICSP представлено на рисунке 4. Поэтому можно для соединений использовать контакты разъёма ICSP.
Рисунок 4. Распиновка разъёма ICSP Arduino для интерфейса SPI
Для программирования модуля будем использовать arduino-библиотеку MFRC522, которую можно скачать на github (https://github.com/miguelbalboa/rfid). Загружаем на плату Arduino скетч из листинга 1 для получения типа метки и ее UID (уникального идентификатора).
Листинг 1 В качестве меток используем брелки и карты, идущие к комплекте с модулем, а также клюющиеся метки Ultrasonic C (рисунок 5).
Рисунок 5. RFID-метки для модуля RFID RC522
После загрузки скетча открываем монитор последовательного порта и видим вывод данных о типе и UID подносимой к считывателю метки (рисунок 6).
Рисунок 6. Вывод данных о типе и UID считываемых с меток
Любопытно посмотреть содержимое памяти метки (дамп памяти). Загрузим на плату Arduino скетч из листинга 2 для чтения и вывода в последовательный порт дампа памяти метки метки.
Листинг 2 И смотрим содержимое памяти для разных меток (рисунок 7). Метка Ultralight C всего 64 байта.
Рисунок 7. Вывод дампа памяти меток
И еще рассмотрим вопрос записи информации на метку. Считывание данных с метки и запись данных на метку производится поблочно. Разные метки имеют разный размер блока. Для Ultralight C размер блока 4 байта. Скетч 3 – запись данных в память метки в первые два байта 15 блока. Получаем данные по последовательному порту и записываем в метку. Затем выводим содержимое блока в последовательный порт. Листинг 3 И смотрим запись на карту данных из последовательного порта (рисунок 8).
Рисунок 8. Вывод дампа памяти меток