===== Эксперимент 37. RFID =====
RFID (англ. Radio Frequency IDentification, радиочастотная идентификация) — способ автоматической идентификации объектов, в котором посредством радиосигналов считываются или записываются данные, хранящиеся в так называемых транспондерах, или RFID-метках.
RFID метки широко применяются в качестве проездных билетов для общественного транспорта и в качестве пропусков. Их часто называют магнитными пропусками, но это категорически не правильно. Большинство RFID-меток состоит из двух частей. Первая — интегральная схема (ИС) для хранения и обработки информации, модулирования и демодулирования радиочастотного (RF) сигнала и некоторых других функций. Вторая — антенна для приёма и передачи сигнала.
{{ :products:esp-iot:1200-133759230-rfid-tag-in-hand.jpg?400 |}}
Пассивные RFID метки не имеют источника питания. Необходимую для работы энергию они получают от считывающего оборудования благодаря электро- магнитной индукции.
В комплект нашего конструктора (в версии MAXI) входит RFID считыватель и две метки — одна в формате карты, вторая в виде брелока.
Проведем эксперимент с RFID. Для работы с модулем приемника нам потребуется специальная библиотека. Ее нужно скачать и записать в память микроконтроллера, так же как [[products:laboratory_iot:exp29|мы это делали ранее]].
{{ :products:esp-iot:mfrc522.zip |}}
В этом архиве находятся два файла mfrc522.py и mfrc522.mpy. Это одна и та же библиотека, но в разных формах. Файл с расширением .py это исходный код библиотеки, его можно открыть и почитать, если интересно разобраться в том, как устроена библиотека. А файл .mpy это предварительно откомпилированная библиотека в виде бинарного файла.
Дело в том, что мы пишем программу на понятном человеку языке, в котором есть понятные по названию переменные, понятные функции, операторы с понятными названиями. Но в микроконтроллере всего этого нет. Для него переменная — это просто место в оперативной памяти, у которого нет имени, есть только адрес. Просто интерпретатор Python прежде чем приступить к исполнению программы, сначала транслирует ее в свой внутренний байт-код, который совершенно не понятен человеку, зато хорошо исполняется интерпретатором. Так вот процесс трансляции требует достаточно больших ресурсов, в том числе оперативной памяти. Чтобы микроконтроллеру было проще мы рекомендуем загружать в него предварительно откомпилированные версии библиотек, а обычные использовать для самостоятельного изучения. Итак загрузи в память микроконтроллера
файл ''mfrc522.mpy''.
==== Схема эксперимента ====
{{ :products:esp-iot:16_mon.png?direct&600 |}}
//Рисунок 1. Монтажная схема эксперимента//
==== Программный код эксперимента ====
import mfrc522
_init()
rdr = mfrc522.MFRC522(0, 2, 12, 13, 14) #sck, mosi, miso, rst, sda
while True:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
card_number = '{:x}{:x}{:x}{:x}'.format(raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
print("Card detected: " + card_number)
Подключаем библиотеку для работы со считывателем RFID меток
import mfrc522
Создаем объект считывателя, указываем как подключен модуль
rdr = mfrc522.MFRC522(0, 2, 12, 13, 14) #sck, mosi, miso, rst, sda
В основном цикле запрашиваем данные о состоянии считывателя
(stat, tag_type) = rdr.request(rdr.REQIDL)
Если обнаружена метка, то запрашиваем номер метки
(stat, raw_uid) = rdr.anticoll()
Формируем строку с номером карты для отображения пользователю
card_number = '{:x}{:x}{:x}{:x}'.format(raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
Метод ''format()'' принимает произвольное количество аргументов и выполняет их подстановку в указанных местах строки, относительно которой он вызван. В строке- шаблоне есть специальные метки в фигурных скобках. На их места подставляются соответствующие аргументы метода. Полученную таким образом строку выводим в терминал
print("Card detected: " + card_number)
Оператор ''+'' в данном случае выполняет функцию конкатенации (склейки строк) так как находится в контексте строк, а не чисел.
[[https://pythonworld.ru/osnovy/formatirovanie-strok-metod-format.html|Подробнее о format()]]