Зчитувач RFID: розповідаємо про технологію. Погляд зсередини: RFID та інші мітки

Мітка EM4100 зберігає 64 біта даних, отже, конструкція повинна містити 64-бітний регістр зрушення, складений з восьми 8-бітних регістрів 74HC165. Регістр перезавантажується після кожних 64 зрушень, щоб скинути дані та почати спочатку. Дані на входах регістру такі:
  • Паттерн синхронізації: дев'ять одиниць
  • Ідентифікатор виробника/версії: 2 блоки по 5 біт, з яких 4 біти - дані, а п'ятий - парність
  • Унікальний ідентифікатор: 8 блоків по 5 біт, з яких 4 біти – дані, а п'ятий – парність
  • Контрольна сума: 4 біти парності, підраховані по стовпцях
  • Стоп-біт: "0"

Навіть мітки з шифруванням уразливі для багатьох атак. Крім того, стає все легше емулювати мітки на смартфонах за допомогою NFC (які зазвичай працюють на 13,56 МГц). Просто правильно напишіть програму для модуляції поля, і ви зможете робити все, що хочете.

Як стандартна відмазка нагадаю, що автор (І перекладач! – Прим. перев.) не несе жодної відповідальності за наслідки використання інформації з цієї статті. Читач має сам відповідати за всі свої дії.

Корпус

Іноді дужещастить. Гарний корпус не завадив би саме зараз, коли прототип закінчено, а друкована плата замовлена. І саме в цей час Флемінг перестав збирати і запустив верстат лазерного різання OSAA PhotonSaw. Після року роботи над проектом лазер готовий вирізати свої перші деталі. Флемінг і Рун роблять останні юстування і ставлять на місце алюмінієву кришку лазерної шафи. Ви можете собі уявити, як ми всі були раді бачити, що ця штука працює.

З працюючим верстатом ми отримали можливість протестувати наш проект у реального життя. Корпус для нашої RFID-мітки зробили з 2-міліметрового огрскла. Цей корпус – перший об'єкт, зроблений на PhotonSaw, так!

Народилася ідея розташувати котушку на зовнішній стороні корпусу. Спершу було вирішено використати половину висоти корпусу, але це не працювало на практиці (додаткові отвори в довгих сторонах, таким чином, не використовуються). Котушка просто чудово розмістилася по периметру всього корпусу, хоча я мав сумніви, чи не буде прямокутна обмотка (105x55 мм) занадто великою для нормального електромагнітного зв'язку.

Тестова котушка була намотана, без жодних розрахунків, проводом 0,4 мм у 66 витків. І, очевидно, нам знову пощастило, тому що котушка вийшла такою, як треба, індуктивністю 645 мкГн, з підключеною міткою даючи резонансну частоту 125,2 кГц. Тест на зчитувачі дверей показав, що прототип працює просто чудово з цією котушкою.

З котушкою зовні корпусу товщину останнього можна зменшити. Внутрішня товщина тепер залежить тільки від висоти деталей на платі і з урахуванням товщини плати повинна становити близько 6 мм. Крім того, було б добре додати гравіювання. Флемінг запропонував заокруглити бічні сторони корпусу з естетичних та ергономічних міркувань. Вигнутий корпус також краще захищатиме бічні сторони котушки, тому що там, де немає сильного натягу, витки дроту люблять вилазити назовні.

Верстат PhotonSaw ще не зовсім у нормальному стані: гравіювання на верхній кришцізначно з'їхала. Необхідно остаточно його налагодити перед виготовленням фінальної версії корпусу. Вигнуті контури також зазнали помилки розрахунку програмне забезпечення, так як промінь не повернувся в початкове положенняпісля проходу замкнутої траєкторії. Але принаймні криві виглядають справді гладкими.

Складання друкованої плати

Прибула замовлена ​​плата:

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

Через розділову ємність (47 пФ мають опір приблизно 27 кОм на частоті 125 кГц) і захисні діоди струм надходить на шини живлення. Енергії, що надходить із котушки, вистачає на підтримку напруги живлення близько 1 В. Струм може досягати 250-500 мкА. Дивно, але мікросхеми 74HC, схоже, працюють за такого харчування. На жаль, за такого напруження відбуваються досить дивні речі. Мікросхеми 74HC мають внутрішню схему скидання і потрібно переконатися, що вона спрацьовує. Зверніть увагу, що вимкнення захисних діодів не допомагає. На входах мікросхем є внутрішні захисні діоди, які у разі відкриваються і виконують ту ж роботу.

Скидання живлення спрацьовує тільки якщо напруга живлення падає нижче певного рівня протягом деякого періоду часу. Якщо напруга залишається надто високою, то внутрішня логіка може заплутатися, тому що деякі її частини можуть бути в невизначеному стані, тоді як інші працюють належним чином. Необхідне внутрішнє скидання для встановлення всіх мікросхем у узгоджений стан. Таким чином, схема буде нестійко працювати при дуже низькій напрузі живлення.

Симптоми спостерігалися такі: мітка працює деякий час, посилаючи коректні дані. Якщо котушку прибрати від зчитувача, а потім повернути назад, можете робити ставки, чи при цьому вимкнеться мітка. Іноді спрацьовує, іноді – ні. Відключення ФАПЛ погіршує ситуацію. Низьке енергоспоживання призводить до того, що рідер час від часу прийматиме дані від вимкненої мітки. Ось що означає "енергоефективна система".

Існує два рішення: 1) зменшити конденсатор у ланцюзі відновлення тактового сигналу до 15 пФ, і 2) включити між живленням та землею резистор 22-100 кОм для скидання зайвої енергії. Другий метод призводить до зростання витоків під час роботи і насправді не потрібний при зменшенні ємності конденсатора. Тим не менш, він передбачений як опція, і це все одно краще, ніж невизначений стан мікросхем.

Модуляція струмом чи напругою

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

Причина опинилася у схемі модулятора. МОП-транзистори замикають котушку на резистор певного опору. Однак, якщо споживання енергії з контуру велике, опір модулятора значно вищий, ніж опір ланцюгів живлення. Це призводить до того, що глибина модуляції залежить від споживаного струму, а це не дуже добре. Ситуацію погіршив вибір обмежувального стабілітрону на нижчу напругу, ніж у прототипі.

Вирішили перевести модулятор з режиму модуляції напругою в режим модуляції струмом. Для першого режиму резистор перебував у ланцюгу стоку, тепер він включений між витоком і землею. На цьому резисторі падатиме напруга затвор-витік, поки не залишиться значення трохи вище за поріг відкривання транзистора (0,9-1,1 В), яке переведе транзистор в лінійний режим. Тепер струм через транзистор буде стабільним, незалежно від напруги стоку.

Тестування на прототипі показало, що модуляція струмом дуже добре працює. Дешевий безіменний зчитувач більше не збоїть (ну гаразд, може бути один раз на сотню або близько того). Можна припустити, що ця зміна працюватиме чудово і на інших рідерах, і мітка тепер, ймовірно, зможе працювати на більшості з них.

Закінчена версія 1

Можна помітити зміни на друкованій платі. У мене не було 15 пФ SMD-конденсатора, довелося впаяти звичайний, з ногами. Модулятор оброс додатковими резисторами на витоках транзисторів. Загалом прийнятно для першої версії.

(картинки клікабельні)





Відео-демонстрація

Висновок

Ви можете подумати, що цей проект, зібраний на логіці 7400, можна зарахувати до ретро-схемотехніки, але це не зовсім так. По-перше, сучасне сімейство 74HC не таке вже й старе. По-друге, схеми, що низько споживають, завжди актуальні. По-третє, мікросхеми одиночних логічних елементів (такі як використаний тригер Шмітта) часто використовуються в сучасних розробках. Часто забувають, що розвиток технологій не припиняється і для старих сімей мікросхем. Вони просто стали менш помітними на тлі загальної різноманітності.

Аналогова частина виявилася складнішою у розробці, ніж цифрова. Частково через відсутність специфікацій, але в основному за рахунок безлічі компромісів, необхідних для відповідності параметрам, та непередбачених побічних ефектів. Цифрові конструкції мають відносно мало варіантів, тоді як аналогові зазвичай вимагають балансу між різними (і часто протилежними) критеріями.

Я повинен зізнатися, що мікросхеми 74HC зроблено дуже, дуже добре. Розробники знали, що роблять, і досягли дуже низького енергоспоживання. Спершу я мав певні сумніви, чи зможе мітка працювати від пасивного харчування, але після прочитання специфікацій це залишилося лише питанням правильної схемотехніки. Хоча є ще можливості для оптимізації різних частин мітки.

Тепер побачимо, як цей проект покаже себе на конкурсі 7400 2012 року. Подання заявок на конкурс закінчується 31 листопада. Побажаємо автору удачі! - Прим. перев.

Теги:

  • RFID
  • 7400 Contest
  • overengineering
  • логічні схеми
  • граблі всюди
Додати теги

Переваги електронних замків не можна недооцінити, як приклад цього, використання електронних замків дозволяє звільнитися від цілої зв'язки важких ключів.

Найголовніше для рядового користувача – це зручність в експлуатації та надійність електронного замку. Цим вимогам задовольняють пристрої, що ґрунтуються на 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)

Сьогодні урок про те, як використовувати 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 у назві цієї штуки означає технологію радіоідентифікації, тобто нічого конкретного не означає. Зате зі специфікацій випливає, що залізниця сумісна з поширеними картками 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Мега. Тому ж, до речі, мене обійшло й друге лихо.

А ось перша - підключення пінів 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; // Видача серійного номера картки ("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); 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 тематики та розробки різноманітних зчитувачів для моделей транспондерів популярних стандартів типу Mifare, EMMARINE, TIRIS… мене часто почало спантеличувати таке питання – буквально в останній рік широку популярність набули різного роду емулятори під теги популярних протоколів та різноманітні копіювальники ключів/брелків .

Враховуючи велику кількість доступних у продажу спеціальних мікросхем популярних протоколів 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. Наступним кроком буде виготовлення пасивної мітки для нашого зчитувача як роблять відомі виробники промислових транспондерів та портування коду обладнання на дешевші моделі контролерів. В архіві до статті додаю прошивки для транспондера та зчитувача.

Завантажити прошивку:
У вас немає доступу до скачування файлів з нашого сервера