Тепловизионные камеры широко используются для различных приложений, таких как обнаружение температурных аномалий, мониторинг тепловых характеристик и даже получение тепловых изображений. Однако эти камеры могут быть довольно дорогими, и не у всех есть к ним доступ. Но что, если бы вы могли построить свою собственную тепловизионную камеру, используя доступные компоненты, такие как Raspberry Pi и температурный датчик AMG8833. Интересный проект, не правда ли? Поэтому в этой статье мы рассмотрим создание собственной тепловизионной камеры на основе платы Raspberry Pi и датчика AMG8833 с матрицей тепловизионного изображения.
Создание тепловизионной камеры с использованием Raspberry Pi и температурного датчика AMG8833 — это увлекательный и доступный проект, который может выполнить любой человек с базовыми навыками работы с электроникой. Если вы хотите отслеживать температурные аномалии в своем доме, обнаруживать утечки тепла в стенах или просто делать тепловые снимки, этот проект — отличный способ начать. Для создания тепловизионной камеры высокого разрешения вы можете использовать температурный датчик MLX90640 с матрицей тепловизионного изображения размером 32×24 - ранее на нашем сайте мы использовали этот датчик в проекте тепловизора на ESP32.
Необходимые компоненты
- Плата Raspberry Pi 4 (купить на AliExpress).
- Тепловизионный датчик AMG8833 (купить на AliExpress).
- ЖК-дисплей TS-Pro 7 дюймов (можете использовать любой другой дисплей для Raspberry Pi, с которым привыкли работать).
- SD-карта 16/32 ГБ.
- Адаптер постоянного тока 5 В, 3 А для Raspberry Pi.
- Мышь и клавиатура (опционально).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Что такое тепловизионная камера и как она работает?
Тепловизионная камера — это устройство, которое обнаруживает и отображает температурные закономерности в виде изображения.
Он работает, измеряя инфракрасное излучение, испускаемое объектами, и преобразуя эту информацию в визуальное изображение, которое показывает относительные различия в температуре. Это позволяет вам видеть объекты, структуры и области, которые могут быть слишком горячими или холодными, и определять проблемы, которые нельзя увидеть невооруженным глазом.
Тепловизионные камеры работают, обнаруживая инфракрасное излучение, испускаемое объектами, и преобразуя эту информацию в визуальное изображение. Вот как этот процесс работает в деталях:
- Инфракрасное обнаружение: Датчик камеры, термобатарея или микроболометр, обнаруживает инфракрасное излучение, испускаемое объектами в поле зрения. Количество обнаруженного излучения зависит от температуры объекта.
- Преобразование в электрический сигнал: Датчик преобразует обнаруженное инфракрасное излучение в измеряемый электрический сигнал. Этот сигнал пропорционален температуре объекта и используется для создания теплового изображения.
- Обработка изображения: Электрический сигнал обрабатывается процессором изображения камеры, который преобразует сигнал в изображение, отображающее относительные различия в температуре. Процессор изображения также улучшает изображение, применяя различные фильтры, такие как цветовые палитры и настройки яркости и контрастности, чтобы сделать тепловую информацию более понятной.
- Дисплей: Окончательное тепловое изображение отображается на экране камеры, где вы можете видеть температурные модели объектов на изображении. Чем горячее объект, тем ярче он выглядит на изображении.
ИК датчик тепловизионной камеры AMG8833 8×8
Обзор датчика
AMG8833 — это простой модуль тепловизионной камеры от Panasonic, также известный как устройство контроля температуры. Он делит полученные данные на 64 блока 8×8, что дает им разрешение 8×8 или 64 пикселя. Каждый пиксель действует как отдельный ИК-датчик, обеспечивая отдельное измерение температуры, что делает этот датчик лучше, чем PIR и пирометрические датчики, которые показывают только одно значение температуры.
AMG8833 оснащен встроенной линзой, которая ограничивает угол обзора до 60 градусов, что делает его идеальным для обнаружения объектов в средней зоне. Он работает при напряжении 3,3 В или 5 В с частотой дискретизации от 1 Гц до 10 Гц. Его температурное разрешение составляет приблизительно 0,25 °C, и он может определять температуру в диапазоне от 0 °C до 80 °C.
По сравнению с камерами видимого изображения, AMG8833 имеет узкое поле зрения (60×60 кв. град) и низкое разрешение 64 пикселя, но стоит дороже, около $40-50. С другой стороны, камера Raspberry Pi с разрешением 5MPx, что в 100 раз больше, стоит всего $10-15.
Стоимость тепловизионных камер в основном обусловлена объективом и схемой, поскольку они обнаруживают ИК-волны 8-14 мкм, что требует использования дорогих материалов, таких как германий или халькогениды. Кроме того, необходимо проявлять особую осторожность, чтобы температура камеры не влияла на показания, что делает ее радиометрической тепловизионной камерой. Размер и рассеивание тепла массивом камеры также увеличивают стоимость.
Однако с развитием материалов и технологий тепловизионные камеры стали более доступными и удобными в использовании и выпускаются в виде датчиков I2C или USB-камер.
Особенности и характеристики AMG8833
- Инфракрасный тепловизионный датчик с матрицей термоэлементов 8×8.
- Обнаруживает разницу температур до 0,01°C.
- Цифровой выход с интерфейсом I2C.
- Поддерживает до 64 измерений температуры.
- Диапазон рабочих температур: от -40°C до +85°C.
- Напряжение питания: от 2,7 В до 3,3 В.
- Рабочий ток: 120 мА.
- Разрешение: 8×8 пикселей.
- Поле зрения: 55° (Г) x 55° (В).
- Диапазон рабочих температур: от -40°C до +85°C.
- Частота кадров: 10 кадров в секунду.
Распиновка AMG8833
Инфракрасный тепловизионный датчик AMG8833 имеет 6 контактов:
- VIN: Входное напряжение питания (от 2,7 В до 3,3 В).
- GND: Земля.
- SCL: линия синхронизации I2C.
- SDA: линия передачи данных I2C.
- INT: выход прерывания (активный низкий уровень).
- AD0: контакт выбора адреса I2C (низкий для 0x69, высокий для 0x68).
Настройка датчика тепловизора AMG8833 с помощью Raspberry Pi 4
Теперь давайте подключим и настроим датчик изображения тепловизора AMG8833 с Raspberry Pi 4 и 7-дюймовым ЖК-дисплеем. Конкретная модель используемой платы Raspberry Pi не является решающим фактором, однако для целей тестирования мы выбрали Raspberry Pi 4 Model B. Это было связано с ее более быстрым процессором, что приводит к более быстрым результатам визуализации в реальном времени.
Мы могли бы реализовать этот проект с помощью платы Arduino, однако отображение изображений с помощью одного скрипта или встроенного устройства может быть сложной задачей. Для визуализации изображений необходима настольная система, такая как Processing IDE, или использование Python. При наличии 64 значений датчиков загрузка данных на сервер, такой как Arduino IOT Cloud, ThingSpeak, Ubidots или Blynk, недостаточна. Вот почему я выбрал Raspberry Pi, который позволяет мне обрабатывать мои изображения с помощью Python.
Для визуализации тепловых изображений используется 7-дюймовый ЖК-дисплей, поскольку использование VNC Viewer или любого другого сервера приводит к медленной визуализации с задержкой отклика.
Схема проекта
Схема тепловизионной камеры на основе платы Raspberry Pi и датчика AMG8833 приведена на следующем рисунке.
Процесс подключения прост и требует всего четыре провода. Просто подключите контакты VCC, GND, SDA и SCL AMG8833 к соответствующим контактам VCC, GND, SDA и SCL Raspberry Pi.
Важно помнить, что схема электропроводки для AMG8833 устанавливает его адрес I2C на 0x69, основываясь на выводе ADO, подключенном к VIN. Однако, если вывод ADO на AMG8833 подключен к GND, адрес I2C изменится на 0x68.
7-дюймовый ЖК-дисплей для визуализации
Для визуализации тепловизионных изображений мы будем использовать 7-дюймовый ЖК-дисплей TS-7 Pro от компании SunFounder, однако вы можете использовать любой другой дисплей для платы Raspberry Pi, с которым привыкли работать.
7-дюймовый сенсорный дисплей — это удобное и простое в использовании устройство, которое можно использовать вместе с Raspberry Pi. Оснащенный двухканальными динамиками, защитным чехлом и подставкой, он обеспечивает просмотр в высоком разрешении и портативность.
Встроенные кнопки позволяют легко регулировать громкость и яркость, а также включать и выключать экран. Основные характеристики включают 7-дюймовый дисплей с разрешением 1024×600 пикселей, рабочее напряжение постоянного тока 5 В и номинальную мощность 3,5 Вт. Сенсорный экран имеет 5-точечное сенсорное управление и является plug-and-play с частотой обновления 60 Гц. Внешние размеры составляют 165x114x40 мм (без учета высоты металлической опоры, которая составляет 55 мм).
После сборки дисплея с помощью Raspberry Pi 4 и подключения датчика AMG8833, датчик можно разместить в верхней части дисплея в качестве камеры.
С обратной стороны соединение довольно простое, а дисплей имеет опорную подставку для размещения его на столе или любой другой поверхности.
Настройка связи по I2C и частоты дискретизации в Raspberry Pi
Набор команд, перечисленных ниже, активирует порт I2C на Raspberry Pi и подтверждает, что AMG8833 правильно подключен к RPi. Связь между AMG8833 и Raspberry Pi будет установлена с использованием протокола I2C. Чтобы включить чтение и запись данных через I2C, необходимо активировать порты I2C на RPi. Это можно сделать либо с помощью командной строки, либо перейдя в Preferences → Raspberry Pi Configuration.
1 2 |
sudo apt-get install -y python-smbus sudo apt-get install -y i2c-tools |
Далее включите I2C на Raspberry Pi 4. Для этого перейдите в Preferences → Raspberry Pi Configuration.
Чтобы узнать, может ли AMG8833 взаимодействовать с Raspberry Pi, откройте командное окно и введите следующую команду:
1 |
sudo i2cdetect -y 1 |
В командном окне должно отобразиться 0x69 как адрес I2C.
Команда «i2cdetect» проверяет правильность подключения AMG8833 к Raspberry Pi через I2C. Чтобы установить тактовую частоту I2C на 400 кГц для связи с AMG8833, откройте терминал на RPi и получите доступ к загрузочному файлу, введя команду.
1 |
sudo nano /boot/config.txt |
В этот файл добавьте следующие строки и сохраните его.
1 |
dtparam=12c_arm=on, i2c_arm_baudrate=400000 |
Установка частоты 400 кГц оптимизирует частоту дискретизации AMG8833, которую можно настроить до 10 выборок в секунду (10 выборок в секунду, 10 Гц).
Код Python для Raspberry Pi для визуализации изображений AMG8833
Теперь перейдем к программной части. Программа выдаст на выходе тепловизионное изображение размером 64 пикселя.
Установка библиотеки
Прежде чем перейти к коду, давайте настроим несколько библиотек Python.
Библиотека Python для GRID-EYE® INFRARED ARRAY SENSOR использует техническое описание Panasonic для полной информации о связи и настройке датчика AMG8833. AMG8833 Datasheet — это краткая версия технического описания, в которой содержится информация об ограничениях, рейтингах и производительности. Библиотека объединяет пакеты Adafruit для их плат AMG8833.
Сначала загрузите и установите пакеты, описанные в руководстве Adafruit:
1 2 3 4 5 |
sudo apt-get update sudo apt-get install build-essential python-pip python-dev python-smbus git git clone https://github.com/adafruit/Adafruit_Python_GPIO.git cd Adafruit_Python_GPIO sudo python setup.py install |
Запустите следующий скрипт для установки pygame и scipy.
1 2 |
sudo apt-get install -y python-scipy python-pygame sudo pip install colour Adafruit_AMG88xx |
Наконец запустите пример скрипта:
1 2 3 4 5 6 |
cd ~/ git clone https://github.com/adafruit/Adafruit_AMG88xx_python cd Adafruit_AMG88xx_python/examples sudo python thermal_cam.py |
Исходный код 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 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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
from Adafruit_AMG88xx import Adafruit_AMG88xx import pygame import os import math import time import numpy as np from scipy.interpolate import griddata from colour import Color #low range of the sensor (this will be blue on the screen) MINTEMP = 26 #high range of the sensor (this will be red on the screen) MAXTEMP = 32 #how many color values we can have COLORDEPTH = 1024 os.putenv('SDL_FBDEV', '/dev/fb1') pygame.init() #initialize the sensor sensor = Adafruit_AMG88xx() points = [(math.floor(ix / 8), (ix % 8)) for ix in range(0, 64)] grid_x, grid_y = np.mgrid[0:7:32j, 0:7:32j] #sensor is an 8x8 grid so lets do a square height = 240 width = 240 #the list of colors we can choose from blue = Color("indigo") colors = list(blue.range_to(Color("red"), COLORDEPTH)) #create the array of colors colors = [(int(c.red * 255), int(c.green * 255), int(c.blue * 255)) for c in colors] displayPixelWidth = width / 30 displayPixelHeight = height / 30 lcd = pygame.display.set_mode((width, height)) lcd.fill((255,0,0)) pygame.display.update() pygame.mouse.set_visible(False) lcd.fill((0,0,0)) pygame.display.update() #some utility functions def constrain(val, min_val, max_val): return min(max_val, max(min_val, val)) def map(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min #let the sensor initialize time.sleep(.1) while(1): #read the pixels pixels = sensor.readPixels() pixels = [map(p, MINTEMP, MAXTEMP, 0, COLORDEPTH - 1) for p in pixels] #perdorm interpolation bicubic = griddata(points, pixels, (grid_x, grid_y), method='cubic') #draw everything for ix, row in enumerate(bicubic): for jx, pixel in enumerate(row): pygame.draw.rect(lcd, colors[constrain(int(pixel), 0, COLORDEPTH- 1)], (displayPixelHeight * ix, displayPixelWidth * jx, displayPixelHeight, displayPixelWidth)) pygame.display.update() |
Объяснение работы кода
- Импорт библиотек:
1 2 3 4 5 6 7 8 9 10 |
from Adafruit_AMG88xx import Adafruit_AMG88xx import pygame import os import math import time import numpy as np from scipy.interpolate import griddata from colour import Color |
Скрипт начинается с импорта различных библиотек. Adafruit_AMG88xx — это библиотека для тепловизионного датчика Adafruit AMG88xx grid-eye. Pygame — это библиотека для создания игр и мультимедийных приложений на Python. Os и math — это встроенные библиотеки Python. Time используется для добавления задержки. Numpy и scipy.interpolate используются для численных вычислений. Color используется для генерации цветов в диапазоне.
- Установка констант:
1 2 3 4 5 6 7 8 |
#low range of the sensor (this will be blue on the screen) MINTEMP = 26 #high range of the sensor (this will be red on the screen) MAXTEMP = 32 #how many color values we can have COLORDEPTH = 1024 |
Затем скрипт устанавливает три константы, которые управляют диапазоном и глубиной цвета теплового изображения. MINTEMP и MAXTEMP определяют нижний и верхний диапазон показаний температуры датчика. COLORDEPTH устанавливает количество значений цвета, доступных для теплового изображения.
- Инициализация pygame:
1 2 |
os.putenv('SDL_FBDEV', '/dev/fb1') pygame.init() |
Скрипт устанавливает переменную среды SDL_FBDEV в значение «/dev/fb1», а затем инициализирует pygame.
- Инициализация датчика:
1 2 |
#initialize the sensor sensor = Adafruit_AMG88xx() |
Затем скрипт инициализирует датчик, создавая экземпляр Adafruit_AMG88xx.
- Создание точек сетки:
1 2 |
points = [(math.floor(ix / 8), (ix % 8)) for ix in range(0, 64)] grid_x, grid_y = np.mgrid[0:7:32j, 0:7:32j] |
Затем скрипт создает список точек, определяющих сетку датчика, и создает массивы grid_x и grid_y, определяющие сетку из 32×32 точек, покрывающую сетку датчика 8×8.
- Установка размера экрана:
1 2 3 |
#sensor is an 8x8 grid so lets do a square height = 240 width = 240 |
Скрипт устанавливает высоту и ширину экрана равными 240 пикселям.
- Инициализация переменных:
1 2 |
blue = Color("indigo") colors = list(blue.range_to(Color("red"), COLORDEPTH)) |
Здесь переменная blue
установлена на Color
объект со значением «индиго». Метод range_to
вызывается для объекта blue
, чтобы сгенерировать список цветов между «индиго» и «красный», где COLORDEPTH
— количество цветов в списке. Этот список цветов хранится в colors
переменной.
- Создание массива цветов:
1 |
colors = [(int(c.red * 255), int(c.green * 255), int(c.blue * 255)) for c in colors] |
В этой строке создается новый список цветов путем преобразования компонентов red
, green
и blue
каждого объекта Color
в списке colors
. Значения масштабируются от 0 до 255 и сохраняются в виде кортежей в новом списке colors
.
- Настройка дисплея:
1 2 3 4 5 6 7 8 9 10 11 12 |
displayPixelWidth = width / 30 displayPixelHeight = height / 30 lcd = pygame.display.set_mode((width, height)) lcd.fill((255,0,0)) pygame.display.update() pygame.mouse.set_visible(False) lcd.fill((0,0,0)) pygame.display.update() |
В этом сегменте ширина и высота каждого пикселя дисплея вычисляются путем деления переменных width
и height
на 30 соответственно. Затем создается окно дисплея с использованием pygame.display.set_mode
с размерами (width, height)
. Дисплей заполняется красным цветом с использованием lcd.fill((255,0,0))
и обновляется с помощью pygame.display.update()
. Затем видимость мыши устанавливается False
с помощью pygame.mouse.set_visible(False)
, а дисплей заполняется черным цветом и снова обновляется.
- Вспомогательные функции:
1 2 3 4 5 |
def constrain(val, min_val, max_val): return min(max_val, max(min_val, val)) def map(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min |
Здесь определены две функции полезности: constrain
и map
. Функция constrain
принимает значение val
, а также минимальное и максимальное значения min_val
и max_val
, и возвращает значение, если оно находится в указанном диапазоне, или минимальное или максимальное значение, если значение находится за пределами диапазона. Функция map
принимает значение x
, минимальное и максимальное входные значения in_min
и in_max
, а также минимальное и максимальное выходные значения out_min
и out_max
, и возвращает отображенное значение.
- Инициализация датчика:
1 |
time.sleep(.1) |
Функция time.sleep
используется для ожидания в течение 0,1 секунды, позволяя датчику инициализироваться.
- Часть цикла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
while(1): #read the pixels pixels = sensor.readPixels() pixels = [map(p, MINTEMP, MAXTEMP, 0, COLORDEPTH - 1) for p in pixels] #perdorm interpolation bicubic = griddata(points, pixels, (grid_x, grid_y), method='cubic') #draw everything for ix, row in enumerate(bicubic): for jx, pixel in enumerate(row): pygame.draw.rect(lcd, colors[constrain(int(pixel), 0, COLORDEPTH- 1)], (displayPixelHeight * ix, displayPixelWidth * jx, displayPixelHeight, displayPixelWidth)) pygame.display.update() |
В каждой итерации цикла:
- Функция
sensor.readPixels()
вызывается для считывания значений температуры с датчика и сохранения их в спискеpixels
. - Затем список
pixels
обрабатывается функциейmap
для сопоставления значений температуры из диапазона[MINTEMP, MAXTEMP]
в диапазон[0, COLORDEPTH - 1]
. Это делается для того, чтобы значения температуры можно было использовать в качестве индексов в спискеcolors
. - Интерполяция выполняется по значениям
pixels
с использованием функцииgriddata
из библиотекиscipy.interpolate
. Эта функция принимает спискиpoints
иpixels
, а также сетку значений x и y (grid_x
иgrid_y
) и возвращает двумерный массив интерполированных значений. - Интерполированные значения затем используются для рисования прямоугольников на дисплее Pygame с использованием функции
pygame.draw.rect
. Цвет каждого прямоугольника определяется путем поиска соответствующего цвета в спискеcolors
с использованием функцииconstrain
, чтобы убедиться, что индекс в списке является допустимым. - Наконец, вызывается функция
pygame.display.update
для обновления дисплея с помощью новых нарисованных прямоугольников.
Тестирование работы тепловизионной камеры
Запустите приведенный выше скрипт Python и дождитесь появления диалогового окна.
В этом диалоговом окне будет показан массив пикселей тепловой матрицы размером 8×8 на экране размером 240×240.
Если вы проведете ладонью и пальцами перед камерой, тепловое изображение на экране появится в каком-то темном цвете. Цвет зависит от температуры объекта.
Поднесите любой горячий предмет к тепловизионной камере AMG8833 или перед ней, пятно станет красным, а на дисплеях появятся тепловые изображения. Для тестирования можно использовать горячий паяльник или любой горячий предмет.
Заключение
В заключение следует отметить, что создание тепловизионной камеры с использованием платы Raspberry Pi и матричного термодатчика AMG8833 — это уникальный и захватывающий проект, который дает возможность любому человеку, имеющему базовые навыки работы с электроникой, создать собственную тепловизионную камеру.
Этот проект DIY (своими руками) может быть использован для широкого спектра приложений, от обнаружения температурных аномалий до получения тепловых изображений. Благодаря доступным компонентам и подробным инструкциям этот проект может предоставить доступный и образовательный опыт для тех, кто хочет попробовать свои силы в создании собственной тепловизионной камеры.