Сегодня я расскажу про 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. Ниже я приведу таблицу подключения модуля для самых распространенных плат.
Arduino Leonardo/ Micro
Пины управления 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( > 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 #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( 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, (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(key, sector); Serial.println(); // Читаем данные из блока Serial.print(F(«Reading data from block «)); Serial.print(blockAddr); Serial.println(F(» . «)); status = mfrc522.MIFARE_Read(blockAddr, buffer, 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, (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, 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(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 добавлять пользовательские символы, фактически добавляя на дисплей графику.
Источник: arthurphdent.livejournal.com
TOSUNY EM4100 Handheld RFID Writer User Manual
Home » TOSUNY » TOSUNY EM4100 Handheld RFID Writer User Manual
125KHz RFID Re-write
User Manual
- Support Em4100
- Support Em4100/HID/AWID
- EM 410
- EM 410/HID/AWID
Remark:
How to distinguish two device listed above?
(1)The device beep 2 times when power on is supported EM4100
(2)The device beep 3 times when power on is supported EM4100, HID, AWID
This device is used to clone a 125KHz RFID card. It can clone Em4100, HID, AWID so you should reference the device model when you work. It’s very easy to use.
Contents hide
Parameter
How to clone
Viofo A229 Duo Dashcam mit 1440p vo.
Please enable JavaScript
- Push the power switch on the right of the device,it will beep two or three times, and LED is on mean it works,if not restart, please.
- Put the mother card near the antenna left of the device, and then press the READ button, the device will beep and the LED is on when read successful,if beep 2 times go to step3, if beep 3 times go to step 4, click READ again if it doesn’t beep.
- Change a new blank card as T5577/EM4305, then press WRITE button, when beep and PASS LED is on mean clone successful, if it doesn’t beep and light please write again.
- Change a blank T5577, then press the WRITE button, when beep and PASS LED is on mean clone successful, if it doesn’t beep and light please write again.
- Repeat step 3 or step 4 if you want to make more same ID card.
- Switch off to save power.
FCC Warning
This device complies with part 15 of the FCC rules. Operation is subject to the following two conditions: (1)
this device may not cause harmful interference, and (2) this device must accept any interference received, including interference that may cause undesired operation.
Changes or modifications not expressly approved by the party responsible for compliance could void the user’s authority to operate the equipment.
NOTE: This equipment has been tested and found to comply with the limits for a Class B digital device, pursuant to part 15 of the FCC Rules. These limits are designed to provide reasonable protection against harmful interference in a residential installation. This equipment generates uses and can radiate radio frequency energy and, if not installed and used in accordance with the instructions, may cause harmful interference to radio communications. However, there is no guarantee that interference will not occur in a particular installation. If this equipment does cause harmful interference to radio or television reception, which can be determined by turning the equipment off and on, the user is encouraged to try to correct the interference by one or more of the following measures:
- Reorient or relocate the receiving antenna.
- Increase the separation between the equipment and receiver.
- Connect the equipment into an outlet on a circuit different from that to which the receiver is connected.
- Consult the dealer or an experienced radio/TV technician for help.
The device has been evaluated to meet general RF exposure requirements. The device can be used in portable exposure conditions without restriction.
Источник: manuals.plus