Текст
                    Техника
САМОДЕЛЬНЫЙ ТЕПЛОВИЗОР
Тепловизор - прибор для измерения распределения температуры поверхностей,
бесконтактным, визуальным способом. Как правило, карта распределения темпера-
туры отображается на встроенном в тепловизор цветном дисплее (или последующая
передача данных в компьютер) в виде цветного изображения, где красный цвет
обозначает наиболее высокотемпературные участки, а черный или синий - низко-
температурные участки. Такие приборы стоят очень дорого (несколько тысяч дол-
ларов) и позволяют определять температуры динамических (движущихся объектов)
в режиме реального времени.
Но, такой функционал нужен не всегда и в данной статье описывается процесс
изготовления самодельного сканирующего тепловизора, стоимость которого не
превышает 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 /•> /Ч Ю Я Из-за большого времени сканирования, данный прибор не подходит для проведе- ния энергетического аудита (по крайней мере, для профессионального примене- ния) . Тем не менее, он может стать отличным подспорьем для проведения различ- ных исследований.