Тепловизор на платформе Arduino UNO

Предисловие




Шел 6-й семестр обучения, перед нами (т.к. над проектом работали 3 человека) стала серьёзная задача — необходимо сделать аппаратный курсовой проект. Было много различных идей: автопилот для автомобиля, прибор ночного видения и др. Но выбор пал на тепловизор, так как он получался не сильно простым и не сильно затратным. Да и кто не мечтал о своем личном тепловизоре? В данной статье мы расскажем о том, как нам удалось собрать тепловизор с довольно неплохими характеристиками в домашних условиях.

Подготовка


Прежде всего, необходимо было определиться, какие модули нам были необходимы для создания недорогого тепловизора, но при этом обладающего приемлемыми характеристиками. В итоге, взвесив все «за» и «против», было решено построить тепловизор на основе сервокронштейна, образованного из двух сервоприводов, ИК-датчика, лазера для лучшего позиционирования сканируемой области, а также Arduino для управления сигналами устройства. Определившись с нужными модулями, необходимо было это все где-то купить. Необходимый нам ИК-датчик оказался довольно редким и не самым дешевым. Но всё это нашлось в известном китайском интернет-магазине, оставалось только дождаться, пока придут посылки.

Разработка схемы




Для воплощения нашей задумки мы решили остановиться на Arduino UNO. Мы решили выбрать именно её, так как у нас уже был опыт работы с этой платформой и требовалась быстрота сборки устройства. На схеме в качестве подтягивающих резисторов R1 и R2 используются резисторы номиналом 4.7 кОм. В качестве ИК-датчика был выбран MLX90614 bci. В основном из-за того, что у него узкое поле зрения, а также из-за его легкости в эксплуатации. Также датчик достаточно компактный и мало весит, что облегчает работу сервоприводам, которые и так работали с небольшими заеданиями. Для лазера и сервокронштейна были выбраны первые приглянувшиеся, совместимые с arduino, модули. С лазером повезло (да и что могло быть не так с лазером), а сервоприводы, как уже упоминалось, пришли не очень хорошие — плохо реагировали на короткие передвижения, часто заедали. Пришлось раскручивать и смазывать, что немного улучшило ситуацию.

Сборка тепловизора


Со сборкой схемы проблем не возникло. После того, как схема была собрана и проверена на работоспособность, стало необходимо спрятать всё ненужное, дабы всё выглядело приемлимо и не было лишних вопросов. Было несколько вариантов, но так как лежал бесхозным кусок оргстекла, то выбор был очевиден. Поэтому мы решили изготовить корпус из оргстекла, в котором будут лежать все провода и плата, а наверху оставить только сервокронштейн с датчиками и лазером. Как мы считаем, получилось красиво и практично.

Процесс сборки представлял собой шлифовку оргстекла (очень долгую шлифовку, чтобы не видеть всё, что за ним находится). Также мы решили закрепить сервокронштейн на каркасе. После данных манипуляций весь каркас был просто посажен на клей.



Так выглядело наше устройство на пути к полной готовности:



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



Работа с тепловизором


Самым простым способом управлять устройством является управление с компьютера. Питание также осуществляется от компьютера. Датчик посылает данные измерений в com-порт. Поэтому была написана программа для подачи команд устройству и считывания данных с датчика.
Алгоритм работы тепловизора довольно прост:
  • Открываем com-порт arduino
  • Осуществляем позиционирование датчика. Для задания области сканирования устанавливаются 2 точки: bot — нижняя левая точка изображения, mid — центр изображения.
  • Запускаем сканирование (сканирование ведётся примерно 2 минуты при использовании режима «64х48 пикселей»)
  • Собираем полученные от датчика данные в массив
  • Формируем изображение

Интерфейс программы




Как можно видеть на скриншоте, интерфейс программы выполнен в минималистичном стиле — только всё самое необходимое для работы. Названия кнопок говорят сами за себя. При нажатии на определённый пиксель тепловой карты будет выведена соответствующая ему температура. Цвета для температуры выбираются относительно текущих результатов сканирования, т.е. самая высокая температура будет обозначена красным, а самая низкая — синим, пусть даже эти значения будут отличаться на 2-3 градуса.
Как можно проверить работоспособность тепловизора? Конечно же просканировав одного из его создателей! Как можно видеть из представленной выше тепловой карты, самым горячим местом является лоб – аж 33,42 ºС. Существуют определенные проблемы с “дальнобойностью” датчика – на расстоянии более чем в 50 см результаты имеют довольно большую погрешность. Но на близком расстоянии показатели температуры определяются очень точно.

Ниже можно увидеть ещё один пример работы устройства:



Как показывает сканирование, температура воды внутри стакана находится на уровне 38 ºС.



А вот и видео с демонстрацией работы тепловизора:



Для интересующихся представлены ссылки на исходный код прошивки и приложение:

Прошивка
Приложение

Итоги


У нас получилось устройство, которым можно сканировать небольшие статические предметы. Но есть и минусы — оно совсем непригодно для больших предметов, а если предмет движется, то нет и малейшего шанса получить правильную картину. Однако несомненным плюсом этого устройства является его дешевизна. Все промышленные тепловизоры стоят несколько тысяч долларов, порой и несколько десятков тысяч. И для простого человека промышленный тепловизор совершенно бесполезен, побалуется неделю и положит его пылиться на полку. А для домашних экспериментов достаточно будет и нашего устройства, дешевого и простого.

Комментарии 47

    0
    Великолепно. Нужна еще вебкамера с той же направленностью, чтобы overlay делать. Сколько стоил датчик?
      0
      Примерно 20$-28$
        +1
        Если что, sacredik также является одним из авторов устройства, так что не удивляйтесь, если он отвечает на вопросы в комментариях)
          +1
          Что касается камеры. Изначально хотели взять веб-камеру от ноутбука, была найдена такая веб-камера (но к сожалению она была неисправна). Новую камеру не хотелось покупать, а модули к arduino заказывать было уже некогда(да и у них, как нам показалось, не очень картинка). При работе мы просто ставили веб-камеру рядом без установки ее в корпус(пример картинки со стаканом — это изображение с веб-камеры стоящей перед корпусом).
            0
            Есть веб камера от моноблока, мне не нужна. Могу подарить проекту, если нужно.
        0
        за файлы для 3d принтера был-бы благодарен.
          +1
          К сожалению не использовали 3dпринтер. Сервоприводы взяли вместе с кронштейном.
            +2
            Ищите на ThingIverse.com по ключевому слову sg90, вот к примеру, что то похожее (http://www.thingiverse.com/thing:501701). Ну или купите на Aliexpress за 40 рублей (так же ищите по ключевому слову «sg90», а потом отсортируйте по цене результат поиска в первых строках как раз будут кронштейны, что на фото в этой статье).
              +1
              блин вот реально, комментарий написать силы есть, а подумать нет. большое спасибо! понять не могу как самому в голову не пришло
            +4

            Я же правильно понимаю, что это сделано под "влиянием" https://geektimes.ru/post/257850/ ?


            А можно подробности (если конечно такие измерения проводили) из практической эксплуатации этого датчика:


            1. Минимальное время для измерения одной точки? Т.е. для более менее точного измерения температуры при переходе от пятна с 20 градусами, до 100 градусами, на сколько нужно зафиксировать позицию, что бы получить результат ну скажем с 20% точностью.
            2. какой угол зрения датчика с данной "линзой" ?

            спасибо заранее..

              0
              Угол, если не ошибаюсь, 5 градусов(по документации).Всего мы брали «матрицу 64(столбца)*48(строк)». Весь скан, с учетом передвижения, занимает примерно 3 минуты. На видео демонстрации за 1 подъем устройство берет 48 точек, приблизительное время подъема 2,83 секунды. Тестировал на стакане с залитой из чайника водой на расстоянии примерно 50 см. Выдавал 69.9 градусов в центре (с учетом того, что от момента заливания закипевшей воды до сканинга прошло около 15-20 минут). Через 6 минут после выдавал в центре стакана 59.02. Добавил результаты на гитхаб(skan60_20(1), skan60_20(2)) (папка results, в том же репозитории, что и код ссылки в статье)
                0
                Угол, если не ошибаюсь, 5 градусов(по документации).

                По документации, то я и сам знаю.
                Я надеялся что кто ни будь фактическую диаграмму направленности построит.


                Весь скан, с учетом передвижения, занимает примерно 3 минуты

                Я вот и хотел спросить, а на основе чего именно такая скорость сканирования была выбрана.
                Из соображений "если больше, то больше ошибка определения температуры"? Или еще каких?


                Т.е. можно ли существенно быстрее?

                0
                Никак не возьму себя в руки, чтобы вплотную заняться этим датчиком, но что есть:.
                1. Измеряемую температуру отображает почти мгновенно. Реально достаточно 1-2 периодов измерений для получения точного результата (0.3-0.5 секунд).
                2. Есть датчик с «родной» линзой — около 5°, вероятно даже более острый угол.
                Чтобы получить дальнобойный — нужна внешняя оптика. Естественно, не {стекло, акрил, пластик} а германиевая линза. Крайне дорого.

                PS: Мне тоже вспомнилась та самая статья.
                  0

                  Спасибо за информацию.


                  Как то хотел сделать нечто то подобное. Но останавливает практически 0-я ценность результата и вторичность (не интересно повторять).
                  А пока только наблюдаю за тем как цена за 2 года плавно снизилась с 60$ до 35$ (на e-bay).


                  Измеряемую температуру отображает почти мгновенно. Реально достаточно 1-2 периодов измерений для получения точного результата (0.3-0.5 секунд).

                  Мда… тогда и понятно откуда 3 минуты взялось. Это для разового измерения в интерактивном режиме 300ms "почти мгновенно". Для режима сканирования это слезы.


                  Придется ждать падения цен на MLX90614 или появления дешевых матриц типа MLX90620.


                  Есть датчик с «родной» линзой — около 5°, вероятно даже более острый угол.

                  В документации то диаграмма весьма красивая нарисована. Ну раз никто не нашел время проверить по факту, то наверное нужно считать, что так оно и есть.


                  Было бы интересно, если бы со штатной "линзой" в этом ценовом диапазоне, хотя бы на 50 метрах ловился контраст между 20 и 30 градусами (человек/животное). Для FOV=5 это не реально.


                  Но по факту, никто из похвалившихся разработкой, на открытой местности тестов не делает. Все в помещении на 5 метрах максимум картинки тестов.

                    0
                    Придется ждать падения цен на MLX90614 или появления дешевых матриц типа MLX90620.

                    MLX90620 — крайне дорого (для «побаловаться»). Так что, я для себя её не рассматриваю.
                    В документации то диаграмма весьма красивая нарисована. Ну раз никто не нашел время проверить по факту, то наверное нужно считать, что так оно и есть.

                    Но вот проверял нагретым предметом, перемещая его перед сенсором где-то на расстоянии в пол метра (паяльник). Показания меняются достаточно резко при попадании жала в поле зрения.
                    Есть датчик без линзы с широким углом обзора. Им приходится едва ли не тыкать в предмет, чтобы узнать его температуру.
                    Но по факту, никто из похвалившихся разработкой, на открытой местности тестов не делает. Все в помещении на 5 метрах максимум картинки тестов.

                    Он не столь дальнобойный, с возрастанием расстояния будет больше погрешностей от усреднения температур объектов в кадре. Например, рядом будут стоять горячее/холодное вёдра воды, где-нибудь метрах в 20-30 и различить их будет сложно. Вот дополнительная оптика отлично бы подошла, но крайне дорого.

                    Как более настоящий тепловизор я бы подумал о Seek Thermal Compact (206x156 px), но цена в 30k деревянных не слишком радует. =(
                +1
                А каков бюджет на данную конструкцию?
                  0
                  Около 50-60$ получилось
                    +1
                    nikita_baz также является автором проекта (именно он и был отсканирован на картинке в статье)
                  +1
                  Годная вешь. Вот тоже собираюсь сделать на досуге подобное, только с ультрозвкуковым дальномером, Можно списочек ссылками на серв которые вы использовали? Было бы очень хорошо.
                    0
                    И объединить их, УЗ/Лазерный дальномер и тепловизор…
                    +1
                    Тут еще инфа, для тех, кто хочет сделать подобное http://cxem.net/arduino/arduino19.php
                      0
                      А какова предельная дальность у теплового датчика? Погрешность в значениях не интересует, главное на каком расстоянии можно «засечь» температурную аномалию. Скажем можно ли определить с 30-50м человека хотя бы как размытое пятно?
                        0
                        На 30 метрах не пробовал(плохие сервоприводы заедают при повороте, либо замирают на одной позиции оси x, а потом резко перепрыгивают).На 4-5 метрах выдавало, что на моей спине 29 градусов.
                        0
                        Этот девайс уже не в один диплом вошел :)
                        За все время существования устройства так не были поставлены два интересных эксперимента, о которых меня постоянно спрашивали:
                        — можно ли увидеть теплопотери в здании, сняв его снаружи?
                        — можно ли увеличить разрешение устройства, добавив к нему ИК-линзу?
                        Так и не нашел времени сделать один из них, может вы найдете, было бы круто.

                        Как я понимаю, программу вы сами составляли? Можете поделиться как реализовали наложение ложных цветов на массив значений температуры. В оригинальном софте цвета назначались автоматически, а мне для экспериментов надо было снимать ИК-timelapse, соответственно хотелось чтобы цвет всегда соответствовал определенной температуре. Когда начал писать свою программу, столкнулся с проблемой создания такого градиента.
                          0
                          теплопотери увидеть можно, но зависит от площади утечки.
                          Вот это снималось на расстоянии ладони от стены


                          Разрешение тоже можно увеличить, но нужна германиевая линза и знание характеристики линзы, уже установленной в датчик, она, как я понимаю, там уже есть, но в даташите про это ничего не сказано
                            0
                            Взять 8-битную шкалу. Задать диапазон от 0(10 градусов) до 255 (50 градусов), например. Все, что за пределами диапазона обрезать клиппингом. 8-бит изображение — обычный grayscale. Потом можно любой другой цветовой схемой заменить. Главное в 256 значений уложиться — проще выводить на 8-битный экран.
                            +5
                            Мы с друзьями в 11 классе тоже подобную штуку делали. GUI писали на си шарпе, датчик тот же. После пары испытаний смогли добиться неплохого качества, не без помощи интерполяции, конечно.


                            чья-то рука

                            раковина


                            Туалет


                            Чей-то дом


                            Человек


                              +5
                              То чувство, когда комментарии к статье несут больше полезного, чем сама статья
                                0
                                Надеюсь, что хоть это поднимет вам настроение
                                Сарказм
                                Сарказм
                                0
                                Потрясающий результат! Жаль что не описали процесс разработки, думаю многим было бы интересно.
                                0
                                Не проще ли было датчик зафиксировать и направить на отклоняемое гальванометром зеркало? Любое посеребренное зеркало прекрасно отражает ИК-излучение и двигать его на порядок легче
                                  0
                                  Зеркало отражает не так хорошо. Если конечно речь идет о чём-нибудь сильно различающемся по температуре, то ещё можно.
                                  Мы пробовали сканировать человека через зеркало. Фигуру, конечно, можно различить, но шума очень много.
                                    +1
                                    А это случаем было не обычное «бытовое» зеркало с внутренним отражающим покрытием? В таком случае ИК излучение должно было дважды пройти сквозь слой стекла, которое не пропускает дальнее ИК излучение.
                                    Поэтому для тепловизора можно использовать только специализированные зеркала с внешним отражающим покрытием.
                                  0
                                  А скорость сканирования чем обусловлена?
                                  Можно, например, заставить в несколько раз быстрее сервы двигаться?

                                  Датчик с фокусирующим модулем?
                                  Какое максимальное расстояние, например картинку человека получить?
                                    0
                                    Можно немного ускорить сканирование поменяв алгоритм прохода — сделать чтобы сканирование шло не только снизу вверх, но и сверху вниз.
                                    А вообще, можно установить несколько датчиков параллельно и сканировать несколько линий за раз. Или установить несколько сервоприводов и поровну разделить между ними область сканирования. А совсем быстро можно сканировать применив технологию как в сканерах штрихкодов, где зеркало очень быстро отклоняется при помощи электромагнитного поля, формируя лазерную «полоску». Только Arduino тут уже не отделаешься.
                                      +1
                                      Отвечаю для Delsian sav13 PKav
                                      Скорость сканирования по большей части определяется временем измерения температуры в 1 точке сканирования. Причем чем точнее нужен результат — тем дольше нужно находится в этой точке. То есть к примеру для погрешности в 1 градус — нужно измерять 1 сек, для погрешности в 10 градусов — хватит и 0,5 сек (цифры от балды, лень лезть в даташит на MLX90...)
                                      То есть всякие сверхбыстрые системы отклонения типа гальванометров и серебряных зеркал — ничего не изменят.
                                      Существенно ускорить вывод первичной картинки можно путем комбинации сканирования на обратном проходе и чересстрочного сканирования в 2 захода с интерполяцией промежуточного результата. Тогда превью можно получить в плохом разрешении, а потом дождаться детализации картинки.
                                      И да, сервоприводы тупо дешевле и подходят по всем параметрам сканирования, так что систему развертки существенно не улучшить.
                                      0
                                      Метод не нов. Конкретная реализация ничем не выделяется среди множества таких же. Можно было бы, к примеру, отвязать девайс от ком-порта, чтобы не пришлось таскать за собой этот самый ком-порт. Или написать приложение для андроида, чтобы использовать девайсы с OTG.

                                      промышленные тепловизоры стоят несколько тысяч долларов, порой и несколько десятков тысяч

                                      Бытовые тепловизоры, выполненные в виде гаджетов для смартфона, стоят около 250$.
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                          0
                                          Датчик не показывает температуру определенной точки, а среднюю температуру в какой-то области. Чем дальше сканируемая поверхность от датчика, тем эта область больше. Можно представить по аналогии с фонариком и стеной. Ближе — яркое пятно света, дальше — тусклое, но большое.
                                          Если я правильно считаю, то на 5 метрах диаметр «пятна», с которого датчик измеряет температуру будет около 40 сантиметров, а на пятнадцати — уже больше метра. Это можно скомпенсировать как на железном уровне, добавив ИК-линзу, так и софтово, используя специальные алгоритмы.
                                            0
                                            Кстати, было бы интересно повесить такую штуку на дрона — часть сканирования переложить на него — тогда можно приблизиться к зданию и повысить тем самым разрешение.
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                              0
                                              Осмелюсь предположить исходя из этой статьи geektimes.ru/post/257850 которая уже фигурировала в здешних комментариях. По всей видимости не получится использовать ее для энергетического аудита. Хотя причины не такие уж и отпугивающие и к каком нибудь результату прийти в общем думаю реально. Но нужно тестировать в боевых условиях.
                                              0
                                              а если использовать диск Нипкова? Скорость измерения не вырастет? Стоимость не снизится?
                                                0
                                                Чуть выше, я об этом уже писал https://geektimes.ru/post/275970/#comment_9274984
                                                0
                                                Вот такой бы девайс, кто-нибудь подключил бы к компу:

                                                www.thermal.com/products/compactxr
                                                  0
                                                  Есть в наличии дешевый бесконтактный ик-термометр с алиекспресса:
                                                  ru.aliexpress.com/item/1Pcs-Non-Contact-Laser-Body-Surface-Forehead-Infrared-Digital-IR-Thermometer-GM300-50-380-Degrees-Brand/1472976963.html
                                                  Я вот думаю, если его разобрать и использовать начинку, для создания такого вот самодельного тепловизора. Взлетит или нет?
                                                    0

                                                    Есть и на таком проекты. И выложены видео ролики.


                                                    Я экспериментировал с таким термометром (лежит разобранный с тех пор без дела) года 3 назад.
                                                    Точнее не точно с таким, но в таком же ценовом диапазоне.
                                                    Но…


                                                    1:12 (~5градусов) в характеристиках — это обман. По моим тестам, не менее 15 градусов.
                                                    Проверить легко. Стакан воды с кипятком + мерная дистанция и линейка на заднем плане.


                                                    Что не удивляет. В качестве фокусирующей системы — пластмассовая линза(?) или скорее просто IR фильтр + трубка с ребристыми стенками.
                                                    Датчик аналоговый. Нужно оцифровывать выход или искать где на схеме взять цифровой сигнал (я с ходу не нашел и не стал искать, разочаровавшись в характеристиках).


                                                    Уж лучше сразу модуль как в статье купить. Цена то того же порядка и размер поменьше и выход сразу цифровой.

                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                  Самое читаемое