RFID (Radio Frequency IDentification, радиочастотная идентификация) – способ бесконтактного распознавания устройств, обмена данными. Например, RFID можно использовать для того, чтобы идентифицировать людей, входивших и выходивших из помещения.
SS 10 пин (меняется программно) SCK 13 пин MOSI 11 пин MISO 12 пин IRQ не подключен GND GND RST 9 пин (меняется программно, подключается к выводам с ШИМ) VCC 3.3V
Библиотека:
При обнаружении метки ваша Arduino отправит в последовательный порт её адрес.
#include <SPI.h> #include <RFID.h> #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); 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()) { // Выводим его в порт в десятичном представлении Serial.println("Card number:"); 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(" "); } } rfid.halt(); }
Для получения типа метки и ее UID (уникального идентификатора)
// Скетч к обзору модуля RFID RC522 // Вывод UID и типа метки // 3d-diy.ru // Подключение библиотек #include <SPI.h> #include <MFRC522.h> // контакты const int reset 9 const int ss 10 // Создание экземпляра объекта MFRC522 MFRC522 rider(reset, ss); void setup() { // запуск Serial Serial.begin(9600); // запуск SPI SPI.begin(); // инициализация MFRC522 rider.PCD_Init(); } void loop() { // Ожидание if ( ! rider.PICC_IsNewCardPresent()) return; // чтение if ( ! rider.PICC_ReadCardSerial()) return; // вывод данных Serial.print("UID="); view_data(rider.uid.uidByte,rider.uid.size); Serial.println(); Serial.print("type="); byte piccType = rider.PICC_GetType(rider.uid.sak); Serial.print(rider.PICC_GetTypeName(piccType)); Serial.println(); delay(1000); } // преобразование в HEX void view_data (byte *buf, byte size) { for (byte j = 0; j < size; j++) { Serial.print(buf [j]); Serial.print(buf [j], HEX); } }
После загрузки скетча открываем монитор последовательного порта и видим вывод данных о типе и UID подносимой к считывателю метки
Для чтения и вывода в последовательный порт дампа памяти метки метки
// Скетч к обзору модуля RFID RC522 // Дамп памяти метки // 3d-diy.ru // Подключение библиотек #include <SPI.h> #include <MFRC522.h> // контакты const int reset 9 const int ss 10 // Создание экземпляра объекта MFRC522 MFRC522 rider(reset, ss); void setup() { // запуск Serial Serial.begin(9600); // запуск SPI SPI.begin(); // инициализация MFRC522 rider.PCD_Init(); Serial.println("Start..."); } void loop() { // Ожидание if ( ! rider.PICC_IsNewCardPresent()) return; // чтение if ( ! rider.PICC_ReadCardSerial()) return; // Вывод данных дампа памяти метки rider.PICC_DumpToSerial(&(rider.uid)); } void viewData() { // Версия по для MFRC522 byte v = rider.PCD_ReadRegister(rider.VersionReg); Serial.print(F("Version Software: 0x")); Serial.print(v, HEX); }
Запись информации на метку. Считывание данных с метки и запись данных на метку производится поблочно. Разные метки имеют разный размер блока. Для Ultralight C размер блока 4 байта. Скетч 3 – запись данных в память метки в первые два байта 15 блока. Получаем данные по последовательному порту и записываем в метку. Затем выводим содержимое блока в последовательный порт.
// Скетч к обзору модуля RFID RC522 // Запись данных на метку Ultralight C // 3d-diy.ru // Подключение библиотек #include <SPI.h> #include <MFRC522.h> // контакты const int reset 9 const int ss 10 // Создание экземпляра объекта MFRC522 MFRC522 rider(reset, ss); // для последовательного порта String inStr0 = ""; boolean strComplete0 = false; unsigned int page_serial; unsigned int data_serial; void setup() { // запуск Serial Serial.begin(9600); // запуск SPI SPI.begin(); // инициализация MFRC522 rider.PCD_Init(); inStr0.reserve(200); } void loop() { // if (strComplete0) { Serial.println(inStr0); if(!parse_string0()) {Serial.print("ERROR1");Serial.println(inStr0);} else { page_serial=max(min(15,page_serial),7); data_serial=min(1000,data_serial); } // очистить строку inStr0 = ""; strComplete0 = false; } // Ожидание метки: if (rider.PICC_IsNewCardPresent()) { // чтение карты if (rider.PICC_ReadCardSerial()) { if(data_serial>0 && page_serial>0) { byte buf[] = {0, 0, 0, 0}; buf[0]=highByte(data_serial); buf[1]=lowByte(data_serial); //Запись на карту на страницы 8,9 или 10 - 4 байта Serial.println(rider.GetStatusCodeName( rider.MIFARE_Ultralight_Write(page_serial, buf, 4))); // Вывод дампа данных rider.PICC_DumpToSerial(&(rider.uid)); } } } delay(2000); } // SerialEvent void serialEvent() { while (Serial.available()) { // получить очередной байт: char data = (char)Serial.read(); // /n - конец передачи if (data == '#') strComplete0 = true; else // добавить в строку inStr0 += data; } } // парсинг строки последовательного порта Serial boolean parse_string0() { int s1,s2; int length1= inStr0.length(); if(inStr0.charAt(0)!='*') return false; if(inStr0.charAt(length1-1)!=';') return false; // for(int i=1;i<length1;i++) {if(inStr0.charAt(i)==';') {s1=i;break;} } page_serial= inStr0.substring(1,s1).toInt(); // action for(int i=s1+1;i<length1;i++) {if(inStr0.charAt(i)==';') {s2=i;break;} } data_serial= inStr0.substring(s1+1,s2).toInt(); return true; }
И смотрим запись на карту данных из последовательного порта