Домой / Игры / Бюджетный UHF RFID считыватель и его развитие. RFID –это просто. Реализация собственного RFID транспондера и ридера

Бюджетный UHF RFID считыватель и его развитие. RFID –это просто. Реализация собственного RFID транспондера и ридера

Из всем полюбившейся (по крайней мере, я на это очень надеюсь) серии «Взгляд изнутри» - больше полугода. Не то, чтобы не было, о чём написать или рассказать, просто одолели дела, которые станут предметом одной из следующих моих статей на Хабре (надеюсь, что её не отправят в утиль, так как посвящена она будет не совсем ИТ-тематике). А пока есть свободная минуточка, давайте разберёмся, что же такое RFID (Radio-frequency identification) – к ним примкнут более простые метки – или как один небольшой шаг в технологиях круто изменил жизнь миллионов и даже миллиардов людей по всему миру.

Предисловие

Сразу хотелось бы оговориться.

Перед началом работы над этой статьёй, я очень надеялся, что по микрофотографиям, а особенно по оптике, информации, найденной на просторах Интернета, и некоторому багажу знаний от прошлых публикаций удастся определить, где и какие элементы микросхемы находятся. Хотя бы на «бытовом» уровне: мол, вот это - память, вот это - схема питания, а вот тут происходит обработка информации. Действительно, казалось бы, RFID – простейшее устройство, самый простейший «компьютер», который только можно придумать…

Однако жизнь внесла свои коррективы и всё, что удалось мне найти: общая схема устройства нового поколения меток , фотографии того, как, например, должна выглядеть память – даже не знаю, почему я не уделил этому внимание (может быть ещё представится возможность исправиться?!), ну и скандалы-интриги-разоблачения процессоров A5 от chipworks .

Часть теоретическая

По традиции начнём с некоторой вводной части.
RFID
История технологии радиочастотного распознавания – пожалуй, именно так можно назвать все мыслимые и немыслимые варианты RFID (radio-frequency identification) – уходит своими корнями в 40-ые года XX века, когда в СССР, Европе и США активно велись разработки вообще любых видов электронной техники.

В то время, любое изделие, работающее на электричестве, было всё ещё в диковинку, так что перед учёными лежало не паханое поле: куда не ткни, как в Черноземье, черенок от лопаты – вырастет дерево. Судите сами: свои законы Максвелл предложил всего-навсего полвека назад (в 1884 году). А теории на основе этих уравнений стали появляться спустя 2-3 десятилетия (между 1900 и 1914), в том числе и теории радиоволн (от их открытия, до моделей модуляции сигнала и т.д.). Плюс подготовка и ведение второй мировой войны наложили свой отпечаток на данную область.

В результате к концу 40-х годов были разработаны системы распознавания «свой-чужой», которые были несколько побольше, чем описанные , но работали фактически по тому же принципу, что и современные RFID-метки.

Первая демонстрация близких к современных RFID была проведена в 1973 году в Исследовательской Лаборатории Лос Аламоса, а один из первых патентов на подобного рода систему идентификации получен спустя десятилетие – в 1983 году. Более подробно с историей RFID можно ознакомиться на Wiki и некоторых других сайтах ( и ).

Активные метки за счёт встроенной батарейки имеют существенно больший радиус работы, габариты, более сложную «начинку» (можно дополнить метку термометром, гигрометром, да хоть целый чип GPS-позиционирования) и соответствующую цену.

Классифицировать метки можно по-разному: по рабочей частоте (LF – низкочастотные ~130КГц, HF – высокочастотные ~14MГц и UHF – ультравысокочастотные ~900МГц), по типу памяти внутри метки (только чтение, однократно записываемая и многократно записываемая). Кстати, так любимый всеми производителями и продвигаемый NFC относится к HF диапазону, который имеет ряд хорошо известных проблем.

Прочие метки
К сожалению, стоимость RFID-меток по сравнению с другими видами идентификации довольно высока, поэтому, например, продукты питания и прочие «ходовые» товары мы по-прежнему покупаем с помощью баркодов (или штрих-кодов), иногда QR-кодов, а защиту от краж обеспечивают так называемые противокражные метки (или EAS – electronic article surveillance)

Самых распространённых три вида (все фото взяты с Wiki):

Впереди нас ждёт много чудных открытий, подчас совершенно неожиданных и конечно же hard geek porn в формате HD !

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

Часть практическая

Итак, какие метки удалось найти в окружающем нас мире:


Левый столбец сверху вниз: карта московского метро, проездной аэроэкспресс, пластиковая карта для прохода в здание, RFID-метка, представленная компанией Перекрёсток на выставке РосНаноФорум-2011. Правый столбец сверху вниз: радиочастотная EAS-метка, акустомагнитная EAS-метка, бонусный билет на общественный транспорт Москвы с магнитной полосой, RFID-карта посетителя РосНаноФорума содержит даже две метки.

Первой заявлена карточка московского метрополитена – приступим.

В круге первом. Билет московского метрополитена
Сначала вымачиваем карту в обычной воде, чтобы удалить бумажные слои, скрывающие самое сердце данной «метки».


Раздетая карта московского метрополитена

Теперь аккуратненько посмотрим на неё при небольшом увеличении в оптический микроскоп:


Микрофотографии чипа карты для прохода в московский метрополитен

Чип закреплён довольно основательно и хочу обратить внимание, что все 4 «ноги» присоединены к антенне – это нам пригодится далее для сравнения с другой RFID-меткой. Сложив пластиковую основу пополам в месте, где находится чип, и слегка покачав из стороны в сторону, он легко высвобождается. В итоге имеем чип размером с игольчатое ушко:


Оптические микрофотографии чипа сразу после отделения от антенны

Что ж, поиграемся с фокусом:


Изменение положения фокуса с нижнего слоя на верхний

Теперь немного интриг.

Ходят слухи, что Микрон разрабатывает и производит чипы для московского метро собственного силам по сходной технологии Mifare (как минимум, различается крепление к антенне – ножки другой формы). 22 августа без объявления войны и вероломно направил обращение в Микрон за разъяснениями, можно ли где-то в принципе увидеть данный чип, к 3.11 ответа не поступило. Один из журналистов (а именно, Александр Эрлих) на форуме IXBT тоже собирался уточнить данную информацию у представителей Микрона, но на данный момент воз и ныне там, то есть официальные представители Микрон уклоняются от ответа на прямо поставленный вопрос.

Рассмотренный выше билет, по всей видимости, изготовлен (или только смонтирован на антенну?) на предприятии Микрон (г. Зеленоград) - см. ссылки ниже - по технологии известной в RFID-кругах фирмы NXP, о чём собственно недвусмысленно намекают 3 огромные буквы и год выпуска технологии (а может и год производства) на верхнем слое металлизации чипа. Если полагать, что 2009 относится к году запуска технологии, а аббревиатуру CUL1V2 расшифровать как Circuit ULtralite 1 Version 2 (данное предположение также подтверждается этой новостью), то на сайте NXP можно найти подробное описание данных чипов (последние две строки в списке)

Кстати, в прошлом году для участников Интернет-олимпиады по Нанотехнологиям была организована экскурсия на завод Микрон (фото- и видео отчёты), поэтому говорить, что там оборудование простаивает смысла нет, но и заявление «дядечки в белом халате», что производят они метки по стандартам 70 нм, я бы поставил под сомнение…

Согласно статистике, собранной после анализа чипов 109 билетов метро (довольно репрезентативная выборка), согласно нормальному распределению шансы найти «необычный» билет ~109^1/2 или около 10%, но они тают с каждым вскрытым билетиком…

Внимательный взгляд уже приметил главное отличие двух чипов Mifare – надпись Philips2001. В самом деле, в далёком 1998 году компания Philips купила американского производителя микроэлектроники – Mikron (не путать с нашим, зеленоградским Микроном). А в 2006 году от Philips отпочковалась компания NXP.

Также несложно заметить пометку CLU1V1C, что, исходя из вышеописанного, означает Circuit ULtralite 1 Version 1C. То есть эта метка является предшественницей Mifare, используемой московским метрополитеном, а, следовательно, совместима с ней по основным параметрам. Однако, как и в предыдущем случае 2001 – это указание на год разработки и внедрения технологии или год производства. Странно, что Аэроэкспресс использует устаревшие метки…

В круге третьем. Пластиковая карта
Как-то раз, решил я одной своей знакомой показать статьи и фотографии на Хабрахабре. После чего спросил, а есть ли у неё какая-нибудь ненужная карта для следующей статьи про RFID. Она к тому времени как раз перебралась учиться в EPFL и подарила мне карточку, по которой осуществляется проход в одно из зданий МГУ. Карта, соответственно, без какой-либо маркировки, и я даже не уверен, что на ней записано хоть что-то, кроме обычно ключа для прохода в здание.
Карточка полностью пластиковая, поэтому сразу кладём её в ацетон буквально на пару десятков минут:


Принимаем ацетоновые ванны

Внутри всё довольно стандартно – антенна да чип, правда, он оказался на маленьком кусочке текстолита. К сожалению, без каких-либо опознавательных знаков – типичный китайский noname. Единственное, что можно узнать об этом чипе и карте, что они изготовлены/относятся к некоторому стандарту TK41. Таких карт полно на распродажах типа ali-baba и dealextreme.

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

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


Новая метка сети магазинов «Перекрёсток»

Поступаем так же как и Mifare аккуратно отсоединяем от полимерной основы и антенны и кладём на столик оптического микроскопа:


Оптические микрофотографии метки, предполагаемой к использованию в SmartShop

По счастливой случайности (то ли клей подкачал, то ли так задумано), метку удалось оторвать от основы быстро, а поверхность её осталась без каких-либо следов клея. Хотелось бы обратить внимание, что если у Mifare все 4 контакта прикреплены к антенне (по 2 контакта на каждый её конец), то здесь мы видим, что два контакта присоединены к двум небольших площадкам, которые не контактирую с антенной.

Немножко поиграем с фокусом в разных частях метки:


Меняем фокусировку…


Максимальное увеличение оптического микроскопа

На последнем фото слева вверху, по всей видимости, запечатлён модуль EEPROM памяти, так как он занимает около трети поверхности чипа и имеет «регулярную» структуру.

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

Результат: когда кладем ноутбук на «зарядку», то автоматически включается розетка с его зарядным устройством. А в остальное время розетка, понятно, выключена. Не сказать, что особо полезно, но - развлечение.

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

Для понимания: этот считыватель - не законченное устройство, а периферия для контроллера или компьютера. По этой причине для использования потребуется некоторое количество усилий. Готовых рецептов «из коробки» как бы нет, зато все остальное зависит от фантазии и способностей.

Что обычно делают? Чаще всего - замки с открытием по карточке, учет рабочего времени, СКД для домашних животных (допуск к корму, например).

Для экспериментов я выбирал недорогой и более-менее универсальный считыватель. RFID в названии этой штуки означает технологию радиоидентификации, то есть ничего конкретно не означает. Зато из спецификаций следует, что железка совместима с распространенными RFID карточками с протоколом MIFARE.

Скорее всего, вы неоднократно встречались с такими карточками. Чаще всего - в виде офисного пропуска. Другой яркий пример - бесконтактные билеты для прохода в метро.

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

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

Гребенок в комплекте было две, но одну (угловую) я, простите уже запаял. Поэтому вида платы без гребенок нет

Этот комплект включает в себя считыватель, гребенку для простого макетирования и даже монтажа на «материнскую» плату и два идентификатора: карточку MIFARE 1K и аналогичный по возможностям брелок. То есть, вполне достаточно для экспериментов.

.

.

.

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

С батарейкой ААА

Т.е. можно не мучить себя компромиссом между удобством и универсальностью (гребенкой) и экономией места в расчете на встраивание (прямой пайкой проводов).

Среди прочего на плате также есть красный светодиод, который, увы, совершенно неинформативен. Суть в том, что он горит даже при оторванном питании - очевидно, достаточно уровней на SPI-интерфейсе. Да и на карточки он никак не реагирует.

Одним словом - горит, когда считыватель хоть как-то подключен к Arduino, что не гарантирует его работоспособности.

Что касается дальности срабатывания, то субъективно порог находится на расстоянии 2 см от поверхности платы. В пределах 2 - 2.5 см - область неуверенного срабатывания.

Характеристики (от продавца):

Напряжение: 3.3В

Потребляемый ток в активном состоянии:13-26 мА

Потребляемый ток в состоянии ожидания: 10-13 мА

Ток в режиме сна: менее 80 мкА

Пиковое потребление: менее 30 мА

Рабочая частота: 13.56 МГц

Поддержвиаемые типы карт: MIFARE S50, MIFARE S70, MIFARE UltraLight, MIFARE Pro, MIFARE DESfire

Интерфейс: SPI

Размеры: 40х60 мм

Из приведенного выше видно, что отличился я дважды. Во-первых, не посмотрел на напряжение питания. А 3.3В, между прочим, означает, что проще всего использовать эту плату с Arduino Uno, Mega и прочими (или аналогичными платами), оснащенными регуляторами напряжения и выходом 3.3В. Благо максимальный потребляемый ток не выходит за пределы возможностей платформы.

В противном случае необходимо либо использовать единое питание 3.3В, либо дополнительный регулятор/стабилизатор/преобразователь напряжения.

Во-вторых, интерфейс SPI в требует 5 (!) проводов для подключения. Т.е. в сумме к считывателю подходит шлейф из 7 проводников, а это довольно расточительно. Для экономии имело смысл ориентироваться на I2C, но где я и где этот смысл?!

Подключение
Я бы хотел разделить подключение на софт и хард, но все так тесно переплелось - и вылилось в не очень интересную проблему.

Одним словом, все знают для RC522. Но почему-то никто не задается вопросом, почему в ридми, приложенном к библиотеке и в табличке в одном из ее примеров совершенно разная «распиновка» подключения считывателя.

Полагаю, это как раз одна из причин вечных проблем с этой библиотекой. Вторая причина в том, что подключение для Arduino Uno и Mega производится к разным пинам. Это связано с особенностью платформ.

Наконец, третья причина - два пина (SS и RST) допускают произвольное подключение и конфигурируются в коде. При этом по умолчанию в коде примера забита конфигурация для Arduino Uno, а если у вас Mega и вы подключали по агитке из ридми или таблички в начале примера, то, разумеется, промахнетесь.

Но фишка в том, что третья причина довольно очевидна, и ее я более-менее обошел, сразу задав свои пины, потому что у меня под руками была плата Arduino Mega. Поэтому же, кстати, меня обошла и вторая беда.

А вот первая - подключение пинов SPI помучила меня вдоволь. Я же и предположить не мог, что человек, сделавший успешную библиотеку, мог так накосячить в банальном подключении трех проводочков.

Иными словами, подключение ни по первому, ни по второму варианту, указанному в описании библиотеки, не помогло. Сначала я подумал, что у меня «мертвая плата». Поэтому, несмотря на позднее время, взял себя в руки и распаял гребенку на вторую (я запасливый и купил сразу три). Результат оказался аналогичным, несмотря на то, что я неоднократно проверял подключение по имеющимся на руках «распиновкам».

Даже не спрашивайте, почему я не пошел на Arduino.cc, чтобы посмотреть, как разведен SPI на Mega. По-моему, это случилось какое-то помутнение.

Зато я погуглил и , который в двух словах (а не как я) описал покупку и ее подключение с библиотекой, как я понимаю, от китайских товарищей. Руки уже опускались, и спать в таком состоянии я не мог, поэтому позволил себе еще эксперимент со свеженайденной распиновкой и библиотекой.

И обе платы заработали.

Чтобы очистить совесть - загрузил пример с «проблемной» библиотекой, и он оказался рабочим тоже.

Вот такими карточками я мучил считыватель. Слева направо: карточка из комплекта, карточка с буквой N, билет метро MIFARE UltraLight, карточка РЖД

А это - как примерно выглядит дамп содержимого и вообще распознавание карточек с библиотекой RFID и ее же примером DumpInfo

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

В завершение правильная распиновка для китайской библиотеки и Mega, к которой я подключался:

Mega RC522
3.3V VCC
GND GND
RESET RST

50 MISO
51 MOSI
52 SCK
53 NSS

И для Uno (ее не проверял):

Uno RC522
3.3V VCC
GND GND
5 RST

12 MISO
11 MOSI
13 SCK
10 NSS

Вместе с большой сестрой

.

.

В результате простых испытаний, которые я все-таки выполнил, также выяснилось, что считыватель нормально записывает (вот такая игра слов) карты MIFARE 1K из тех, что были с ним в комплекте.

Вторая особенность в том, что эта штука адекватно реагирует, если к нему одновременно поднести несколько карт. Я подносил две карты, опять же, из тех, что были в комплекте. При этом пример DumpInfo из библиотеки RFID по порядку выводит содержимое обеих карт. Т.е. сначала - содержимое одной карты, а следом за ней - второй.

И шашечки, и ехать
Итак, подключили, полюбовались на дамп содержимого памяти карточек MIFARE 1K. Что дальше? А дальше мне было немного лень возиться с розеткой, и я вспомнил, что карточки метро, вроде бы, работают по тому же протоколу.

Сходил, взял свою, приложил, полюбовался на ее содержимое. Как и обещали: MIFARE UltraLight, 64 байта памяти и не очень понятно, где там поездки, где срок действия, ну и вообще не очень понятно.

Гугление на тему использования Arduino с этими карточками не дало ничего особо полезного. Чаще всего карточки метро, как выяснилось, используют в качестве ультрадешевых (т.е. бесплатных) NFC-меток во всяких самодельных системах вроде замков, исполнения сценариев и прочего, где достаточно знать серийный номер карты для идентификации. А вот готовых библиотек и решений для вывода информации о поездках я почему-то не нашел: то ли так спать хотел, то ли их действительно нет (см. синдром «Неуловимого Джо»).

Зато я нашел замечательный и очень романтичный текст авторства Александра «Dark Simpson» Симонова под заголовком " ", опубликованный, судя по всему, в каком-то из номеров Хакера. Несмотря на любопытную природу текста, в нем есть масса полезной информации о структуре хранения данных, в том числе на интересующих меня билетах.

Значащая часть билета - номер - проверяемая визуально

Так что на следующий день я постарался переборость свое отвращение к HEX и полез разбираться. Вот такой дамп билета я получил с помощью библиотеки RFID:

Card UID: 04 6F 25 62 04 33 82
PICC type: MIFARE Ultralight or Ultralight C

Page 0 1 2 3
0 04 6F 25 C6
1 62 04 33 82
2 D7 48 F0 00
3 00 07 FF FC
4 45 DA 21 06
5 D0 E5 3D 00
6 1F E8 00 00
7 1F E8 00 00
8 1F 8F 5A 00
9 40 19 2E D2
10 19 91 59 7C
11 1F AB 91 C8
12 1F 8F 5A 00
13 40 19 2E D2
14 19 91 59 7C
15 1F AB 91 C8

Здесь Card UID - уникальный идентификатор карты (суть серийный номер), а остальное - 16 страниц памяти, каждая из которых содержит по 4 байта. Вместе - 64 байта.

Из чтения текста про билеты метро отметил наиболее полезные моменты:

1) Номер билета (который отпечатан на нем) зашит в 32 битах, начиная с 21 бита на странице 4: 10 6D 0E 53;

2) Дата выдачи билета в днях, прошедших с 01.01.1992 г. - первые два байта странице 8: 1F 8F;

3) Срок действия в днях - третий байт на странице 8: 5А.

4) Наконец, количество оставшихся поездок - второй байт на странице 9: 19.

С этим уже можно было работать.

Немного поковырялся в примере DumpInfo из библиотеки RFID, в ее же коде, чтобы понять, какие функции за что отвечают и чем могут быть полезны, в форумах Arduino, чтобы посмотреть реализацию вычисления даты (вообще, можно на любом языке смотреть, но мне было проще искать ближе к целевой платформе).

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

#include #include #define SS_PIN 53 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // объект MFRC522 unsigned long uidDec, uidDecTemp; // для отображения номера карточки в десятичном формате byte bCounter, readBit; unsigned long ticketNumber; void setup() { Serial.begin(9600); SPI.begin(); // инициализация SPI mfrc522.PCD_Init(); // инициализация MFRC522 Serial.println("Waiting for card..."); } void loop() { // Поиск новой карточки if (! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор карточки if (! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера карточки Serial.print("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); uidDecTemp=mfrc522.uid.uidByte[i]; uidDec=uidDec*256+uidDecTemp; } Serial.println(uidDec); Serial.println(); // Выдача типа карты byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); // запрос типа Serial.print("Card type: "); Serial.println(mfrc522.PICC_GetTypeName(piccType)); // трансляция типа в читаемый вид if (piccType != MFRC522::PICC_TYPE_MIFARE_UL) { // если не билетная карта Serial.print("Not a valid card: "); // так и говорим Serial.println(piccType); // Halt PICC mfrc522.PICC_HaltA(); // остановка чипа return; } // сюда мы приедем, если чип правильный byte status; byte byteCount; byte buffer; // длина массива (16 байт + 2 байта контрольная сумма) byte pages={4, 8}; // страницы с данными byte pageByte; // счетчик байтов страницы byteCount = sizeof(buffer); byte bCount=0; for (byte i=0; i<2; i++) { // начинаем читать страницы status = mfrc522.MIFARE_Read(pages[i], buffer, &byteCount); if (status != MFRC522::STATUS_OK) { Serial.print("Read error: "); Serial.println(mfrc522.GetStatusCodeName(status));} else { if (pages[i] == 4) { bCounter = 0; // 32-битный счетчик для номера // биты 0-3 for (bCount=0; bCount<4; bCount++) { readBit = bitRead(buffer, (bCount+4)); setBitsForGood(readBit); } // биты 4 - 27 for (pageByte=5; pageByte > 2; pageByte--) { for (bCount=0; bCount<8; bCount++) { readBit = bitRead(buffer, bCount); setBitsForGood(readBit); } } // биты 28-31 for (bCount=0; bCount<4; bCount++) { readBit = bitRead(buffer, bCount); setBitsForGood(readBit); } Serial.print("Ticket number: "); Serial.println(ticketNumber, DEC); } if (pages[i] == 8) { // читаем дату выдачи Serial.print("Issued: "); unsigned int issueDate = buffer * 256 + buffer; // количество дней с 01.01.1992 в десятичном формате, 256 - сдвиг на 8 бит printIssueDate(issueDate); Serial.print("Good for (days): "); // срок действия Serial.print(buffer, DEC); Serial.println(); Serial.print("Trip reminder: "); // количество оставшихся поездок Serial.print(buffer, DEC); Serial.println(); } } } // Halt PICC mfrc522.PICC_HaltA(); } void printIssueDate(unsigned int incoming) { boolean isLeap = true; // признак високосного года int days={0,31,59,90,120,151,181,212,243,273,304,334}; // последний по порядку день месяца для обычного года byte dayOfMonth, monthCounter; unsigned int yearCount; incoming = incoming+1; // подогнал под ответ, но возможно это как раз необходимая коррекция, потому что начало отсчета - 01.01.1992, а не 00.01.1992 for (yearCount = 1992; incoming >366; yearCount++) { // считаем год и количество дней, прошедших с выдачи билета if ((yearCount % 4 == 0 && yearCount % 100 != 0) || yearCount % 400 == 0) { incoming = incoming - 366; isLeap = true; } else { incoming = incoming - 365; isLeap = false; } } for (monthCounter = 0; incoming > days; monthCounter++) { // узнаем номер месяца } // считаем день месяца if (isLeap == true) { // если високосный год if (days>31) { // если не первый месяц, то добавляем к последнему дню месяца единицы dayOfMonth = incoming - (days+ 1); } else { dayOfMonth = incoming - (days); // если первый - ничего не добавляем, потому что сдвиг начинается с февраля } } else { dayOfMonth = incoming - (days); // если не високосный год } Serial.print(dayOfMonth); Serial.print("."); Serial.print(monthCounter); Serial.print("."); Serial.print(yearCount); Serial.println(); } void setBitsForGood(byte daBeat) { if (daBeat == 1) { bitSet(ticketNumber, bCounter); bCounter=bCounter+1; } else { bitClear(ticketNumber, bCounter); bCounter=bCounter+1; } }

Что мне дает этот скетч? Ну, во-первых, небольшую тренировку головы - приходилось, знаете, думать, когда разбирался со считывателем и кодом. Во-вторых, я всегда могу узнать, сколько осталось поездок, и когда закончится карточка. С учетом того, что у меня в смартфоне NFC нет, получается довольно удобно.

Результат работы монстра

Разумеется, в данном случае даже речь не идет о том, чтобы сделать «копию» билета. Это исключительно информационная функция, дублирующая терминал в вестибюле метро.

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

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

Логика простая: если считыватель видит карту с определенным номером, то включает розетку. Если не видит - выключает.

РОЗЕТОЧНЫЙ МОНСТР

#include #include #define SS_PIN 53 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. unsigned long uidDec, uidDecTemp; #include RCSwitch mySwitch = RCSwitch(); boolean switchOn = false; boolean cardRead = false; void setup() { Serial.begin(9600); // Initialize serial communications with the PC SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 card mySwitch.enableTransmit(8); Serial.println("Waiting for card..."); } void loop() { byte status; byte byteCount; byte buffer; // длина массива (16 байт + 2 байта контрольная сумма) byteCount = sizeof(buffer); uidDec = 0; status = mfrc522.PICC_RequestA(buffer, &byteCount); if (mfrc522.PICC_ReadCardSerial()) { for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp=mfrc522.uid.uidByte[i]; uidDec=uidDec*256+uidDecTemp; } if ((uidDec==2218415941) && (switchOn == false)) { mySwitch.sendTriState("00110000F000"); switchOn = true; // Serial.println("Switched On"); } mfrc522.PICC_ReadCardSerial(); } else { if (switchOn == true) { mySwitch.sendTriState("001100000000"); // Serial.println("Switched Off"); switchOn = false; } } }

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

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

Вот так работает розеточный монстр

Подводя итог: недорого, просто, довольно удобно и стимулирует фантазию.

Ps. Я уверен, что вы можете лучше, и что я ничего не понимаю в Arduino и программировании.

Ссылочки всякие
Обзор понравился +67 +173

Считыватель RFID - карт и брелков
на микроконтроллере ATtiny13

Источник: www.serasidis.gr
Vassilis Serasidis

Перевод: Vadim по заказу РадиоЛоцман

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

Любая система радиочастотной идентификации (RFID) состоит из считывающего устройства (считыватель, ридер или интеррогатор) и транспондера (он же RFID-метка, иногда также применяется термин RFID-тег). В статье мы рассмотрим простое устройство для считывания RFID ключей, поддерживающих протокол EM4100 и работающие на частоте 125 кГц. Данный тип RFID-ключей может иметь форму брелока или кредитной карточки (Рисунок ниже).

Основным компонентом считывающего устройства является микроконтроллер Atmel AVR ATtiny13, который считывает 10-значный уникальный идентификационный номер ключа и передает его в кодировке ASCII по последовательному интерфейсу (UART) со скоростью 2400 бит/с Host-устройству. Другими словами, считыватель представляет собой отдельный модуль, подключаемый к основному процессору или микроконтроллеру системы (Рисунок 2).

Принципиальная схема RFID считывателя изображена на Рисунке ниже:

Рассмотрим основные особенности работы схемы. Микроконтроллер использует встроенный ШИМ модулятор для генерирования на выходе PB0 прямоугольных импульсов с частотой 125 кГц. Если на выходе PB0 лог. 0 (спадающий фронт импульса), транзистор T1 находится в закрытом состоянии, и на катушку L1 подается напряжение питания +5 В через резистор R1. Нарастающий фронт на выходе PB0 (лог. 1) открывает транзистор T1, и верхний по схеме вывод катушки подключается к «земле». В этот момент катушка оказывается включенной параллельно конденсатору С2, образуя LC генератор (колебательный контур). Переключение транзистора происходит 125,000 раз в секунду (125 кГц).). В итоге, катушкой генерируется сигнал синусоидальной формы с частотой 125 кГц

Модуль считывателяя генерирует электромагнитное поле, энергия которого используется для питания RFID-ключа. В основе передачи энергии между RFID-ключом и считывателем лежит принцип работы обычного трансформатора: первичная обмотка трансформатора создает ЭДС индукции во всех остальных обмотках. Для нашего случая первичной обмоткой является катушка считывателя, а вторичной - катушка RFID-ключа. Элементы D1, C3 и R5 образуют демодулятор сигнала с амплитудной модуляцией.

Обмен данными между ключом и считывающим устройством

Процесс обмена данными между RFID-ключом и считывателем очень прост, но продуман до мелочей. Если RFID-ключ должен передать лог. 0, то он к своему источнику питания подключает определенную «нагрузку», что требует больше энергии, передаваемой считывателем. Это вызовет небольшую «просадку» напряжения на стороне считывателя; именно этот уровень воспринимается считывателем как лог. 0

RFID ключ в общем случае передает 64 бита данных в следующей последовательности (Рисунок 6):

  1. Первые 9 бит (всегда лог. 1) - стартовые биты, свидетельствующие о начале обмена данными.
  2. 4 бита - младшие значащие биты пользовательского идентификационного номера (D00 - D03).
  3. 1 бит (P0) - бит контроля четности предыдущих 4 бит.
  4. 4 бита - старшие значащие биты пользовательского идентификационного номера (D04 - D07).
  5. 1 бит (P1) - бит контроля четности предыдущих 4 бит.
  6. 4 бита - первая часть 32-битного серийного номера RFID ключа (D08 - D11).
  7. 1 бит (P2) - бит контроля четности предыдущих 4 бит.
  8. Далее передаются следующие группы по 4 бита серийного номера ключа, каждая с битом контроля четности.
  9. Затем передаются 4 бита контроля четности битов по столбцам. К примеру, бит контроля четности PC0 для битов D00, D04, D08, D12, D16, D20, D24, D28, D32 и D36.
  10. 1 стоп-бит.

Данные (64 битная последовательность), которые передает RFID-ключ.

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

Конструкция катушки.

Бескаркасная катушка индуктивности в считывающем устройстве диаметром 120 мм намотана проводом диаметром 0.5 мм и имеет 58 витков, однако автор рекомендует при намотке добавить еще 2 - 3 витка. С целью повышения эффективности катушки и увеличения расстояния считывания данных RFID-ключа необходимо выполнить калибровку колебательного контура. Если, подключив осциллограф в точку соединения R1 и L1, на экране прибора вы увидите искаженные пики (Рисунок 7), то это говорит о необходимости калибровки катушки L1.

Искажения сигнала, генерируемого катушкой L1, говорит о необходимости калибровки.

Калибровку можно выполнить двумя способами после подачи напряжения питания на модуль.

  1. Подключите щупы осциллографа в точку соединения R1 и L1 и, увеличивая или уменьшая количество витков катушки L1, добейтесь устранения искажения сигнала.
  2. Если у вас нет осциллографа, то медленно подносите RFID-ключ к катушке до момента распознавания ключа, о чем свидетельствует звуковой сигнал. Если ключ определяется с расстояния 2 см, то необходимо добавить/удалить несколько витков и после этого снова проверить расстояние, с которого уверенно считывается ключ. С помощью калибровки автор схемы добился уверенного считывания RFID-ключа с 3 см.

При программировании микроконтроллера необходимо установить следующую конфигурацию Fuse-битов: младший байт 0x7A и старший байт 0x1F (микроконтроллер работает от встроенного тактового генератора 9.6 МГц, делитель тактовой частоты на 8 отключен). Программный код занимает в памяти микроокнтроллера 1024 Байт - используется весь доступный объем памяти микроконтроллера ATtiny13. Поэтому в дальнейшем при расширении функционала считывателя лучше использовать другой 8-выводной микроконтроллер AVR, например ATtiny85.

Загрузки:

Исходный код программы микроконтроллера (AVRStudio 6), прошивка (.hex) и принципиальная схема -

1 Описание считывателя RFID RC522

Модуль RFID-RC522 выполнен на микросхеме MFRC522 фирмы NXP . Эта микросхема обеспечивает двухстороннюю беспроводную (до 6 см) коммуникацию на частоте 13,56 МГц.

Микросхема MFRC522 поддерживает следующие варианты подключения:

С помощью данного модуля можно записывать и считывать данные с различных RFID-меток: брелоков от домофонов, пластиковых карточек-пропусков и билетов на метро и наземный транспорт, а также набирающих популярность NFC -меток.

RFID - это сокращение от "Radio Frequency IDentification" и переводится как «радиочастотная идентификация».
NFC - это "Near field communication", «коммуникация ближнего поля» или «ближняя бесконтактная связь».

2 Схема подключения RFID-RC522 к Arduino

Подключим модуль RFID-RC522 к Arduino по интерфейсу SPI по приведённой схеме.


Питание модуля обеспечивается напряжением от 2,5 до 3,3 В. Остальные выводы подключаем к Arduino так:

Пин RC522 Пин Arduino
RST D9
SDA (SS) D10
MOSI D11
MISO D12
SCK D13

Не забывайте также, что Arduino имеет специальный разъём ICSP для работы по интерфейсу SPI. Его распиновка также приведена на иллюстрации. Можно подключить выводы RST, SCK, MISO, MOSI и GND модуля RC522 к разъёму ICSP на Ардуино.

3 Библиотека для работы Arduino с RFID

Микросхема MFRC522 имеет достаточно обширную функциональность. Познакомиться со всеми возможностями можно изучив её паспорт (datasheet) . Мы же для знакомства с возможностями данного устройства воспользуемся одной из готовых библиотек , написанных для работы Arduino с RC522. Скачайте её и распакуйте в директорию Arduino IDE\libraries\


Установка библиотеки "rfid-master" для работы Arduino с RFID-метками

После этого запустите среду разработки Arduino IDE.

4 Скетч для считывания информации, записанной на RFID-метке

Теперь давайте откроем скетч из примеров: Файл Образцы MFRC522 DumpInfo и загрузим его в память Arduino.


Данный скетч определяет тип приложенного к считывателю устройства и считывает данные, записанные на RFID-метке или карте, а затем выводит их в последовательный порт.

#include #include const int RST_PIN = 9; // пин RST const int SS_PIN = 10; // пин SDA (SS) MFRC522 mfrc522(SS_PIN, RST_PIN); // создаём объект MFRC522 void setup() { Serial.begin(9600); // инициализация послед. порта SPI.begin(); // инициализация шины SPI mfrc522.PCD_Init(); // инициализация считывателя RC522 } void loop() { // Ожидание прикладывания новой RFID-метки: if (! mfrc522.PICC_IsNewCardPresent()) { return; // выход, если не приложена новая карта } // Считываем серийный номер: if (! mfrc522.PICC_ReadCardSerial()) { return; // выход, если невозможно считать сер. номер } // Вывод дампа в послед. порт: mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); }

Текст скетча достаточно хорошо прокомментирован.

Для более полного знакомства с библиотекой изучите файлы MFRC522.h и MFRC522.cpp из директории rfid-master .

5 Дамп данных с RFID-метки

Запустим монитор последовательного порта сочетанием клавиш Ctrl+Shift+M , через меню Инструменты или кнопкой с изображением лупы. Теперь приложим к считывателю билет метро или любую другую RFID-метку. Монитор последовательного порта покажет данные, записанные на RFID-метку или билет.


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

Примечание

Да, с помощью модуля RFID-RC522 можно записать данные на билет метро. Но не обольщайтесь, каждая карта имеет неперезаписываемый счётчик циклов записи, так что «добавить» поездок себе на метро не получится - это сразу будет обнаружено и карта будет забракована турникетом:) А вот использовать билеты метро для записи на них небольших объёмов данных - от 1 до 4 кб - можно. И способы применения этому ограничены только вашей фантазией.

Любая система радиочастотной идентификации (RFID) состоит из считывающего устройства (считыватель, ридер или интеррогатор) и транспондера (он же RFID-метка, иногда также применяется термин RFID-тег). В статье мы рассмотрим простое устройство для считывания RFID ключей, поддерживающих протокол EM4100 и работающие на частоте 125 кГц. Данный тип RFID-ключей может иметь форму брелока или кредитной карточки (Рисунок 1).

Основным компонентом считывающего устройства является микроконтроллер AVR , который считывает 10-значный уникальный идентификационный номер ключа и передает его в кодировке ASCII по последовательному интерфейсу (UART) со скоростью 2400 бит/с Host-устройству. Другими словами, считыватель представляет собой отдельный модуль, подключаемый к основному процессору или микроконтроллеру системы (Рисунок 2).

Принципиальная схема RFID считывателя изображена на Рисунке 3.

Рисунок 3.

Рассмотрим основные особенности работы схемы. Микроконтроллер использует встроенный ШИМ модулятор для генерирования на выходе PB0 прямоугольных импульсов с частотой 125 кГц. Если на выходе PB0 лог. 0 (спадающий фронт импульса), транзистор T1 находится в закрытом состоянии, и на катушку L1 подается напряжение питания +5 В через резистор R1. Нарастающий фронт на выходе PB0 (лог. 1) открывает транзистор T1, и верхний по схеме вывод катушки подключается к «земле». В этот момент катушка оказывается включенной параллельно конденсатору С2, образуя LC генератор (колебательный контур). Переключение транзистора происходит 125,000 раз в секунду (125 кГц).). В итоге, катушкой генерируется сигнал синусоидальной формы с частотой 125 кГц (Рисунок 4).

Модуль считывателяя генерирует электромагнитное поле, энергия которого используется для питания RFID-ключа. В основе передачи энергии между RFID-ключом и считывателем лежит принцип работы обычного трансформатора: первичная обмотка трансформатора создает ЭДС индукции во всех остальных обмотках. Для нашего случая первичной обмоткой является катушка считывателя, а вторичной - катушка RFID-ключа. Элементы D1, C3 и R5 образуют демодулятор сигнала с амплитудной модуляцией.

Обмен данными между ключом и считывающим устройством

Процесс обмена данными между RFID-ключом и считывателем очень прост, но продуман до мелочей. Если RFID-ключ должен передать лог. 0, то он к своему источнику питания подключает определенную «нагрузку», что требует больше энергии, передаваемой считывателем. Это вызовет небольшую «просадку» напряжения на стороне считывателя; именно этот уровень воспринимается считывателем как лог. 0 (Рисунок 5).

RFID ключ в общем случае передает 64 бита данных в следующей последовательности (Рисунок 6):

  1. Первые 9 бит (всегда лог. 1) - стартовые биты, свидетельствующие о начале обмена данными.
  2. 4 бита - младшие значащие биты пользовательского идентификационного номера (D00 - D03).
  3. 1 бит (P0) - бит контроля четности предыдущих 4 бит.
  4. 4 бита - старшие значащие биты пользовательского идентификационного номера (D04 - D07).
  5. 1 бит (P1) - бит контроля четности предыдущих 4 бит.
  6. 4 бита - первая часть 32-битного серийного номера RFID ключа (D08 - D11).
  7. 1 бит (P2) - бит контроля четности предыдущих 4 бит.
  8. Далее передаются следующие группы по 4 бита серийного номера ключа, каждая с битом контроля четности.
  9. Затем передаются 4 бита контроля четности битов по столбцам. К примеру, бит контроля четности PC0 для битов D00, D04, D08, D12, D16, D20, D24, D28, D32 и D36.
  10. 1 стоп-бит.

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

Конструкция катушки.

Бескаркасная катушка индуктивности в считывающем устройстве диаметром 120 мм намотана проводом диаметром 0.5 мм и имеет 58 витков, однако автор рекомендует при намотке добавить еще 2 - 3 витка. С целью повышения эффективности катушки и увеличения расстояния считывания данных RFID-ключа необходимо выполнить калибровку колебательного контура. Если, подключив осциллограф в точку соединения R1 и L1, на экране прибора вы увидите искаженные пики (Рисунок 7), то это говорит о необходимости калибровки катушки L1.

Калибровку можно выполнить двумя способами после подачи напряжения питания на модуль.

  1. Подключите щупы осциллографа в точку соединения R1 и L1 и, увеличивая или уменьшая количество витков катушки L1, добейтесь устранения искажения сигнала.
  2. Если у вас нет осциллографа, то медленно подносите RFID-ключ к катушке до момента распознавания ключа, о чем свидетельствует звуковой сигнал. Если ключ определяется с расстояния 2 см, то необходимо добавить/удалить несколько витков и после этого снова проверить расстояние, с которого уверенно считывается ключ. С помощью калибровки автор схемы добился уверенного считывания RFID-ключа с 3 см.

При программировании микроконтроллера необходимо установить следующую конфигурацию Fuse-битов: младший байт 0x7A и старший байт 0x1F (микроконтроллер работает от встроенного тактового генератора 9.6 МГц, делитель тактовой частоты на 8 отключен). Программный код занимает в памяти микроокнтроллера 1024 Байт - используется весь доступный объем памяти микроконтроллера ATtiny13. Поэтому в дальнейшем при расширении функционала считывателя лучше использовать другой 8-выводный микроконтроллер AVR, например .

Загрузки:

Исходный код программы микроконтроллера (AVRStudio 6), прошивка (.hex) и принципиальная схема -