Оглавление
- Исходный код программы (скетча)
- Создание дубликатора своими руками
- Схема проекта
- Передача аутентификации
- Как подключить RFID считыватель RC522 к Arduino
- Описание
- RC522 RFID Module Pinout
- License
- Перевод данных для передачи
- Шаг 5: Код проекта
- Шаг 4: Соединяем все детали
- Подключение RFID модуля RC522 к Arduino UNO
- Объяснение программы для Arduino
- Тестируем проект
- MIFARE Classic 1K Memory Layout
- Бесконтактные копировщики
- Скачать стандартные библиотеки Arduino IDE на русском
- Список комплектующих
- Считывание данных с RFID-тега
- 1Описание считывателяRFID RC522
Исходный код программы (скетча)
Arduino
#include <SPI.h>
#include <MFRC522.h>
#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();
for (byte i = 0; i < 6; i++)
key.keyByte = 0xFF;
Serial.print(‘>’);
}
void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
if ( ! mfrc522.PICC_ReadCardSerial())
return;
send_tag_val(mfrc522.uid.uidByte, mfrc522.uid.size);
delay(1000);
}
void send_tag_val(byte *buffer, byte bufferSize)
{
Serial.print(«ID:»);
for (byte i = 0; i < bufferSize; i++)
{
Serial.print(buffer, DEC);
Serial.print(» «);
}
Serial.println(0, DEC);
Serial.print(‘>’);
}
1 |
#include <SPI.h> #define RST_PIN 9 MFRC522mfrc522(SS_PIN,RST_PIN); MFRC522::MIFARE_Keykey; voidsetup() { Serial.begin(9600); while(!Serial); SPI.begin(); mfrc522.PCD_Init(); for(bytei=;i<6;i++) key.keyBytei=0xFF; Serial.print(‘>’); } voidloop() { if(!mfrc522.PICC_IsNewCardPresent()) return; if(!mfrc522.PICC_ReadCardSerial()) return; send_tag_val(mfrc522.uid.uidByte,mfrc522.uid.size); delay(1000); } voidsend_tag_val(byte*buffer,bytebufferSize) { Serial.print(«ID:»); for(bytei=;i<bufferSize;i++) { Serial.print(bufferi,DEC); Serial.print(» «); } Serial.println(,DEC); Serial.print(‘>’); } |
Создание дубликатора своими руками
ЖК-дисплей имеет 16 контактов, что слишком много для Arduino Nano домофона, поэтому важно иметь адаптер I2C. Это позволяет управлять дисплеем только из двух сигнальных штырей на Ардуино. Это полезно из-за небольшого числа контактов, которые нужно будет контролировать из MCU
Это полезно из-за небольшого числа контактов, которые нужно будет контролировать из MCU.
ЖК-контакты
ЖК-дисплеи имеют параллельный интерфейс, а это означает, что MCU должен одновременно управлять несколькими контактами интерфейса для управления дисплеем. В приведенной ниже таблице дается описание каждого из контактов на английском языке:
Спецификация контактов
Для начала сделаем связи между ЖК-дисплеем и I2C. Для этого нужен адаптер ЖК-дисплея I2C (LCD1602). Адаптер преобразует ЖК-дисплей формата 16 x 2 в серийный ЖК-дисплей I2C, которым можно управлять через Arduino всего посредством 2-х проводов.
Соединения между Arduino и LCD
Схема проекта
Схема подключения считывателя RFID меток RC522 к плате Arduino представлена на следующем рисунке.
Поскольку RFID модуль RC522 работает по интерфейсу SPI, то подключить его к плате Arduino достаточно просто – мы соединили его контакты MISO, MOSI, SCK и NSS к контактам SPI платы Arduino Uno. Модуль RC522 запитывается от контакта 5V платы Arduino. Сама же плата Arduino получает питание по USB кабелю от компьютера. Полный список соединений в схеме представлен в следующей таблице.
Модуль RC522 | Плата Arduino Uno |
VCC | 3.3V |
GND | GND |
RST | D9 |
MISO | D12 |
MOSI | D11 |
SCK | D13 |
SDA/NSS | D10 |
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Передача аутентификации
делегирования аутентификации
- Написать код аутентификации пользователей в рутине ZAUTHENTICATE. У неё есть 4 точки входа: получения логина/пароля, их проверка и назначение прав, смена пароля, формирование токена. Подробнее об этом ниже.
- Включить передачу аутентификации в Caché (SMP → System Administration → Security → System Security → Authentication/CSP Session Options, установите флаг Allow Delegated authentication и сохраните настройки).
- Включить передачу аутентификации для требуемых сервисов (SMP → Menu → Manage Services → Сервис → Allowed Authentication Methods → выбрать Delegated → Save) и/или приложений (SMP → Menu → Manage Web Applications → Приложение → Allowed Authentication Methods → выбрать Delegated → Save).
Как подключить RFID считыватель RC522 к Arduino
В этой статье мы рассмотрим подключение к Arduino считывателя карт и брелоков RFID RC522, работающего на частоте 13,56 МГц.
Модуль 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 так:
RST | D9 |
SDA (SS) | D10 |
MOSI | D11 |
MISO | D12 |
SCK | D13 |
Не забывайте также, что 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 кб – можно. И способы применения этому ограничены только вашей фантазией.
Описание
Аббревиатура RFID расшифровывается как «radio-frequency identification», что переводится как «радио-частотная идентификация». Эта технология используется для передачи данных на короткие расстояния при помощи электромагнитных полей. Она может пригодиться, к примеру, для идентификации людей, совершения финансовых транзакций и т.д.
Систему, в основе которой лежит технология RFID, можно использовать, к примеру, для открытия дверей. То есть можно вручить какому-нибудь человеку карту, на которой будут данные, позволяющие открыть дверь лишь при помощи этой карты.
RFID-система состоит из следующих компонентов:
Теги (метки). Они встраиваются в объект, который нужно идентифицировать. К примеру, в брелок или электромагнитную карту. У каждого тега есть собственный UID (расшифровывается как «user identifier», т.е. «идентификатор пользователя»)
Ридер. Это двусторонний радио-приемопередатчик. Он отправляет сигнал тегу, а затем считывает ответ.
RC522 RFID Module Pinout
The RC522 module has total 8 pins that interface it to the outside world. The connections are as follows:
VCC supplies power for the module. This can be anywhere from 2.5 to 3.3 volts. You can connect it to 3.3V output from your Arduino. Remember connecting it to 5V pin will likely destroy your module!
RST is an input for Reset and power-down. When this pin goes low, hard power-down is enabled. This turns off all internal current sinks including the oscillator and the input pins are disconnected from the outside world. On the rising edge, the module is reset.
GND is the Ground Pin and needs to be connected to GND pin on the Arduino.
IRQ is an interrupt pin that can alert the microcontroller when RFID tag comes into its vicinity.
MISO / SCL / Tx pin acts as Master-In-Slave-Out when SPI interface is enabled, acts as serial clock when I2C interface is enabled and acts as serial data output when UART interface is enabled.
MOSI (Master Out Slave In) is SPI input to the RC522 module.
SCK (Serial Clock) accepts clock pulses provided by the SPI bus Master i.e. Arduino.
SS / SDA / Rx pin acts as Signal input when SPI interface is enabled, acts as serial data when I2C interface is enabled and acts as serial data input when UART interface is enabled. This pin is usually marked by encasing the pin in a square so it can be used as a reference for identifying the other pins.
License
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
Перевод данных для передачи
Тут тоже следует освежить в памяти форматы данных, хранимые на карте. То, в каком виде они записаны. Давайте на живом примере.
Предположим у нас есть карта, но нет ридера. На карте написан номер 010,48351.
Реальная карта с номером 010, 48351.
Как этот номер нам перевести в тот серийный номер, который записан на карте? Достаточно просто. Вспоминаем формулу: переводим две части числа отдельно:
Итого, серийный номер у нас получается: 0xABCDF. Проверим его, считываем карточку считывателем (он читает в десятичном формате), получаем число:
Переводим его любым калькулятором в хекс-формат и получаем снова: 0xABCDF.
Вроде пока просто, погодите, сейчас придётся поднапрячь. Напомню формат данных, которые лежат на самой карте.
Проговорю словами:
- Вначале идут девять единиц заголовка.
- Младшие пол байта ID клиента.
- В конце бит чётности.
- Вторые пол байта ID клиента.
- Бит чётности.
- Младшие пол байта нулевого байта серийного номера.
- Бит чётности
- Старшие пол байта данных байта нулевого байта серийного номера.
- Точно так же все остальные данные, передаются ниблами и оканчиваются битом чётности
- Самое сложное. Теперь все эти 10 нибблов по вертикали точно так же вычисляется бит чётности (прямо как в таблице).
- Завершает всё это безобразие стоп бит, который равен всегда нулю.
Итого у нас получается 64 бита данных (это из пяти байт!). В качестве ремарки, мой считыватель не читает ID-клиента, и я его принимаю равным нулю.
Что такое бит чётности? Это количество единиц в посылке: если оно чётное, то бит чётности равен нулю, если нет, то единице. Проще всего рассчитать его, просто обычным XOR.
На самом деле я долго думал, как элегантнее сделать пересчёт серийного номера в посылку, да так чтобы это занимало меньше места в микроконтроллере. Поэтому набросал небольшую програмку, которая это делает. Программу можно посмотреть под спойлером.
Самое важное для нас, это то как будет выглядеть биты чётности. Для удобства я сделал вывод на экран точно так же, как в этой табличке
В результате получилось вот так.
card_id — это серийный номер карты (о котором мы говорили выше).
Первый столбец — это ниблы, второй — их битовое представление, третий — это бит чётности. Третья строка снизу — это биты чётности всех ниблов. Как я уже сказал, они рассчитываются просто операцией XOR.
Протестировав расчёты, сверив из визуально, я проверил получившиеся данные в программе на Arduino (последняя строка специально для вставки в код). Всё отработало отлично. В результате наброска этой программы, я получил готовую функцию пересчёта. Раньше, расчёты битов были чужими программами на компе и мне не нравилась их монструозная реализация. Таким образом функция пересчёта серийного номера в формат передачи выглядит так:
Шаг 5: Код проекта
Чтобы код проекта был скомпилирован, нам нужно включить некоторые библиотеки. Прежде всего, нам нужна библиотека MFRC522 Rfid.
Чтобы установить её, перейдите в Sketch -> Include Libraries -> Manage libraries (Управление библиотеками). Найдите MFRC522 и установите её.
Нам также нужна библиотека Adafruit SSD1306 и библиотека Adafruit GFX для отображения.
Установите обе библиотеки. Библиотека Adafruit SSD1306 нуждается в небольшой модификации. Перейдите в папку Arduino -> Libraries, откройте папку Adafruit SSD1306 и отредактируйте библиотеку Adafruit_SSD1306.h. Закомментируйте строку 70 и раскомментируйте строку 69, т.к. дисплей имеет разрешение 128×64.
Сначала мы объявляем значение метки RFID, которую должен распознать Arduino. Это массив целых чисел:
int code[] = {69,141,8,136}; // UID
Затем мы инициализируем считыватель RFID и дисплей:
rfid.PCD_Init(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
После этого в функции цикла мы проверяем тег на считывателе каждые 100 мс.
Если на считывателе есть тег, мы читаем его UID и печатаем его на дисплее. Затем мы сравниваем UID тега, который мы только что прочитали, со значением, которое хранится в кодовой переменной. Если значения одинаковы, мы выводим сообщение UNLOCK, иначе мы не будем отображать это сообщение.
if(match) { Serial.println("\nI know this card!"); printUnlockMessage(); }else { Serial.println("\nUnknown Card"); }
Конечно, вы можете изменить этот код, чтобы сохранить более 1 значения UID, чтобы проект распознал больше RFID-меток. Это просто пример.
Код проекта:
#include <MFRC522.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <SPI.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #define SS_PIN 10 #define RST_PIN 9 MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class MFRC522::MIFARE_Key key; int code[] = {69,141,8,136}; //This is the stored UID int codeRead = 0; String uidString; void setup() { Serial.begin(9600); SPI.begin(); // Init SPI bus rfid.PCD_Init(); // Init MFRC522 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64) // Clear the buffer. display.clearDisplay(); display.display(); display.setTextColor(WHITE); // or BLACK); display.setTextSize(2); display.setCursor(10,0); display.print("RFID Lock"); display.display(); } void loop() { if( rfid.PICC_IsNewCardPresent()) { readRFID(); } delay(100); } void readRFID() { rfid.PICC_ReadCardSerial(); Serial.print(F("\nPICC type: ")); MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); Serial.println(rfid.PICC_GetTypeName(piccType)); // Check is the PICC of Classic MIFARE type if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Serial.println(F("Your tag is not of type MIFARE Classic.")); return; } clearUID(); Serial.println("Scanned PICC's UID:"); printDec(rfid.uid.uidByte, rfid.uid.size); uidString = String(rfid.uid.uidByte)+" "+String(rfid.uid.uidByte)+" "+String(rfid.uid.uidByte)+ " "+String(rfid.uid.uidByte); printUID(); int i = 0; boolean match = true; while(i<rfid.uid.size) { if(!(rfid.uid.uidByte == code)) { match = false; } i++; } if(match) { Serial.println("\nI know this card!"); printUnlockMessage(); }else { Serial.println("\nUnknown Card"); } // Halt PICC rfid.PICC_HaltA(); // Stop encryption on PCD rfid.PCD_StopCrypto1(); } void printDec(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer < 0x10 ? " 0" : " "); Serial.print(buffer, DEC); } } void clearUID() { display.setTextColor(BLACK); // or BLACK); display.setTextSize(1); display.setCursor(30,20); display.print(uidString); display.display(); } void printUID() { display.setTextColor(WHITE); // or BLACK); display.setTextSize(1); display.setCursor(0,20); display.print("UID: "); display.setCursor(30,20); display.print(uidString); display.display(); } void printUnlockMessage() { display.display(); display.setTextColor(BLACK); // or BLACK); display.setTextSize(2); display.setCursor(10,0); display.print("RFID Lock"); display.display(); display.setTextColor(WHITE); // or BLACK); display.setTextSize(2); display.setCursor(10,0); display.print("Unlocked"); display.display(); delay(2000); display.setTextColor(BLACK); // or BLACK); display.setTextSize(2); display.setCursor(10,0); display.print("Unlocked"); display.setTextColor(WHITE); // or BLACK); display.setTextSize(2); display.setCursor(10,0); display.print("RFID Lock"); display.display(); }
Шаг 4: Соединяем все детали
Связь с платой Arduino Uno очень проста. Сначала подключим питание как считывателя, так и дисплея.
Будьте осторожны, считыватель RFID должен быть подключен к выходу 3,3 В от Arduino Uno или он будет испорчен.
Так как дисплей также может работать на 3,3 В, мы подключаем VCC от обоих модулей к положительной шине макета. Затем эта шина подключается к выходу 3,3 В от Arduino Uno. После чего соединяем обе земли (GND) с шиной заземления макета. Затем мы соединяем GND-шину макета с Arduino GND.
OLED-дисплей → Arduino
VCC → 3.3V
GND → GND
SCL → Аналоговый Pin 5
SDA → Аналоговый Pin 4
RFID-ридер → Arduino
RST → Цифровой Pin 9
IRQ → Не соединен
MISO → Цифровой Pin 12
MOSI → Цифровой Pin 11
SCK → Цифровой Pin 13
SDA → Цифровой Pin 10
Модуль RFID-считывателя использует интерфейс SPI для связи с Arduino. Поэтому мы собираемся использовать аппаратные штыри SPI от Arduino UNO.
Вывод RST поступает на цифровой контакт 9. Контакт IRQ остается несвязным. Контакт MISO подключается к цифровому выходу 12. Штырь MOSI идет на цифровой контакт 11. Контакт SCK переходит на цифровой контакт 13, и, наконец, вывод SDA идет на цифровой вывод 10. Вот и все.
Считыватель RFID подключен. Теперь нам нужно подключить OLED-дисплей к Arduino, используя интерфейс I2C. Таким образом, вывод SCL на дисплее переходит к аналоговому выводу Pin 5 и SDA на дисплее к аналоговому Pin 4. Если теперь мы включим проект и разместим RFID-карту рядом с ридером, мы увидим, что проект работает нормально.
Подключение RFID модуля RC522 к Arduino UNO
Теперь, когда мы знаем всё о модуле, мы можем подключить его к нашей плате Arduino!
Для начала подключите вывод VCC на модуле к выводу 3,3V на Arduino, а вывод GND — к земле Arduino. Вывод RST может быть подключен к любому цифровому выводу на Arduino. В нашем случае он подключен к цифровому выводу 5. Вывод IRQ не подключен, так как библиотека Arduino, которую мы собираемся использовать, не поддерживает его.
Теперь у нас остаются выводы, которые используются для связи по SPI. Поскольку модуль RC522 требует передачи больших данных, то наилучшая производительность будет обеспечена при использовании аппаратного модуля SPI в микроконтроллере. Использование выводов аппаратного SPI модуля намного быстрее, чем «дергание битов» в коде при взаимодействии через другой набор выводов.
Обратите внимание, что у плат Arduino выводы SPI различаются. Для плат Arduino, таких как UNO/Nano V3.0, это цифровые выводы 13 (SCK), 12 (MISO), 11 (MOSI) и 10 (SS)
Если у вас Arduino Mega, выводы отличаются! Вы должны использовать цифровые выводы 50 (MISO), 51 (MOSI), 52 (SCK) и 53 (SS). В таблице ниже приведен список выводов для связи по SPI для разных плат Arduino.
MOSI | MISO | SCK | CS | |
---|---|---|---|---|
Arduino Uno | 11 | 12 | 13 | 10 |
Arduino Nano | 11 | 12 | 13 | 10 |
Arduino Mega | 51 | 50 | 52 | 53 |
В случае если вы используете плату Arduino, отличную от приведенных выше, рекомендуется проверить официальную документацию Arduino, прежде чем продолжить.
Рисунок 5 – Подключение модуля RFIDсчитывателя RC522 к Arduino UNO
Как только вы всё подключите, вы готовы к работе!
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Arduino
#include <rdm6300.h>
1 | #include <rdm6300.h> |
Затем зададим (определим) контакт, который будет использоваться для чтения данных с модуля RDM6300.
Arduino
#define RDM6300_RX_PIN 6
1 | #define RDM6300_RX_PIN 6 |
Далее внутри функции setup() инициализируем последовательную связь со скоростью 9600 бод (для целей отладки) и модуль чтения RFID меток.
Arduino
void setup()
{
Serial.begin(9600);
rdm6300.begin(RDM6300_RX_PIN);
Serial.println(«\nPlace RFID tag near the rdm6300…»);
}
1 |
voidsetup() { Serial.begin(9600); rdm6300.begin(RDM6300_RX_PIN); Serial.println(«\nPlace RFID tag near the rdm6300…»); } |
Затем в функции loop() мы будем проверять находится ли рядом с модулем радиочастотная метка или нет. Если находится, то мы будем считывать ее номер и печатать его в окне монитора последовательной связи (Serial Monitor).
Arduino
void loop()
{
if (rdm6300.update())
Serial.println(rdm6300.get_tag_id(), HEX);
delay(10);
}
1 |
voidloop() { if(rdm6300.update()) Serial.println(rdm6300.get_tag_id(),HEX); delay(10); } |
Код программы готов, можно приступать к проверке работоспособности проекта.
Тестируем проект
Теперь приступаем к тестированию! Перейдите в меню пользователя вашего Adafruit IO, в меню Feeds. Проверьте, созданы или нет каналы для отпечатка пальцев и замка (на принт-скрине ниже это строки fingerprint и lock):
Если их нет, то придется создать вручную.
Теперь нам надо обеспечить обмен данными между каналами fingerprint и lock. Канал lock должен принимать значение ‘1’, когда канал fingerprint принимает значение ‘1’ и наоборот.
Для этого используем очень мощный инструмент Adafruit IO: триггеры. Триггеры – это по-сути условия, которые вы можете применять к настроенным каналам. То есть, их можно использовать для взаимосвязи двух каналов.
Создаем новый reactive trigger из раздела Triggers в Adafruit IO. Это обеспечит возможность обмениваться данными между каналами датчика отпечатка пальцев и замка:
Вот как это должно выглядеть, когда оба триггера настроены:
Все! Теперь мы действительно можем тестить наш проект! Прикладываем палец к сенсору и видим как Arduino начал подмигивать светодиодом, который соответствует передаче данных. После этого должен начать мигать светодиод на модуле ESP8266. Это значит, что он начал получать данные через MQTT. Светодиод на монтажной плате в этот момент должен тоже включиться.
После задержки, которую вы установили в скетче (по умолчанию это значение равно 10 секундам), светодиод выключится. Поздравляем! Вы можете управлять светодиодом с помощью отпечатка пальца, находясь в любой точке мира!
MIFARE Classic 1K Memory Layout
The 1K memory of the Tag is organized in 16 sectors (from 0 to 15)Each sector is further devided in to 4 blocks (block 0 to 3).Each block can store 16 bytes of data (from 0 to 15).
That surely tells us we have
16 sectors x 4 blocks x 16 bytes of data = 1024 bytes = 1K memory
The whole 1K memory with sectors, blocks and data is highlighted below.
3D Representation of MIFARE Classic 1K Memory Map Layout
The Block 3 of each sector is called Sector Trailer and contains information called Access Bits to grant read and write access to remaining blocks in a sector. That means only the bottom 3 blocks (block 0, 1 & 2) of each sector are actually available for data storage, meaning we have 48 bytes per 64 byte sector available for our own use.
Also The Block 0 of sector 0 is known as Manufacturer Block/Manufacturer Data contains the IC manufacturer data, and the Unique IDentifier (UID). The Manufacturer Block is highlighted in red below.
Warning:
It is very risky to overwrite the Manufacturer Block and it may permanently lock the card.
Бесконтактные копировщики
Бесконтактные дубликаторы представлены 3-мя модификациями.
- Программаторы tmd, формирующие стандарт радиочастотной идентификации Indala, HID, EM-Marin.
- Дубликаторы, сочетающиеся с устройствами стандарта ТКРФ и ТЕХ-КОМ.
- Копировальщики, которые поддерживают стандарт Mifare.
Универсальные механизмы программирования
Программировать дубликаты ключей можно на универсальных устройствах. С их помощью можно не только создать копию цифрового ключа, но и получить набор дополнительных полезных функций:
- база памяти;
- возможность обновления;
- генерация символьных шифров.
Обновляющая функция позволяет подстраивать программную базу под новые, оригинальные модификации чипов, чтобы в дальнейшем устройство могло делать их дубликаты. База памяти обеспечивает возможность создавать дубликаты ключей без наличия оригинального устройства. Код ключа попадает во встроенную базу после первой же прошивки. В дальнейшем его можно будет найти и использовать для создания других дубликатов.
Генерирование кодов помогает записывать оригинальные символьные шифры на домофонный ключ. Такой вариант подходит для крупных корпораций, сотрудники которых получают на руки ключ с уникальным шифром для открывания дверей. Он позволяет проконтролировать время и число посещений конкретным человеком производственных объектов.
Скачать стандартные библиотеки Arduino IDE на русском
Библиотеки для Ардуино делятся на две группы — стандартные и пользовательские. При установке Arduino IDE в папке Program Files\Arduino\libraries имеется набор стандартных библиотек для базовых функций видов, коммуникации платы и для подключения устройств: сервомоторов, шаговых двигателей, LCD-дисплеев и т.д. Стандартные библиотеки скачать можно на официальном сайте www.arduino.cc.
Список стандартных библиотек Arduino:
EEPROM — чтение и запись в энергонезависимую память (скачать eeprom.h)Ethernet — связь с Интернет с помощью Ethernet Shield (скачать ethernet.h)Firmata — для взаимодействия Arduino и ПК (скачать firmata.h)GSM — коммуникация по GSM/GRPS протоколу для GSM Shield (скачать gsm.h)LiquidCrystal — управление LCD дисплеем (скачать liquidcrystal.h)SD — чтение и запись в SD карту (скачать sd.h)Servo — управление серво двигателем (скачать servo.h)SPI — для взаимодействия Arduino и периферийных устройств (скачать spi.h)SoftwareSerial — коммуникация по цифровому порту (скачать softwareserial.h)Stepper — управление шаговым двигателем (скачать stepper.h)TFT — вывод текста и картинок на TFT дисплее (скачать ethernet.h)WiFi — связь с Интернет с помощью WiFi Shield (скачать wifi.h)Wire — коммуникация по протоколу I2C (скачать wire.h)
Список комплектующих
- Arduino Uno R3;
- плата расширения Adafruit PN532 RFID/NFC Shield (или аналог);
- Arduino IDE;
- перезаписываемые NFC метки.
Плата расширения Adafruit PN532 RFID/NFC Shield
Важно, чтобы NFC метки были перезаписываемыми, иначе код не заработает. Для проверки того, успешно ли мы записали данные на метки, мы можем использовать Arduino или телефон с NFC
Большинство смартфонов на Android могут читать NFC метки, я буду использовать для тестов Nexus 5. К сожалению, для пользователей iPhone, поддержка NFC началась с iPhone 6 и 6s, но они не поддерживают чтение NFC меток, поэтому можно воспользоваться платой Arduino для проверки того, что записано на вашей NFC метке. iPhone использует свои NFC возможности только для Apple Pay, следовательно вы не можете использовать их для чтения меток или чего-то другого
Для проверки того, успешно ли мы записали данные на метки, мы можем использовать Arduino или телефон с NFC. Большинство смартфонов на Android могут читать NFC метки, я буду использовать для тестов Nexus 5. К сожалению, для пользователей iPhone, поддержка NFC началась с iPhone 6 и 6s, но они не поддерживают чтение NFC меток, поэтому можно воспользоваться платой Arduino для проверки того, что записано на вашей NFC метке. iPhone использует свои NFC возможности только для Apple Pay, следовательно вы не можете использовать их для чтения меток или чего-то другого.
Когда у нас будут все необходимые комплектующие, нам будет необходимо установить две библиотеки, которые делают возможным чтение и запись меток. Это библиотеки don/NDEF и Seeedstudio’s, мы будем в основном использовать первую из них. Библиотека Seeedstudio’s используется, если у вас есть плата расширения Seeedstudio NFC shield. Мы установим ее просто на всякий случай. Вам необходимо скачать и установить обе библиотеки, используя в Arduino IDE пункт «Добавить .zip библиотеку» (Add .zip Library) в меню «Скетч (Sketch) → Добавить библиотеку (Include Library)». Не забудьте установить обе библиотеки по отдельности и в каталог Arduino по умолчанию, иначе у вас будут ошибки компиляции.
Ошибка при импорте библиотеки Seeed-Studio/PN532 (PN532_I2C.h: No such file or directory). (upd. 20 октября 2019)
Проблема заключается в структуре каталогов «PN532/PN532/файлы_исходников» (должно быть «PN532/файлы_исходников»). При копировании четырех подкаталогов (по инструкции к библиотеке) PN532, PN532_SPI, PN532_I2C and PN532_HSU ошибка будет появляться уже на этапе компиляции, так как в самих исходниках пути к другим файлам указаны с учетом изначальной структуры каталогов.
Решение: скопировать каталоги из архива с отредактированными исходниками в каталог библиотек Arduino (например, «C:\Users\Имя_пользователя\Documents\Arduino\libraries«).
Скачать библиотеку PN532_edited.7z
Запустите IDE, у вас должен создасться файл нового скетча. Сохраните новый файл под любым именем, например, «Read NFC Tag». Сперва необходимо добавить в него заголовочные файлы. Они должны идти до .
Считывание данных с RFID-тега
Подключив все как нужно, кликните в IDE Arduino по Файл > Примеры > MFRC522 > DumpInfo (File > Examples > MFRC522 > DumpInfo) и загрузите этот скетч на Arduino. Он уже будет в IDE Arduino, когда вы установите в него библиотеку RFID.
Затем откройте в IDE Arduino монитор порта. В нем должны появиться данные примерно как на картинке ниже:
Приложите к RFID-ридеру карту или брелок с RFID-тегом. Держите их в таком положении, пока в мониторе порта не будет показана вся необходимая информация.
Это информация, считанная с RFID-тега, включая UID, который высвечен желтым цветом. Информация хранится в памяти, которая поделена на сегменты и блоки, которые можно наблюдать на картинке выше. Общий объем памяти составляет 1024 байта, которые поделены на 16 секторов, и каждый сектор защищен двумя разными ключами, A и B.
Запишите где-нибудь UID свой карты – позже он вам понадобится.
Загрузите на Arduino код, показанный ниже:
1 /* 2 * 3 * Более подробно о проекте на: http://randomnerdtutorials.com/ 4 * Модифицирован Руи Сантосом (Rui Santos) 5 * 6 * Написан FILIPEFLOP 7 * 8 */ 9 10 #include <SPI.h> 11 #include <MFRC522.h> 12 13 #define SS_PIN 10 14 #define RST_PIN 9 15 MFRC522 mfrc522(SS_PIN, RST_PIN); // создаем экземпляр MFRC522 instance. 16 17 void setup() 18 { 19 Serial.begin(9600); // запускаем последовательную коммуникацию 20 SPI.begin(); // инициализируем шину SPI 21 mfrc522.PCD_Init(); // инициализируем MFRC522 22 Serial.println("Approximate your card to the reader..."); 23 // "Приложите карту к ридеру... " 24 Serial.println(); 25 26 } 27 void loop() 28 { 29 // ищем новые карты: 30 if ( ! mfrc522.PICC_IsNewCardPresent()) 31 { 32 return; 33 } 34 // выбираем одну из карт: 35 if ( ! mfrc522.PICC_ReadCardSerial()) 36 { 37 return; 38 } 39 // показываем UID на мониторе порта: 40 Serial.print("UID tag :"); // "UID тега: " 41 String content= ""; 42 byte letter; 43 for (byte i = ; i < mfrc522.uid.size; i++) 44 { 45 Serial.print(mfrc522.uid.uidBytei < 0x10 ? " 0" " "); 46 Serial.print(mfrc522.uid.uidBytei], HEX); 47 content.concat(String(mfrc522.uid.uidBytei < 0x10 ? " 0" " ")); 48 content.concat(String(mfrc522.uid.uidBytei], HEX)); 49 } 50 Serial.println(); 51 Serial.print("Message : "); // "Сообщение: " 52 content.toUpperCase(); 53 if (content.substring(1) == "BD 31 15 2B") 54 // впишите здесь UID тега, которому вы хотите дать доступ 55 { 56 Serial.println("Authorized access"); // "Доступ открыт" 57 Serial.println(); 58 delay(3000); 59 } 60 61 else { 62 Serial.println(" Access denied"); // "Запрос на доступ отклонен" 63 delay(3000); 64 } 65 }
В этом скетче вам нужно поменять строчку…
if (content.substring(1) == "BD 31 15 2B")
…вписав вместо BD 31 15 2B значение для UID, которое ранее было показано в мониторе порта.
1Описание считывателяRFID RC522
Модуль 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», «коммуникация ближнего поля» или «ближняя бесконтактная связь».