标准版
#第四届立创大赛#Teensy 打造热成像仪

创建时间:5年前

项目主题:自拟主题

描述

<p>注:*为必填项。</p> <p>【请在报名阶段填写 ↓】 使用 Teensy 配合 MLX90640 实现一个简单的热成像仪</p> <p>【请在竞赛阶段填写 ↓】 <em>  一、作品详情; 使用 Teensy 3.2在 320</em>240 的液晶屏幕上显示 MLX90640取得的温度数据,从而实现一个简单的热成像仪。</p> <p>*  二、描述作品所面临的挑战及所解决的问题; 主要问题有:</p> <ol> <li>传感器是 32x24 的数据,屏幕是 320X240的分辨率,如何来进行显示达到最好的效果。最终使用双线性插值算法,将 32x24的数据进行插值显示在屏幕上;</li> <li>实现液晶屏上的快速显示。选择 UcgLib 实现屏幕的显示,通过DrawPixel 来绘制每一个点,这样的效率很低。最终,通过研究ILI9431的DataSheet掌握了最简单的发送点的方法,直接使用SPI将颜色传输到主控的 DRAM 中实现了快速显示。</li> </ol> <p>*  三、描述作品硬件、软件部分涉及到的关键点; 使用 Arduino 来进行编译。</p> <p>因为主要模块是 Teensy 3.2 所以整体电路非常简单,外部只是有一个 5v转3.3v 模块,外加 i2c 接口的传感器。</p> <p><img src="//image.lceda.cn/pullimage/Vob3HSC1qpXMavQO9FPHbaozT62P01JL0xUetOUF.jpeg" alt="c1.jpg"></p> <p><img src="//image.lceda.cn/pullimage/70tAeLrXNb2aOcGfStPuEDmWudc7qMrXiAUwFIqL.png" alt="xx.png"> 完整电路和pcb 文件可以在附件中看到,是 eagle 格式的。</p> <p>*  四、作品材料清单; Teensy 3.2 一块 MLX90640 一块 320X240 LCD ILI9341主控一块</p> <p><em>  五、作品图片上传;(PCB上须有大赛logo标识并拍照上传,若无视为放弃参赛) <img src="//image.lceda.cn/pullimage/FwygQjNGVB4XH8qrfz0fDleiJlMQWqCInZBDDK8y.png" alt="ircam.png"> </em>  六、演示您的作品并录制成视频上传;(视频内容须包含:作品介绍;功能演示;性能测试;PCB上大赛logo标识特写镜头,若无视为放弃参赛)</p> <p>七、开源文档。</p> <p>在我小时候,荧幕上还都是史泰龙施瓦辛格这样的硬汉,他们亮出肌肉敌人就会大片的倒下,看起来非常过瘾,一个偶然的机会,在父亲的朋友家看了电视上播出的《铁血战士》。这部影片给我留下很深的印象,一方面是神秘的丛林,另一方面是影片中掌握着高科技的外星人。譬如说,他有一个很酷的带在手腕上能显示当前心率的个人电脑。还有就是他可以切换到红外线模式,看到人类无法看到的红外线。这样的功能在夜战中占尽便宜。当年最后州长大人凭借主角光环发现了对手这一特性,用泥巴将自己包裹起来躲过搜查最终反杀之。最近发现市面上有一种红外阵列传感器:MLX90640 ,分辨率可以达到 32*24.于是尝试DIY一个简易的热成像仪。首先,主控选择  Teensy 3.2 ,原因是它性能远超 Arduino \,主频可以达到 120Mhz (Overclock状态),内存有 62KB。MLX90640对内存要求比较高,普通的 Arduino 无法胜任。之后,选择屏幕,从淘宝入手了 320*240 分辨率的SPI 接口的液晶屏。之后就可以动手制作了。 从整体上来说,完成制作需要三部分:第一步,获得传感器数据;第二步,处理数据(因为屏幕明显比传感器大,因此,需要将少量数据变换成大量数据,这里我使用的是双线性插值算法);第三步,将数据显示在屏幕上。下面就是每个步骤的做法。第一步:传感器数据的获得。MLX90640 有对应的 Arduino 库,这使得我们能够方便的获得红外数据。需要注意的是,取得的数据是从右上到左下排列的。<img src="//image.lceda.cn/pullimage/FemV5pDTaLt02MFrznCfJuYrVwGDD9lqbsUNFCtZ.jpeg" alt="image004.jpg"> 代码很简单:   for (byte x = 0 ; x < 2 ; x++){     uint16_t mlx90640Frame[834];     int status = MLX90640_GetFrameData(MLX90640_address\, mlx90640Frame);</p> <p>float vdd = MLX90640_GetVdd(mlx90640Frame, &mlx90640);     float Ta = MLX90640_GetTa(mlx90640Frame, &mlx90640);</p> <p>float tr = Ta - TA_SHIFT; //Reflected temperature based on the sensor ambient temperature     float emissivity = 0.95;</p> <p>MLX90640_CalculateTo(mlx90640Frame, &mlx90640, emissivity, tr, mlx90640To);   }</p> <p>第二步,处理数据。目标是将我们取得的 32X24的数据进行变换,以便显示在LCD上。实际数据比较少,要扩展得更大。这一个过程更通俗的解释就是“脑补”。比方说,即便下面的图片实际上非常模糊,但是看到的人还是会认出来这是著名的《蒙娜丽莎》。实际上当我们看到之后,大脑会进行一个处理,处理的结果就是识别出来这幅名画。 <img src="//image.lceda.cn/pullimage/HYz2lctLROBb6VYVXt1wzq6Fw63ZWWcWHsASZ7MM.jpeg" alt="image005.jpg"></p> <p>这里我选择双线性插值算法。这种算法是假设中间的点收到周围的点均匀的影响。用一维的例子来说明这个算法,比如,我们已知下面 A 点的值为 100,B点的值为200,那么如果中间有一个C点,我们可以推算出来 C 点的值应该是 150.</p> <p><img src="//image.lceda.cn/pullimage/HK7M7SkWFKg0uDLQPxsaV49hltDzCUkm3H1BJx1a.png" alt="image007.png">有了上面的经验,推广到二维世界,下面图片中,我们知道Q(X,Y) 四个点的取值,想推算出 P 的取值。可以先推算出R1 R2的取值 <img src="//image.lceda.cn/pullimage/BBQf3swFKCdEOJhmc7DU9GmopDErraNnDLyznjVH.jpeg" alt="image009.jpg"></p> <p><img src="//image.lceda.cn/pullimage/4d4gCjsKWNuliyZMOynFmFLL1wRpEeO0DzGbPPVW.jpeg" alt="image010.jpg"> <img src="//image.lceda.cn/pullimage/ZQ1gBcK5UAohxgxvrH8yNrctdLRX3ExX1L7xIZJM.jpeg" alt="image011.jpg"></p> <p>代码中使用同样的方法,将4个点插值为100个点,这样整体从 32x24=768个点变换为76800个点。这样的计算量对于 Teensy 来说并不是问题,可以在1ms 内处理完毕。第三步,数据的现实。代码使用Arduino 的 UcgLib来驱动屏幕。UcgLib 没有提供按照帧发送数据的函数(当然如果有的话,因为数据量的限制,我们也不可能在内存中存放一帧然后完整发送之)。所以,我使用 DrawPixel 这样的函数一个点一个点的在屏幕上绘制。这样就会牵扯到效率的问题需要进行优化。对此,使用了两个方法:1.绝对的提升 SPI 传输速度。Teensy 默认频率为 72Mh,超频到 120Mhz 之后,SPI 可以提升到 30Mhz,体现在代码中就是下面这个语句:  SPI.beginTransaction(SPISettings(30000000, MSBFIRST, SPI_MODE0));2.相对的减少绘制数据量。通过查看UcgLib 的代码可以看到,绘制每一个点时,都会发送位置信息这对于我们来说是不必要的开销。所谓显示,就是将必要的数据送到LCD显示内存中。因此,代码中使用混合的方式。先用 DrawPixel 绘制Y坐标上的第一个点,之后直接发送这一行上每一个点的颜色信息即可。从实验室数据来看,这样可以节省3/5的时间。此外,默认情况下库使用 18Bits 显示模式,每个点由三个Bytes来给出。实际上可以设置为 16Bits显示模式,这样每个点可以由2个Bytes给出。相应的屏幕颜色会大大减少,我经过试验显示效果不佳就放弃了。如果用户对速度有更高的要求,可以考虑使用这种模式。最终成品如下,我用亚克力制作了一个简单的外壳,下面是一个把柄,同时可以放置一个充电宝来为整体进行供电。 <img src="//image.lceda.cn/pullimage/Drw01KV5hAEOlLPwXzUNBj87yKqPTOlg177WvU7N.jpeg" alt="IMG_20190913_100342.jpg"></p> <p><img src="//image.lceda.cn/pullimage/oe2EpddFZh2ZkGqODmEbbgE7kloZE1dbL9eeSMJ5.jpeg" alt="IMG_20190913_095838.jpg"> <img src="//image.lceda.cn/pullimage/uxP6Sq0bu1yk2SHMVC4GBz4Jk1b1zYHgLlDVgjYa.jpeg" alt="IMG_20190914_081202.jpg"> <img src="//image.lceda.cn/pullimage/4c8XaSnSFSsr4lJ1CPH8U1LPd0B9EegqClgosv5T.jpeg" alt="IMG_20190914_081154.jpg"></p> <p>工作的视频在项目附件中,同样的之前的一个测试版本的可以在 <a href="https://zhuanlan.zhihu.com/p/76527719" target="_blank">https://zhuanlan.zhihu.com/p/76527719</a> 看到。</p>

文档

BOM

暂无

附件

附件名 下载
IrCam.zip
UcgLib.zip
热成像v1.0.rar
格式工厂未命名.mp4

评论(15)

  • 表情
    emoji
    小嘉工作篇
    小嘉日常篇
  • 图片
成功
工程所有者当前已关闭评论
立创电赛 回复
<p>很有意义的作品,创客圈需要这样的好作品被发掘。如果能给大家公开一下源码就好啦,顺便再写个教程给大家科普一下相关知识就更棒。</p>
立创电赛 回复
<p>你的作品好像没有看到原理图和相关PCB。建议你弄个简单的原理图便于讲述相关连线的关系。</p>
Zoologist 回复
<p>@LCDS 忘记贴了,晚上贴上来</p>
Zoologist 回复
<p>@LCDS 原理图和电路图已经上传文章中和附件上。</p>
立创电赛 回复
<p>温馨提示:距项目提交截止还有11天,记得完善作品上传哟!</p>
Zoologist 回复
<p>@LCDS  原理图 pcb 文件和说明都已经上传,还有视频,请帮忙看一下是否还缺少什么? 谢谢!</p>
立创电赛 回复
<p>恭喜您的项目获得第四届立创电子设计大赛参与奖,点击查看获奖名单:<a href="https://diy.szlcsc.com/posts/7b78bd99e53745588a4f2d81cc11af92" target="_blank">https://diy.szlcsc.com/posts/7b78bd99e53745588a4f2d81cc11af92</a></p>
158813a 回复
<p>这个刷新率是多少,感觉很低的样子</p>
Zoologist 回复
<p>忘记了,好像是比较低的(16Hz?),因为传感器是 I2C 接口的。</p>
zhmaoo 回复
<p><span class="colour" style="color:rgb(51,51,51);">您好!请问这个I2C使用的是哪个I2C的库?是Wire.h 还是 i2c_t3.h?因为我有个teensy4.0板子必须和其他传感器通过I2C通信,但程序始终无法编译,提示Wire未声明,如果可能,可否私信发我一下I2C部分的源码?zhmao2018@126.com叩谢!</span></p>
Zoologist 回复
<p>代码是开源的,IrCam.zip 就是完整的代码<br/>其中用的是:</p><br/><h1>include \</h1><br/><p>按道理 i2c 是比较简单的,你可以先跑一下 i2c scan 的代码看看</p><br/><p>如果扫不到,检查一下 i2c 的2个信号线是不是需要上拉。</p>
Zoologist 回复
<p>wire.h 这个库</p>
zhmaoo 回复
<p>刚看到,后来我又换了STM32所以没继续搞这个了,不过还是谢谢您!</p>
zhmaoo 回复
<p>您有没有遇到过,加了i2c相关语句编译上传后,电脑的串口就不识别teensy板子了?</p>
Zoologist 回复
<p>没有碰到啊,你跑 example 里面的 i2c 代码也有这样的问题吗?</p>
goToTop
svg-battery svg-battery-wifi svg-books svg-more svg-paste svg-pencil svg-plant svg-ruler svg-share svg-user svg-logo-cn svg-double-arrow