sonyps4.ru

Считыватель карточек RFID RC522 в домашнем хозяйстве. RFID –это просто

После нескольких лет работы по RFID тематике и разработки разнообразных считывателей для моделей транспондеров популярных стандартов типа Mifare, EMMARINE, TIRIS… меня часто начал озадачивать такой вопрос – буквально в последний год широкую популярность приобрели разного рода эмуляторы под тэги популярных протоколов и разнообразные копировальщики ключей/брелков.

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

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

Пассивные тэги достаточно маломощны и нуждаются для своего питания в достаточно мощном генераторе считывателя, особенности распространения радиоволн на данных частотах также ограничивают пределы работы данной системы. Реальная дальность считывания транспондеров редко превышает 20см для 125 Кгц стандартов типа EmMarine, скажем стандарта EM4001, для других протоколов типа Mifare (13,56Мгц) может быть побольше (1,5 метра для iso15693). Можно добиться большего расстояния считывания для низкочастотных ридеров если увеличить размеры катушки и напряжение питания, соответственно и мощность ридера. Однако такие системы имеют громоздки и как правило их тяжело сделать портативными. Как правило, такие системы реализуются только стационарно – скажем для автомобилей.

Итак, теперь собственно по архитектуре нашей RFID системы. Для экспериментов был выбран контроллер atmel atmega8. Для целей изготовления транспондера это кажется несомненным излишеством. Однако в данном случае решалась первостепенная задача разработки нового интерфейса на готовой отладочной платке c atmega с последующим портированием данного кода на более дешевые контроллеры типа tiny13. Для транспондера алгоритм работы был построен на основе режима ШИМ генерации при помощи таймера T1 в режиме CTC с прерыванием и сбросом по совпадению с OCR1. Данные для передачи транспондера считываются из EEPROM при включении питания контроллера. Всего транспондер передает 10 байт. Содержимое EEPROM транспондера можно видеть на рисунке 1. Первый байт 0xE7 является обязательным заголовком пакета, так как его наличие проверяется в первую очередь при разборе пакета считывателем.

Первые 8 байт являются содержимым пакета транспондера, последние 2 байта содержат контрольную сумму CRC16 первых восьми байт пакета. Для примера в нашем транспондере были записаны такие данные – пакет 0xE7, 0x05, 0xE8, 0x93, 0x43, 0x7F, 0x20, 0xFF и соответственно контрольную сумму 0xF5 0xA8. Для изготовления собственного уникального транспондера нужно кроме первого байта 0xE7 записать семь следующих байт в EEPROM, после чего рассчитать контрольную сумму для первых восьми байт. После этого записать в EEPROM два байта CRC16 в конце пакета. Первый байт оставляем без изменений - 0xE7. При включении транспондера данные этих байт разбиваются по битам и кодируются соответствующей длиной импульса в соответствии со значением регистра OCR. Для передачи используются 2 частоты 2Кгц и 5Кгц для передачи логических “0” и “1”. Кроме того данные разделяются импульсами синхронизации – стартовые метки пакетов.

Рис.1 Содержимое пакета транспондера.


Рис.2 Дамп передачи транспондера на экране виртуального осцилографа.

Схему транспондера можно увидеть на рисунке 3. Частота задающего генератора 8Мгц. Питание контроллера +5В. Можно использовать контроллер mega8 с маркировкой “L” тогда питание можно осуществлять от литиевой батарейки 3в (параметры для такого чипа +2,7…. +3,5). Вместо данного транзистора можно использовать любой другой маломощный NPN транзистор. Катушка транспондера была намотана на оправке диаметром 50мм проводом 0,22мм и насчитывает 50 витков. На данный момент транспондер сделан активным - с внешним питанием. На следующем этапе планируется сделать пассивный вариант транспондера, что достаточно просто – сделать развязку для питания от данной катушки, добавить диоды моста выпрямителя и стабилизатор.


Рис.3 Схема транспондера.

Теперь поговорим о схеме считывателя для данного транспондера. Схема была адаптирована на основе раннее использованного считывателя для карт EMMARINE. Часть схемы с генератором на 74hc4060 можно на данном этапе смело удалять, так как пока мы используем активную метку. Однако эта часть схемы нам понадобится в дальнейшем, когда мы будем делать пассивную метку и нам потребуется получить питание от считывателя. В остальном схема не имеет существенных отличий от схемы считывателя для EMMARINE: пассивный пиковый детектор – фильтр – усилитель – компаратор. Схема имеет максимально возможную простоту и позволяет считывать данные транспондера на расстоянии 10-12см при хорошо настроенных контурах.

Можно еще дальше упрощать схему оставив только детектор и фильтр, поставить один транзистор на выходе который будет играть роль компаратора, но я не стал так делать. На выходе мы получаем двоичный сигнал прямоугольной формы в соответствии с кодированными длительностями импульсов передаваемых транспондером. Допустимые отклонения номиналов элементов при котором схема работоспособна 5-10%. Питание контроллера и операционника +5В. Частота кварца задающего генератора контроллера 12Мгц. Выход компаратора на LM358 подключен к ножке внешнего прерывания контроллера INT0. В программе контроллера настроен вызов прерывания по нарастающему фронту на ножке внешнего прерывания INT0. В обработчике прерывания происходит проверка синхронизирующих импульсов а затем проверка заголовка пакета и запись содержимого в буфер контроллера. Данные считанных пакетов передаются по интерфейсу RS232 на ПК. Для настройки терминалки указываем следующие параметры: скорость 57.6Kb/s, 8 бит данных, 1стоп бит, без контроля четности.

При приеме пакета контроллер рассчитывает контрольную сумму принятых байт и передает данные в терминалку (пакет и CRC). В случае совпадения контрольных сумм расчитанной контроллером и принятой в пакете выводится сигнал на ножку PORTB.0 (14) контроллера (LED1 на схеме). Можно подключить в данную точку пищалку со встроенным генератором или светодиод через сопротивление. При считывании корректного ключа контроллер запрещает внешние прерывания и делает задержку 1с перед следующим считыванием. Предусмотрен также режим работы данного считывателя в качестве основы RFID замка. Для этого необходимо в EEPROM контроллера считывателя записать полностью байты дампа транспондера - 10 байт. Данные пишутся в EEPROM считывателя точно также, как в EEPROM транспондера. В данном случае при считывании очередного транспондера и совпадении его с записанным в EEPROM считывателя выводится сигнал на ножку PORTB.1 (15) контроллера (LED2 на схеме). В данную точку можно подключить светодиод через сопротивление или выходной ключ (транзистор) на реле исполнительного устройства. Теперь мы получили RFID замок под конкретный ключ и обычный считыватель в одном флаконе.


Рис.4 Схема считывателя RFID меток. (увелчить схему)

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

Скачать прошивку:
У вас нет доступа к скачиванию файлов с нашего сервера

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


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

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

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

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

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

Подключение

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

MFRC522 Arduino Uno Arduino Mega Arduino Nano v3

Arduino Leonardo/ Micro

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

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


#define SS_PIN 10 #define RST_PIN 9

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

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


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

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

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


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

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

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


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

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

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


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

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


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

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

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

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


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

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


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

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

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

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

Введение

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

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

Описание

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ATtiny13

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

LM358

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

LM78L05

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

BS170

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

BC547B

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

1N4148

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

100 Ом

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

1 кОм

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

390 кОм

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

33 кОм

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

270 кОм

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

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

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

В данной статье я расскажу, как собрать работающий считыватель 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 мкгн, на которые я рассчитывал.

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

Схема эмулятора 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.


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



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



Загрузка...