/
Text
Техника
САМОДЕЛЬНЫЙ ТЕПЛОВИЗОР
Тепловизор - прибор для измерения распределения температуры поверхностей,
бесконтактным, визуальным способом. Как правило, карта распределения темпера-
туры отображается на встроенном в тепловизор цветном дисплее (или последующая
передача данных в компьютер) в виде цветного изображения, где красный цвет
обозначает наиболее высокотемпературные участки, а черный или синий - низко-
температурные участки. Такие приборы стоят очень дорого (несколько тысяч дол-
ларов) и позволяют определять температуры динамических (движущихся объектов)
в режиме реального времени.
Но, такой функционал нужен не всегда и в данной статье описывается процесс
изготовления самодельного сканирующего тепловизора, стоимость которого не
превышает 200$. Процесс сканирования объекта занимает примерно с минуту. Дан-
ный тепловизор подойдет для съемки статических обьектов.
В устройстве используется:
• два сервопривода (для перемещения по горизонтали и вертикали),
• контроллер Arduino (для обработки сигналов и передачи данных в персо-
нальный компьютер),
• лазерный модуль или лазерная указка (чтобы вы видели зону сканирования),
• сам модуль бесконтактного датчика температуры MLX90614ESF,
• корпус г
• поворотное устройство.
Веб-камера
Камера здесь будет являться источником исходной картинки, а также своеоб-
разным видоискателем для области сканирования. Подойдет практически любая де-
шевая вебкамера. Я нашел у себя в бардаке старую Logitech. Если же подходить
к вопросу практично, чем меньше веб-камера по размерам, тем лучше. Поэтому
огромный корпус моей кпмеры пришлось снять.
Сервоприводы и крепления
К этому моменту тоже можно подступиться с широким размахом. Нам понадобятся
2 сервопривода — один будет отвечать за движение по вертикали, второй по го-
ризонтали соответственно. Учитывая, что на горизонтальном приводе держится и
вертикальный и сама веб-камера, стоит взять более мощный. Хотя многие, уже
сделавшие устройство спокойно пользуются одинаковыми маломощными.
Крепления для сервоприводов в оригинале называются «поворотно-наклонным ме-
ханизмом» .
В сборе данный элемент конструкции выглядит примерно так:
Нижний привод крепится к штативу или другому корпусу/подставке, к верти-
кальному сервоприводу приделывается веб-камера и датчик MLX90614 путем хитрых
манипуляций с клеем или деталями от конструктора или, например, запчастями от
старых электросчетчиков. Туда же надо вставить и лазерную указку
Датчик температуры MLX90614-BCI
Самая сложная часть данной конструкции. Сложная в плане добычи. Найти его
непросто (по крайней мере, на отечественных сайтах) и он является самой доро-
гой частью конструкции. Сам я ждал его около двух месяцев, везли видимо из
Китая. Подсказать где взять не смогу, ибо ту лавочку уже прикрыли. Автор про-
екта ссылается на Futureelectronics.
При выборе необходимо обратить особое внимание на последние буквы «BCI» в
названии, что означает наличие у датчика насадки для обеспечения узкого поля
зрения1.
Выглядит он так:
1 Индекс I обозначает тип форм-фактора - с насадкой для обеспечения узкого поля зре-
ния в 5°. Можно использовать датчик с индексом DCI или BCI. Питание 3 В.
Seeduino 2.21
3V3 5V
Vm
Power
RST
AREF
Arduino
АО
Al
A2 f
A3 3*
•o
с
A4
A5
D13
D12
Dll
D10
D9
E D8
U D7
Q.
5 D6
a D5
D4
D3
D2
Dl
DO
GND
RX 4
Servo
Servo Up-Down
4.7k Ohm I
Of
4.7k Ohm
1
pulse fQ
Servo
Servo Left-Right
MLX90614
1 Gnd
2 3.3V
3 SDA
4 SCL
1 3 3V
2 GND
Laser Module
Сборка:
1. Для начала необходимо разместить плату Arduino в корпус с батарейным отсе-
ком.
2. При помощи суперклея или эпоксидки закрепите серводвигатель в пустом про-
странстве впереди Arduino.
3. Разместите второй серводвигатель в поворотное устройство и закрепите всю
конструкцию на серводвигателе.
4. Теперь, необходимо подключить MLX90614 к Arduino. Для этого подсоедините
Ground к GND, Vin к 3.3V, SDA к pin 4 и SCL к pin 5. Также, установите ре-
зистор 4.7 кОм от SDA к 3.3V, а второй от SCL к 3.3V. Смотрите схему выше.
5. Подключите Laser Card или лазерную указку. Лазер нужен для того, чтобы вы
могли видеть, где в настоящий момент сканирует тепловизор.
6. После, необходимо установить вебкамеру и сориентировать ее точно с ИК дат-
чиком и лазером, чтобы они были направлены в одну и ту же точку. На этом
сборка тепловизора закончена.
Ниже показан один из вариантов конструкции:
Скачайте скетч для конфигурирования датчика. После заливки данного скетча в
Arduino, откройте Serial Monitor и нажмите клавишу. Программа изменит на-
стройки EEPROM датчика. Это требуется сделать только один раз. После того,
как увидите надпись "Finish" отсоедините Arduino от ПК и присоедините его
снова.
Дополнительно, понадобится библиотека I2CMaster.
Программа для компьютера написана на Java, поэтому вам понадобится Java
Runtime Environment. Программа работает под Windows, Linux или Mac OSX в 32-
bit & 64-bit. Однако, если запускается под Windows 64 бит, то лучше устано-
вить 32-битную версию Java2.
Все кроме Java находится в одном архиве (7 Мб):
ftp://homelab.homelinuxserver.org/pub/arhiv/2018-09-a2.rar
Пример скетча для Arduino из аналогичного проекта3:
//Arduino Thermal Camera
#include <i2cmaster.h>
#include <Servo.h>
Servo mvert;
Servo mhorz;
// Pins: 7=sonar; 4&5=ir sensor; 8=vert servo; 9=horz servo
//
//
//
const int pwPin = 7;
const int dev = 0x5A«l;
long count = 0;
///Servo Ranges
int home_p = 0;
int j_done = 0;
int even = 0;
int xskip = 1;
int yskip = 1;
int xstart = 60;
int xstop = 75;
int ystart = 80;
int уstop = 70;
const int xnum = abs(xstart-xstop)+1;
const int ynum = abs(ystart-ystop)+1;
double therm[16][11];
double acous[16] [11] ;
void setup(){
//sonar pin
pinMode(pwPin, INPUT);
//Servo pins
mvert.attach(8);
mhorz.attach(9);
//Home position servos
mvert.write(xstart); //1485
mhorz.write(ystart); //1530
Serial.begin(9600);
2 hhttp://www.oracle.com/technetwork/Java/javase/downloads/java-archive-downloads-
javase7-521261.html
3 ftp://homelab.homelinuxserver.org/pub/arhiv/2018-09-a3.rar
Serial.println("Setup...");
i2c_init(); //Initialise the i2c bus
PORTC = (1 « P0RTC4) | (1 « P0RTC5)///enable pullups
}
void loop(){
int i,j,jt;
int hpos,vpos,hpos2,vpos2;
double tempDatal = 0x0000; // zero out the data
double sonrDatal = 0x0000;
if(Serial.available()){
if(home_p == 0){
i = 0;
Serial.flush();
Serial.println("Sweeping Viewing Space");
Serial.println("Enter 1 to confirm space");
mvert.write(ystart);
mhorz.write(xstart) ;
delay(30) ;
do
{
//This will sweep through window of view
for(int hpos=xstart;hpos<=xstop;hpos++){
mvert.write(ystart);
mhorz.write(hpos);
delay(20);
}
for(int vpos=ystart;vpos>=ystop;vpos--){
mvert.write(vpos);
mhorz.write(xstop);
delay(20);
}
for(int hpos=xstop;hpos>=xstart;hpos--){
mvert.write(ystop);
mhorz.write(hpos);
delay(20);
}
for(int vpos=ystop;vpos<=ystart;vpos++){
mvert.write(vpos);
mhorz.write(xstart);
delay(20);
}
i=Serial.read();
}while (i<=0);
Serial.println("Starting Calculation");
home_p=l;
}
if(j_done == 0){
for(int i=ystart;i>=ystop;i-=yskip){
for(int j=xstart;j<=xstop;j+=xskip){
if(even == 0){
jt = j;
mhorz .write (j) ;
delay(20);
}
else{
jt=xstop-(j-xstart);
mhorz.write(jt);
delay(20);
}
sonrDatal = readSonar(1);
tempDatal = readMLX(l);
//58uS per cm
double cm = sonrDatal;
double celcius = tempDatal - 273.15;
//double fahrenheit = (celcius*l.8) + 32;
//Serial.print("temp,dist,i,j: ");
//Serial.print(celcius);
//Serial.print(", ") ;
//Serial.print(cm);
//Serial.print(", ");
//Serial.print(ystart-i);
//Serial.print(", ") ;
//Serial.println(xstop-jt);
//Serial.print("Fahrenheit,inches: ");
//Serial.println(fahrenheit,inches);
therm[xstop-jt][ystart-i] = celcius;
acous[xstop-jt][ystart-i] = cm;
delay(400); // wait a second before printing again
}
mvert.write(i);
delay(20);
if(even == 0){
even = 1;
}else{
even = 0;
}
}
//Output data
Serial.println("Outputting Data");
for(int j=0;j<ynum;j++){
for(int i=0;i<xnum;i++){
Serial.print(therm[i][j]);
Serial.print(", ");
Serial.print(acous[i][j]);
Serial.print(", ");
Serial.print(i);
Serial.print(", ");
Serial.println(j);
Serial.flush();
}
Serial.println(" ");
}
j_done = 1 ;
}
}}
double readMLX(int Tt) {
int data_low = 0;
int data_high = 0;
int pec = 0;
i2c_start_wait(dev+l2C_WRITE);
i2c_write(0x07);
// read
i 2 c_rep_s tar t (dev+12 C_READ) ;
data_low = i2c_readAck () ; //Read 1 byte and then send ack
data_high = i2c_readAck(); //Read 1 byte and then send ack
pec = i2c_readNak();
i2c_stop () ;
//This converts high and low bytes together and processes temperature, MSB is a
error bit and is ignored for temps
double tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution of the
MLX90614)
double tempData = 0x0000; // zero out the data
int frac; // data past the decimal point
// This masks off the error bit of the high byte, then moves it left 8 bits and adds
the low byte.
tempData = (double)(((data_high & 0x007F) « 8) + data_low);
tempData = (tempData * tempFactor)-0.228;
return tempData;
}
double readSonar(int St) {
long pulse;
//Used to read in the pulse that is being sent by the MaxSonar device.
//Pulse Width representation with a scale factor of 147 uS per Inch,
pulse = pulseIn(pwPin, HIGH);
double sonrData = (double) ((pulse)/58.0);
return sonrData;
}
Запуск программы:
set term postscript enhanced color
set pm3d map
set size square
set title 'Thermal Image1
set output "thermal.eps"
splot fdata.txtf using 4:3:1 title fCelciusf
set title 'Acoustic Image1
set output "sonar.eps"
splot fdata.txtf using 4:3:2 title fCenimetersf
Еще одно программное обеспечение можно скачать здесь:
ftp://homelab.homelinuxserver.org/pub/arhiv/2018-09-a4.zip
Зачем здесь нужен китайский лазер и как же происходит процесс сканирования
легко понять на примере моего ковра:
Разрешение
Мониторинг
Количество циклов
1
Старт!
Итак, на картинке с веб-камеры есть две желтые точки и точка нашего лазера
(снизу по центру). Вся калибровка состоит в том, чтобы выбрать координаты
центра и левого нижнего угла будущей термограммы. В этом собственно и поможет
лазерная указка:
Разрешение
Мониторинг
Количество циклов
1
Старт!
Сегодняшнее ПО поддерживает всего два типа разрешения будущей картинки, в
то время, как прошлая версия была богата на это дело, насчитывая шесть разных
разрешений. Особенно было забавно получать сильно «пиксельные» картинки за 15
секунд. Думаю, разработчики осознали ненужность остальных режимов и убрали
их, хотя программно они остались и могут быть активированы.
Ниже приведены примеры термограммы:
26-23'С
26.79*С
/* /'.. Л/ Н ?! /8 /•> /Ч Ю Я
Из-за большого времени сканирования, данный прибор не подходит для проведе-
ния энергетического аудита (по крайней мере, для профессионального примене-
ния) . Тем не менее, он может стать отличным подспорьем для проведения различ-
ных исследований.