Это старая версия документа!


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

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

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

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

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

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

эксперименте 29

В этом архиве находятся два файла mfrc522.py и mfrc522.mpy. Это одна и та же библиотека, но в разных формах. Файл с расширением .py это исходный код библиотеки, его можно открыть и почитать, если интересно разобраться в том, как устроена библиотека. А файл .mpy это предварительно откомпилированная библиотека в виде бинарного файла.

Дело в том, что мы пишем программу на понятном человеку языке, в котором есть понятные по названию переменные, понятные функции, операторы с понятными названиями. Но в микроконтроллере всего этого нет. Для него переменная — это просто место в оперативной памяти, у которого нет имени, есть только адрес. Просто интерпретатор Python прежде чем приступить к исполнению программы, сначала транслирует ее в свой внутренний байт- код, который совершенно не понятен человеку, зато хорошо исполняется интерпретатором. Так вот процесс трансляции требует достаточно больших ресурсов, в том числе оперативной памяти. Чтобы микроконтроллеру было проще мы рекомендуем загружать в него предварительно откомпилированные версии библиотек, а обычные использовать для самостоятельного изучения. Итак загрузи в память микроконтроллера файл mfrc522.mpy.

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

НУЖНО ИЗМЕНИТЬ СХЕМУ Рисунок 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. SPI.begin();
  21. rdr.PCD_Init();
  22. }
  23.  
  24. void loop() {
  25. if (!rdr.PICC_IsNewCardPresent()) return;
  26. if (!rdr.PICC_ReadCardSerial()) return;
  27.  
  28. Serial.println("Card detected: " + bytesToString(rdr.uid.uidByte, 4));
  29. rdr.PICC_HaltA();
  30. }

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

  1. import mfrc522

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

  1. rdr = mfrc522.MFRC522(0, 2, 12, 13, 14) #sck, mosi, miso, rst, sda

В основном цикле запрашиваем данные о состоянии считывателя

  1. (stat, tag_type) = rdr.request(rdr.REQIDL)

Если обнаружена метка, то запрашиваем номер метки

  1. (stat, raw_uid) = rdr.anticoll()

Формируем строку с номером карты для отображения пользователю

  1. card_number = '{:x}{:x}{:x}{:x}'.format(raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])

Метод format() принимает произвольное количество аргументов и выполняет их подстановку в указанных местах строки, относительно которой он вызван. В строке- шаблоне есть специальные метки в фигурных скобках. На их места подставляются соответствующие аргументы метода. Полученную таким образом строку выводим в терминал

  1. print("Card detected: " + card_number)

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