Всем привет! Не так давно я рассказывал о самодельном «тепловизоре» на базе платформы T-Watch и сенсора MLX90640 и в конце обзора я обозначил, как бы я хотел усовершенствовать данный проект. В первую очередь мне хотелось перенести проект на платформу с большим дисплеем, желательно с сенсорным управлением, также хотелось поработать в направлении наложения теплового изображения на изображение с камеры. Я не торопился с реализацией этого проекта, а занимался другими не менее интересными вещами, но попутно присматривал комплектующие для него. Мой выбор пал на 3,2" дисплей с разрешением 320*240 и тачскрином, но останавливало нежелание получить в итоге громоздкий «бутерброд» из множества плат, поэтому я искал готовую платформу на базе ESP32 c сенсорным экраном, и я нашел практически идеальный вариант — платформа без названия на базе ESP32 с 3,5" дисплеем с емкостным тачскрином и камерой от компании Makerfabs, обзор которой я рад представить вашему вниманию.
У Makerfabs есть несколько подобных платформ, отличающихся размером дисплея и типом сенсорного экрана: ёмкостный или резистивный.
Характеристики выбранной платформы
— 3.5" дисплей с разрешением 320x480 пикселей;
— Ёмкостный тачскрин;
— ESP32-WROVER SOC c 4Mb SPI FLASH и 8Mb PSRAM
— 2MП камера OV2640
— WIFI/ BLE беспроводная связь.
— USB-UART конвертер для программирования ESP32
— Слот для MicroSD
— USB Type-C для питания и программирования
Размер дисплея 84х55 мм., размер платы несколько больше — 84x66 мм. за счет выступающих «ушек» с монтажными отверстиями. Толщина с учетом модуля ESP32-Wrover около 9 мм. Также вместе с платформой можно приобрести акриловый корпус для неё. В комплекте также идет MicroSD на 16 Гб, что весьма полезно.
Дисплей построен на контроллере ILI9488 и общается с ESP32 по SPI. На нижней стороне платы выведены порты GPIO, которые могут быть использованы для подключения внешних устройств, при условии, что не используется камера, которая также использует некоторые из этих портов. (В этом состоит одно из препятствий для совместного использования камеры и сенсора MLX90640.) Матрица дисплея выполнена по технологии TFT и не отличается высоким качеством по сравнению, например, с IPS. В целом это не критично.
За работу емкостного тачскрина отвечает контроллер FT6263, который подключен к ESP32 по I2C. Для данного контроллера доступно несколько библиотек для среды Arduino IDE, разработчики платформы также представляют код для работы с контроллером тачскрина. При этом на плате также установлен контроллер резистивного тачскрина NS2009 и соответственно разъем для подключения сенсорной панели.
Драйвера для встроенного USB-UART конвертера CP2104 устанавливаются автоматически, проблем с подключением и программированием не возникает. Есть две кнопки BOOT и RESET для загрузки и сброса соответственно.
Платформа поставляется прошитой примером, который выводит изображение с камеры на дисплей, а также позволяет сохранять фотографии на SD-карту и просматривать их.
Пример сохраненного изображения.
Платформа потребляет порядка 250 мА. При этом по умолчанию нет возможности управлять подсветкой дисплея для уменьшения энергопотребления. Для получения возможности управления подсветкой дисплея необходимо запаять перемычку, которая соединяет вывод TXD ESP32 с шиной LCD_BCK.
Есть подробная страница информации на английском языке, где представлено несколько примеров использования платформы: игры, различные индикаторы, вывод изображения с камеры. Довольно интересный пример Screenshot reciver, который выводит на дисплей изображение с экрана компьютера. Я в свою очередь вижу возможность использования данной платформы в качестве HMI (Human maсhine interface), т. е. панели управления, на которой могут быть отражены различные индикаторы и элементы управления. На базе данной платформы можно сделать интерактивную фоторамку, часы web-радио много других интересных проектов, где требуется большой сенсорный дисплей.
Обновление тепловизора
Как я сказал в начале обзора, главной целью для которой приобреталась данная платформа было обновление тепловизора на базе сенсора MLX90640.
Не все желаемые изменения удалось реализовать.
Во-первых не удалось реализовать наложение теплового изображения на изображение с камеры по причине использования одних и тех же пинов для подключения камеры и сенсора MLX90640, есть некоторые идеи преодоления этой проблемы, а именно использование UART интерфейса для подключения сенсора, но пока в этом направлении ничего не сделано. К тому же нет уверенности, что вообще удастся заставить эту схему работать.
Во-вторых не удалось запустить библиотеку LVGL для отрисовки графического интерфейса, хотя есть пример работы библиотеки LVGL на данной платформе.
Что сделано:
— Увеличена частота обновления экрана — максимум 4.3 кадров в секунду (при частоте опроса сенсора в 8 Гц), что совсем немного, но при наличии контрастного по температуре объекта в поле зрения сенсора, обновление экрана выглядит довольно плавно. Достигнуто это за счет перехода на другую библиотеку для дисплея, увеличения частоты опроса сенсора и увеличения частоты шины I2C. Для увеличения частоты обновления экрана, вероятно, необходимо задействовать возможности двух ядер ESP32, разделив функции чтения и вывода графики.
— Добавлена бикубическая интерполяция, которая в отличие от интерполяции по Гауссу работает корректно на всем массиве данных и интерполированное изображение не имеет артефактов по краям, но работает она медленнее и итак невысокая частота кадров заметно снижается;
— добавлен вывод гистограммы распределения температуры в кадре;
— добавлена возможность сохранения полноэкранного скриншота в разрешении 480*320 пикселей с легендой и гистограммой (правда изображение сохраняется с некоторыми артефактами);
— добавлено сенсорное управление для сохранения скриншота.
Несколько примеров сохраненных изображений: Селфи
Кот
Пламя газовой плиты
Датчик смонтирован на макетной плате, если буду развивать проект дальше, то есть смысл заказать печатную плату на производстве. К сожалению, на платформе не предусмотрено использование в качестве источника питания аккумулятора, питание подается только через USB-C, что несколько ограничивает возможности, но можно, например, добавить схему управления аккумулятором на плату с датчиком.
На данный момент я уперся в некоторый «потолок» своих возможностей, но так или иначе есть ещё много изменений, которые я хотел бы реализовать. Код проекта доступен на на github.
Технические подробности реализации данных изменений убрал под спойлер
1. Перенос проекта с платформы TTGO T-Watch на платформу с 3,5” дисплеем от MakerFabs.
Обе платформы построены на ESP32 поэтому перенос проекта не составил труда библиотека для T-Watch основана на популярной библиотеке для дисплеев TFT_eSPI, которая также поддерживает контроллер ILI9488, на котором основан дисплей, используемы в платформе от Makerfabs. Сначала код был перенесен как есть для проверки его работоспособности в целом, а затем несколько оптимизирован для большего разрешения дисплея.
2. Оптимизация кода с целью повышения частоты кадров. В исходном проекте частота кадров не измерялась, но чисто визуально она была очень низкой. Во-первых, я установил частоту процессора ESP32 на 240МГц, но визуально увеличения частоты кадров я не заметил. Далее позаимствовав этот прием из примера от SparkFun, я изменил частоты CLOCK шины I2C для чтения данных с сенсора. Для чтения параметров сенсора используется частота 400000 Гц, а для чтения данных она может быть увеличена до 1000000 Гц. Наконец, я начал пробовать изменять частоту опроса сенсора. Для измерения частоты опроса сенсора и отрисовки изображения в код были добавлены строки вычисляющие время начала и конца операций. Расчетная частота выводится в монитор порта. Рассчитывается частота опроса сенсора и частота опроса плюс вывод изображения на дисплей. Из этих величин можно рассчитать соответственно время, затрачиваемое на выполнение каждой операции. Данные были сведены в таблицу.
Вопреки ожиданиям, при максимальной заданной частоте опроса сенсора в 16 Гц, реальная частота меньше чем при 4Гц и при этом появляется множество ошибок чтения данных. Оптимальным стала частота опроса 8 Гц при частоте CLOCK 1000000 Гц. Реальная частота опроса при этом составляет максимум 8.7 Гц, а частота опроса и отрисовки всего 3,86 Гц. Время отрисовки не зависит от частоты опроса сенсора и составляет около 146 мс, при этом следует отметить, что это время включает обработку данных и интерполяцию для увеличения видимого разрешения. Без интерполяции время уменьшается в 1.5 раза и составляет 96 мс.
3. Интерполяция
Для увеличения видимого разрешения я использую интерполяцию по Гауссу. Описание и исходный код функции интерполяции взяты из данной статьи. Интерполяция работает хорошо, но на краях изображения она работает некорректно. В качестве альтернативы я решил использовать бикубическую интерполяцию. Код бикубической интерполяции взят отсюда. Бикубическая интерполяция работает корректно на всем массиве данных, но занимает больше времени, нежели интерполяция по Гауссу и частота обновления дисплея уменьшается до 2,8 Гц.
При увеличении частоты опроса сенсора увеличивается шум, так если в поле зрения сенсора нет контрастных по температуре объектов, разброс температур составляет порядка 4 градусов. При этом цветовая шкала автоматически масштабируется, и изображение получается достаточно шумным. Для уменьшения этого эффекта я добавил расширение границ на -5 и +5 градусов если дельта между максимальным и минимальным значениями меньше 5 градусов.
4. Оптимизация скорости отрисовки изображения.
Очевидно, для увеличения частоты обновления экрана необходимо уменьшать время отрисовки. Я начал с того, что решил попробовать другую библиотеку. TFT_eSPI является самой популярной, но не единственной библиотекой для дисплеев. Первая библиотека, на которую я обратил внимание была Arduino_GFX от пользователя moononournation на странице с информацией о данной библиотек приведены данные о сопоставлении скорости отрисовки основных графических примитивов различными библиотеками. Из этой таблицы видно, что библиотека Arduino_GFX работает медленнее или практически наравне с TFT_eSPI. Также из этой таблицы видно, что библиотека Lovyan_GFX от Lovyan работает несколько быстрее. К тому же библиотека Lovyan_GFX поддерживает платформу от Makerfabs и нет необходимости углубляться в файлы конфигурации, а достаточно добавить в скетче одну строку. Для перехода на библиотеку Lovyan_GFX потребовалось изменить дополнительно всего две строки. Я не ожидал никакого эффекта, но на удивление частота обновления экрана увеличилась с 3,86 до 4,63 Гц, время отрисовки снизилось на 30% со 145 до 101 с. Визуально эффект также очень заметен.
Сохранение изображений на SD-карту.
Неожиданно полезной находкой оказалось то, что библиотека Lovyan_GFX умеет сохранять изображение с экрана в BMP или PNG на SD-карту. В моем исполнении сохранение выполняется в несколько операций, при этом разрешение изображения соответствует размеру массива интерполированных значений температуры, т.е всего 48*64. Lovyan_GFX позволяет сохранять изображение, соответствующее разрешению дисплею и содержащее помимо данных с сенсора текст, цветовую легенду и прочие элементы графического интерфейса. С библиотекой есть пример, в котором реализована функция сохранения изображения. Я добавил эту функцию в свой скетч с небольшими изменениями, а в частности было добавлено чтение и запись номера изображения из EEPROM, таким образом, после выключении питания устройства счетчик не сбрасывается и изображения не перезаписываются. Сохранение работает нормально, за исключением небольших артефактов получаемого изображения, с которыми еще предстоит разобраться.
Вывод гистограммы.
Видел в подобном проекте, как цветовая шкала выводится в виде гистограммы, показывая распределение температуры. После небольшого обдумывания вопроса реализации данного функционала решил использовать готовую библиотеку, а не писать функцию самостоятельно. В итоге взял первую попавшуюся библиотеку по запросу “Arduino histogram library” — histogram.h. Библиотека оказалась довольно проста в использовании. В скетч добавлена функция, в которой рассчитываются границы гистограммы, гистограмма заполняется значениями температуры и гистограмма выводится на дисплей в виде графика, столбики гистограммы при этом окрашены в соответствующие цвета легенды. После этого гистограмма очищается.
Расчет и вывод гистограммы на дисплей занимает порядка 12,9 мс, частота обновления экрана при этом уменьшилась с 4,63 до 4,37 Гц.
4. Использование тачскрина
Для сохранения изображения на SD-карту я использовал внешнюю сенсорную кнопку и библиотеку button2.h. Но это решение временное, так как платформа содержит емкостный тачскрин и я планирую в конечном итоге использовать его. Была добавлена функция отрисовки кнопки и считывания координат нажатия на тачскрин. Платформа прошилась но вместо изображения я увидел черный экран. Причиной оказалось то, что контроллер тачскрина, как и сенсор MLX90640 используют шину I2C, но при этом физически о ни подключены к разным пинам ESP32 и соотвественно должны иметь разные фукнкции чтения данных. MLX90640 подключен к аппаратной I2C (пины SDA – SCL), а контролер тачскрина подключен к пинам 26, 27 Шину к которой подключен MLX90640 я оставил по умолчанию как Wire, а шину к которой подключен тачскрин переименовал в Wire1. После прошивки сенсор работает нормально, контроллер тачскрина обнаруживается но на нажатия не реагирует. После некоторого перерыва я вернулся к решению проблемы. Добавил вывод координат касания в ком-порт после проверки соответствия координат касания на попадание в область кнопки, но я не получал никаких сообщений. После ещё непродолжительного перерыва в работе я сообразил добавить вывод координат касания до проверки принадлежности точки касания области кнопки и обнаружил, что тачскрин работает, но перепутаны координаты касания. После корректировки кода, таскрин заработал, но логика работы меня не совсем удовлетворяет: функция считывания координат вызывается в начале цикла, далее следует проверка координат касания и в случае попадания на кнопку вызывается функция сохранения изображения. Таким образом, если нажать на сенсор в любой другой момент, функция не будет вызвана, поэтому приходится нажимать несколько раз.
Чтобы функция считывания координат касания выполнялась постоянно с какой-то периодичностью, я решил использовать таймер. Я взял знакомую библиотеку simpletimer добавил вызов функции считывания касания каждые 100 мс, частота обновления дисплея при этом снизилась до 3,98 Гц, а сенсорное управление не стало более отзывчивым. Очевидно необходимо использовать прерывания, но получить удовлетворительный результат пока не получилось, поэтому оставил, как было раньше.
В видео представлена демонстрация работы примеров от производителя платформы а также работа тепловизора.
В заключение отмечу, что в целом мне данная платформа понравилась. Из плюсов можно отметить качество исполнения платы, отзывчивый емкостный тачскрин, наличие примеров и подробной документации. Для моей задачи обновления тепловизора платформа вполне подошла.
Из минусов стоит отметить отсутствие возможности питания платформы от внешнего аккумулятора и соответственно какой-либо схемы питания, не выведен даже пин VIN для подачи питания. Вторым небольшим минусом можно назвать невысокое качество самого TFT дисплея, а именно плохие углы обзора.
Помимо развития проекта тепловизора у меня есть еще несколько идей использования данной платформы, о некоторых из них я обязательно расскажу в будущих обзорах. До новых встреч!
P.S.
С момента предыдущей статьи о самодельном тепловизоре, когда цена датчика MLX90640 доходила до 200$, ситуация несколько стабилизировалась и датчик можно купить за 60$. При этом за 70$ можно купить готовый тепловизор на базе этого сенсора с дисплеем и аккумулятором. Также хотелось отметить, что FLIR анонсировала выпуск модуля Lepton FS с разрешением 160*120 стоимостью 99$, что практически в два раза ниже цены модулей с аналогичными характеристиками, выпускаемых до этого.
Планирую купить+11Добавить в избранноеОбзор понравился+74
+91
о-первых не удалось реализовать наложение теплового изображения на изображение с камеры по причине использования одних и тех же пинов для подключения камеры и сенсора MLX90640
не удалось реализовать наложение теплового изображения на изображение с камеры
В целом на этой платформе это практически не реально т.к. кроме нехватки пинов на самой ESP32 еще надо динамически в зависимости от расстояния до объекта пересчитывать — делать ресайз изображения с тепловой камеры чтобы «вписать» его в угол зрения видео камеры. Для этого нужен еще и дальномер :) А ресурсов у ESP32 для всего этого уже нет.
Угол не меняется. Согласен. Но ресурсов все равно не хватит… 8fps — это приблизительный «потолок» для вывода еще приемлемого по качеству изображения с тепловой камеры учетом применения режима DMA и интерполяции. Добавьте сюда еще получение и обработку изображения с видеокамеры (в которой и пикселей побольше, чем в MLX90640) и ваш fps упадет до 1...2-х. В любом случае ESP32 — слабовата для такой задачи…
+
Обычно, в проектах с MLX90640 используют TTGO T4 — 2.2'', 240x360, 43ma, поддержка аккумулятора.
Есть ресурсы.
У меня прекрасно работает наложение на TTGO-T-Camera Plus
Вот углы зрения не совпадают.
Есть прекрасный проект Open Thermal Camera на мобилу. github.com/openthermalcamera
У меня работает
подскажите — на гитхабе есть возможность скачать версию для андроида? и как это сделать (скачать )? я на этом сайте плохо ориентируюсь. вижу что можно скачать архив — но как его в APK переделать?
FLIR анонсировала выпуск модуля Lepton FS с разрешением 160*120 стоимостью 99$
А что с надёжностью такого модуля в перспективе относительно старых? Нашел 'низкая стоимость была достигнута за счет некоторых компромиссов, в частности, снижения термочувствительности и динамического диапазона сцены, а также до 3% неработающих пикселей'
Вы не ошиблись?
+
Обычно, в проектах с MLX90640 используют TTGO T4 — 2.2'', 240x360, 43ma, поддержка аккумулятора.
У меня прекрасно работает наложение на TTGO-T-Camera Plus
Вот углы зрения не совпадают.
Есть прекрасный проект Open Thermal Camera на мобилу.
github.com/openthermalcamera
У меня работает
github.com/openthermalcamera/Android-Application/releases/tag/v0.2.0
www.youtube.com/watch?v=9_x5Tyz2OLI
Не ожидал.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.