Электронный ключ RC-522 для Ардуино

Содержание

Делаем на Ардуино дубликатор домофонных ключей

Электронный ключ RC-522 для Ардуино

10 июня в 16:27 / Уроки /

Устали от блокировки, когда вы теряете или забываете свои ключи? Сегодня мы создадим дверной замок RFID Arduino посредством копирования домофонного ключа. Мы узнаем о радиочастотной идентификации RFID и используем беспроводную связь. С помощью микроконтроллера Arduino можно копировать домофонный ключ, если случайно его потерял. Давайте посмотрим, как это делается.

RFID – радиочастотная идентификация. Устройство выполняет ту же функцию, что и штрих-код или магнитная полоска на задней стороне кредитной карты. Он предоставляет уникальный идентификатор для этого объекта. И так же, как штрих-код или магнитная полоса, RFID должен быть отсканирован для получения информации.

RFID используется в этом проекте для чтения данных из RFID-меток и отправки информации в энергонезависимую память MCU.

Идентификатор, считываемый из тегов, сравнивается с хранимой информацией, и если он совпадает, то дверь открывается.

Принцип работы дубликатора на Ардуино

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

Проверяя номер из своей базы данных разрешенных скоростей передачи данных, он откроет дверь. Ключи для внутренней связи, которые мы будем подключать к Arduino дубликатору (иногда называемому iButton или Touch Memory), считываются и записываются в 1-проводной интерфейс. Поэтому схема подключения очень проста.

Необходимые материалы

Для конструирования проекта “Arduino дубликатор домофонных ключей” понадобятся следующие материалы:

  1. Дубликатор домофонных ключей строится на микропроцессоре Arduino Nano.
  2. RFID RC522.
  3. Пьезо-зуммер.
  4. 2x LED-монитора.
  5. 2x 330 резистор.
  6. Клавиатура 4 × 4.
  7. Адаптер I2C для ЖК-дисплея.
  8. LCD16X2BL.

Создание дубликатора своими руками

ЖК-дисплей имеет 16 контактов, что слишком много для Arduino Nano домофона, поэтому важно иметь адаптер I2C. Это позволяет управлять дисплеем только из двух сигнальных штырей на Ардуино. Это полезно из-за небольшого числа контактов, которые нужно будет контролировать из MCU.

ЖК-контакты

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

Спецификация контактов

Для начала сделаем связи между ЖК-дисплеем и I2C. Для этого нужен адаптер ЖК-дисплея I2C (LCD1602). Адаптер преобразует ЖК-дисплей формата 16 x 2 в серийный ЖК-дисплей I2C, которым можно управлять через Arduino всего посредством 2-х проводов.

Соединения между Arduino и LCD

Аппаратная часть

Для набора кода понадобится библиотека LiquidCrystal_I2C.h в Arduino IDE. Библиотека позволяет подключить ЖК-дисплей к Ардуино. Встроенная библиотека LiquidCrystal_I2C позволяет легко отображать символы на ЖК-дисплее.

Вы можете скачать LiquidCrystal_I2C.h с нашего сайта отсюда, или с ГитХаба – https://github.com/todeilatiberia/SmartDoor.

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

  1. Сначала загрузите файлы из Github.
  2. Извлеките из архивов каждую папку.
  3. Скопируйте ZIP-файлы в папку Ардуино.
  4. Откройте Ардуино и добавьте Keypad.zip:: Меню эскиза> Включить библиотеку> Добавить. ZIP-библиотеку.
  5. Добавить библиотеку клавиатуры: меню «Эскиз»> «Включить библиотеку»> «Клавиатура».

Мы подключим клавиатуру для отображения номеров на ЖК-дисплее для Arduino и скопируем ключ, который вводим с клавиатуры.

Keypad.h – это библиотека, которая позволяет Arduino читать клавиатуру с матричным типом.

В этом проекте используется клавиатура 4 × 4.

В таблице показано соединение между платой Arduino и клавиатурой. Штыри клавиатуры подключены к цифровым выходным выводам Arduino. Pin D6 использовался для зуммера, потому что это был штырь ШИМ.

Вывод клавиатурыКонтакт Arduino
1D2
2D3
3D4
4D5
5A0
6D7
7D8

Соединение между Arduino, LCD и клавиатуройЖК-дисплей и клавиатура, подключенные к Arduino

Затем добавим RFID. В этом случае плата RFID использует протокол связи SPI, где Arduino будет действовать, как ведущий и считыватель RFID в качестве подчиненного. Считыватель карт и теги предназначены для связи с частотой, равной 13,56 МГц.

Это важный шаг, поскольку он помогает нам считывать данные с карты, и он будет решать, соответствует ли идентификатор информации, хранящейся в EEPROM. Если он соответствует, он даст нам доступ и отобразит «Unlocked». В противном случае на ЖК-дисплее отобразится «Заблокировано».

Соединение между Arduino, LCD и RFIDДомофон на Ардуино, LCD и RFID

Следующий шаг – добавить зуммер и 2 светодиода для имитации системы контролируемого доступа.

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

Красный светодиод всегда горит, когда он заблокирован, но зеленый светодиод загорается, когда он разблокирован.

Чтобы защитить модули, нужно использовать 3D-печать корпуса. Если у вас нет 3D-принтера, вы можете просто использовать пластиковый корпус, который позволяет вам вставлять все компоненты внутрь. Это очень полезно, потому что модули будут размещены внутри, а единственными частями вне коробки будут светодиоды, клавиатура и ЖК-дисплей.

Схема соединений, показывающая соединение между Nano, LCD, клавиатурой, RFID и звуковым сигналом

Код для загрузки на микропроцессор доступен по ссылке: www.deviceplus.com/how-tos/arduino-guide/make-your-own-arduino-rfid-door-lock/.

Тестирование и настройка готового дубликатора

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

Можно разработать корпус с использованием программы SketchUp, которая имеет удобный интерфейс с простыми кнопками, такими как Eraser, Lines и Tape Measure Tool.

Размеры коробки составляют: 120 х 125 х 37 мм.

Если вы не знакомы с Sketchup, вам нужно ознакомиться со следующими учебниками SketchUp: http://www.sketchup.com/learn/videos/58.

Коробка для корпуса устройства (вид сверху)Коробка для  корпуса устройства (вид снизу)

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

  • Вид сверху:
    • 2 отверстия для светодиодов (5,2 мм).
    • 1 для ЖК-дисплея (42,2 × 7,3 мм).
    • 1 отверстие для кабеля (16 × 10,5 мм).
  • Вид снизу:
    • 1 открытие для клавиатуры (27 × 10 мм).

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

Полный корпус с модулями, расположенными внутри

Как пользоваться устройством

Откройте последовательный монитор. Нажмите клавиши. Вы должны заметить, что последовательный монитор сообщает, какой именно ключ пользователь нажал. Тем не менее, может потребоваться небольшая практика нажатия кнопок.

Источник: https://ArduinoPlus.ru/arduino-dublikator-domofonnih-kluchei/

Как подключить RFID считыватель RC522 к Arduino

Электронный ключ RC-522 для Ардуино

В этой статье мы рассмотрим подключение к Arduino считывателя карт и брелоков RFID RC522, работающего на частоте 13,56 МГц.

  • Arduino (или совместимая плата);
  • считыватель RFID RC522 (приобретается здесь);
  • беспроводная RFID метка (идёт в комплекте по ссылке выше) или бесконтактный билет на метро/наземный транспорт;
  • макетная плата;
  • соединительные провода (вот такие);
  • компьютер с Arduino IDE.

Модуль RFID-RC522 выполнен на микросхеме MFRC522 фирмы NXP. Эта микросхема обеспечивает двухстороннюю беспроводную (до 6 см) коммуникацию на частоте 13,56 МГц.

Беспроводной модуль RFID-RC522

Микросхема MFRC522 поддерживает следующие варианты подключения:

ИнтерфейсСкорость передачи
SPI (Serial Peripheral Interface, последовательный интерфейс для связи периферийных устройств)до 10 Мбит/сек;
двухпроводной интерфейс I2Cдо 3400 кбод в режиме High-speed,до 400 кбод в режиме Fast;
последовательный UART (аналог RS232)до 1228,8 кбод.

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

RFID – это сокращение от “Radio Frequency IDentification” и переводится как «радиочастотная идентификация».
NFC – это “Near field communication”, «коммуникация ближнего поля» или «ближняя бесконтактная связь».

2Схема подключения RFID-RC522 к Arduino

Подключим модуль RFID-RC522 к Arduino по интерфейсу SPI по приведённой схеме.

Схема подключения RFID-RC522 к Arduino по интерфейсу SPI

Питание модуля обеспечивается напряжением от 2,5 до 3,3 В. Остальные выводы подключаем к Arduino так:

Пин RC522Пин Arduino
RSTD9
SDA (SS)D10
MOSID11
MISOD12
SCKD13

Не забывайте также, что Arduino имеет специальный разъём ICSP для работы по интерфейсу SPI. Его распиновка также приведена на иллюстрации. Можно подключить выводы RST, SCK, MISO, MOSI и GND модуля RC522 к разъёму ICSP на Ардуино.

3Библиотека для работы Arduino с RFID

Микросхема MFRC522 имеет достаточно обширную функциональность. Познакомиться со всеми возможностями можно изучив её паспорт (datasheet). Мы же для знакомства с возможностями данного устройства воспользуемся одной из готовых библиотек, написанных для работы Arduino с RC522. Скачайте её и распакуйте в директорию Arduino IDE\libraries\

Установка библиотеки “rfid-master” для работы Arduino с RFID-метками

После этого запустите среду разработки Arduino IDE.

4Скетч для считывания информации, записанной на RFID-метке

Теперь давайте откроем скетч из примеров: Файл Образцы MFRC522 DumpInfo и загрузим его в память Arduino.

Открываем скетч DumpInfo

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

#include #include const int RST_PIN = 9; // пин RST const int SS_PIN = 10; // пин SDA (SS) MFRC522 mfrc522(SS_PIN, RST_PIN); // создаём объект MFRC522 void setup() { Serial.begin(9600); // инициализация послед. порта SPI.begin(); // инициализация шины SPI mfrc522.PCD_Init(); // инициализация считывателя RC522 } void loop() { // Ожидание прикладывания новой RFID-метки: if ( ! mfrc522.PICC_IsNewCardPresent()) { return; // выход, если не приложена новая карта } // Считываем серийный номер: if ( ! mfrc522.PICC_ReadCardSerial()) { return; // выход, если невозможно считать сер. номер } // Вывод дампа в послед. порт: mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); }

Текст скетча достаточно хорошо прокомментирован.

Для более полного знакомства с библиотекой изучите файлы MFRC522.h и MFRC522.cpp из директории rfid-master.

5Дамп данных с RFID-метки

Запустим монитор последовательного порта сочетанием клавиш Ctrl+Shift+M, через меню Инструменты или кнопкой с изображением лупы. Теперь приложим к считывателю билет метро или любую другую RFID-метку. Монитор последовательного порта покажет данные, записанные на RFID-метку или билет.

Считываем данные с билета на наземный транспорт и метро с помощью RFID

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

Примечание

Да, с помощью модуля RFID-RC522 можно записать данные на билет метро.

Но не обольщайтесь, каждая карта имеет неперезаписываемый счётчик циклов записи, так что «добавить» поездок себе на метро не получится – это сразу будет обнаружено и карта будет забракована турникетом 🙂 А вот использовать билеты метро для записи на них небольших объёмов данных – от 1 до 4 кб – можно. И способы применения этому ограничены только вашей фантазией.

Источник: https://soltau.ru/index.php/arduino/item/399-kak-podklyuchit-rfid-schityvatel-rc522-k-arduino

Чтение и запись RFID меток. Модуль RC522 для Arduino

Электронный ключ RC-522 для Ардуино

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

MFRC522Arduino UnoArduino MegaArduino Nano v3Arduino Leonardo/MicroArduino Pro Micro
RST95D9RESET/ICSP-5RST
SDA(SS)1053D101010
MOSI11 (ICSP-4)51D11ICSP-416
MISO12 (ICSP-1)50D12ICSP-114
SCK13 (ICSP-3)52D13ICSP-315
3.3V3.3V3.3VСтабилизатор 3,3ВСтабилизатор 3,3ВСтабилизатор 3,3В
GNDGNDGNDGNDGNDGND

Пины управления 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[0] != serNum0 && rfid.serNum[1] != serNum1 && rfid.serNum[2] != serNum2 && rfid.serNum[3] != serNum3 && rfid.serNum[4] != serNum4 ) { /* Если карта – новая, то считываем*/ Serial.println(” “); Serial.println(“Card found”); serNum0 = rfid.serNum[0]; serNum1 = rfid.serNum[1]; serNum2 = rfid.serNum[2]; serNum3 = rfid.serNum[3]; serNum4 = rfid.serNum[4]; //Выводим номер карты Serial.println(“Cardnumber:”); Serial.print(“Dec: “); Serial.print(rfid.serNum[0],DEC); Serial.print(“, “); Serial.print(rfid.serNum[1],DEC); Serial.print(“, “); Serial.print(rfid.serNum[2],DEC); Serial.print(“, “); Serial.print(rfid.serNum[3],DEC); Serial.print(“, “); Serial.print(rfid.serNum[4],DEC); Serial.println(” “); Serial.print(“Hex: “); Serial.print(rfid.serNum[0],HEX); Serial.print(“, “); Serial.print(rfid.serNum[1],HEX); Serial.print(“, “); Serial.print(rfid.serNum[2],HEX); Serial.print(“, “); Serial.print(rfid.serNum[3],HEX); Serial.print(“, “); Serial.print(rfid.serNum[4],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[18]; 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 добавлять пользовательские символы, фактически добавляя на дисплей графику.

Источник: https://arthurphdent.livejournal.com/1759.html

Подключение RFID к Arduino с помощью RC522 и RDM3600

Электронный ключ RC-522 для Ардуино

RFID метки стали неотъемлемой частью нашей жизни, без них немыслимы современные системы автоматизации и умные устройства.

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

В этой статье мы расскажем, что такое RFID, сделаем обзор стандартов , типов карточек, узнаем как подключать популярные RFID-считыватели RC522 и RDM3600 к Arduino.

Что такое RFID

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

Все RFID-системы можно разделить по дальности действия:

  • Ближней идентификации – расстояние не более 20 см;
  • Средней идентификации – расстояние от 20 см до 5 м;
  • Дальней идентификации – максимум 300 м.

С точки зрения частот можно выделить:

  • Системы, работающие в низкочастотном диапазоне (125 кГц, 134 кГц);
  • Работающие в среднечастотном диапазоне (13,56 МГц);
  • Работающие в высокочастотном диапазоне (800 МГц – 2, 4 ГГц).

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

Основными стандартами являются ISO 14443, ISO 15693 и EPC. На основе стандарта ISO 14443 изготавливаются смарт-карты. ISO 15693 используется для перезаписывания меток.

EPC – аналог штрихкодов, имеет более простую и понятную структуру.

ВЧ диапазон начали использовать недавно, в основном его применяют для складских приложений. Для этого диапазона используются стандарты ISO 18000 и EPC. Стандарты ISO 18000 вызывают наибольший интерес, они используются в приложениях с метками с увеличенной дальностью. Для ISO 18000 также можно выделить несколько стандартов, различающихся по  частоте:

  • ISO 18000-1 (определение тех параметров, которые необходимо стандартизировать);
  • ISO 18000-2 (для параметров с бесконтактным интерфейсом связи менее 135 кГц);
  • ISO 18000-3 (для бесконтактного интерфейса на частоте 13,56 МГц);
  • ISO 18000-4 (для частоты 2, 45 ГГц);
  • ISO 18000-6 (для частоты 860-930МГц);
  • ISO 18000-7 (для частоты 433 МГц).

Преимущества RFID

  • Не требуется прямая видимость;
  • Практически 100% идентификация сигнала;
  • Возможность применения в агрессивной среде;
  • Долгий срок службы;
  • RFID-метку трудно подделать;
  • Возможность хранения и передачи большого объема информации.

Области применения RFID идентификации

RFID-технология часто используется в розничной торговле, библиотеках и архивах, логистике, системах контроля и управления доступом (СКУД), инициализации людей, удостоверении подлинности товаров.

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

Основной задачей СКУД является управление доступом – например, ограничение в доступе на какую-либо территорию, идентификация лиц, которые могут попадать на территорию.

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

RFID-брелки используются и для подъездных домофонов. Для открытия дверей чаще всего используются брелки Proximity, то есть брелки ближнего действия, работающие на расстоянии 10-15 см.  Proximity также делятся на несколько форматов – наиболее популярные на сегодняшний день EM-Marin, HID для бесконтактных ключей и MIFARE, к которым относятся бесконтактные смарт карты.

Модуль Arduino RFID RC522

Модуль RFID RC522 выполнен на основе схемы MFRC522, которая обеспечивает беспроводную коммуникацию на частоте 13,56 МГц. Подключать микросхему можно по интерфейсу SPI, I2c и UART. Стандарт протокола NFC Reader ISO 14443.

Технические характеристики модуля RFID RC522:

  • Напряжение питания 3,3 В;
  • Максимальный потребляемый ток 30 мА;
  • Частотная полоса 13,55-13,57 МГц;
  • Расстояние считывания до 25 мм;
  • Рабочая температура от -20С до 80 С.

Распиновка модуля изображена на рисунке. Контакт SDA (SS, CS, NSS) отвечает за выбор ведомого устройства. Выход SCK является тактовым сигналом SPI. MOSI – отвечает за передачу данных от мастера к ведомому, MISO – от ведомого к мастеру.

IRQ – выполняет прерывание. RST – выполняет прерывание.

RDM6300 – бесконтактный считыватель, который используется для дистанционного считывания номера RFID брелка и передачи номера через UART на микроконтроллер, управляющий замком в системах доступа. Устройство обладает несколькими преимуществами – невысокая цена и простота в установке.

Чаще всего используется в системах контроля доступа в дома, гаражи, офисы, квартиры и другие здания с электромеханическим замком.  Считыватель используется для чтения карт EM4100/TK4100. RDM6300 может монтироваться в стену или в корпус.

В качестве микроконтроллера обычно применяется Ардуино.

Технические характеристики RDM6300:

  • Максимальный потребляемый ток 50 мА;
  • Напряжение питания 5 В;
  • Рабочая частота 125 кГц;
  • Рабочие температуры от -10С до 70 С.

Распиновка изображена на рисунке.

Пин TX отвечает за передачу данных, RX – за прием. 3 выход не используется.

Для P2 выходы ANT1 и ANT2 используются для подключения антенны.

Подключение RC522 к Ардуино

Для подключения понадобятся плата Ардуино, считыватель RC522, компьютер, провода и беспроводная RFID метка.

Подключается модуль RC522 к ардуино по следующей схеме:

Напряжение питания обеспечивается от 2,5 до 3,3 В. Выход RST подключается к D9 пину на ардуино, SDA – к D10, MOSI – D11, MISO – D12, SCK – D13. В данном случае рассмотрены платы Arduino Nano v3 и Arduino Uno. После того как все будет подключено, на RC522 загорится индикатор.

Плата Ардуино оснащена дополнительным разъемом ICSP, который используется для работы по интерфейсу  SPI. Распиновка для него изображена на рисунке, выводы с модуля RC522 можно подключить к этому разъему.

Для работы с модулем нужно установить библиотеку RFID Library for MFRC522. После установки нужно загрузить тестовый скетч для считывания номера карты cardRead, включить мониторинг последовательного порта. Затем метку нужно поднести к ридеру, произойдет инициализация метки и на мониторе появится следующее:

В данном примере произведено считывание трех различных меток.

Можно выбрать другой пример – DumpInfo, который также считает данные с карты. В результате на экране появятся тип карты и информация, которая состоит из 16 сектором памяти по 4 блока.

Источник: https://ArduinoMaster.ru/datchiki-arduino/podklyuchenie-rfid-k-arduino/

Дверной замок. RFID

Электронный ключ RC-522 для Ардуино

Доброго времени суток! Параллельно моей предыдущей статье я работал еще над одним «проектом». Собственно у меня завалялось пару китайских RFID читалок. Вот таких:

Фото RC522

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

работы устройства

На видео есть еще одна Arduino — она нужна только для питания Arduino Pro Mini. В конечной схеме её конечно нет, просто блок питания на 5В я еще не приобрел. Под катом очень много фотографий!

Читать дальше

Как это работает?

Вся система состоит из 5-и элементов:

  • Модуль RFID RC522 13,56 Mhz;
  • Микроконтроллер Arduino Pro Mini;
  • Транзистор;
  • Стабилизатор напряжения 3.3В;
  • Сервопривод TowerPro SG-90.

Пока метка не поднесена к RC522, микроконтроллер слушает состояние ножки, на которой «висит» кнопка.

Если на входе высокое напряжение — программа инвертирует положение системы: замок открыт — закрыть, и наоборот. В зависимости от открыт/закрыт загораются светодиоды: красный — закрыт, зеленый — открыт. Наконец то подносим метку к RC522. Arduino считывает 16 байт данных и сверяет с имеющимся двухмерным массивом пользователей.

При совпадении система инвертируется, иначе — ничего не происходит.

Фото Arduino Pro Mini

Модуль считывания RFID меток RC522. Фото модуля вначале статьи. Сервопривод TowerPro SG-90. Просто потому что был под рукой. На самом деле купить помощнее и надежнее не было бы лишним.

Фото TowerPro SG-90

Любой подходящий транзистор. У меня был 2N2222.

Фото 2N2222

Любой стабилизатор напряжения 3.3В. В наличии был LF33CV.

Фото LF33CV

Ну и конечно ключи. Пока был в Киеве, я приобрел вот такой силиконовый RFID-браслет:

Замок

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

Схема

На самой печатной плате присутствует разъем ИК-приемника, но реализовывать не стал.

Устройство

В итоговом устройстве я совсем забыл про резистор для кнопки, но в схеме я его добавил. Для питания Arduino Pro Mini был взят штекер от старого ПК.

Программная часть

Замок/* —————————————————————————– * Pin layout should be as follows: * Signal Pin Pin Pin * Arduino Uno Arduino Mega MFRC522 board * ———————————————————— * Reset 9 5 RST * SPI SS 10 53 SDA * SPI MOSI 11 51 MOSI * SPI MISO 12 50 MISO * SPI SCK 13 52 SCK * * */ #include #include #include #define SS_PIN 10#define RST_PIN 9MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.Servo myservo;boolean doorOpen; /*Users*/ int countUsers = 2;byte Users[2][16] = {{1,2,3,4, 5,6,7,8, 9,10,255,12, 13,14,15,16}, {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1}}; void setup() { Serial.begin(9600); pinMode(8, INPUT); //button open/close door pinMode(7, OUTPUT); //load transistor digitalWrite(7, LOW); pinMode(5, OUTPUT); //LED open/close door myservo.attach(6); SPI.begin(); mfrc522.PCD_Init();} void loop() { MFRC522::MIFARE_Key key; for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } if ( ! mfrc522.PICC_IsNewCardPresent()) { if (digitalRead(8) == HIGH) { digitalWrite(7, HIGH); delay(500); if (doorOpen) { myservo.write(80); doorOpen = false; Serial.println("CLOSED!"); digitalWrite(5, HIGH); } else { myservo.write(2); doorOpen = true; Serial.println("OPENED!"); digitalWrite(5, LOW); } delay(500); digitalWrite(7, LOW); } return; } if ( ! mfrc522.PICC_ReadCardSerial()) { return; } Serial.print("!"); Serial.print("\r"); 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.print("\r"); byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); //Serial.print(mfrc522.PICC_GetTypeName(piccType)); //Serial.print("\r"); if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { return; } byte sector = 1; byte valueBlockA = 4; byte valueBlockB = 5; byte valueBlockC = 6; byte trailerBlock = 7; MFRC522::StatusCode status; status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print("PCD_Authenticate() failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return; } status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print("PCD_Authenticate() failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return; } byte buffer[18]; byte size = sizeof(buffer); status = mfrc522.MIFARE_Read(valueBlockA, buffer, &size); Serial.print(buffer[0]); Serial.print("\r"); Serial.print(buffer[1]); Serial.print("\r"); Serial.print(buffer[2]); Serial.print("\r"); Serial.print(buffer[3]); Serial.print("\r"); Serial.print(buffer[4]); Serial.print("\r"); Serial.print(buffer[5]); Serial.print("\r"); Serial.print(buffer[6]); Serial.print("\r"); Serial.print(buffer[7]); Serial.print("\r"); Serial.print(buffer[8]); Serial.print("\r"); Serial.print(buffer[9]); Serial.print("\r"); Serial.print(buffer[10]); Serial.print("\r"); Serial.print(buffer[11]); Serial.print("\r"); Serial.print(buffer[12]); Serial.print("\r"); Serial.print(buffer[13]); Serial.print("\r"); Serial.print(buffer[14]); Serial.print("\r"); Serial.print(buffer[15]); Serial.print("\r"); byte trueBytes = 0; boolean acceptUser = false; for (int i = 0; i < countUsers; i++) { if (!acceptUser) { for (int j = 0; j < 16; j++) { if (buffer[j] == Users[i][j]) { trueBytes++; } } } if (trueBytes == 16) { digitalWrite(7, HIGH); delay(500); if (doorOpen) { myservo.write(80); doorOpen = false; Serial.println("CLOSED!"); digitalWrite(5, HIGH); } else { myservo.write(2); doorOpen = true; Serial.println("OPENED!"); digitalWrite(5, LOW); } delay(500); digitalWrite(7, LOW); acceptUser = true; trueBytes = 0; } else trueBytes = 0; } mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); }

Вывод

«boolean yes = false;» уже не будет, но все может быть 🙂

Используемые библиотеки: MFRC522.h и Servo.h. Пример был взят из RFID библиотеки и дописан под себя.

В примерах так же есть функция записи первого блока(по факту второго, первый блок read-only). Мне было достаточно 16 байт данных. Конечно лучше было использовать еще UID тогда было бы надежнее, но я пока не собирался его куда-нибудь ставить.

  • nfc
  • дверной замок
  • arduino
  • rc522

Источник: https://habr.com/post/233139/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.

    x