Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp37 [2024/12/04 16:34] – [Схема эксперимента] labuser30products:laboratory_iot_c:exp37 [2024/12/04 17:20] (текущий) – [Программный код эксперимента] labuser30
Строка 11: Строка 11:
 В комплект нашего конструктора (в версии MAXI) входит RFID считыватель и две метки — одна в формате карты, вторая в виде брелока. В комплект нашего конструктора (в версии MAXI) входит RFID считыватель и две метки — одна в формате карты, вторая в виде брелока.
  
-Проведем эксперимент с RFID. Для работы с модулем приемника нам потребуется специальная библиотека. Ее нужно скачать и записать в память микроконтроллера, так же как [[products:laboratory_iot:exp29|мы это делали ранее]]. +Проведем эксперимент с RFID. Для работы с модулем приемника нам потребуется специальная библиотека "MFRC522". Ее нужно установить с помощью управления библиотеками, как мы уже делали ранее в  
- +[[products:laboratory_iot_c:exp29|эксперименте 29 ]].
-<WRAP center round download 60%> +
-{{ :products:esp-iot:mfrc522.zip |}} +
-</WRAP> +
- +
-В этом архиве находятся два файла mfrc522.py и mfrc522.mpy. Это одна и та же библиотека, но в разных формах. Файл с расширением .py это исходный код библиотеки, его можно открыть и почитать, если интересно разобраться в том, как устроена библиотека. А файл .mpy это предварительно откомпилированная библиотека в виде бинарного файла.  +
- +
-Дело в том, что мы пишем программу на понятном человеку языкев котором есть понятные по названию переменные, понятные функции, операторы с понятными названиями. Но в микроконтроллере всего этого нет. Для него переменная — это просто место в оперативной памяти, у которого нет имени, есть только адрес. Просто интерпретатор Python прежде чем приступить к исполнению программы, сначала транслирует ее в свой внутренний байт- код, который совершенно не понятен человеку, зато хорошо исполняется интерпретатором. Так вот процесс трансляции требует достаточно больших ресурсов, в том числе оперативной памяти. Чтобы микроконтроллеру было проще мы рекомендуем загружать в него предварительно откомпилированные версии библиотек, а обычные использовать для самостоятельного изучения. Итак загрузи в память микроконтроллера  +
-файл ''mfrc522.mpy''.+
  
 ==== Схема эксперимента ==== ==== Схема эксперимента ====
Строка 28: Строка 20:
  
 ==== Программный код эксперимента ==== ==== Программный код эксперимента ====
-<file python Exp37.py[enable_line_numbers="2", start_line_numbers_at="1"]> +<file arduino Exp37.ino[enable_line_numbers="2", start_line_numbers_at="1"]> 
-import mfrc522 +#include <SPI.h> 
-_init()+#include <MFRC522.h>
  
-rdr = mfrc522.MFRC522(0, 2, 12, 13, 14) #sck, mosi, miso, rst, sda+#define PIN_SS  15 
 +#define PIN_RST 16
  
-while True: +MFRC522 rdr(PIN_SSPIN_RST)
-    (stattag_type) = rdr.request(rdr.REQIDL)+
  
-    if stat == rdr.OK+String bytesToString(byte *bytes, byte size) { 
-        (statraw_uid) = rdr.anticoll()+    String str; 
 +    for (byte i 0; i < size; i++) { 
 +        str +bytes[i] < 0x10 ? "0":""; 
 +        str += String(bytes[i]HEX);  
 +    } 
 +    return str; 
 +}
  
-        if stat == rdr.OK: +void setup() {  
-            card_number = '{:x}{:x}{:x}{:x}'.format(raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]+  Serial.begin(9600); 
-            print("Card detected: " + card_number)+  Serial.println(); 
 +  SPI.begin(); 
 +  rdr.PCD_Init();  
 +} 
 +  
 +void loop() { 
 +  if (!rdr.PICC_IsNewCardPresent()) return; 
 +  if (!rdr.PICC_ReadCardSerial()) return; 
 + 
 +  Serial.println("Card detected: " + bytesToString(rdr.uid.uidByte, 4)); 
 +  rdr.PICC_HaltA(); 
 +}
 </file> </file>
  
 Подключаем библиотеку для работы со считывателем RFID меток Подключаем библиотеку для работы со считывателем RFID меток
-<code python[enable_line_numbers="2", start_line_numbers_at="1"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="1"]> 
-import mfrc522+#include <MFRC522.h>
 </code> </code>
  
-Создаем объект считывателя, указываем как подключен модуль+Задаем псевдонимы для пинов, к которым подключен считыватель: 
 +<code arduino[enable_line_numbers="2", start_line_numbers_at="3"]> 
 +#define PIN_SS  15 
 +#define PIN_RST 16 
 +</code> 
 + 
 +Создаем объект считывателя, указываем как подключен модуль:
 <code python[enable_line_numbers="2", start_line_numbers_at="4"]> <code python[enable_line_numbers="2", start_line_numbers_at="4"]>
-rdr = mfrc522.MFRC522(02, 12, 13, 14#sck, mosi, miso, rst, sda+MFRC522 rdr(PIN_SSPIN_RST)
 </code> </code>
  
-В основном цикле запрашиваем данные о состоянии считывателя +Далее мы определили функцию ''bytesToString()'', которая принимает массив байт и его длину, и возвращает строку — номер метки. Эта функция позволит нам удобно выводить номер метки. Подробно останавливаться как работает функция не будем.     
-<code python[enable_line_numbers="2", start_line_numbers_at="7"]> +<code python[enable_line_numbers="2", start_line_numbers_at="8"]> 
-    (stattag_type) = rdr.request(rdr.REQIDL)+String bytesToString(byte *bytesbyte size
 +    String str; 
 +    for (byte i 0; i < size; i++) { 
 +        str += bytes[i] < 0x10 ? "0":""; 
 +        str += String(bytes[i], HEX);  
 +    } 
 +    return str; 
 +}
 </code> </code>
  
-Если обнаружена метка, то запрашиваем номер метки +Инициализируем шину SPI и считыватель меток: 
-<code python[enable_line_numbers="2", start_line_numbers_at="10"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="20"]> 
-        (stat, raw_uidrdr.anticoll()+  SPI.begin()
 +  rdr.PCD_Init();
 </code> </code>
  
-Формируем строку с номером карты для отображения пользователю +В основном цикле мы сначала проверяем приложена ли метка с считывателю, если нет начинаем цикл сначала. Аналогично проверяем удалось ли считать номер метки, если нет  начинаем цикл сначала. 
-<code python[enable_line_numbers="2", start_line_numbers_at="13"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="25"]> 
-            card_number = '{:x}{:x}{:x}{:x}'.format(raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])+  if (!rdr.PICC_IsNewCardPresent()) return; 
 +  if (!rdr.PICC_ReadCardSerial()) return;
 </code> </code>
  
-Метод ''format()'' принимает произвольное количество аргументов и выполняет их подстановку в указанных местах строки, относительно которой он вызван. В строке- шаблоне есть специальные метки в фигурных скобках. На их места подставляются соответствующие аргументы метода. Полученную таким образом строку выводим в терминал +Если считывание метки было успешно, то номер записывается в массив байт ''rdr.uid.uidByte'', который мы передаем в функцию ''bytesToString()'' возвращающую строку.   
- +<code arduino[enable_line_numbers="2", start_line_numbers_at="28"]>  
-<code python[enable_line_numbers="2", start_line_numbers_at="14"]> +  Serial.println("Card detected: " + bytesToString(rdr.uid.uidByte, 4));
-            print("Card detected: " + card_number)+
 </code> </code>
 +
  
 Оператор ''+'' в данном случае выполняет функцию конкатенации (склейки строк) так как находится в контексте строк, а не чисел. Оператор ''+'' в данном случае выполняет функцию конкатенации (склейки строк) так как находится в контексте строк, а не чисел.
 +
 +Функция ''rdr.PICC_HaltA()'' блокирует повторное считывание метки.
 +<code arduino[enable_line_numbers="2", start_line_numbers_at="29"]> 
 +  rdr.PICC_HaltA();
 +</code>
  
 <WRAP center round info 60%> <WRAP center round info 60%>
-[[https://pythonworld.ru/osnovy/formatirovanie-strok-metod-format.html|Подробнее о format()]]+  * [[https://arduino.ru/Reference/StringObject|Подробнее о строках в Arduino]]
 </WRAP> </WRAP>
-