CircuitPython: тепловизионная матрица MLX90640

Тепловизором называют прибор, который преобразует распределение тепла в видимое для человека или машины изображение. Существует множество сфер, где этот прибор может быть полезен:

  • приборы ночного видения;
  • охранные системы;
  • контроль электрических цепей на предмет перегрева;
  • контроль тепловых утечек в зданиях;
  • медицина.

Однако, не каждый тепловизор может справиться со всеми этими задачами одновременно. Существует несколько технологий создания тепловизионных матриц, которые отличаются точностью определения температуры и диапазоном детектируемого инфракрасного излучения. Ниже представлено изображение, полученное с помощью микроболометрической тепловизионной матрицы с разрешением 256 x 192 точки.

тепловизор микроболометр infiray

На этом уроке мы изучим более простой датчик MLX90640, который представляет собой решётку микроболометров — электронных детекторов, которые меняют своё сопротивлением под действием ИК излучения. Эти детекторы имеют микроразмеры и достаточно просты в изготовлении в понимании современного электронного производства. Благодаря этому, большинство бытовых тепловизоров основаны именно на микроболометрах.

Подключать будем модуль MLX90640 от RobotClass, на котором кроме самого датчика имеется некоторая обвязка и разъём QIIC.

тепловизор 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. Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.

Компоненты для урока "CircuitPython: тепловизионная матрица MLX90640" на shop.robotclass.ru
В корзину
В корзину
В корзину

Установка библиотек

Для работы с 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()

Сохраняем программу и открываем монитор последовательного порта (кнопка «Последовательный»). Датчик должен выдавать поток чисел с заданной частотой обновления.

CircuitPython тепловизор MLX90640

Конечно, полученные данные не очень наглядны, но это уже, как-никак, температура в градусах Цельсия, а значит их можно относительно легко визуализировать.

Для визуализации можно пойти двумя путями: получать данные на компьютере и формировать изображение, например, с помощью инструментов OpenCV, либо же подключить к контроллеру цветной дисплей и формировать изображение на нём.

Оба варианта визуализации разберем в будущих статьях на RobotClass.


Изменено:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.