Эксперимент 37. RFID

RFID (англ. Radio Frequency IDentification, радиочастотная идентификация) — способ автоматической идентификации объектов, в котором посредством радиосигналов считываются или записываются данные, хранящиеся в так называемых транспондерах, или RFID-метках.

RFID метки широко применяются в качестве проездных билетов для общественного транспорта и в качестве пропусков. Их часто называют магнитными пропусками, но это категорически не правильно. Большинство RFID-меток состоит из двух частей. Первая — интегральная схема (ИС) для хранения и обработки информации, модулирования и демодулирования радиочастотного (RF) сигнала и некоторых других функций. Вторая — антенна для приёма и передачи сигнала.

Пассивные RFID метки не имеют источника питания. Необходимую для работы энергию они получают от считывающего оборудования благодаря электро- магнитной индукции.

В комплект нашего конструктора (в версии MAXI) входит RFID считыватель и две метки — одна в формате карты, вторая в виде брелока.

Проведем эксперимент с RFID. Для работы с модулем приемника нам потребуется специальная библиотека «MFRC522». Ее нужно установить с помощью управления библиотеками, как мы уже делали ранее в эксперименте 29 .

Схема эксперимента

НУЖНО ИЗМЕНИТЬ СХЕМУ Рисунок 1. Монтажная схема эксперимента

Программный код эксперимента

Exp37.ino
  1. #include <SPI.h>
  2. #include <MFRC522.h>
  3.  
  4. #define PIN_SS 15
  5. #define PIN_RST 16
  6.  
  7. MFRC522 rdr(PIN_SS, PIN_RST);
  8.  
  9. String bytesToString(byte *bytes, byte size) {
  10. String str;
  11. for (byte i = 0; i < size; i++) {
  12. str += bytes[i] < 0x10 ? "0":"";
  13. str += String(bytes[i], HEX);
  14. }
  15. return str;
  16. }
  17.  
  18. void setup() {
  19. Serial.begin(9600);
  20. Serial.println();
  21. SPI.begin();
  22. rdr.PCD_Init();
  23. }
  24.  
  25. void loop() {
  26. if (!rdr.PICC_IsNewCardPresent()) return;
  27. if (!rdr.PICC_ReadCardSerial()) return;
  28.  
  29. Serial.println("Card detected: " + bytesToString(rdr.uid.uidByte, 4));
  30. rdr.PICC_HaltA();
  31. }

Подключаем библиотеку для работы со считывателем RFID меток

  1. #include <MFRC522.h>

Задаем псевдонимы для пинов, к которым подключен считыватель:

  1. #define PIN_SS 15
  2. #define PIN_RST 16

Создаем объект считывателя, указываем как подключен модуль:

  1. MFRC522 rdr(PIN_SS, PIN_RST);

Далее мы определили функцию bytesToString(), которая принимает массив байт и его длину, и возвращает строку — номер метки. Эта функция позволит нам удобно выводить номер метки. Подробно останавливаться как работает функция не будем.

  1. String bytesToString(byte *bytes, byte size) {
  2. String str;
  3. for (byte i = 0; i < size; i++) {
  4. str += bytes[i] < 0x10 ? "0":"";
  5. str += String(bytes[i], HEX);
  6. }
  7. return str;
  8. }

Инициализируем шину SPI и считыватель меток:

  1. SPI.begin();
  2. rdr.PCD_Init();

В основном цикле мы сначала проверяем приложена ли метка с считывателю, если нет начинаем цикл сначала. Аналогично проверяем удалось ли считать номер метки, если нет начинаем цикл сначала.

  1. if (!rdr.PICC_IsNewCardPresent()) return;
  2. if (!rdr.PICC_ReadCardSerial()) return;

Если считывание метки было успешно, то номер записывается в массив байт rdr.uid.uidByte, который мы передаем в функцию bytesToString() возвращающую строку.

  1. Serial.println("Card detected: " + bytesToString(rdr.uid.uidByte, 4));

Оператор + в данном случае выполняет функцию конкатенации (склейки строк) так как находится в контексте строк, а не чисел.

Функция rdr.PICC_HaltA() блокирует повторное считывание метки.

  1. rdr.PICC_HaltA();