Тепловизором называют прибор, который преобразует распределение тепла в видимое для человека или машины изображение. Существует множество сфер, где этот прибор может быть полезен:
- приборы ночного видения;
- охранные системы;
- контроль электрических цепей на предмет перегрева;
- контроль тепловых утечек в зданиях;
- медицина.
Однако, не каждый тепловизор может справиться со всеми этими задачами одновременно. Существует несколько технологий создания тепловизионных матриц, которые отличаются точностью определения температуры и диапазоном детектируемого инфракрасного излучения. Ниже представлено изображение, полученное с помощью микроболометрической тепловизионной матрицы с разрешением 256 x 192 точки.
На этом уроке мы изучим более простой датчик MLX90640, который представляет собой решётку микроболометров — электронных детекторов, которые меняют своё сопротивлением под действием ИК излучения. Эти детекторы имеют микроразмеры и достаточно просты в изготовлении в понимании современного электронного производства. Благодаря этому, большинство бытовых тепловизоров основаны именно на микроболометрах.
Подключать будем модуль MLX90640 от RobotClass, на котором кроме самого датчика имеется некоторая обвязка и разъём QIIC.
Датчик MLX90640 имеет матрицу с разрешением 32 x 24 точки, что позволяет получить с него более или менее сносное изображение, на котором можно рассмотреть очертания объектов. Из прочих характеристик:
- напряжение питания: 3,3 В;
- рабочий ток: менее 23 мА;
- настраиваемая частота обновления данных: от 0,5 до 64 Гц;
- угол обзора: 55° x 35° (версия BAB) and 110°x75° (версия BAA);
- рабочая температура: от -40 до 85°C;
- измеряемая температура: от -40 до 300°C.
Программу напишем на языке Python при помощи CircuitPython, используя библиотеки из стандартной коллекции Adafruit. Подключение будем производить по шине I2C, используя при этом разъём QIIC.
СПИСОК НЕОБХОДИМЫХ КОМПОНЕНТОВ
Для выполнения примеров из данного урока, кроме модуля MLX90640, потребуется отладочная плата Графит-S2 или аналогичная с установленным CircuitPython и кабель для шины QIIC. Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.
Установка библиотек
Для работы с MLX90640 используем библиотеку adafruit_mlx90640, которая имеется в стандартном наборе библиотек от Adafruit (ссылка в конце урока). Всё, что нам нужно сделать для её установки — это скопировать файл adafruit_mlx90640.mpy в папку lib на накопителе CIRCUITPY.
Более подробно о работе с библиотеками CircuitPython мы писали в одном из ранних наших уроков: Библиотеки для CircuitPython
УСТАНОВКА ЗАВИСИМОСТЕЙ
Чтобы библиотека adafruit_ssd1306 заработала, необходимо будет добавить еще три «зависимости»:
- adafruit_bus_device
- adafruit_register
Все эти библиотеки есть в сборнике от Adafruit. Точно также, копируем их на накопитель CIRCUITPY.
Программа
Для составления программы используем среду разработки Mu.
Пусть, самая первая наша программа будет выводить температурную матрицу в COM-порт в виде списка из 32*24=768 элементов. Начнём с подключения всех необходимых библиотек. Помним, что в python это делается с помощью команды import.
Кроме adafruit_mlx90640 нам будут нужны еще две:
- board — хранит названия всех контактов платы контроллера и их синонимы;
- busio — предоставляет интерфейс для работы с шиной I2C.
import board
import busio
import adafruit_mlx90640
Затем инициализируем шину I2C, указывая контакты SCL, SDA, а также частоту передачи данных — 800 кГц. То же самое проделываем с датчиком, указывая в качестве параметров интерфейс i2c.
i2c = busio.I2C(board.SCL, board.SDA, frequency=800000)
mlx = adafruit_mlx90640.MLX90640(i2c)
Датчик позволяет настроить частоту обновления собираемых данных в диапазоне от 0,5 Гц до 64 Гц (0,5Гц, 1Гц, 2Гц, 4Гц, …, 64Гц). Для начала можно установить 2-4Гц, а затем пробовать увеличивать данный параметр, пока система не перестанет выдавать годные данные.
mlx.refresh_rate = adafruit_mlx90640.RefreshRate.REFRESH_4_HZ
Чтобы получить массив значений температуры, собранных датчиком, используем функцию getFrame. Единственный аргумент функции — список python, в который будут сохранены извлекаемые значения.
Остаётся только вывести содержимое списка в последовательный порт, чтобы мы могли их увидеть. Полный код программы:
import board
import busio
import adafruit_mlx90640
i2c = busio.I2C(board.SCL, board.SDA, frequency=800000)
mlx = adafruit_mlx90640.MLX90640(i2c)
print("MLX addr detected on I2C", [hex(i) for i in mlx.serial_number])
mlx.refresh_rate = adafruit_mlx90640.RefreshRate.REFRESH_4_HZ
frame = [0] * 768
while True:
try:
mlx.getFrame(frame)
except ValueError:
# these happen, no biggie - retry
continue
for h in range(24):
for w in range(32):
t = frame[h*32 + w]
print("%0.1f, " % t, end="")
print()
print()
Сохраняем программу и открываем монитор последовательного порта (кнопка «Последовательный»). Датчик должен выдавать поток чисел с заданной частотой обновления.
Конечно, полученные данные не очень наглядны, но это уже, как-никак, температура в градусах Цельсия, а значит их можно относительно легко визуализировать.
Для визуализации можно пойти двумя путями: получать данные на компьютере и формировать изображение, например, с помощью инструментов OpenCV, либо же подключить к контроллеру цветной дисплей и формировать изображение на нём.
Оба варианта визуализации разберем в будущих статьях на RobotClass.