基于立创泰山派开发板与海康4117模块的简易热成像系统实战(含3.1寸MIPI屏驱动)
基于立创泰山派开发板与海康4117模块的简易热成像系统实战含3.1寸MIPI屏驱动最近在立创EDA社区看到泰山派开发板挺火的正好手头有个海康威视的4117热成像模块就琢磨着能不能把它们俩结合起来做个能实时显示温度图像的小设备。说干就干折腾了小一个月总算搞定了。这个项目从硬件设计到软件驱动踩了不少坑也学到了不少东西。今天我就把整个搭建过程特别是驱动那块3.1寸MIPI屏的详细步骤分享给大家希望能帮到也想玩转泰山派和复杂外设的朋友。整个项目可以分成三块一块是给泰山派扩展的3.1寸屏幕板一块是给海康4117模块做的固定背板和USB转接板最后就是最核心的软件驱动和系统编译。咱们一步步来看。1. 硬件设计与组装从屏幕到热成像模块1.1 3.1寸MIPI屏幕拓展板泰山派本身没有屏幕所以第一步就是给它加个“眼睛”。我设计了一块拓展板核心就是驱动一块3.1寸的MIPI接口液晶屏。这块板子有几个关键设计点背光驱动电路屏幕要亮背光很重要。我参考了泰山派开发板本身的背光方案用了一个专门的背光驱动芯片。同时为了能灵活控制背光亮度板上还设计了一个I2C-PWM电路。简单说就是通过I2C总线发送指令来控制一个PWM信号的占空比从而调节背光的明暗比直接给固定电压要高级和节能。背光来源选择板子上放了四个0欧姆的电阻位置设计得很巧妙。它们的作用是让你可以选择背光的供电来源比如是从拓展板自身电路取电还是从泰山派主板取电。这里有个超级重要的坑群里有朋友实测过这四个电阻绝对不能同时焊上否则会导致泰山派主板故障。所以焊接时一定要根据你的需要只焊接其中一路对应的电阻。音频接口最初的版本用了普通的音频座子后来发现不方便就改成了开口向上的座子插拔耳机和扬声器会更顺手。焊接与调试注意事项仔细检查丝印板子上有些位置标注了“NC”No Connect不连接这些位置的电阻千万不要焊。焊接质量是关键屏幕的FPC排线座子引脚很密焊接完成后一定要用放大镜或者手机微距模式好好检查杜绝虚焊和连锡。上电前必做用万用表的蜂鸣档仔细测量板子的电源比如3.3V、5V和地GND之间有没有短路。确认没问题再通电这是保护芯片的基本操作。排线方向连接屏幕和主板的两条排线注意它们的方向是一致的别插反了。我踩过的硬件坑背光升压二极管发烫最初选了个1A电流的二极管结果一上电就烫得不行。后来查资料才发现背光启动瞬间电流很大必须换成了3A的二极管才解决问题。座子选型错误第一次买的扬声器座子是卧式的不好用后来换成了开口朝上的立式座子。触摸座子焊接焊接时没对准有点歪。装进外壳后屏幕排线被顶到导致触摸功能时好时坏。返工重新焊正了才搞定。1.2 海康4117热成像模块的集成热成像模块用的是海康威视的TB-4117-3/S。它本身是个独立的模块我们需要把它“嫁接”到泰山派上。我做了两个小配件固定背板就是一个简单的结构件用螺丝把4117模块固定在上面。背板上有一个40PIN的母座但这个座子没有实际的电气连接纯粹是为了让模块插上去更稳固防止晃动。螺丝用的是常见的M2*6规格。USB转接板这是功能核心。4117模块有自己的接口不是标准USB这块转接板的作用就是把它的信号线转换成标准的USB Type-A公头。这样我们就可以像插U盘一样直接把热成像模块插到泰山派的USB口上了。这样做的好处是软件上它会被识别为一个普通的USB摄像头兼容性非常好后面直接用现成的APP就能出图。这部分遇到的问题背板开孔偏差设计时尺寸算得有点误差导致有一颗螺丝死活拧不进去最后只好放弃那颗螺丝用其他三颗固定也算牢固。外观不够紧凑USB转接板加上自制的连接线整体凸出来一块看起来不够美观。这是后续可以优化的地方。2. 软件环境搭建与系统编译绕不开的“坑”硬件组装好只是第一步让系统跑起来才是重头戏。对于嵌入式Linux开发搭建编译环境是第一个拦路虎。2.1 虚拟机环境选择官方教程用的是VirtualBox虚拟机。我跟着操作安装系统挺顺利但卡在了虚拟机与主机共享文件夹这一步。折腾了一个多小时没搞定最后在群里求助经过工程师远程帮忙才发现是我自己设置共享文件夹路径时目录层级搞错了多嵌套了两层。所以跟着教程操作时一定要对每一步的路径保持敏感。后来因为VirtualBox用起来有些小毛病性能也一般我换成了Windows下的WSLWindows Subsystem for Linux。但这又带来了新问题教程基于Ubuntu 18.04而我装的WSL是Ubuntu 22.04。两个系统版本差异导致编译时一堆依赖库版本冲突的报错。我的解决方案是与其在22.04上折腾降级不如直接装一个Ubuntu 18.04的虚拟机。虽然又花了不少时间安装和配置但终于绕开了版本依赖的坑成功编译了系统。当然更优雅的解法是使用Docker容器它可以完美隔离环境后来我也在22.04的主机上用Docker编译成功了这是后话。提示对于嵌入式Linux编译强烈建议使用与教程一致的Ubuntu发行版和版本号比如18.04或者使用Docker。这能避免90%的环境问题。2.2 Linux基础与“打补丁”在驱动开发中经常需要修改内核源码。社区大佬们通常会提供“补丁”文件.patch用一行命令就能把修改应用到你的源码上。这次我就遇到了打补丁失败的问题。当时群里大佬提供了3.1寸屏的驱动补丁但我执行git apply命令时总是报错。反复尝试甚至删掉源码重新拉取了好几次都无济于事。最后没办法我只好手动对比补丁文件和源码找到要修改的地方手动复制、粘贴代码一个个文件去改。这个过程虽然繁琐但让我对驱动代码的修改位置有了更深的印象。事后分析可能是我本地的源码版本和大佬的产生补丁时的版本有细微差别导致无法自动合并。3. 核心驱动开发点亮屏幕与触摸3.1 理解设备树Device Tree在接触驱动之前先得搞明白设备树是什么。你可以把它理解成嵌入式Linux系统的“硬件描述文件”或者“结构化配置清单”。以前硬件信息都硬编码在内核源码里换块板子就要改一堆代码。现在有了设备树我们把CPU、内存、外设比如屏幕、USB、I2C的连接方式、参数等都写在一个.dts文件里。内核启动时读取这个文件就知道当前板子上挂了什么设备、该怎么初始化它们。对于咱们这个项目要驱动MIPI屏幕和触摸芯片主要工作就是在设备树里添加正确的节点和配置参数。3.2 MIPI屏幕驱动一直听说MIPI屏很难点亮但实际做下来感觉流程是清晰的关键在于细心。核心步骤就两步获取屏幕规格书从屏幕厂商或卖家那里拿到屏幕的Datasheet里面会详细规定初始化序列一长串寄存器命令、时序参数像时钟频率、 porch、 sync等。编写设备树节点在泰山派对应的设备树文件比如ts-audio.dts里找到显示控制器Display Controller可能是DSI或DPI主机的节点在里面添加一个panel子节点。然后把从规格书上查到的初始化命令序列、时序参数严格按照Linux内核设备树的格式翻译并填写进去。dsi { status okay; // ... 其他dsi控制器配置 ... panel: panel0 { compatible your_panel_vendor,your_panel_model; // 屏幕厂商和型号 reg 0; // 背光控制引脚引用 backlight backlight; // 屏幕物理尺寸毫米 width-mm 70; height-mm 51; // MIPI-DSI相关配置 dsi,flags (MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST); dsi,format MIPI_DSI_FMT_RGB888; // 像素格式 dsi,lanes 4; // 使用的数据通道数 // 屏幕时序参数来自规格书 panel-init-sequence [ // 这里是一长串16进制的初始化命令 // 例如05 78 01 11 表示延时120ms然后发送0x11命令 05 78 01 11 05 32 01 29 // ... 更多命令 ... ]; display-timings { native-mode timing0; timing0: timing0 { // 详细时序像素时钟、分辨率、前后沿、同步脉冲宽度等 clock-frequency 71000000; // 70.1 MHz hactive 800; // 水平有效像素 vactive 480; // 垂直有效像素 hfront-porch 40; hback-porch 40; hsync-len 48; vfront-porch 13; vback-porch 29; vsync-len 3; hsync-active 0; vsync-active 0; de-active 1; pixelclk-active 0; }; }; }; };上面是一个示例框架你需要把your_panel_vendor,your_panel_model、panel-init-sequence和display-timings里的具体数值替换成你屏幕规格书上的真实数据。填对了编译系统、更新到板子上屏幕基本就能亮了。3.3 触摸驱动调试我用的这块屏是电容触摸芯片通过I2C总线通信。和普通I2C设备比如温湿度传感器相比触摸芯片多了一个INT中断引脚。这个引脚是干嘛的呢普通I2C设备需要主控泰山派不停地去问轮询“你有新数据吗”。对于触摸这种需要实时响应的操作轮询效率低会有延迟感。而INT引脚就是触摸芯片主动“拍一下”主控的肩膀说“嘿我这里有触摸事件了快来读数据”。主控收到这个中断信号才去通过I2C读取具体的触摸坐标。这样响应更快操作更跟手。为了验证触摸芯片的通信是否正常我用了树莓派PICO模拟了一个简易的逻辑分析仪去抓取触摸芯片INT引脚和I2C总线SCL SDA上的波形。通过分析波形可以确认中断信号是否产生、I2C通信时序是否正确这对于驱动调试非常有帮助。驱动触摸同样是在设备树里添加对应的I2C设备节点并配置好中断引脚。4. 系统集成与效果展示当屏幕和触摸都驱动起来后剩下的就是应用层的工作了。对于热成像显示我直接使用了网上流传的一个名为UHikCamera的应用程序。这个APP就是针对海康这类USB热成像模块开发的。把编译好的APP放到泰山派的文件系统里并设置成开机自启动。这样整个系统上电后流程是这样的泰山派启动Linux内核。内核读取设备树初始化MIPI显示控制器和触摸芯片。系统启动完毕自动运行UHikCamera应用。应用打开/dev/videoX热成像模块被识别成的USB摄像头设备开始捕获热成像数据流。应用将温度数据转换成彩色图像通过FrameBuffer显示在3.1寸的MIPI屏幕上。一个低成本、可实时显示的简易热成像仪就诞生了你可以拿着它观察散热器温度、检查门窗气密性甚至看看家里的宠物躺在哪里非常有趣。整个项目做下来最大的感受是嵌入式Linux开发就像搭积木硬件设计、内核驱动、应用软件环环相扣。其中设备树的配置是连接硬件和驱动软件的桥梁把这部分理解透了很多外设驱动就通了。希望我的这些经验和踩过的坑能让你在玩转泰山派和类似项目时少走些弯路。