描述
<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>
评论(15)