低成本单点慢扫描热成像仪
smith2023/01/18原创 极客DIY电子技术 IP:广东
关键词
热成像


目前分辨率稍微好一些的热成像传感器价格都在500元以上, 但测单点的红外探头很便宜, 但如果我们让红外探头运动起来,对空间进行扫描,那我们是否能够得到一副热成像图像呢, 为了验证想法,我做了一个低成本的慢扫描热成像仪。

IMG_20230118_103256695_HDR.jpg


材料清单:

MLX90614-BCC

MG995舵机x2 + 铁支架

铝管

锗镜一片(这个可能不好买,但可以用小的硒化锌透镜代替)

Ardunio-nano

硬质底座


MLX90614-BCC是内置MCU和I2C的单点红外探测器,通过I2C可以获取温度,其中bcc型号的测温距离最小, 最大只有10cm,但是没有关系,我们加入一个红外透镜后,测温距离能够大大增加。


将铝管、锗镜片、探测器组成了如下的结构

stru.png

其中黑色胶布主要是减少管壁的反射, 然后将探测器的I2C与Ardunio的I2C引脚相连, 装在舵机上,再使用Ardunio控制舵机, 之所以使用arduino的原因,是发现手上的esp32模块都没有提供5V引脚, 无法驱动舵机, 不然使用esp32会更方便一些

最开始的装置效果如下:

IMG_20230118_104156760_HDR.jpg

接着就是扫描和处理的代码,这里很简单,只要两个循环,移动舵机获取“温度”数据即可。

注意加了锗镜之后,测出的温度是不准的, 但是没关系,我们只要有温度差异能成像即可

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

IMG_20230117_221605637.jpg

上电之后就开始扫描,串口发送数据,扫描的时间很长, 最终拍摄完成, 用python处理后得到的图像很模糊

scan5.png

思考了一下,原因应该是FOV太大, 导致扫描的精度降低, 解决的方法,应该是降低FOV,于是对镜头传感器做了改进 ,加了一截铝管用做减少FOV,注意铝管内部也要加入黑色绒毛胶布降低内壁反射

news.png

最终的结构就是如下了:

IMG_20230118_103256695_HDR.jpg


再次进行扫描,并优化了一下python显示的代码,加大放大系数,再次扫描的图像如下:

nice2.png

可见再次扫描的效果有了很大的改善了,可以看见水壶的底座,底座是塑料的不导热,温度较低,同时水壶的表面,也可以看见红外发射的角度差异造成的阴影

扫描时的视频,那是真的慢


VID_20230118_114408236.mp4 点击下载

主要是MLX90614太废柴, 这个传感器根本不是给快速测温使用的,内部的ADC和MCU速度极慢,拖尾很严重, 需要30ms才能得到正确的温度,所以延长了扫描时间, 如果换成普通的PIR传感器,自己采用高速的ADC进行采样,可能速度能好很多


还拍摄了一些其他的照片,水杯:

nice.png


总体来说,初步可以看出个轮廓,还是比不上FPA的传感器,这是FILR 320x240拍摄的效果,供参考

DSC000001.jpg

但是优势在于成本很低,只花了不到150元

来自:综合交流区 / 极客DIY电子信息 / 电子技术
20
 
10
 
高赞回复 
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
smith 作者
1年10个月前 IP:广东
914692

hum.png

扫描人的话只有个模糊的影子, 实在没办法静坐在机器面前20多分钟


6
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smith作者
1年10个月前 IP:广东
914690
引用20!Dopaminor发表于1楼的内容
能不能上振镜?

如果要用振镜的话,得换探测器,换成模拟红外探测器, 自己搞一个高速ADC做转换, MLX90614的转换速度过于拉跨

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smith作者
1年10个月前 IP:广东
914692

hum.png

扫描人的话只有个模糊的影子, 实在没办法静坐在机器面前20多分钟


引用
评论
6
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smith作者
1年10个月前 IP:广东
914693

xianshqi.png


电脑屏幕,可以看出是方的了, 而且灯管在底部,发热比较大,

左侧边的高亮是扫回来的时候MLX90614的拖尾导致的

引用
评论
2
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smith作者
1年10个月前 IP:广东
914697
引用UICalc发表于5楼的内容
想法不错,但是150元左右已经可以可以买到32*24的MLX90640了,直接薄纱

90640才是真正没有什么卵用,无法测超过2米的距离,分辨率连手指都看不清,我手上的热成像整机和模组五六个,不缺这个,事实上,廉价的模组多的是,但是,是你自己做的吗?这个更在于自己动手自制的意义

引用
评论(1)
2
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smith作者
1年10个月前 修改于 1年10个月前 IP:广东
914716
引用UICalc发表于7楼的内容
单论实用性的话,本来就是卧龙凤雏,但成像时间上单点扫描已经输太多了。从上限考虑,要改善成像速度就只能...

说比不过MLX90640的大可看一下这个视频,你的MLX90640能达到这个分辨率和效果?


Scanning Thermal Camera.mp4 点击下载

他的设计和我的差别仅仅在于换了NETD更好的TPS334模拟红外传感器,用了高速率的ADC,效果就可以接近160x120的Flir one。扫描出来的房间细节和人物衣服墨镜都清晰可见,原贴在这里

other.png

XXXXXXXXXXXXXXXXXXXXXXX/forum/projects/diy-scanning-thermal-camera/

还是那句话,do your self,年轻人,少指点江山多做事


引用
评论
5
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smith作者
1年10个月前 IP:广东
915539

如果换成InGaAs的探测器的话, 感觉可以做短波红外相机?

InGaAs实在是太贵了。 一个线阵都卖40000左右

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smith作者
1年9个月前 IP:广东
915712
引用c150发表于14楼的内容
我倒是想,能不能把90640的镜头换成长一点的焦距,然后加云台,扩展扫描范围

90640是没有镜头的,  加头倒是挺简单的, 到咸鱼上收一个别人海康h10换下来的加上去即可

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}