Сайт о телевидении

Сайт о телевидении

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

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

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


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

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

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

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

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

Подключение

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

MFRC522 Arduino Uno Arduino Mega Arduino Nano v3

Arduino Leonardo/ Micro

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

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


#define SS_PIN 10 #define RST_PIN 9

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

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


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

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

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


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

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

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


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

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

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


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

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


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

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

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

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


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

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


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

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

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

Самое главное для рядового пользователя — это удобство в эксплуатации и надежность электронного замка. Этим требованиям удовлетворяют устройства, основанные на RFID (от англ. Radio Frequency IDentification — радиочастотная идентификация) — бесконтактной радиочастотной идентификации.

Подобная система идентификации состоит из стационарного приемника и носимого передатчика (транспондера).

Представленный в данной статье RFID замок работает подобным образом. Идентификация осуществляется на основе чтения 40-битного серийного номера карты Unique. Рабочее состояние сигнализируется звуковым сигналом. Замок может работать в двух основных режимах: чтения и регистрация карт Unique в памяти микроконтроллера. Всего в память можно записать 4 карты.

Краткие характеристики RFID замка;

Описание работы RFID замка

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

Внутренний RC генератор микроконтроллера позволяет получить тактовую частоту с программируемым диапазоном частот 37кГц … 8МГц.

Аппаратный генератор сигнала ШИМ, содержащийся в контроллере, используется для генерации прямоугольных импульсов с чистотой 125 кГц, которые после усиления поступают на антенну считывателя.

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

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

Форма волны, полученный таким образом, направляется на вход усилителя, состоящего из транзисторов VT1 и VТ2, и далее на катушку-антену считывателя, которая используется для бесконтактного питания схемы, находящейся в Unique карте.

Для используемых Unique карт скорость передачи данных равна примерно 2 кбит/с (125000/64=1953bps). Уникальный код каждой авторизованной карты хранится в энергонезависимой памяти EEPROM микроконтроллера.

Состояние работы замка сигнализируется с помощью зуммера, подключенного к выводу GP4. Управление реле осуществляется с выхода GP5 через транзистор VT3.

Две перемычки служат для установки режима работы микроконтроллера. Перемычка JP2 переводит контроллер в режим программирования новых карт, а JP1 меняет способ управления реле между режимом переключения и временным включением.

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

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

После всей обработки, уже соответствующий цифровой сигнал поступает на вход GP3 микроконтроллера.

Антенна состоит из 40 витков эмалированного обмоточного провода диаметром 0,1…0,3 м
м, намотанного на временную оправку диаметром 40…60 мм. После этого катушку для защиты следует обмотать изоляционной лентой.

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

Питающее напряжение подается к выводу CON2. Его значение должно находиться в диапазоне 9…12 В. Более высокое напряжение не повредит стабилизатор, но из-за этого он может значительно греться.

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

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

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

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

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

(62,6 Kb, скачано: 1 051)

Характеристики:
Частота метки: 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 (Radio-frequency identification) – к ним примкнут более простые метки – или как один небольшой шаг в технологиях круто изменил жизнь миллионов и даже миллиардов людей по всему миру.

Предисловие

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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


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

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


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

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


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

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

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

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

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

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

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

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

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


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

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

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

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


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

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


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

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

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


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


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

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

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

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

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

Шаг 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 мкгн, на которые я рассчитывал.

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