Рубрики
Проекты на ESP32

Тепловизор на ESP32 и датчике MLX90640 своими руками

Откажитесь от рентгеновского зрения, тепловизионные камеры — настоящие промышленные супергерои! Они не просто видят свет, они видят тепло, что делает их мастерами обнаружения скрытых источников энергии, выявления перегревающихся устройств и даже помощи солдатам в темноте. Они неоценимы в таких отраслях, как технический ремонт, где они выявляют короткие замыкания, как своеобразные электронные ищейки. Единственный подвох? Их цена может быть немного пугающей. Но технологии постоянно развиваются и вскоре тепловидение может стать таким же распространенным явлением, как камера вашего телефона! Так что помните, что эта, казалось бы, обычная камера может обладать необычайными способностями к обнаружению тепла.

Итак, в этом проекте мы собираемся найти решение этой проблемы, создав тепловизор (тепловизионную камеру, на англ. thermal camera) своими руками с использованием гораздо более дешевых доступных компонентов. Более дешевые тепловизионные датчики, которые мы рассмотрели — это AMG8833 от Panasonic, MLX90640 и MLX90641 от Melexis. Несмотря на то, что AMG8833 является самым дешевым из всех, он имеет разрешение только 8×8, тогда как MLX90640 предлагает разрешение 32×24, а MLX90641 предлагает разрешение 16×12. Поскольку MLX90640 предлагает лучшее разрешение в своем ценовом диапазоне, мы выбрали его для нашей тепловизионной камеры, сделанной своими руками.

Ранее на нашем сайте мы уже рассматривали похожие проекты:

Особенности тепловизионной камеры в нашем проекте

  • Разрешение сенсора изображения: 32×24.
  • Поле зрения датчика (FoV): 55°x35°
  • Диапазон измерения температуры: от -40 до 300°C.
  • Диапазон рабочих температур от -40 до 85°C.
  • Регулируемая частота обновления — 4 Гц — 32 Гц.
  • 10 паллет разного цвета.
  • 5 различных режимов интерполяции.
  • Простой в использовании графический интерфейс.
  • 2,4-дюймовый TFT-дисплей с разрешением 320×240.
  • Сохранение теплового изображения на SD-карту.
  • Встроенный аккумулятор и схема зарядки.

Наглядно основные принципы нашего проекта тепловизора вы можете посмотреть в следующем видео:

Необходимые компоненты

  • Модуль ESP32 Wrover с флэш-памятью 8 МБ и PSRAM — x1 (купить на AliExpress).
  • MLX90640 — массив термодатчиков дальнего инфракрасного диапазона — x1 (купить на AliExpress).
  • 2,4-дюймовый TFT-дисплей с разрешением 320×240 и драйвером ILI9341 — x1 (купить на AliExpress).
  • CH340K — USB-контроллер UART – x1 (купить на AliExpress).
  • TP4056 — микросхема зарядного устройства для литий-ионных аккумуляторов — x1 (купить на AliExpress).
  • MIC5219-3.3YM5 3,3 В LDO – x1 (купить на AliExpress).
  • AO3401 P — МОП-транзистор — x1 (купить на AliExpress).
  • 2n7002DW двойной N — МОП-транзистор – x1.
  • Транзистор S8050 — 1 шт. (купить на AliExpress).
  • Диод SS34 – x1 (купить на AliExpress).
  • Устройство чтения SD-карт — x1 (купить на AliExpress).
  • USB-разъем типа C, 16 контактов — x1 (купить на AliExpress).
  • SMD резисторы и конденсаторы.
  • SMD светодиоды.
  • SMD тактильные переключатели (кнопки).
  • Ползунковый переключатель SDM.
  • Разъемы.
  • Пользовательская печатная плата.
  • Корпус и крепежные винты, напечатанные на 3D-принтере.
  • Прочие инструменты и расходные материалы.

Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158

Схема тепловизора

Схема тепловизора на модуле ESP32 и датчике MLX90640 показана на рисунке ниже. Ее также можно скачать в формате PDF по следующей ссылке. Авторы проекта использовали KiCad для разработки схем и печатной платы для этого проекта. Все файлы, необходимые для изготовления данного проекта, вы можете найти на странице авторов на GitHub, приведенной внизу этой статьи.

Рассмотрим назначение основных элементов схемы. Порт USB типа C используется как для зарядки, так и для целей программирования. Питание от USB-порта подается на схему контроллера цепи питания, построенную на основе P-канального МОП-транзистора U2 и диода D1. Когда питание USB доступно, устройство будет работать от питания USB, а также заряжать внутреннюю батарею. Когда питание USB отключается, устройство автоматически переключается на питание от аккумулятора. Для регулирования напряжения мы использовали LDO-стабилизатор MIC5219 3,3 В от Microchip, который способен обеспечивать ток до 500 мА с очень низким падением напряжения 500 мВ при полной нагрузке.

Ползунковый переключатель с подтягивающим резистором подключен к выводу включения MIC5219. Этот переключатель используется для включения и выключения тепловизионной камеры. Когда этот контакт заземляется, LDO отключается, а значит, и другие части устройства, за исключением секции зарядки аккумулятора. Для зарядки внутренней батареи мы используем контроллер заряда TP4056 , максимальный ток заряда которого составляет 1 А. Для измерения напряжения батареи мы использовали классический делитель напряжения, который снижает напряжение батареи до безопасного для измерения уровня.

На следующем рисунке у нас показана сама SoC ESP32 вместе со схемой программирования и массивом термодатчиков дальнего инфракрасного диапазона MLX90640. Схема программирования состоит из контроллера USB-UART CH340K и двойного N-N-канального МОП-транзистора 2N7002DW от ON Semi.

Авторы проекта выбрали CH340K из-за его небольших размеров и низкой стоимости. Крошечный двойной полевой МОП-транзистор будет действовать как схема автоматического сброса для ESP32, что устраняет необходимость ручного отдыха или выбора загрузки во время программирования. Несмотря на то, что автоматический сброс работает безупречно, на всякий случай мы также добавили кнопки загрузки и сброса. Схема вокруг ESP32 стандартная, просто шунтирующие конденсаторы и подтягивающие резисторы. Что касается датчика изображения, мы решили припаять его непосредственно к печатной плате, чтобы сделать все устройство компактным. Датчик подключен к SoC с помощью интерфейса I2C и имеет только 4 контакта, включая питание и землю. Если мы хотим использовать модуль датчика изображения вместо припаивания датчика к печатной плате или если мы хотим добавить какое-либо другое устройство I2C, мы можем использовать дополнительный разъем I2C, добавленный к печатной плате.

На следующем фрагменте схемы у нас есть TFT-дисплей, кнопки навигации и слот Micro SD.

В качестве дисплея мы использовали 2,4-дюймовый TFT-дисплей с разрешением 320×240. В дисплее используется микросхема драйвера ILI9341. Он подключен к ESP32 с помощью SPI и поддерживает скорость SPI до 65 МГц. Дисплей припаян непосредственно к печатной плате. Для управления подсветкой мы использовали транзистор S8050 . Управлять яркостью подсветки мы сможем с помощью ШИМ-сигналов. Дисплей подключен к интерфейсу VSPI ESP32, а слот Micro SD подключен к интерфейсу HSPI. Это гарантирует, что ESP32 сможет получить доступ или управлять как дисплеем, так и SD-картой одновременно в случае необходимости.

Печатная плата для тепловизионной камеры своими руками

Для этого проекта мы решили изготовить специальную печатную плату. Это гарантирует, что конечный продукт будет максимально компактным, а также простым в сборке и использовании. Печатная плата имеет размеры 80х50 мм. Верхний и нижний слои печатной платы показаны на следующем рисунке.

3D-вид печатной платы показан на следующем рисунке.

А вот так выглядит полностью собранная плата.

3D-печатные детали

Авторы проекта разработали классный корпус для тепловизионной камеры, напечатанный на 3D-принтере. Файлы для всех напечатанных на 3D-принтере деталей можно скачать по ссылке GitHub, приведенной в конце статьи, вместе со эскизом Arduino и растровым файлом.

Отдельно STL файлы для изготовления деталей можно скачать по этой ссылке.

Внешний вид напечатанных деталей корпуса для нашего проекта тепловизора показан на следующем рисунке.

А вот и полностью собранная тепловизионная камера, сделанная своими руками.

Обзор интерфейса тепловизионной камеры (тепловизора)

Внешний вид нашего тепловизора с подписанными названиями компонентов представлен на следующем рисунке.

Назначение у кнопок следующее.

  • Кнопка Up/+:
    • По умолчанию: изменение/циклическое переключение режима интерполяции.
    • В настройках: изменение выбранного значения.
  • Кнопка Middle/Ok:
    • По умолчанию:
      • Короткое нажатие : сохранение изображений на SD-карту.
      • Длительное нажатие : вход в меню настроек.
    • В настройках:
      • Короткое нажатие : изменение выбора в меню.
      • Длительное нажатие: выход из меню настроек.
  • Кнопка Down/-:
    • По умолчанию : изменить цветовую палитру.
    • В настройках : измените выбранное значение.

Как упоминалось выше, вы можете переключаться между различными режимами интерполяции и цветовыми палитрами, используя кнопки «Вверх» или «Вниз» соответственно, находясь на главном экране. Вы можете сохранить текущий вид в виде файла BMP на SD-карту коротким нажатием средней кнопки. Если изображение успешно сохранено, будет воспроизведена анимация успешного сохранения. Если возникла какая-либо ошибка, например, SD-карта не вставлена ​​или не поддерживается, отобразится анимированное сообщение об ошибке SD-карты. Обязательно отформатируйте SD-карту в формате FAT32, а затем выключите камеру, если вы вставили SD-карту, когда камера находится во включенном состоянии. Если вы не перезагрузите компьютер после вставки SD-карты, устройство может не обнаружить SD-карту. Поэтому важно либо вставлять SD-карту, пока камера находится в выключенном состоянии, либо просто перезагрузить устройство.

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

На изображении ниже показан экран настроек тепловизионной камеры. В настройках имеется 7 вариантов. Выбранный параметр будет отображаться зеленым текстом, а другие — белым. Вы можете изменить выбор коротким нажатием средней кнопки. Значение выбранного параметра можно изменить с помощью кнопок «Вверх/+» или «Вниз/-».

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

  • Auto Scale (Автоматическое масштабирование)
    • Вкл.: автоматическое масштабирование включено. Цвет будет отображаться в соответствии с показаниями датчика максимальной и минимальной температуры.
    • Выкл.: автоматическое масштабирование выключено. Цвет будет отображаться в соответствии с максимальной и минимальной температурой, установленной вручную.
  • Min Temperature (Мин. температура): Минимальная температура для расчета цветовой палитры, когда автоматическое масштабирование отключено.
  • Max Temperature (Максимальная температура): максимальная температура для расчета цветовой палитры, когда автоматическое масштабирование отключено.
  • Interpolation (Интерполяция): метод интерполяции. Это относится к алгоритму интерполяции, используемому для повышения масштаба изображения с низким разрешением с датчика (32×24) до изображения с высоким разрешением (320×240), отображаемого на экране. В зависимости от метода интерполяции будет меняться качество изображения, а также время обработки изображения. Доступные методы следующие.
    • Ближайший сосед
    • Средний
    • Билинейный
    • Билинейный быстрый
    • Треугольник
  • Palette (Палитра): Цветовая палитра относится к различным режимам отображения. На выбор доступно 10 различных палитр.
  • Refresh Rate (Частота обновления): частота обновления датчика изображения. MLX90640 поддерживает частоту обновления от 0,5 Гц до 64 Гц. Но при тестировании наиболее полезными частотами обновления были 4 Гц, 8 Гц, 16 Гц и 32 Гц. Итак, мы включили только эти частоты обновления.
  • Backlight (Подсветка): Яркость подсветки. Вы можете установить ее от 10% до 100%.

Объяснение кода программы

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Как обычно, мы включили в код все необходимые библиотеки с помощью функции include, в том числе  TFT_eSPI, Adafruit_MLX90640, Preferences, AnimatedGIF и другие стандартные библиотеки. Мы также включили данные анимированного изображения вместе с файлами шрифтов. Вы можете скачать все необходимые файлы из репозитория GitHub, ссылка на который приведена внизу этой статьи. После этого мы определили все необходимые глобальные переменные. Позже мы создали экземпляры классов. Мы будем использовать эти экземпляры для доступа к соответствующей функции.

Функции upButton_ISR, downButton_ISR и middleButton_ISR используются для обнаружения и обработки нажатий переключателей. Они используют аппаратные прерывания для обнаружения изменений контактов, подключенных к переключателям. Мы использовали программное обеспечение для устранения дребезга, чтобы правильно обнаружить нажатия переключателей и избежать шума. В зависимости от нажатого переключателя и времени нажатия функция установит соответствующую переменную в значение true, которая будет обрабатываться в основной программе.

Функции MLXInit, ConfigRefreshrate, ReadConfig и WriteConfig используются для связи и настройки датчика MLX90640. Функция MLXInit используется для инициализации датчика при запуске. Функция ConfigRefreshrate используется для установки частоты обновления датчика изображения, как следует из ее названия. Остальные функции используются для чтения и записи конфигураций в соответствующие регистры MLX90640.

Функция initSDcard используется для инициализации SD-карты, а также для обнаружения наличия SD-карты перед сохранением изображения. Если SD-карта не обнаружена или не поддерживается, функция вернет соответствующий код ошибки.

Функция generateFilename используется для генерации имен файлов изображений. Она будет генерировать имя файла с приращением. Если файл уже существует на SD-карте, функция проверит его и сгенерирует новое имя с увеличенным номером. Функция writeBMP используется для записи файла изображения на SD-карту при нажатии кнопки сохранения изображения.Эта функция сгенерирует файл изображения BMP с необходимыми данными заголовка и сохранит в него экранный буфер. То есть происходит сохранение изображения на экране на SD-карту.

Функция NavigationUpdate отвечает за все процедуры, связанные с тактильными переключателями и навигацией по меню.В зависимости от того, на каком экране мы сейчас находимся, эта функция будет соответствующим образом обрабатывать нажатия клавиш.

Функция displayUpdate отвечает за все процедуры, связанные с графикой, а также за получение данных изображения от MLX90640 и их обработку. Эта функция будет считывать данные с датчика изображения, когда появятся новые данные. Затем он будет масштабирован с использованием выбранного метода интерполяции. После масштабирования он вызовет функцию drawPixel для рисования изображения попиксельно. Функция drawPixel будет использовать выбранную цветовую палитру для определения подходящего цвета для каждого пикселя. Функция displayUpdate также отвечает за печать минимальной, максимальной и средней температуры вместе со значком батареи (с использованием функции drawBattery) на дисплее на главном экране. Эта же функция используется и для рисования и обработки меню настроек.

Функция GIFDraw используется для обработки и отображения файла анимированного изображения. Для этой цели она использует библиотеку AnimatedGIF.

И последнее, но не менее важное: функции setup и loop. Как обычно, функция setup используется для инициализации и настройки всех библиотек и конфигураций при запуске. Функция setup также вызовет все параметры конфигурации из пространства имен, сохраненного во флэш-памяти NVS. Функция loop будет постоянно вызывать функции NavigationUpdate и displayUpdate для более плавной работы.

Исходный код программы

Все файлы, необходимые для изготовления данного проекта тепловизора, вы можете скачать с GitHub по следующей ссылке.