В этом проекте мы создадим собственную тепловизионную камеру с использованием датчика MLX90640 и платы Raspberry Pi. Дальняя инфракрасная камера MLX90640 представляет собой массив из 768 (32×24) тепловых датчиков, которые могут определять температуру от -40 до 300°C с точностью приблизительно 1°C.
Ранее на нашем сайте мы рассматривали проект тепловизионной камеры с использованием AMG8833 и платы Raspberry Pi. Но AMG8833 имеет более низкое разрешение 8×8 пикселей, что в сумме составляет 64 тепловых детектора, а датчик MLX90640 обеспечивает более высокое разрешение 32×24 пикселей, что соответствует 768 отдельным тепловыделяющим детекторам. Это более высокое разрешение обеспечивает более подробные тепловые изображения. AMG8833 обеспечивает более низкую частоту обновления 10 Гц, что делает его менее подходящим для мониторинга быстро меняющихся тепловых событий, в то время как MLX90640 поддерживает более высокую частоту обновления до 64 Гц для более плавного захвата тепловизионного видео.
Эта самодельная тепловизионная камера с использованием MLX90640 и Raspberry Pi использует код Python и несколько библиотек Python, таких как Numpy и Matplotlib, для визуализации тепловых изображений на 7-дюймовом ЖК-экране HDMI. Таким образом, создание тепловизионной камеры с использованием Raspberry Pi и MLX90640 — это увлекательный и доступный проект, который может выполнить любой человек с базовыми навыками работы с электроникой. Независимо от того, хотите ли вы обнаружить изменения температуры вокруг дома, определить утечки тепла в строительных конструкциях, создать систему обнаружения лихорадки или просто сделать уникальные инфракрасные фотографии, этот проект станет отличной отправной точкой в этом деле.
Ранее на нашем сайте мы рассматривали проект тепловизора на ESP32 и датчике MLX90640.
Необходимые компоненты
- Плата Raspberry Pi 4 (купить на AliExpress).
- Датчик MLX90640 (купить на AliExpress).
- ЖК-дисплей TS-Pro 7 дюймов (можете использовать любой другой дисплей для Raspberry Pi, с которым привыкли работать).
- SD-карта 16/32 ГБ.
- Адаптер постоянного тока 5 В, 3 А для Raspberry Pi.
- Источник бесперебойного питания с аккумулятором (опционально).
- Мышь и клавиатура (опционально).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
ИК-датчик температуры MLX90640
MLX90640 от Melexis — это компактная, бесконтактная и недорогая матрица тепловых датчиков дальнего инфракрасного диапазона, которая объединяет 768 (32×24) тепловых датчиков в компактном стандартном 4-выводном корпусе TO39.
Этот датчик способен получать подробные тепловые изображения , измеряя инфракрасное излучение, испускаемое объектами в поле его зрения, и преобразуя его в показания температуры в диапазоне от -40°C до 300°C .
Датчик достигает высокой степени точности, поддерживая приблизительно ±1°C во всем рабочем диапазоне. Кроме того, MLX90640 включает в себя дополнительные функции, такие как датчик температуры окружающей среды и датчик напряжения питания, что повышает его точность и надежность. Данные с ИК-датчиков, а также измерения напряжения окружающей среды и питания хранятся во внутренней оперативной памяти и могут быть доступны через интерфейс I2C.
Тепловизионная камера MLX90640 оснащена матрицей 32×24, в общей сложности получаем 768 отдельных пикселей дальнего инфракрасного диапазона. Каждый пиксель фиксирует данные о температуре, что позволяет получать подробные тепловые изображения и точные измерения температуры по всему полю зрения датчика.
MLX90640 не только функционален, но и удобен в использовании, подходит как любителям, так и профессионалам. Он поддерживает рабочие напряжения 3,3 В и 5 В и взаимодействует через настраиваемый интерфейс I2C, который может достигать скорости передачи данных до 1 МГц. Этот датчик совместим с такими платформами, как Arduino, Raspberry Pi или STM32.
Возможность датчика регулировать частоту кадров от 0,5 до 64 Гц позволяет пользователям точно настраивать его производительность в зависимости от конкретных требований приложения, будь то отслеживание быстро движущихся объектов или проведение подробных тепловых оценок в течение более медленного периода. Более подробную информацию об этой тепловизионной камере см. в техническом описании MLX90640.
Особенности и преимущества датчика
- Малый размер, низкая стоимость, ИК-матрица 32×24 пикселей.
- Легко интегрировать.
- Стандартный для отрасли четырехвыводной корпус TO39.
- Заводская калибровка.
- Эквивалентная разность температур шума (NETD): 0,1K RMS при частоте обновления 1 Гц.
- Цифровой интерфейс совместимый с I2C.
- Программируемая частота обновления 0,5 Гц…64 Гц.
- Напряжение питания 3,3 В.
- Потребление тока менее 23мА.
- 2 варианта поля зрения – 55°x35° и 110°x75°.
- Рабочая температура -40°С ÷ 85°С.
- Целевая температура -40°C ÷ 300°C.
- Соответствует нормам RoHS.
Применение MLX90640
- Высокоточные бесконтактные измерения температуры.
- Обнаружение вторжения/движения.
- Обнаружение присутствия/локализация человека.
- Температурный чувствительный элемент для интеллектуального кондиционирования воздуха в здании.
- Датчик теплового комфорта в системе управления автомобильным кондиционером.
- Микроволновые печи.
- Промышленный контроль температуры движущихся частей.
- Визуальные ИК-термометры.
Распиновка MLX90640
Тепловизионная камера MLX90640 имеет 4 контакта, которые необходимо подключить к контроллеру/плате, и в настоящее время поддерживаются платы Raspberry Pi, STM32F405R и ESP32.
- VCC : Контакт питания, должен быть подключен к источнику питания управления 3,3 В или 5 В.
- GND : Заземляющий контакт, соответствует подключению земли (GND).
- SDA : Контакт данных для связи I2C, подключенный к GPIO контроллера.
- SCL : Тактовый вывод для связи I2C, подключенный к GPIO контроллера
Некоторые варианты модуля тепловизионной камеры MLX90640 оснащены поддержкой протокола связи UART в дополнение к стандартному интерфейсу I2C. Эта функция обеспечивает большую гибкость при интеграции датчика с более широким спектром микроконтроллеров и систем, которые могут предпочесть UART из-за простоты или особых требований к приложению.
Расстояние измерения и поле зрения
Тепловой датчик MLX90640 обеспечивает поле зрения (FOV) 55 градусов или 110 градусов в зависимости от модели.
Поле зрения (Field of View, FOV) теплового датчика MLX90640 определяется 50%-ным сигналом излучения, полученным его термобатареей, и ориентировано вдоль главной оси датчика. Он измеряет средневзвешенную температуру объектов в пределах этого FOV, требуя полного покрытия цели в пределах FOV для точных показаний.
Варианты MLX90640
MLX90640 — это инфракрасная тепловая матрица датчиков, которая выпускается в двух вариантах: MLX90640BAA и MLX90640BAB.
- MLX90640BAA: имеет более широкое поле зрения 110 ° x 75°. Этот вариант подходит для приложений, где необходимо одновременно наблюдать за большой площадью, например, для наблюдения за широкой зоной или обнаружения присутствия людей в помещении.
- MLX90640BAB: имеет более узкое поле зрения 55° x 35°. Этот вариант лучше подходит для сфокусированных тепловых измерений, что делает его идеальным для таких приложений, как тепловое тестирование электронных устройств или обнаружение целевых объектов.
Протокол связи MLX90640
MLX90640 использует протокол связи I2C с поддержкой режима FM+, допуская тактовую частоту до 1 МГц. Он работает исключительно как ведомое устройство на шине I2C. Оба контакта, SDA и SCL, допускают напряжение 5 В, что позволяет напрямую подключаться к сети I2C с напряжением 5 В. Адрес ведомого устройства датчика программируется, поддерживая до 127 различных адресов.
Каждый сеанс начинается с состояния START (SDA переходит из состояния HIGH в состояние LOW, пока SCL находится в состоянии HIGH) и заканчивается состоянием STOP (SDA переходит из состояния LOW в состояние HIGH, пока SCL находится в состоянии HIGH).
Устройство адресуется с помощью 7-битного адреса подчиненного устройства, за которым следует бит чтения/записи, где HIGH указывает на операцию чтения, а LOW указывает на операцию записи. За каждой передачей байта следует подтверждение (ACK), когда приемник устанавливает линию SDA на низкий уровень, чтобы указать на прием.
Частота обновления MLX90640
Частоту обновления MLX90640 можно настроить с помощью «регистра управления 1» ( 0x800D ), с вариантами от 0,5 Гц до 64 Гц, что соответствует обновлению данных от каждых 2 секунд до каждых 15,6 миллисекунд.
Настройки могут быть постоянно сохранены в EEPROM по адресу 0x240C, чтобы избежать повторной настройки после включения-выключения питания. Точные расчеты температуры требуют считывания с обеих чередующихся подстраниц датчика.
Схема проекта и настройка оборудования
Схема подключения датчика MLX90640 к плате Raspberry Pi представлена на следующем рисунке. Как видим, подключение очень простое, поскольку MLX90640 требует всего лишь протокол связи I2C для связи с Raspberry Pi 4.
- VCC : Подключите контакт VCC MLX90640 к одному из контактов 3,3 В на Raspberry Pi.
- GND : Подключите контакт GND MLX90640 к одному из контактов заземления на Raspberry Pi.
- SDA : Подключите вывод SDA MLX90640 к выводу SDA на Raspberry Pi GPIO (вывод 3).
- SCL : Подключите вывод SCL MLX90640 к выводу SCL на Raspberry Pi GPIO (вывод 5).
Примечание: для варианта датчика с контактами UART подключите PS к GND чтобы включить связь I2C.
Для визуализации тепловых изображений вам понадобится портативный дисплей HMI. В моем случае я использовал 7-дюймовый дисплей TS-7 Pro от компании SounFounder.
Благодаря разрешению 1024×600 пикселей он предлагает удобный способ отображения контента и взаимодействия с платой Raspberry Pi, которая идеально помещается на дисплее.
Аналогично, нам также нужен блок питания для Raspberry Pi и блока дисплея. Я использовал PiPower UPS Supply от SunFounder, который представляет собой специальный портативный UPS Supply, разработанный для Raspberry Pi 4.
Печатная плата поставляется с аккумуляторной батареей напряжением 7,4 В и емкостью 2000 мАч.
Вот как выглядит наше устройство после подключения портативного источника бесперебойного питания PiPower к Raspberry Pi.
Вы можете сдвинуть кнопку питания на печатной плате PiPower, и вы увидите, как Raspberry Pi немедленно загрузится.
Подготовка Raspberry Pi для использования с MLX90640
Сначала установите операционную систему на свою Raspberry Pi. Если у вас есть HDMI-монитор , вы можете напрямую начать программирование. В моем случае я подключил свой Raspberry Pi к VNC-просмотрщику через SSH-терминал. Это означает, что я могу программировать свой Raspberry Pi удаленно.
Откройте терминал Raspberry Pi. Давайте сначала обновим Raspberry Pi. Следующая команда обновляет список доступных пакетов и их версий.
1 |
sudo apt-get update |
Затем выполните команду обновления, чтобы установить более новые версии имеющихся у вас пакетов.
1 |
sudo apt-get upgrade |
Затем установите библиотеку matplotlib для создания статических, интерактивных и анимированных визуализаций на Python.
1 |
sudo pip3 install matplotlib |
Установите библиотеку SciPy. Эта библиотека используется для научных и технических вычислений.
1 |
sudo pip3 install scipy |
Следующая команда установит NumPy, библиотеку для больших многомерных массивов и матриц, а также большую коллекцию математических функций для работы с этими массивами.
1 |
sudo pip3 install numpy |
Затем установите пакет python-smbus, необходимый для доступа к шине I2C через Python.
1 |
sudo apt-get install -y python-smbus |
Следующая команда установит i2c-tools, полезные для проверки и отладки коммуникаций I2C.
1 |
sudo apt-get install -y i2c-tools |
Теперь откройте файл конфигурации загрузки Raspberry Pi в текстовом редакторе nano с помощью следующей команды.
1 |
sudo nano /boot/config.txt |
Добавьте dtparam=i2c_arm=on, i2c_arm_baudrate=400000
, чтобы включить интерфейс I2C и установить скорость передачи данных для более быстрой передачи данных.
Теперь перезагрузите Raspberry Pi чтобы изменения вступили в силу.
1 |
sudo reboot |
После перезапуска Raspberry Pi выполните следующую команду для сканирования и отображения устройств, подключенных к шине I2C, что полезно для проверки подключения.
1 |
sudo i2cdetect -y 1 |
Вывод 0x33 указывает на то, что обнаружено устройство по адресу I2C 0x33 на шине I2C вашего Raspberry Pi. Этот адрес соответствует устройству, которое активно взаимодействует через I2C, а именно датчику тепловизионной камеры MLX90640.
Это подтверждает, что датчик MLX90640 правильно подключен и распознан вашим Raspberry Pi.
Я просмотрел технические характеристики датчика от компании Melexis, которые содержат сложные математические уравнения и многочисленные расчеты. Понимание всех этих математических деталей может показаться сложным, требующим почти докторской степени по физике или математике. К счастью, компания Adafruit разработала библиотеку, которая обрабатывает все эти сложные расчеты, значительно упрощая процесс для пользователей.
Выполните следующую команду.
1 |
sudo pip3 install RPI.GPIO adafruit-blinka |
Она установит RPi.GPIO для управления выводами GPIO на Raspberry Pi и Adafruit Blinka, уровень совместимости, позволяющий запускать библиотеки CircuitPython на Raspberry Pi.
Наконец, нам нужно установить библиотеку Adafruit MLX90640. Поэтому выполните следующую команду.
1 |
sudo pip3 install adafruit-circuitpython-mlx90640 |
Эта последовательность команд настраивает Raspberry Pi для использования датчика MLX90640, гарантируя, что все необходимые библиотеки и инструменты установлены и настроены правильно.
Скрипт Python для сбора показаний средней температуры
Поскольку настройка Raspberry Pi завершена, нам необходимо перейти к программированию.
Откройте Thonny IDE и вставьте следующий скрипт Python в окно редактора.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import time import board import busio import numpy as np import adafruit_mlx90640 def main(): # Setup I2C connection i2c = busio.I2C(board.SCL, board.SDA, frequency=400000) mlx = adafruit_mlx90640.MLX90640(i2c) mlx.refresh_rate = adafruit_mlx90640.RefreshRate.REFRESH_2_HZ frame = np.zeros((24 * 32,)) # Initialize the array for all 768 temperature readings while True: try: mlx.getFrame(frame) # Capture frame from MLX90640 average_temp_c = np.mean(frame) average_temp_f = (average_temp_c * 9.0 / 5.0) + 32.0 print(f"Average MLX90640 Temperature: {average_temp_c:.1f}C ({average_temp_f:.1f}F)") time.sleep(0.5) # Adjust this value based on how frequently you want updates except ValueError as e: print(f"Failed to read temperature, retrying. Error: {str(e)}") time.sleep(0.5) # Wait a bit before retrying to avoid flooding with requests except KeyboardInterrupt: print("Exiting...") break except Exception as e: print(f"An unexpected error occurred: {str(e)}") if __name__ == "__main__": main() |
Этот скрипт Python устанавливает соединение I2C для непрерывного считывания и отображения средней температуры с датчика тепловизионной камеры MLX90640 с частотой обновления 2 Гц.
Запустите этот скрипт, и вы увидите терминал, отображающий значения температуры.
Это тестирование подтверждает работу вашего датчика MLX90640. Для наблюдения значений температуры до 300 градусов вы можете поместить горячий объект рядом с датчиком.
Визуализация тепловизионного изображения с помощью MLX90640 и Raspberry Pi
Для визуализации тепловых изображений с помощью matplotlib и numpy я использовал код Python из репозитория GitHub от Maker Portal. Я модифицировал скрипт Python в соответствии со своими конкретными потребностями.
Тепловые данные с датчика MLX90640 считываются и визуализируются с помощью функции «imshow», которая отображает данные с началом координат в верхнем левом углу, требуя горизонтального переворота данных для точного представления пространственного выходного сигнала датчика.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import time import board import busio import numpy as np import adafruit_mlx90640 import matplotlib.pyplot as plt i2c = busio.I2C(board.SCL, board.SDA) mlx = adafruit_mlx90640.MLX90640(i2c) mlx.refresh_rate = adafruit_mlx90640.RefreshRate.REFRESH_4_HZ # Set to a feasible refresh rate plt.ion() fig, ax = plt.subplots(figsize=(12, 7)) therm1 = ax.imshow(np.zeros((24, 32)), vmin=0, vmax=60) cbar = fig.colorbar(therm1) cbar.set_label('Temperature [$^{\circ}$C]', fontsize=14) frame = np.zeros((24*32,)) t_array = [] max_retries = 5 while True: t1 = time.monotonic() retry_count = 0 while retry_count < max_retries: try: mlx.getFrame(frame) data_array = np.reshape(frame, (24, 32)) therm1.set_data(np.fliplr(data_array)) therm1.set_clim(vmin=np.min(data_array), vmax=np.max(data_array)) fig.canvas.draw() # Redraw the figure to update the plot and colorbar fig.canvas.flush_events() plt.pause(0.001) t_array.append(time.monotonic() - t1) print('Sample Rate: {0:2.1f}fps'.format(len(t_array)/np.sum(t_array))) break except ValueError: retry_count += 1 except RuntimeError as e: retry_count += 1 if retry_count >= max_retries: print(f"Failed after {max_retries} retries with error: {e}") break |
Датчик MLX90640, который я использую, поддерживает максимальную частоту обновления 64 Гц, но из-за ограничений моего Raspberry Pi я установил ее на 4 Гц.
Эксплуатация шины I2C на высоких скоростях, например, 1 Мбит/с, для требовательных приложений, таких как тепловидение в реальном времени с датчиком MLX90640, может привести к увеличению энергопотребления и тепловыделения. Крайне важно обеспечить адекватное охлаждение Raspberry Pi, чтобы предотвратить тепловое дросселирование или повреждение. Для поддержания стабильной работы и предотвращения перегрева при превышении скорости связи I2C типичных 400 кбит/с рекомендуется использовать надлежащую вентиляцию или активные решения по охлаждению, такие как радиаторы или вентиляторы.
При запуске этого модифицированного кода отображаются тепловые изображения, как показано на рисунке ниже.
Вы можете взаимодействовать с тепловизионной камерой MLX90640, расположившись или проведя рукой перед датчиком.
Это приводит к пикселизированному виду тепловых данных с частотой четыре кадра в секунду. Хотя это обеспечивает базовую визуализацию, изображения довольно шумные и требуют дальнейшей обработки для повышения четкости и плавности.
Интерполяция данных в реальном времени с использованием MLX90640
Интерполяция — это вычислительный метод в Python, используемый для оценки неизвестных значений путем вычисления между двумя известными значениями.
Этот подход особенно полезен для улучшения качества тепловых изображений, полученных с помощью датчика MLX90640. Реализовав интерполяцию, мы можем улучшить разрешение и визуальную четкость получаемых тепловых изображений.
В обновленном скрипте Python интерполяция применяется к данным с датчика тепловизионной камеры MLX90640, что позволяет отображать постоянно обновляемый поток тепловизионного видео в реальном времени .
Скрипт Python извлекает тепловые данные размером 24×32 пикселя, которые затем визуализируются в реальном времени с помощью функции Matplotlib imshow
. Для выравнивания с ориентацией датчика массив данных переворачивается по горизонтали перед отображением. Визуализация включает динамически настраиваемую цветовую карту для диапазонов температур, что повышает четкость и понимание изображения.
Для эффективной обработки данных скрипт использует интерактивный график Matplotlib (plt.ion()
), который непрерывно обновляется в цикле.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
import time import board import busio import numpy as np import adafruit_mlx90640 import matplotlib.pyplot as plt def initialize_sensor(): i2c = busio.I2C(board.SCL, board.SDA) mlx = adafruit_mlx90640.MLX90640(i2c) mlx.refresh_rate = adafruit_mlx90640.RefreshRate.REFRESH_4_HZ return mlx def setup_plot(): plt.ion() fig, ax = plt.subplots(figsize=(12, 7)) therm1 = ax.imshow(np.zeros((24, 32)), vmin=0, vmax=60, cmap='inferno', interpolation='bilinear') cbar = fig.colorbar(therm1) cbar.set_label('Temperature [°C]', fontsize=14) plt.title('Thermal Image') return fig, ax, therm1 def update_display(fig, ax, therm1, data_array): therm1.set_data(np.fliplr(data_array)) therm1.set_clim(vmin=np.min(data_array), vmax=np.max(data_array)) ax.draw_artist(ax.patch) ax.draw_artist(therm1) fig.canvas.update() fig.canvas.flush_events() def main(): mlx = initialize_sensor() fig, ax, therm1 = setup_plot() frame = np.zeros((24*32,)) t_array = [] max_retries = 5 while True: t1 = time.monotonic() retry_count = 0 while retry_count < max_retries: try: mlx.getFrame(frame) data_array = np.reshape(frame, (24, 32)) update_display(fig, ax, therm1, data_array) plt.pause(0.001) t_array.append(time.monotonic() - t1) print('Sample Rate: {0:2.1f}fps'.format(len(t_array) / np.sum(t_array))) break except ValueError: retry_count += 1 except RuntimeError as e: retry_count += 1 if retry_count >= max_retries: print(f"Failed after {max_retries} retries with error: {e}") break if __name__ == '__main__': main() |
Однако эта настройка приводит к максимальной частоте кадров около 4 кадров в секунду из-за ограничений вычислений и передачи данных, присущих Raspberry Pi, а также ограничений разрешения датчика. Для улучшения визуального качества вывода можно использовать методы интерполяции или сглаживания, хотя они потребуют тщательного управления, чтобы избежать дальнейшего снижения частоты кадров. Несмотря на эти улучшения, производительность системы принципиально ограничена аппаратными возможностями Raspberry Pi и скоростью связи I2C.
При запуске этого кода вы заметите значительное улучшение визуального качества тепловизионного видео.
Ранее пикселизированные изображения теперь стали более гладкими и визуально привлекательными, демонстрируя мощный эффект интерполяции.
Заключение
В этом проекте показано, как построить самодельную тепловизионную камеру высокого разрешения с использованием датчика MLX90640 и платы Raspberry Pi. В этой установке используется массив 32×24 из 768 тепловых датчиков MLX90640, что значительно превосходит возможности ранее использовавшегося датчика AMG8833. Он обеспечивает улучшенную детализацию с более высокой частотой обновления до 64 Гц. Используя доступные инструменты и библиотеки, такие как Python, Numpy и Matplotlib, любой человек с базовыми навыками работы с электроникой может создать тепловизионную систему, способную обнаруживать едва заметные изменения температуры. Будь то для практического применения в доме или для захвата уникальных инфракрасных изображений, этот проект представляет собой ценное и экономически эффективное введение в мир тепловидения. Вы можете построить систему обнаружения лихорадки с помощью MLX90640 и OpenCV.