自己做本来就是为了学习,买谁不会买,咸鱼上大把便宜货。
目前分辨率稍微好一些的热成像传感器价格都在500元以上, 但测单点的红外探头很便宜, 但如果我们让红外探头运动起来,对空间进行扫描,那我们是否能够得到一副热成像图像呢, 为了验证想法,我做了一个低成本的慢扫描热成像仪。
材料清单:
MLX90614-BCC
MG995舵机x2 + 铁支架
铝管
锗镜一片(这个可能不好买,但可以用小的硒化锌透镜代替)
Ardunio-nano
硬质底座
MLX90614-BCC是内置MCU和I2C的单点红外探测器,通过I2C可以获取温度,其中bcc型号的测温距离最小, 最大只有10cm,但是没有关系,我们加入一个红外透镜后,测温距离能够大大增加。
将铝管、锗镜片、探测器组成了如下的结构
其中黑色胶布主要是减少管壁的反射, 然后将探测器的I2C与Ardunio的I2C引脚相连, 装在舵机上,再使用Ardunio控制舵机, 之所以使用arduino的原因,是发现手上的esp32模块都没有提供5V引脚, 无法驱动舵机, 不然使用esp32会更方便一些
最开始的装置效果如下:
接着就是扫描和处理的代码,这里很简单,只要两个循环,移动舵机获取“温度”数据即可。
注意加了锗镜之后,测出的温度是不准的, 但是没关系,我们只要有温度差异能成像即可
void loop() {
for (int j = 0; j < v_schritte; j++)
{
MG995_ServoV.writeMicroseconds(verti_start + 2*j);
MG995_ServoV.writeMicroseconds(verti_start + 2*j);
MG995_ServoV.writeMicroseconds(verti_start + 2*j);
delay(80);
for (int i = 0; i < h_schritte; i++)
{
MG995_ServoH.writeMicroseconds(horiz_start + 2*i);
MG995_ServoH.writeMicroseconds(horiz_start + 2*i);
MG995_ServoH.writeMicroseconds(horiz_start + 2*i);
if(i % h_schritte == 0)
delay(100);
else
delay(80);
float Temp = mlx.readObjectTempC();
Serial.print(i);
Serial.print(" ");
Serial.print(j);
Serial.print(" ");
Serial.println(Temp);
}
}
MG995_ServoV.writeMicroseconds(verti_start + v_schritte);
MG995_ServoH.writeMicroseconds(horiz_start + h_schritte);
while(1)
delay(50000);
}
获取到的数据是如下的格式:
0 0 17.69
1 0 15.87
2 0 15.87
3 0 15.75
4 0 15.67
5 0 15.67
6 0 15.47
7 0 15.47
8 0 15.85
9 0 15.85
10 0 16.01
11 0 16.01
12 0 15.61
13 0 15.61
第一列是x, 第二列是y, 第三列是浮点的温度值
然后再用一段python,把数据转换成图片,方法很简单,按照X和Y,像素的值就是温度的值
def main():
img = Image.new( 'RGB', (160,120), "black") # Create a new black image
pixels = img.load() # Create the pixel map
databuf = get_data('dataFile.txt')
size = get_size(databuf)
base = size[0]
scale = int(256 / (size[1] - size[0]))
print("high = %f low = %f, scale = %d " % (size[1], size[0], scale))
for dat in databuf:
x = int(dat[0])
y = int(dat[1])
value = int((float(dat[2]) - base)* scale )
#print("x= %d y= %d v= %d" % (x, y, value))
#print(value)
pixels[x,y] = (value, value, value)
img.show()
最开始得到的图片比较模糊, 目标是拍摄一个热水壶,距离大概1.5m
上电之后就开始扫描,串口发送数据,扫描的时间很长, 最终拍摄完成, 用python处理后得到的图像很模糊
思考了一下,原因应该是FOV太大, 导致扫描的精度降低, 解决的方法,应该是降低FOV,于是对镜头传感器做了改进 ,加了一截铝管用做减少FOV,注意铝管内部也要加入黑色绒毛胶布降低内壁反射
最终的结构就是如下了:
再次进行扫描,并优化了一下python显示的代码,加大放大系数,再次扫描的图像如下:
可见再次扫描的效果有了很大的改善了,可以看见水壶的底座,底座是塑料的不导热,温度较低,同时水壶的表面,也可以看见红外发射的角度差异造成的阴影
扫描时的视频,那是真的慢
VID_20230118_114408236.mp4 点击下载
主要是MLX90614太废柴, 这个传感器根本不是给快速测温使用的,内部的ADC和MCU速度极慢,拖尾很严重, 需要30ms才能得到正确的温度,所以延长了扫描时间, 如果换成普通的PIR传感器,自己采用高速的ADC进行采样,可能速度能好很多
还拍摄了一些其他的照片,水杯:
总体来说,初步可以看出个轮廓,还是比不上FPA的传感器,这是FILR 320x240拍摄的效果,供参考
但是优势在于成本很低,只花了不到150元
引用20!Dopaminor发表于1楼的内容能不能上振镜?
如果要用振镜的话,得换探测器,换成模拟红外探测器, 自己搞一个高速ADC做转换, MLX90614的转换速度过于拉跨
扫描人的话只有个模糊的影子, 实在没办法静坐在机器面前20多分钟
电脑屏幕,可以看出是方的了, 而且灯管在底部,发热比较大,
左侧边的高亮是扫回来的时候MLX90614的拖尾导致的
想法不错,但是
150元左右已经可以可以买到32*24的MLX90640了,直接薄纱
想法不错,但是150元左右已经可以可以买到32*24的MLX90640了,直接薄纱
90640才是真正没有什么卵用,无法测超过2米的距离,分辨率连手指都看不清,我手上的热成像整机和模组五六个,不缺这个,事实上,廉价的模组多的是,但是,是你自己做的吗?这个更在于自己动手自制的意义
90640才是真正没有什么卵用,无法测超过2米的距离,分辨率连手指都看不清,我手上的热成像整机和模组...
单论实用性的话,本来就是卧龙凤雏,但成像时间上单点扫描已经输太多了。
从上限考虑,要改善成像速度就只能定制有高速AD的传感器,想提高空间分辨率也十分困难,而且势必增加大量成本。
当然如果就是做着玩图一乐当我没说。
单论实用性的话,本来就是卧龙凤雏,但成像时间上单点扫描已经输太多了。从上限考虑,要改善成像速度就只能...
说比不过MLX90640的大可看一下这个视频,你的MLX90640能达到这个分辨率和效果?
Scanning Thermal Camera.mp4 点击下载
他的设计和我的差别仅仅在于换了NETD更好的TPS334模拟红外传感器,用了高速率的ADC,效果就可以接近160x120的Flir one。扫描出来的房间细节和人物衣服墨镜都清晰可见,原贴在这里
XXXXXXXXXXXXXXXXXXXXXXX/forum/projects/diy-scanning-thermal-camera/
还是那句话,do your self,年轻人,少指点江山多做事
说比不过MLX90640的大可看一下这个视频,你的MLX90640能达到这个分辨率和效果?他的设计...
你是不是应该重新学一下语文啊,别人做的好和你做的比不比得过有什么关系吗?你的作品和90640最终呈现出来的效果难道有这么大的区别吗?
此外,视频里面的读取效果是加了倍速的,读出速率仍然是硬伤,不要避而不谈。
如果换成InGaAs的探测器的话, 感觉可以做短波红外相机?
InGaAs实在是太贵了。 一个线阵都卖40000左右
90640才是真正没有什么卵用,无法测超过2米的距离,分辨率连手指都看不清,我手上的热成像整机和模组...
我觉得也没有那么不堪,加一些插值啥的,效果还是可以蒙混过关的:
我倒是想,能不能把90640的镜头换成长一点的焦距,然后加云台,扩展扫描范围
我倒是想,能不能把90640的镜头换成长一点的焦距,然后加云台,扩展扫描范围
90640是没有镜头的, 加头倒是挺简单的, 到咸鱼上收一个别人海康h10换下来的加上去即可
90640是没有镜头的, 加头倒是挺简单的, 到咸鱼上收一个别人海康h10换下来的加上去即可
应该是一体化的,带了锗镜头,但视角太大:
两种视场角可选: 55° *30° 和 110° *75°
哈哈,意思只要不着急,红外测温枪也可以是热成像是吧
200字以内,仅用于支线交流,主线讨论请采用回复功能。