扫描人的话只有个模糊的影子, 实在没办法静坐在机器面前20多分钟
目前分辨率稍微好一些的热成像传感器价格都在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了,直接薄纱
90640才是真正没有什么卵用,无法测超过2米的距离,分辨率连手指都看不清,我手上的热成像整机和模组五六个,不缺这个,事实上,廉价的模组多的是,但是,是你自己做的吗?这个更在于自己动手自制的意义
单论实用性的话,本来就是卧龙凤雏,但成像时间上单点扫描已经输太多了。从上限考虑,要改善成像速度就只能...
说比不过MLX90640的大可看一下这个视频,你的MLX90640能达到这个分辨率和效果?
Scanning Thermal Camera.mp4 点击下载
他的设计和我的差别仅仅在于换了NETD更好的TPS334模拟红外传感器,用了高速率的ADC,效果就可以接近160x120的Flir one。扫描出来的房间细节和人物衣服墨镜都清晰可见,原贴在这里
XXXXXXXXXXXXXXXXXXXXXXX/forum/projects/diy-scanning-thermal-camera/
还是那句话,do your self,年轻人,少指点江山多做事
如果换成InGaAs的探测器的话, 感觉可以做短波红外相机?
InGaAs实在是太贵了。 一个线阵都卖40000左右
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。