RFID. Часть 1. Ридер.
Изучать любую технологию удобнее, когда у тебя есть фирменное оборудование, а не самодельный хлам. Ибо, когда ты не до конца понимаешь, как и что должно работать очень сложно отлаживать самоделки. А готовое работающее устройство очень помогает в освоении новой технологии.
Хммм… к чему это я.
Orcinus Orca, отправляя мне пару карточек EM-Marine, положил в посылку сломаный, по его мнению, ридер… Ага, как-же, «сломаный»! 🙂
Ридер оказался живее всех живых *, и теперь у меня целый «RFID Starter’s kit»: считыватель и две карточки (свой-чужой).
* Вообще, есть такая тенденция. Мне приносят какой-нибудь девайс со словами «%device% не работает, вот, может тебе на запчасти пригодится..». Перед тем, как разобрать девайс на запчасти (или выкинуть нах, ибо хлам) я пытаюсь его включить. И, о чудо! В подавляющем большинстве случаев он включается. И даже более того — работает! 🙂
На радостях от того, что ридер работает, первый пост решил написать про него. Из полезной инфы тут можно найти описание протокола wiegand и пример на МикроПаскале по работе с ним. И еще кучу флуда про ридеры вообще и EM-02 в частности.
Первое знакомство.
В коробке лежали две карточки и ридер EM-02.
Ридер оказался тяжелее, чем казалось на первый взгляд. Вскоре выяснилось — почему: внутри все было залито эпоксидкой.
Все видели букашку, застывшую в янтаре? Вот и он выглядел примерно так:
Крупнее.
Сзади торчал огрызок восьмижильного кабеля.
Из скудной документации на ридер я выяснил распиновку:
Тут всплывает не то, что-бы недостаток, но отсутствие удобной фичи. Незнаю, есть-ли она у других ридеров, но если нет, то её стоило-бы придумать :). Это выход +5В с преобразователя. Дело в том, что ридер питается от 12В и в нем стоит преобразователь на 5В (некое подобие 7805, а может и она). И было-бы круто сделать выход с этого преобразователя для питания, к примеру, простенького контроллера. Чтобы не плодить стабилизаторы. В конце-концов, даже на FT232 такая штука есть :).
* Кстати, из правила «красный-питание, черный-земля», оказывается, есть исключения. К примеру, недавно разбирал ps\2 клавиатуру — в ней на питание шли желтый и коричневый, а для обмена данными — красный и черный. Вот так.
После включения ридер непрерывно «фонит» в окружающую среду, пытаясь обнаружить карточку (к слову, дальнось у него около 10 см). Как только он прочитает её код — моргает зеленым светодиодом и коротко пикает. В этот момент по протоколу Wiegand выдается код карточки. Причем на моем ридере Wiegand может работать в двух форматах — 26 и 40 бит. Wiegand-40 не содержит данных о четности, поэтому проще в обращении, чем wiegand-26.
По ходу дела выясняется еще один недостаток этого ридера — отсутствие режима энергосбережения. То-есть ему нельзя сказать «заткнись, и не трать электричество». У других ридеров такой режим есть. Хотя, можно просто отрубать питание ридеру, когда требуется экономить энергию.
И тут-же, недостаток №3: ридер нельзя отучить от пищания и мигания светодиодом при поднесении карточки. Т.е. если мы, например, хотим сделать незаментый замок, который должен молчать при поднесении чужой карточки, то ридер придется покалечить 🙂
Помимо недостатков у ридера есть удобнейшая фича — порт 1-wire. Он полностью прикидывается таблеткой iButton (aka TouchMemory, aka DS1990A). Пока карточка находится в зоне считывания, он отвечает на сигнал RESET и выдает код карточки по команде 0x33 (READ ROM).
Надо отметить, что на всех интерфейсах есть нужная обвязка. Подтяжка 4.7k на 1-wire и по 10к на D1 и D0 для Wiegand.
На мой взгляд, использовать wiegand удобнее, чем 1-wire. Через Виганд ридер сам выдаст код, как только карточка войдет в зону считывания, а 1-wire нужно постоянно опрашивать. С другой стороны, при помощи 1-wire можно следить за тем, чтобы карточка находилась около ридера.
Тест-драйв.
Еще до того, как я начал разбираться с протоколами, провел «тест на дальность». Смотрел, с какоко расстояния (приблизительно) считыватель чует карточку. При этом я мешал сигналу разнобразными препядствиями. Вот, что из этого получилось:
(Условия теста: Питание = 12.5V, источников ЭМ помех по близости нету, крышка ридера снята)
Без препядствий — 9 см.*
Между ридером и карточкой лежит книжка (толщиной примерно 3см) — тоже около 9см.
Между ридером и карточкой стальная крышка от коробочки (размером как сам ридер) — вообще не ловит карточку. Даже вплотную.
Та-же байда, но уже позади ридера (как-будто ридер закреплен на металлической поверхности) — 5-7 см.
Всякие мелкие железные предметы, которые не могут полностью накрыть ридер (взял, что под руку попадется — ножницы) — 9 — 10 см.
Провод 220 Вольт, от розетки к БП ридера (между ридером и картой) — тоже никак не повлиял на дальность: 9-10 см.
* Если спозиционировать катрочку точно над ридером — можно добиться дальности аж в 15 см!
При разработке какого-нибудь замка на бесконтактных картах или другой подобной приблуды, может возникнуть желание спрятать ридер от посторонних глаз. Например, в дверь или стену. Вот для таких случаев я и провел свой тест на дальность. Из него можно сделать один вывод: железкой ридер не накрывать! Все остальное можно, в пределах разумного 🙂
Йа таблетко!
После проверки на дальность я пристал к ридеру по 1-wire. Для этого использовал свой отладчик/сниффер. Кстати, наличие в доме подобного устройства очень мотивирует совершать эксперименты и другие глупые вещи 🙂 Ведь не нужно каждый раз писать программу, чтобы пообщаться с новым девайсом: весь функционал для работы с i2c и 1-wire уже реализован, осталось его только заюзать.
Заработало все с первого раза. Ридер выдал мне код карточки:
Собственно, перед вами копипаста отчета отладчика. «RESET + PRESENSE» значит, что мы дернули линию (RESET), на что ридер ответил тем-же (PRESENSE). Дальше мы передали команду на чтение (0x33) и прочитали 8 байт: Family code, 48 бит кода, и CRC. Так-как считыватель полностью косит под таблетку iButton, family code у него тоже «таблеточный» и CRC считается так-же.
Кроме команды 0x33, ридер живо реагирует на команду 0x0F (тоже самое, что и 0x33 — READ ROM). Еще хотел посмотреть как он дружит с процедурой Search ROM, но передумал ввиду того, что сам эту процедуру не очень понимаю. Да и не нужна она 🙂
Простой протокол со странным названием. *
Наигравшись с 1-wire, решил заюзать Wiegand. Во первых, потому, что он есть, а во-вторых не у каждого ридера может быть выход на 1-wire. А wiegand это стандарт для ридеров, со времен магнитных карт.
Хорошее описание протокола можно стащить отсюда. Далее следует вольный пересказ сего документа.
Протокол прост, как каменный топор. Две линии: D1 и D0. Активный уровень — низкий. Данные передаются кототкими импульсами (20-200 мкс). Паузы между импульсами примерно 2мс. Импульс на линии D0 значит, что передался 0. Импульс на D1 — передалась единичка.
Завершение передачи детектится по таймауту. Обычно это 250-500 мс. Т.е. если пол секунды не было ни одного импульса — считаем, что все приняли.
Временные характеристики протокола довольно сильно варьируются в зависимости от того, что ударило в голову изготовителю ридера.
Так-же, возможно, на некоторых ридерах не будет интегрированого обвеса (pull-up резисторы) для интерфейсов.
Вот так передача данных выглядит на схеме, выдраной из документации на Wiegand (которая еще более скудна, чем документация на ридер):
Все, пересказ кончился. Быстро, да? 🙂
* Название протокола Wiegand (произносится «Виганд») видимо произошло от «Карты Виганда» (Wiegand Card). Это пластиковая карта, в которую в хаотичном порядке впресованы кусочки магнитного материала. Они создают уникальный код карты. Работа такой карты основана на эффекте Виганда (Wiegand effect), который был открыт американским инженером Джоном Вигандом. Вот такие плюшки. Семь «вигандов» на три предложения 🙂
Разведка боем.
Для тех, у кого завалялся подобный ридер, я заготовил немного материалов для размышления и изучения.
Во-первых это программа на МикроПаскале, которая принимает данные от считывателя по протоколу Wiegand и выдает в комп по UART.
Формат на выходе таков:
0x38 — просто сигнал о том, что дальше пойдут данные.
Количество данных, принятых от ридера (в битах).
Массив из 6 байт — код карточки. Это данные с ридера в сыром виде. Т.е. биты четности присутствуют. Старший бит кода (тот, который ридер выдал первым) соответствует старшему биту последнего байта массива.
Исходник состоит из 2х файлов. В первом (weigand_tst *) сам код программы, а во втором (weigand_unit) — процедуры для работы с wiegand.
Точнее, процедура там одна: wd_interrupt. В программе она вызывается из обработчика PCINT, когда изменяется уровень на линии D0 или D1 (это не названия пинов МК, а линии wiegand). В принципе, если МК нечем заняться, можно вызывать эту функцию по таймеру.
Еще нужно организовать тайм-аут. Для этого нужен таймер (не важно-программный или аппаратный), с периодом = 0.5 сек. Или около того.
У меня в программе используется TIMER\COUNTER 1 с предделителем = 1024. (надо заметить, что частота МК в моем случае = 18 МГц).
В процедуре wd_interrupt таймер сбрасывается:
А при его переполнении можно считать, что данные готовы к употреблению. У меня в прерывании TIMER1_OVF устанавливается флаг, по которому программа в основном цикле узнаёт, что пора отправлять данные в комп.
Это во-первых. А во-вторых была программка на делфи, которая принимала данные и выводила на экран код карточки, протокол (Wiegand-26 или 40) и т.д. «Была» потому-что я её случайно вынес 🙁 Но и терминалки хватает.
* Да, weigand. Это я дико ошибся, когда обзывал проект. А переименовать обратно его как-то лениво 🙂
Продолжение следует.
Правда, я еще не знаю, про что будет вторая часть.
Сейчас потихоньку собираю свой ридер. Если ничего ужасного не произойдет, второй пост будет про постройку ридера своими руками.
А может, какое-нибудь устройство на базе этого считывателя.
Потом попробую сделать эмулятор карточки.
В общем, изучение RFID будет интересным 🙂
Источник
Схема сборки своими руками мобильного RFID считывателя меток
Много разговоров в последнее время ведется вокруг использования радиочастотных меток, причем в обсуждениях высказываются даже предположения, что при желании люди с определенными навыками владения компьютером могут взломать вашу домашнюю систему и получить полную информацию о ваших вещах.
Я решил сам разобраться в этой технологии. Для этого я заказал нужные компоненты и собрал 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 мкгн, на которые я рассчитывал.
Математические расчёты здесь не играют огромной роли, хотя именно благодаря им я вычислил емкость конденсаторов, подходящих к моей катушке. Это, конечно, можно было выяснить методом проб и ошибок, но на это ушло бы много времени.
Рассказываю как сделать какую-либо вещь с пошаговыми фото и видео инструкциями.
Источник