sonyps4.ru

RFID –это просто. Реализация собственного RFID транспондера и ридера

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

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

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

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

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

Для экспериментов я выбирал недорогой и более-менее универсальный считыватель. 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) состоит из считывающего устройства (считыватель, ридер или интеррогатор) и транспондера (он же 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) и принципиальная схема -

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

Основные характеристики контроллера доступа:

RFID-карты формат EMmarin 125кгц

Микроконтроллер ATtiny13

Количество карт/брелков - 10.
Кнопка "OPEN" нормально разомкнутая, защищена от залипания.
Выход управления замком, сильноточный полевой транзистор, режим работы на защёлку (включается на время).

Питание - 12в.
Потребление в дежурном режиме - 35 мА.
Количество карт/брелков доступа - 10 шт.
Длина связи с кнопкой "OPEN" - 10 метров.
Тип выхода управления замком - открытый сток (мощный полевой транзистор, ток до 2А).

Принципиальная схема контроллера ограничения доступа на RFID-картах 125КГц (Em-Marin) на 10 карт (на микроконтроллере ATtiny13):

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

Внешний вид собранного RFID-валидатора:

Установка Fuse-битов в PonyProg:

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

Инструкция по программированию

Рабочий режим - при подачи 12В на контроллер светодиод мигает 1Гц.
Режим программирования - светодиод мигает 2Гц.
При нажатии на кнопку "OPEN" серия коротких звуковых сигналов во временя открытия замка.

Звуковые сигналы

1 короткий сигнал - карта или брелок записан в память контроллера.
2 коротких сигнала - карта или брелок уже записан в памяти контроллера.
5 коротких сигнала - выход из режима программирования.
1 длинный сигнал - память карт-ключей стерта из контроллера.
Непрерывные короткие сигналы - память карт/ключей заполнена, максимально 10шт. (требуется отключение питания контроллера).

Запись МАСТЕР-КАРТЫ и времени открывания замка

1 - Выключить питание контроллера.
2 - Нажать кнопку "OPEN"
3 - Удерживая кнопку подключить питание к контроллеру, через 5 сек. контроллер "ПИСКНЕТ", светодиод будет мигать с частотой 2 Гц.
4 - Отпустить кнопку.
5 - Поднести в зону считывания карту или брелок, раздастся одиночный звуковой сигнал, Мастер-карта или брелок ЗАПИСАН, при этом запишется время открытия замка 1 сек.

6 - Удерживая карту или брелок в зоне считывания - считаем звуковые сигналы. Кол-во определяет требуемое время отрывания замка, приращение 1 сек., но не более 32 сек.
7 - Отключаем питание контроллера или выдерживаем паузу 30 сек.

Стирание всей памяти карт-брелков

1 - Рабочий режим.
2 - Нажимаем кнопку "OPEN" и удерживая подносим к считывателю МАСТЕР-карту или брелок и держим, через 5 сек раздастся продолжительный звуковой сигнал - память карт/брелков стёрта.
3 - Отпускаем кнопку отнимаем карту или брелок.

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

RFID (англ. Radio Frequency IDentification, радиочастотная идентификация) - способ автоматической идентификации объектов, в котором посредством радиосигналов считываются или записываются данные, хранящиеся в так называемых транспондерах, или RFID-метках. Любая RFID-система состоит из считывающего устройства (считыватель, ридер или интеррогатор) и транспондера (он же RFID-метка, иногда также применяется термин RFID-тег).

В уроке будет использоваться RFID-метка с Arduino. Устройство читает уникальный идентификатор (UID) каждого тега RFID, который мы размещается рядом со считывателем, и отображает его на OLED-дисплее. Если UID тега равен предопределенному значению, которое хранится в памяти Arduino, тогда на дисплее мы увидим сообщение «Unlocked» (англ., разблокировано). Если уникальный идентификатор не равен предопределенному значению, сообщение "Unlocked" не появится - см. фото ниже.

Замок закрыт

Замок открыт

Детали, необходимые для создания этого проекта:

  • RFID-ридер RC522
  • OLED-дисплей
  • Макетная плата
  • Провода

Дополнительные детали:

  • Аккумулятор (powerbank)

Общая стоимость комплектующих проекта составила примерно 15 долларов.

Шаг 2: RFID-считыватель RC522

В каждой метке RFID есть небольшой чип (на фото белая карточка). Если направить фонарик на эту RFID-карту, можно увидеть маленький чип и катушку, которая его окружает. У этого чипа нет батареи для получения мощности. Он получает питание от считывателя беспроводным образом используя эту большую катушку. Можно прочитать RFID-карту, подобную этой, с расстояния до 20 мм.

Тот же чип существует и в тегах RFID-брелка.

Каждый тег RFID имеет уникальный номер, который идентифицирует его. Это UID, который показывается на OLED-дисплее. За исключением этого UID, каждый тег может хранить данные. В этом типе карт можно хранить до 1 тысячи данных. Впечатляет, не так ли? Эта функция не будет использована сегодня. Сегодня все, что интересует, - это идентификация конкретной карты по ее UID. Стоимость RFID-считывателя и этих двух карт RFID составляет около 4 долларов США.

Шаг 3: OLED-дисплей

В уроке используется OLED-монитор 0.96" 128x64 I2C.

Это очень хороший дисплей для использования с Arduino. Это дисплей OLED и это означает, что он имеет низкое энергопотребление. Потребляемая мощность этого дисплея составляет около 10-20 мА, и это зависит от количества пикселей.

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

Этот OLED-дисплей очень яркий и у него отличная и очень приятная библиотека, которую разработала компания Adafruit для этого дисплея. В дополнение к этому дисплей использует интерфейс I2C, поэтому соединение с Arduino невероятно простое.

Вам нужно только подключить два провода, за исключением Vcc и GND. Если вы новичок в Arduino и хотите использовать недорогой и простой дисплей в вашим проекте, начните с этого.

Шаг 4: Соединяем все детали

Схема эмулятора RFID транспондера стандарта EM-Marine (EM4100).
Бесконтактные карты стандарта Em-Marine являются на сегодняшний день наиболее популярным средством идентификации в нашей стране и используются для идентификации пользователей в системах контроля и управления доступом (СКУД).
Второй, не менее популярной, областью применения карт Em-Marine является их использование в системах логического доступа при авторизации пользователей по ID номеру карты в операционной системе компьютера и рабочих приложениях и тп.

Карты и брелки Em-Marine.
Соответственно подобные системы идентификации очень распространены и могут представлять интерес для реализации собственных систем идентификации и автоматизации. Поскольку протокол обмена и аппаратная часть подобных низкочастотных систем является более простой для самостоятельной реализации собственных устройств большинство радиолюбительских конструкций тематики RFID посвящена низкочастотным системам.

Рабочая частота карт Em-Marine составляет 125 КГц. Для их чтения используются специализированные считыватели бесконтактных карт (считыватели RFID). Взаимодействие идентификатора с таким считывателем осуществляется дистанционно.
Вариантов внешнего исполнения данных идентификаторов существует огромное количество: пропуска Em-Marine изготавливаются в виде тонких и толстых карт, браслетов для аквапарков, различных брелоков, радио-меток для интеграции в RFID-изделия.
Для стандарта транспондеров EM4100 карта содержит 64 бита данных, при этом карты, как правило, не перезаписываемые. Для удобства регистрации карт код, записанный в карте, продублирован печатью на одной из сторон карты. Кодировка передаваемых транспондером данных - манчестер кодирование. При этом периоды сигнала передаваемого транспондером являются кратными частоте 125Кгц - частота сигнала считывателя транспондеров. Сами транспондеры реализованы без внешнего питания (пассивный тэг), питание осуществляется за счет контура LC (катушка и конденсатор) при попадании тэга в зону действия поля считывателя карт. Тактирование транспондера также осуществляется сигналом считывателя - 125Кгц. Поэтому параметры результирующего сигнала в манчестер кодировке являются кратными сигналу 125Кгц.

Схема взаимодействия транспондера и считывателя RFID.
Для более полного понимания рассмотрим структуру пакета RFID транспондера формата EMMarine EM4100. Приведено описание (на английском, взято из анноутов) формата пакета транспондера.
“…….EM4100 compatible RFID transponders carry 64 bits of Read Only memory. This means that information can be read from the Tag but no data can be changed, or new data written to the card once the card has been programmed with the initial data. The format of the data is as shown here.
1 1 1 1 1 1 1 1 1 9 bit header bits, all 1"s
8 bit version number D00 D01 D02 D03 P0
or customer ID.
D04 D05 D06 D07 P1
D08 D09 D10 D11 P2 Each group of 4 bits
D12 D13 D14 D15 P3 is followed by an Even 32 Data Bits
D16 D17 D18 D19 P4 parity bit
D20 D21 D22 D23 P5
D24 D25 D26 D27 P6
D28 D29 D30 D31 P7
D32 D33 D34 D35 P8
D36 D37 D38 D39 P9
4 column Parity bits PC0 PC1 PC2 PC3 S0 1 stop bit (0)
The first 9 bits are logic 1“.
Соответственно мы имеем 9 стартовых бит пакета (всегда логическая 1), 11 групп по 4 бит данных с 1 битом четности по строке, 4 бита четности по столбцам в конце пакета, завершающий бит (всегда 0).
Для примера возьмем транспондер с данными номера 06001259E3.
1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 0 0 1 0 00
0 6 0 0 1 2 5 9 E 3

Байт с данными 0x06 считается номером версии. На картах EM-Marine, которые попадались мне, выбиты десятичные значения соответствующие последним 3 байтам пакета. В любом случае нам нужно будет для реализации воспроизводить все 64 бита пакета согласно данному описанию.
Теперь обратимся внимательно к описанию модуляции данных транспондера. Данные взяты из анноута AN680. На рисунке сделал отметки красным относительно интересующих нас диаграмм.

Теперь подробнее опишем нужные нам диаграммы. Сигнал CLK тактирования - это и есть сигнал считывателя RFID, о чем уже было сказано ранее. Данные в кодировке NRZ следует подготовить транспондеру в соответствии с записанными данными пакета (64 бит). Видно, что реализация кодирования NRZ по пакету транспондера элементарная и требует минимальных затрат ресурсов. Собственно разбираем пакет на битовый поток и меняем логическое значения сигнала по 0 и 1 в данных и все. Для получения результирующего сигнала делаем программно XOR текущего состояния сигнала в формате NRZ и CLK тактирующего сигнала считывателя. В итоге получаем манчестер кодирование результирующего сигнала. Подробнее про манчестер кодирование описывать не буду - данные можно найти в отдельных анноутах. Для более подробного описания методов модуляции можно ознакомиться с данными из “Modulation Methods H.R. Walker Data Systems 05/01/04(reviewed 4/18/10)”, мною изучались именно данные примеры. Главное, что с минимальными затратами ресурсов мы можем таким образом реализовать транспондер формата EM-Marine. Для примера можно взять контроллер AVR серии tiny45 (можно и на tiny13 сделать). На контроллере tiny45 тестировалось поскольку именно такой оказался в наличии для экспериментов.
Теперь представим функциональную схему транспондера на основе модели в Proteus для контроллера tiny45.

Функциональная схема транспондера в Proteus.

Вот так выглядит сигнал генерируемый транспондером. Красным отмечено начало пакета.
По схеме видно, что ножка контроллера T0 (PORTB.2) используется для подачи тактового сигнала для 8 битного таймера TIMER0. В программе реализовано прерывание по совпадению на таймере TIMER0 (TIM0_COMPA). Тактирование установлено от внешнего сигнала для данного таймера. Для нас тактовым сигналом является 125Кгц от считывателя карт. На схеме удалено все, что касается питания контроллера и цепей тактирования от считывателя. В реальной схеме сам контроллер тактируется от кварца 4 Мгц установленного между 2 и 3 ножкой контроллера. Также можно добавить блокировочные конденсаторы для кварца по 22 pF на данных ножках контроллера.
Настройки симуляции Proteus для контроллера указанны следующим образом:

При программировании контроллера tiny45 фьюзы (биты конфигурации) устанавливаем таким же образом, как указано на рисунке.2. Для тактирования контроллера используется кварц 4 Мгц.
Относительно реализации внешней схемы обвязки контроллера рассмотрим данный вопрос подробнее. Для примеров были взяты материалы RFID Handbook (E2E_chapter03-rfid-handbook) где описываются фундаментальные принципы построения RFID систем. Сам документ прилагается к статье. Рассмотрим пример схемы пассивного транспондера (часть схемы на странице 46). Для понимания я сделал пометки на схеме красным цветом.
Видно, что мы имеем приемный контур на L1C1, который служит для питания схемы транспондера и тактирования. Все что касается счетчика-делителя IC1(4024), логических элементов IC3 (7400) можем смело выкидывать - нам это не потребуется. Делитель для таймера реализован настройками таймера без внешних делителей - счетчиков, логическая часть также реализована программно. Однако данный пример позволяет более полно понять работу пассивной схемы транспондера. Максимальное расстояние считывания для транспондера данного формата составляет 200см. В реальности большинство схем работает на расстояниях 2-10см. Параметры контура емкости и индуктивности LC подбираются максимально точно на резонансную частоту 125Кгц. Для примера использовался контур с емкостью 1nF и катушкой 60 витков на оправке диаметром 50мм проволокой ПЭВ 0.2. Рассчитать нужный контур можно в специальной программе (можно рассчитать контур для прямоугольно катушки, печатной и тп.). Главное подобрать точные номиналы под частоту 125 Кгц иначе расстояние считывания и чувствительность схемы значительно ухудшатся. При плохо настроенных контурах будет работать только при поднесении катушки транспондера вплотную к считывателю. Устройство работает по принципу Full Duplex (FDX) - генерация данных транспондера непрерывно при наличии питания схемы. Тактирование схемы от считывателя и передача данных осуществляется непрерывно. Некоторые схемы транспондеров используют схему работы HDX (Half Duplex) - считыватель излучает в импульсном режиме, транспондер передает данные в промежутках данных импульсов зарядки от считывателя. Это относится, например к TIRIS транспондерам от Texas Instruments.

Схема пассивного транспондера на основе схемы из RFID Handbook.


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



Как вам эта статья?



Загрузка...