- Вступление
- [iot] принцип и пример анализа nfc mrc522 — русские блоги
- Arduino rc522 nfc — купите arduino rc522 nfc с бесплатной доставкой на алиэкспресс version
- Видео работы устройства
- Для замочка нам понадобится:
- Замок
- Как это работает?
- Программная часть
- Схема
- Устройство
- Фото 2n2222
- Фото arduino pro mini
- Фото lf33cv
- Фото rc522
- Фото rfid-браслета
- Фото towerpro sg-90
- Вывод
Вступление
Доброго времени суток! Параллельно моей предыдущей
я работал еще над одним «проектом». Собственно у меня завалялось пару китайских RFID читалок. Вот таких:
[iot] принцип и пример анализа nfc mrc522 — русские блоги
1. Основные принципы соглашения
Протокол ISO-14443A:
Международная организация по стандартизации: разновидность протокола RFID Международной организации по стандартизации;
PICC:
Бесконтактная карта типа A и типа B
PCD:
Устройство бесконтактной связи — относится к модулю MFRC522
ATQ:
Ответ на запрос, ответ ATQA на запрос карты типа A, ответ ATQB на запрос карты типа B
REQA:
Запрос на карту типа А
REQB:
Запрос на карту типа B
WUPA:
Команда пробуждения для карты типа А
ASK:
Выберите Подтвердить
MIFARE:
Один из товарных знаков, принадлежащих NXP Semiconductors.
Карта MIFARE (карта M1):
Он имеет функции чтения и записи, в основном бесконтактные, и имеет быстрый механизм предотвращения коллизий — механизм, который одновременно обрабатывает несколько карт, попадающих в зону считывания. Его особая структура хранения подходит для одной карты для нескольких целей. В настоящее время основными чипами являются philip mifare1 S50, S70 и т. Д .;
2. Основные характеристики MFRC522
Бесконтактный чип чтения и записи карт, максимальная скорость связи составляет 13,56 МГц;
Интерфейс поддержки:
UART, SPI (Speed_max = 10 Мбит / с), IIC (быстрый: 400 Кбит / с, высокая скорость: 3400 Кбит / с)
письмо-соглашение:
ISO-14443A, 7816 и др.
Буфер приемопередатчика:
64 байта
Поддержка режима прерывания, программируемый таймер, сопроцессор CRC
1) связь карт MFRC522 и M1
Принцип работы карты M1-IC-S50 / процесс работы:
Структура карты M1:
Всего 16 секторов, каждый сектор состоит из 4 блоков (блоки 0 ~ 3), всего 64 блока, а адресация 0 ~ 63 в соответствии с номером блока;
Блок 0 0-го сектора (то есть блок с абсолютным адресом 0) используется для хранения кода производителя, который закреплен и не может быть изменен.
Другие сектора:
Блок 0, блок 1 и блок 2 — это блоки данных для хранения данных;
Блок 3 — это блок управления, хранящий пароль A, контроль доступа, хранение пароля B
Пароль и контроль доступа каждого сектора независимы, и их собственный пароль и контроль доступа могут быть установлены в соответствии с фактическими потребностями.
Примечание:
Шифрование для одного сектора.
Процесс связи между модулем MFRC522 и картой MF-IC:
3. Процесс работы MRC522
RC522 поддерживает три метода связи: SPI, IIC и UART. Теперь рассмотрим SPI в качестве примера:
#define RF_LPCTL BIT3 // P2.3 Контроль сна радиочастотной карты --- RST #define RF_SS BIT7 // p2.7 Выбор подчиненного устройства радиочастотной карты (SS) --- SDA #define RF_SCLK BIT6 // p2.6 Выход тактовой частоты данных карты RF (SCLK) #define RF_DATA_OUT BIT5 // p2.5 вывод данных RF карты (MOSI) #define RF_DATA_IN BIT1 // p2.1 вход модуля RF (MISO)Для чтения и записи блоков данных внутри модуля необходимо выполнить 4 шага: найти карту → антиконфликтность → выбрать карту → прочитать / записать карту;
1) Найдите карту
status2 = PcdRequest (0x52, Temp); // Найти параметр карты Temp - возвращаемый тип карты
if(status2== MI_OK)
{
tochar(Temp[0]); Tochar (Temp [1]); // Выводим тип карты
} Среди них 0x52 представляет все карты в области антенны. Тип карты (TagType):
0x4400 =Mifare_UltraLight
0x0400 =Mifare_One(S50)
0x0200 =Mifare_One(S70)
0x0800 =Mifare_Pro(X)
0x4403 =Mifare_DESFireНапример, когда Temp [0] = 04 и Temp [1] = 00, тип карты — S50.
2) Защита от столкновений
status2 = PcdAnticoll (UID); // Антиколлизионная обработка, серийный номер выходной карты, 4 байта
if(status2==MI_OK)
{
PutString0("Card Id is:");
tochar(UID[0]);
tochar(UID[1]);
tochar(UID[2]); Tochar (UID [3]); // вывод серийного номера карты
}3) Выбор карты
status2 = PcdSelect (UID); // Выбираем карту, вводим серийный номер карты, 4 байта
4) Перед чтением и записью карты требуется аутентификация.
status2= PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID);
Четыре параметра представляют:
Проверить ключ A адрес блока пароль сектора серийный номер карты.
Затем выполните операцию записи:
status2 = PcdWrite (1, writeData); // Записываем данные, записываем число в массив writeData на карту
Среди них первый параметр 1 означает, что записанный адрес — это блок 1.
Или выполните операцию чтения карты:
status2 = PcdRead (1, str); // Считываем карту
Первый параметр 1 означает, что адрес чтения — блок 1. Чтобы
Данные, полученные после считывания карты, хранятся в массиве str.
refer:
https://blog.csdn.net/li13158/article/details/81588148
https://blog.csdn.net/txf1984/article/details/46560513
Arduino rc522 nfc — купите arduino rc522 nfc с бесплатной доставкой на алиэкспресс version
Перед покупкой сравните цены на arduino rc522 nfc, прочитайте реальные отзывы покупателей, ознакомьтесь с техническими характеристиками.
Закажите arduino rc522 nfc онлайн с доставкой по России: товары с пометкой Plus доступны с ускоренной доставкой и улучшенными условиями возврата.
На Алиэкспресс arduino rc522 nfc всегда в наличии в большом ассортименте: на площадке представлены как надежные мировые бренды, так и перспективные молодые.
Видео работы устройства
На видео есть еще одна Arduino — она нужна только для питания Arduino Pro Mini. В конечной схеме её конечно нет, просто блок питания на 5В я еще не приобрел. Под катом очень много фотографий!
Для замочка нам понадобится:
Микроконтроллер Arduino.
Замок
Пошагово снять процесс переделывания замка не вышло. Но думаю будет и так все ясно.
Аккуратно вырезано отверстие для сервопривода и просверлены отверстия для крепления болтами. Рычаг привода сделан из двух деталей, которые шли в комплекте с ним, и обычной скрепки. На конце привинчен шурупчик.
Запирающая часть замка была усилена у основания штырей, а так же утолщена, чтобы не болталась.
Как это работает?
Вся система состоит из 5-и элементов:
Пока метка не поднесена к RC522, микроконтроллер слушает состояние ножки, на которой «висит» кнопка. Если на входе высокое напряжение — программа инвертирует положение системы: замок открыт — закрыть, и наоборот. В зависимости от открыт/закрыт загораются светодиоды: красный — закрыт, зеленый — открыт.
Программная часть
/* ----------------------------------------------------------------------------- * 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 <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 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("rn"); 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("rn"); byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); //Serial.print(mfrc522.PICC_GetTypeName(piccType)); //Serial.print("rn"); 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("rn"); Serial.print(buffer[1]); Serial.print("rn"); Serial.print(buffer[2]); Serial.print("rn"); Serial.print(buffer[3]); Serial.print("rn"); Serial.print(buffer[4]); Serial.print("rn"); Serial.print(buffer[5]); Serial.print("rn"); Serial.print(buffer[6]); Serial.print("rn"); Serial.print(buffer[7]); Serial.print("rn"); Serial.print(buffer[8]); Serial.print("rn"); Serial.print(buffer[9]); Serial.print("rn"); Serial.print(buffer[10]); Serial.print("rn"); Serial.print(buffer[11]); Serial.print("rn"); Serial.print(buffer[12]); Serial.print("rn"); Serial.print(buffer[13]); Serial.print("rn"); Serial.print(buffer[14]); Serial.print("rn"); Serial.print(buffer[15]); Serial.print("rn"); 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();
}Схема

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

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

Любой стабилизатор напряжения 3.3В. В наличии был LF33CV.
Фото arduino pro mini
Модуль считывания RFID меток RC522. Фото модуля вначале статьи.
Сервопривод TowerPro SG-90. Просто потому что был под рукой. На самом деле купить помощнее и надежнее не было бы лишним.
Фото lf33cv

Ну и конечно ключи. Пока был в Киеве, я приобрел вот такой силиконовый RFID-браслет:
Фото rc522
До этого, перебирая ящик с инструментами, я нашел новенький, но никому не нужный замок.
Фото rfid-браслета

Фото towerpro sg-90

Любой подходящий транзистор. У меня был 2N2222.
Вывод
«boolean yes = false;» уже не будет, но все может быть 🙂
Используемые библиотеки:
. Пример был взят из RFID библиотеки и дописан под себя.
В примерах так же есть функция записи первого блока(по факту второго, первый блок read-only). Мне было достаточно 16 байт данных. Конечно лучше было использовать еще UID тогда было бы надежнее, но я пока не собирался его куда-нибудь ставить.





