Метка EM4100 хранит 64 бита данных, значит, конструкция должна содержать 64-битный сдвиговый регистр, составленный из восьми 8-битных регистров 74HC165. Регистр перезагружается после каждых 64 сдвигов, чтобы сбросить данные и начать сначала. Данные на входах регистра следующие:
  • Паттерн синхронизации: девять единиц
  • Идентификатор производителя/версии: 2 блока по 5 бит, из которых 4 бита - данные, а пятый - четность
  • Уникальный идентификатор: 8 блоков по 5 бит, из которых 4 бита - данные, а пятый - четность
  • Контрольная сумма: 4 бита четности, подсчитанные по столбцам
  • Стоп-бит: «0»

Даже метки с шифрованием уязвимы для множества атак. Кроме того, становится все легче эмулировать метки на смартфонах с поддержкой NFC (которые обычно работают на 13,56 МГц). Просто правильно напишите приложение для модуляции поля, и вы сможете делать все, что хотите.

В качестве стандартной отмазки напомню, что автор (И переводчик! - Прим. перев. ) не несет никакой ответствености за последствия использования информации из данной статьи. Читатель должен сам отвечать за все свои действия.

Корпус

Иногда очень везет. Красивый корпус не помешал бы именно сейчас, когда прототип закончен, а печатная плата заказана. И именно в это время Флеминг закончил собирать и запустил станок лазерной резки OSAA PhotonSaw . После года работы над проектом лазер готов вырезать свои первые детали. Флемминг и Рун делают последние юстировки и ставят на место алюминиевую крышку лазерного шкафа. Вы можете себе представить, как все мы были рады видеть, что эта штука работает.

С работающим станком мы получили возможность протестировать наш проект в реальной жизни. Корпус для нашей RFID-метки сделали из 2-миллиметрового огрстекла. Этот корпус - первый объект, сделанный на PhotonSaw, да!

Родилась идея расположить катушку на внешней стороне корпуса. Сперва было решено использовать половину высоты корпуса, но это не работало на практике (дополнительные отверстия в длинных сторонах, таким образом, не используются). Катушка просто великолепно разместилась по периметру всего корпуса, хотя у меня были сомнения, не будет ли прямоугольная обмотка (105x55 мм) слишком большой для нормальной электромагнитной связи.

Тестовая катушка была намотана, без всяких расчетов, проводом 0,4 мм в 66 витков. И, очевидно, нам опять повезло, потому что катушка получилась точно такой как надо, индуктивностью 645 мкГн, с подключенной меткой давая резонансную частоту 125,2 кГц. Тест на дверном считывателе показал, что прототип работает просто прекрасно с этой катушкой.

С катушкой снаружи корпуса толщину последнего можно уменьшить. Внутренняя толщина теперь зависит только от высоты деталей на плате, и с учетом толщины платы должна составлять около 6 мм. Кроме того, было бы хорошо добавить гравировку. Флемминг предложил скруглить боковые стороны корпуса из эстетических и эргономических соображений. Изогнутый корпус также будет лучше защищать боковые стороны катушки, потому что там, где нет сильного натяжения, витки провода любят вылезать наружу.

Станок PhotonSaw еще не совсем в нормальном состоянии: гравировка на верхней крышке значительно съехала. Необходимо его окончательно отладить перед изготовлением финальной версии корпуса. Изогнутые контуры также подверглись ошибке расчета в программном обеспечении, так как луч не вернулся в начальное положение после прохода замкнутой траектории. Но во всяком случае, кривые выглядят действительно гладкими.

Сборка печатной платы

Прибыла заказанная плата:

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

Через разделительную емкость (47 пФ имеют сопротивление примерно 27 кОм на частоте 125 кГц) и защитные диоды ток поступает на шины питания. Энергии, поступающей с катушки, хватает на поддержание напряжения питания около 1 В. Ток может достигать 250-500 мкА. Удивительно, но микросхемы 74HC, похоже, работают при таком питании. К сожалению, при таком напряжении происходят довольно странные вещи. Микросхемы 74HC имеют внутреннюю схему сброса, и нужно убедиться, что она срабатывает. Обратите внимание, что отключение защитных диодов не помогает. На входах микросхем есть внутренние защитные диоды, которые в этом случае открываются и выполняют ту же работу.

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

Симптомы наблюдались следующие: метка работает некоторое время, при этом посылая корректные данные. Если катушку убрать от считывателя, а затем вернуть обратно, можете делать ставки, выключится ли при этом метка. Иногда срабатывает, иногда - нет. Отключение ФАПЧ ухудшает ситуацию. Низкое энергопотребление приводит к тому, что ридер время от времени будет принимать данные от выключенной метки. Вот что значит «энергоэффективная система».

Существует два решения: 1) уменьшить конденсатор в цепи восстановления тактового сигнала до 15 пФ, и 2) включить между питанием и землей резистор 22-100 кОм для сброса лишней энергии. Второй метод приводит к росту утечек во время работы и на самом деле не требуется при уменьшении емкости конденсатора. Тем не менее, он предусмотрен как опция, и это все равно лучше, чем неопределенное состояние микросхем.

Модуляция током или напряжением

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

Причина оказалась в схеме модулятора. МОП-транзисторы замыкают катушку на резистор определенного сопротивления. Однако, если потребление энергии из контура велико, сопротивление модулятора значительно выше, чем сопротивление цепей питания. Это приводит к тому, что глубина модуляции зависит от потребляемого тока, а это не очень хорошо. Ситуацию ухудшил выбор ограничительного стабилитрона на более низкое напряжение, чем в прототипе.

Было принято решение перевести модулятор из режима модуляции напряжением в режим модуляции током. Для первого режима резистор находился в цепи стока, а теперь он включен между истоком и землей. На этом резисторе будет падать напряжение затвор-исток, пока не останется значение чуть выше порога открывания транзистора (0,9-1,1 В), которое переведет транзистор в линейный режим. Теперь ток через транзистор будет стабильным, независимо от напряжения на стоке.

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

Законченная версия 1

Можно заметить внесенные изменения на печатной плате. У меня не было 15 пФ SMD-конденсатора, пришлось впаять обычный, с ногами. Модулятор оброс дополнительными резисторами на истоках транзисторов. В целом приемлемо для первой версии.

(картинки кликабельны)





Видео-демонстрация

Заключение

Вы можете подумать, что этот проект, собранный на логике 7400, можно отнести к ретро-схемотехнике, но это не совсем так. Во-первых, современное семейство 74HC не такое уж и старое. Во-вторых, низкопотребляющие схемы всегда актуальны. В-третьих, микросхемы одиночных логических элементов (такие, как использованный триггер Шмитта) часто используются в современных разработках. Часто забывают, что развитие технологий не прекращается и для старых семейств микросхем. Они просто стали менее заметны на фоне общего разнообразия.

Аналоговая часть оказалась сложнее в разработке, чем цифровая. Частично из-за отсутствия спецификаций, но в основном, за счет множества компромиссов, необходимых для соответствия параметрам, и непредвиденных побочных эффектов. Цифровые конструкции имеют относительно мало вариантов, в то время как аналоговые обычно требуют баланса между различными (и часто противоположными) критериями.

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

Теперь посмотрим, как этот проект покажет себя на конкурсе 7400 2012 года. Подача заявок на конкурс заканчивается 31 ноября. Пожелаем автору удачи! - Прим. перев.

Теги:

  • RFID
  • 7400 Contest
  • overengineering
  • логические схемы
  • грабли повсюду
Добавить метки

Характеристики:
Частота метки: 125 кГц
Источник питания: +5 В постоянного тока
Выводимые данные: последовательно, 2 400 б/с 8N1. Выдается 10-цифровой серийный номер метки.

Рисунок 1: Рисунок 2:

Введение

Данный RFID-считыватель работает с метками частотой 125 кГц в картах размером с кредитную карточку и 125 кГц брелоках (Рисунок 1). При этом используется протокол EM4100 . Когда вы приближаете RFID-метку на близкое расстояние (4-5 см) к катушке считывателя (L1), считыватель считает 10-цифровой уникальный идентификатор метки и передаст его как ASCII символы через последовательных выход со скоростью 2 400 бит в секунду.

В схему входит сигнализатор, который издает прерывистые звуковые сигналы, когда метка успешно считывается.

Описание

Я попытаюсь в нескольких словах объяснить, как работает RFID-считыватель. Контроллер ATtiny13 используется функцию PWM для создания прямоугольного импульсного сигнала частотой 125 кГц. Данный сигнал выходит с вывода PB0. По заднему фронту импульса на выводе PB0 (Логический ноль "0"), транзистор T1 закрыт. Таким образом, катушка L1 возбуждается через резистор R1 (номиналом 100 Ом) от напряжения +5V. Когда импульс на выводе PB0 растет (Логическая единица "1") транзистор T1 открывается и один из выводов катушки L1 соединяется с землей GND. К катушке L1 параллельно подсоединяется конденсатор C2, создавая LC генератор. Данные переключения катушки L1 от логической единицы к логическому нулю происходят 125 000 раз в секунду (125 кГц).

Рисунок 3: Колебания сигнала частотой 125 кГц, которые передаются от катушки L1 и конденсатора C2.

RFID-считыватель передает энергию к транспондеру (метке) путем создания электромагнитного поля. Передача энергии между RFID-считывателем и меткой происходит на том же принципе, что и работа трансформаторов, преобразующих напряжение 220 В сети переменного тока в 12 В переменного тока, благодаря магнитному полю, которое создает первичная обмотка. В нашем случае первичная обмотка – это RFID-считыватель, а вторичная обмотка – это RFID-метка. Разница лишь в том, что в схеме RFID-считывателя нет стального магнитопровода между двумя катушками (одна катушка располагается на стороне считывателя, а другая катушка в RFID-метке). Компоненты D1 ,C3 и R5 составляют демодулятор AM сигнала (AM = Амплитудная модуляция).

Передача данных между метками и считывателем.

Как метки передают данные в считыватель? Очень просто! Когда метка хочет передать логический ноль "0" в считыватель, она прилагает "нагрузку" к своей линии источника питания для получения большей энергии из считывателя. Это вызывает небольшое падение напряжения на стороне RFID-считывателя. Этот уровень напряжения является логическим нулем "0" (смотрите рисунок 4). Одновременно с передачей считывателем сигнала частотой 125 кГц, он считывает напряжение передаваемого сигнала через фильтры D1, C3 и R5, C1. Когда метка снижает напряжение, как было сказано ранее, считыватель считывает данное падение напряжение как логический ноль "0". Если метка не требует дополнительной энергии, она не вызывает падение напряжения. Это соответствует логической единице "1" (Рисунок 3). Длина "единиц" или "нулей" зависит от скорости передачи последовательной передачи данных. Например, для несущей частоты 125 кГц мы не получаем скорость передачи данных 125 000 бит в секунду! Передача данных от метки в считыватель изменяется от 500 до 8 000 бит в секунду.

Рисунок 4: Снимок экрана передаваемых данных...10101... Рисунок 5


  • 125 кГц RFID-метка передает 64 бита.
    1. Первые 9 бит – это стартовые биты передачи (всегда "1").
    2. Следующие 4 бита – это младшие биты идентификатора пользователя (D00,..., D03).
    3. Следующий 1 бит (P0) – это бит контроля четности предыдущих 4 бит.
    4. Следующие 4 бита – это старшие биты идентификатора пользователя (D04,..., D07).
    5. Следующий 1 бит (P1) – это бит контроля четности предыдущих 4 бит.
    6. Следующие 4 бита – это первая часть 32-битного серийного номера метки (D08,..., D11).
    7. Бит PC0 – это бит контроля четности битов D00, D04, D08, D12, D16, D20, D24, D28, D32 и D36 (биты располагаются в одной колонке).
    8. Биты PC1, PC2, PC3 представляют собой биты четности следующих трех колонок.

Верификация данных выполняется с помощью контроллера ATtiny13, путем вычисления бита контроля четности каждой строки и каждой колонки с битами четности, которые получены в передаваемых данных RFID-метки.

Изготовление катушки

Катушка имеет диаметр 120 мм и 58 витков. На всякий случай, оставьте немного медного провода для дополнительных 2-3 витков (всего 60-61 витков). Для достижения максимального расстояния между RFID-меткой и считывателем (между меткой и антенной-катушкой считывателя) вам необходимо откалибровать катушку. Если подключить осциллограф в общую точку соединения R1 и L1 вы увидите место, помеченное красным кружком на рисунке слева. Это означает, что катушка L1 должна быть откалибрована.

Как откалибровать катушку L1?

Включите RFID-считыватель:

1. После подключения щупа осциллографа в общую точку R1, L1 попытайтесь медленно удалить или добавить немного медной проволоки (увеличить или уменьшить количество витков) катушки, пока шум не будет устранен.

2. Если вы не имеете осциллограф, тогда попытайтесь переместить RFID-метку близко к катушке L1, пока метка не будет распознана считывателем. Если ваша метка будет обнаружена на расстоянии 2 см от катушки L1, тогда попытайтесь добавить несколько витков медной проволоки для катушки L1, чтобы убедиться в обнаружении метки на более длинном расстоянии (например, 3 см).

Попытайтесь выполнить те же действия, удалив витки медной проволоки с катушки L1. Таким образом, вы получите максимальный диапазон расстояния между метками и катушкой L1.

Я изготовил катушку L1 диаметром 120 мм с 58 витками, но впоследствии захотел сделать ее более меньшего размера. Поэтому я согнул катушку пополам так, чтобы она стала похожа на "цифру восемь" (по форме напоминает восьмерку) и выполнил повторную калибровку. Таким образом, катушка L1 на рисунках фактически имеет диаметр менее 120 мм.

Катушка L1 на рисунке имеет диаметр 60 мм и почти 116 витков.

Программирование ATtiny13

Набор битов конфигурации (фьюзов) для ATtiny13: High Fuse: 0x1F и Low Fuse: 0x7A . Данный набор настроек ATtiny13 работает с внутренним генератором частотой 9.6 МГц. Функция деления на 8 системного тактового генератора отключена.

Прошивка версии v1.00 занимает 1024 байт и занимает 100% Flash-памяти контроллера ATtiny13. Возможно переход на любой другой 8-выводный AVR, такой как ATtiny85, будет хорошей идеей, если вы захотите добавить некоторые функции в исходный программный код.

Проект спроектирован: Вассилис Серасидис (Vassilis Serasidis ) 18 августа 2012 года
Язык программирования: С
Среда разработки:
Микроконтроллер: ATtiny13 (внутренний генератор 9.6 МГц)

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
IC1 МК AVR 8-бит

ATtiny13

1 В блокнот
IC2 Операционный усилитель

LM358

1 В блокнот
IC3 Линейный регулятор

LM78L05

1 В блокнот
T1 MOSFET-транзистор

BS170

1 В блокнот
T2 Биполярный транзистор

BC547B

1 В блокнот
D1 Выпрямительный диод

1N4148

1 В блокнот
C1 Конденсатор 12 нФ 1 В блокнот
C2 Конденсатор 1.5 нФ 1 В блокнот
C3 Конденсатор 4.7 нФ 1 В блокнот
C4, C5 Электролитический конденсатор 100 мкФ 2 В блокнот
C6 Конденсатор 100 нФ 1 В блокнот
R1 Резистор

100 Ом

1 В блокнот
R2 Резистор

1 кОм

1 В блокнот
R3 Резистор

390 кОм

1 В блокнот
R4, R8 Резистор

33 кОм

2 В блокнот
R5 Резистор

270 кОм

1 В блокнот
R6 Резистор

Сегодня я расскажу про RFID модуль RC522 , на базе чипа MFRC522. Питание 3.3В, дальность обнаружения до 6см. Предназначен для чтения и записи RFID меток с частотой 13.56 МГц. Частота в данном случае очень важна, так как RFID метки существуют в трех частотных диапазонах:


  • Метки диапазона LF (125—134 кГц)

  • Метки диапазона HF (13,56 МГц)

  • Метки диапазона UHF (860—960 МГц)

Конкретно этот модуль работает с метками диапазона HF, в частности с протоколом MIFARE.

Для работы с модулем можно использовать стандартную библиотеку RFID входящую в Arduino IDE, однако есть и другая библиотека, написанная специально под данный модуль - MFRC522 (1 Мб) . Обе библиотеки вполне удобны, однако в MFRC522 больше специальных функций, позволяющих максимально сократить итоговый код программы.

Подключение

Некоторые столкнуться с проблемой - название пинов в большинстве уроков и руководств может не соответствовать распиновке на вашем модуле. Если в скетчах указан пин SS, а на вашем модуле его нет, то скорее всего он помечен как SDA. Ниже я приведу таблицу подключения модуля для самых распространенных плат.

MFRC522 Arduino Uno Arduino Mega Arduino Nano v3

Arduino Leonardo/ Micro

Arduino Pro Micro
RST 9 5 D9 RESET/ICSP-5 RST
SDA(SS) 10 53 D10 10 10
MOSI 11 (ICSP-4) 51 D11 ICSP-4 16
MISO 12 (ICSP-1 ) 50 D12 ICSP-1 14
SCK 13 (ICSP-3) 52 D13 ICSP-3 15
3.3V 3.3V 3.3V Стабилизатор 3,3В Стабилизатор 3,3В Стабилизатор 3,3В
GND GND GND GND GND GND

Пины управления SS(SDA) и RST задаются в скетче, так что если ваша плата отличается от той, что я буду использовать в своих примерах, а использую я UNO R3, указывайте пины из таблицы в начале скетча:


#define SS_PIN 10 #define RST_PIN 9

Пример №1: Считывание номера карты

Рассмотрим пример из библиотеки RFID - cardRead. Он не выдает данные из карты, а только ее номер, чего обычно бывает достаточно для многих задач.


#include #include #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); // Данные о номере карты храняться в 5 переменных, будем запоминать их, чтобы проверять, считывали ли мы уже такую карту int serNum0; int serNum1; int serNum2; int serNum3; int serNum4; void setup() { Serial.begin(9600); SPI.begin(); rfid.init(); } void loop() { if (rfid.isCard()) { if (rfid.readCardSerial()) { // Сравниваем номер карты с номером предыдущей карты if (rfid.serNum != serNum0 && rfid.serNum != serNum1 && rfid.serNum != serNum2 && rfid.serNum != serNum3 && rfid.serNum != serNum4) { /* Если карта - новая, то считываем*/ Serial.println(" "); Serial.println("Card found"); serNum0 = rfid.serNum; serNum1 = rfid.serNum; serNum2 = rfid.serNum; serNum3 = rfid.serNum; serNum4 = rfid.serNum; //Выводим номер карты Serial.println("Cardnumber:"); Serial.print("Dec: "); Serial.print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.println(" "); Serial.print("Hex: "); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.println(" "); } else { /* Если это уже считанная карта, просто выводим точку */ Serial.print("."); } } } rfid.halt(); }

Скетч залился, светодиод питания на модуле загорелся, но модуль не реагирует на карту? Не стоит паниковать, или бежать искать "правильные" примеры работы. Скорее всего, на одном из пинов просто нет контакта - отверстия на плате немного больше чем толщина перемычки, так что стоит попробовать их переставить. На плате не горит светодиод? Попробуйте переставить перемычку, ведующую в 3.3В, и убедитесь, что на плате она подключена именно к 3.3В, подача питания в 5В может вашу плату запросто убить.

Допустим, все у вас заработало. Тогда, считывая модулем RFID метки, в мониторе последовательного порта увидим следующее:


Здесь я считывал 3 разных метки, и как видно все 3 он успешно считал.

Пример №2: Считывание данных с карты

Рассмотрим более проработанный вариант - будет считывать не только номер карты, но и все доступные для считывания данные. На этот раз возьмем пример из библиотеки MFRC522 - DumpInfo.


#include #include #define RST_PIN 9 // #define SS_PIN 10 // MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance void setup() { Serial.begin(9600); // Инициализируем монитор последовательного порта while (!Serial); // Ничего не делаем пока он не открыт (для Arduino на чипе ATMEGA32U4) SPI.begin(); // Инициализируем SPI шину mfrc522.PCD_Init(); // Инициализируем RFID модуль ShowReaderDetails(); // Выводим данные о модуле MFRC522 Serial.println(F("Scan PICC to see UID, type, and data blocks...")); } void loop() { // Ищем новую карту if (! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбираем одну из карт if (! mfrc522.PICC_ReadCardSerial()) { return; } // Выводим данные с карты mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); } void ShowReaderDetails() { // Получаем номер версии модуля byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg); Serial.print(F("MFRC522 Software Version: 0x")); Serial.print(v, HEX); if (v == 0x91) Serial.print(F(" = v1.0")); else if (v == 0x92) Serial.print(F(" = v2.0")); else Serial.print(F(" (unknown)")); Serial.println(""); // Когда получаем 0x00 или 0xFF, передача данных нарушена if ((v == 0x00) || (v == 0xFF)) { Serial.println(F("WARNING: Communication failure, is the MFRC522 properly connected?")); } }

Если предыдущий пример работал без ошибок, то и в этом проблем возникнуть не должно. Хотя, проездной на метро, без проблем выдававший номер карты в предыдущем примере, в этом оказался с неопределяемым типом данных, и модуль ничего кроме номера карты считать не смог.

Как результат, считав данные с карты, получим ее тип, идентификатор, и данные из 16 секторов памяти. Следует отметить, что карты стандарта MIFARE 1K состоят из 16 секторов, каждый сектор состоит из 4 блоков, а каждый блок содержит 16 байт данных.


Пример №3: Запись нового идентификатора на карту

В этом примере мы рассмотрим смену идентификатора карты (UID). Важно знать, что далеко не все карты поддерживают смену идентификатора. Карта может быть перезаписываемой, но это означает лишь перезаписываемость данных. К сожалению, те карты, которые были у меня на руках, перезапись UID не поддерживали, но код скетча я здесь на всякий случай приведу.


#include #include /* Задаем здесь новый UID */ #define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF} #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!")); for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } } void loop() { if (! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial()) { delay(50); return; } // Считываем текущий UID Serial.print(F("Card UID:")); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); // Записываем новый UID byte newUid = NEW_UID; if (mfrc522.MIFARE_SetUid(newUid, (byte)4, true)) { Serial.println(F("Wrote new UID to card.")); } // Halt PICC and re-select it so DumpToSerial doesn"t get confused mfrc522.PICC_HaltA(); if (! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial()) { return; } // Считываем данные с карты Serial.println(F("New UID and contents:")); mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); delay(2000); }

Пример №4: Запись данных на карту

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

Изменим один из блоков данных на карте:


#include #include #define RST_PIN 9 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); // Подготовим ключ // используем ключ FFFFFFFFFFFFh который является стандартом для пустых карт for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write.")); Serial.print(F("Using key (for A and B):")); dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE); Serial.println(); Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1")); } void loop() { // Ждем новую карту if (! mfrc522.PICC_IsNewCardPresent()) return; // Выбираем одну из карт if (! mfrc522.PICC_ReadCardSerial()) return; // Показываем подробности карты Serial.print(F("Card UID:")); dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); Serial.println(); Serial.print(F("PICC type: ")); byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType)); // Проверяем совместимость if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Serial.println(F("This sample only works with MIFARE Classic cards.")); return; } // В этом примере мы используем первый сектор данных карты, блок 4 byte sector = 1; byte blockAddr = 4; byte dataBlock = { // Данные, которые мы запишем на карту 0x01, 0x02, 0x03, 0x04, // 1, 2, 3, 4, 0x05, 0x06, 0x07, 0x08, // 5, 6, 7, 8, 0x08, 0x09, 0xff, 0x0b, // 9, 10, 255, 12, 0x0c, 0x0d, 0x0e, 0x0f // 13, 14, 15, 16 }; byte trailerBlock = 7; byte status; byte buffer; byte size = sizeof(buffer); // Аутентификация Serial.println(F("Authenticating using key A...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // Показываем текущие данные сектора Serial.println(F("Current data in sector:")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); // Читаем данные из блока Serial.print(F("Reading data from block ")); Serial.print(blockAddr); Serial.println(F(" ...")); status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":")); dump_byte_array(buffer, 16); Serial.println(); Serial.println(); // Аутентификация Serial.println(F("Authenticating again using key B...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // Записываем данные в блок Serial.print(F("Writing data into block ")); Serial.print(blockAddr); Serial.println(F(" ...")); dump_byte_array(dataBlock, 16); Serial.println(); status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.println(); // Читаем данные снова, чтобы проверить, что запись прошла успешно Serial.print(F("Reading data from block ")); Serial.print(blockAddr); Serial.println(F(" ...")); status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":")); dump_byte_array(buffer, 16); Serial.println(); Serial.println(F("Checking result...")); byte count = 0; for (byte i = 0; i < 16; i++) { if (buffer[i] == dataBlock[i]) count++; } Serial.print(F("Number of bytes that match = ")); Serial.println(count); if (count == 16) { Serial.println(F("Success:-)")); } else { Serial.println(F("Failure, no match:-(")); Serial.println(F(" perhaps the write didn"t work properly...")); } Serial.println(); // Выводим данные Serial.println(F("Current data in sector:")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); } void dump_byte_array(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], HEX); } }

И как результат, получаем карту с измененным блоком данных:


Теперь, научившись считывать и записывать блоки данных карты, вы можете поэксперементировать с метками, которые скорее всего есть у вас - пропуски, проездные общественного транспорта. Попробуйте считывать и записывать данные с этих карт, пара дубликатов пропуска никогда не помешает, так ведь?)

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

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

Я решил сам разобраться в этой технологии. Для этого я заказал нужные компоненты и собрал RFID считыватель своими руками.

В данной статье я расскажу, как собрать работающий считыватель RFID-меток.

Шаг 1


В одной из прочитанных мною статей автор говорил, что его мобильный RFID считыватель работал только на частоте 13,56 МГц (короткая волна), но на частоте 1,25 кГц (длина волны ниже границы АМ-диапазона) не работал. Я же сделал считыватель, работающий на стандартной для всей этой отрасли частоте 125 кГц. Это значит, что для моего считывателя нужна другая комбинация антенны и конденсатора. Это иллюстрируют базовая схема и базовая формула. Чтобы получить нужное значение, выберите соответствующую формулу, подставьте ваши значения и с помощью калькулятора получите результат.

Список компонентов:

  • Около 12 м тонкой проволоки, от 22 до 30 калибра (я использовал 30 калибр).
  • Любой диод (я использовал красный).
  • Один 0,005 мкФ конденсатор или два дисковых конденсатора 0,01 мкФ, соединенных последовательно.
  • 2-5 дисковых конденсатора 100 пФ.
  • Основание для катушки (любое основание, диаметр катушки должен быть 10 см).
  • Печатная плата для прототипирования, для пробных сборок.
  • Печатная плата для аккуратной и точной сборки.
  • Возможность доступа к считывателю, чтобы снимать показания приемника.
  • Элементы питания не потребуются, так как приемник питается беспроводным способом от считывателя.

Шаг 2



Сначала я намотал проволоку на основу примерно 10 см в диаметре (я больше чем уверен, что пара сантиметров плюс-минус роли не сыграют).

Когда проволока была намотана на основание, я сравнил катушку с другими катушками, которые у меня уже были. Так я примерно оценил индуктивность новой катушки – у меня вышло около 330 мкгн.

Я подставил значение 330 мкгн в формулу и полученный результат значил, что для этой катушки нужен 0,005 мкФ конденсатор, чтобы пара катушка-конденсатор «резонировала» на частоте 125 кГц, а тока было достаточно для питания диода.

Прежде чем приступить к пайке, я сделал предварительную сборку на макетной плате.

Шаг 3


На макетной плате сначала соединяем катушку, диод и два дисковых 0,01 мкФ конденсатора (соединены последовательно друг с другом, а затем параллельно с диодом, что дает общую емкость 0,005 мкФ (5000 пФ)), затем включаем считыватель радиометок. При положении считывателя на расстоянии около 10 см от катушки горит диод. Диод горит очень ярко на расстоянии примерно 1,5 см.

Затем я добавил 100 пФ (0,0001 мкФ) конденсатор параллельно электросхеме, это увеличило радиус действия считывателя. Затем я выяснил, что добавив второй такой же конденсатор параллельно всей схеме я еще больше увеличу радиус действия считывателя. А добавление третьего конденсатора, напротив, уменьшило этот радиус. Таким образом, я установил, что емкость 5200 пФ является оптимальной для моей катушки (иллюстрация третьей попытки).

Мой приемник срабатывал бы на 10 см при использовании 0,005 мкФ конденсатора в параллельном соединении с катушкой и диодом, но макетная плата позволила использовать дополнительные конденсаторы и, тем самым, увеличила расстояние до 12,5 см.

Шаг 4




Фотографии наглядно показывают, как увеличивается яркость свечения диода по мере приближения катушки к считывателю.
Это маленькое устройство работает на частоте 125 кГц. Его достаточно просто собрать, используя более-менее подходящие материалы.

Шаг 5

Все компоненты, использованные в пробной сборке на макетной плате, я собрал на печатной плате и спаял их. Потом я приклеил схему к катушке, чтобы все устройство можно было перемещать с места на место просто в руке, без лишних проводов или соединений. Устройство работает нормально. Я ожидал, что оно будет реагировать на все считыватели радиометок в пределах 7-12 см и работающие на частоте 125 кГц.

Шаг 6

Так как я знаю, что максимальное свечение диода на заданном расстоянии достигается при емкости 0, 0052 мкФ, я вставил это значение вместе с длиной волны 125 кГц в соответствующую формулу и получил значение индуктивности 312 мкгн, вместо 330 мкгн, на которые я рассчитывал.

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