描述
<h2>1.项目功能介绍</h2>
<p>本项目实现了一个可以实时监控电脑状态的硬件设备。它拥有一块4.3寸的LCD彩色显示屏,可以实时监视CPU、内存、硬盘、显卡的实时状态,方便掌握电脑主要硬件的负载。既适合游戏玩家了解系统的瓶颈所在,也适合用来观察是否有非法的后台程序在长期占用电脑的资源(比如挖矿类木马程序)。</p>
<p>同时,本项目也适合作为机箱美化的副屏使用。本项目使用的是上位机配合串口通讯的解决方案,仅需一根TYPE-C连接线就能工作,对比市场上现有的HDMI接口的小型显示屏+AID64之类的系统监控软件的解决方案,本项目拥有成本低廉,系统资源占用小,方便灵活的优点。市场上的HDMI方案虽然通用性强,但是作为副屏时一方面会浪费一个HDMI接口加一个用于供电的USB接口,另一方面还会加大显卡的压力,浪费系统性能。</p>
<p>最后,因为整个系统的性能冗余比较充足,所以在开发者手中,本项目也可以作为一款开源的嵌入式GUI开发平台来使用。</p>
<p><strong>本项目硬件部分100%使用立创EDA进行设计。</strong></p>
<p><strong>因为本项目软件、硬件完全开源,可以随意浏览、下载本项目资源,或在此基础上进行二次开发。但是禁止商用</strong></p>
<p><img src="//image.lceda.cn/pullimage/WzOp2JOmfqisCo3PT8ehdaC3jcdb4mK1g9Gkj31d.png" alt="image.png"></p>
<h2>2.项目属性</h2>
<p>本项目为首次公开,为本人原创项目。项目未曾在别的比赛中获奖。</p>
<h2>3.开源协议</h2>
<p>本项目完全开源,包括PC端的上位机代码和MCU端的代码。使用GPL3.0协议分发。禁止商用。</p>
<h2>4.硬件部分</h2>
<h3>显示系统</h3>
<p>首先是面子问题。出于实用性,我们需要尽量在一个屏幕上显示更多的内容,所有我们不能使用过于小型的屏幕。但是屏幕太大也不好,太大的屏幕一方面会增加DIY的难度,提高整个系统的制作成本(屏幕的费用,PCB打样的费用,控制系统的费用等等),另一方面,也会造成桌面空间的浪费,做为机箱副屏使用时也会降低对机箱的兼容性。经过综合考虑,我选择了通用的4.3寸分辨率为480x272的LCD显示屏,面板材质为TN,硬件接口为RGB:</p>
<p><img src="//image.lceda.cn/pullimage/DD5W2mYaCF8ebyYAAnqM9h2lHCo0vUKqjGoDvJNS.png" alt="image.png"></p>
<p>此类显示屏是事实上的商业显示屏标准,在市场上很容易买到,价格也十分低廉。甚至可以从各种报废的设备中拆解得到(如各种媒体播放器设备)。</p>
<p>480x272的分辨率虽然不高,但是在本系统中已经够用。4.3寸的大小,使得驱动板打样的费用非常便宜,同时在保证显示足够内容的基础上不会显得太大或者太小。</p>
<p>由于此类显示屏使用的是恒流背光系统,所以我们需要一个恒流的背光驱动电路。在此,我选择了PT4103这款LED恒流驱动IC。PT4103是一款升压型的LED恒流驱动IC,拥有开路保护的功能,同时支持PWM调光,而且在3.3V的系统中即可正常工作,可以完全满足本项目的需求。</p>
<p>关于驱动电流的选择,我并没有按照屏幕数据表上的设定使其工作在20mA,而是设定为10mA,这可以保护背光,同时减小整个系统的功耗。经过测试,10mA和20mA的背光亮度区别并不大。但是如果你在自己制作时使用了IPS屏幕,则应该使用标准的20mA驱动电流。</p>
<p><img src="//image.lceda.cn/pullimage/Wmf7G9NFIsjv5MSp4juGOiwwD1O5v6m6VbNAZjbj.png" alt="image.png"></p>
<h3>控制系统</h3>
<p>由于屏幕使用的是RGB接口,而且对于嵌入式系统而言,这个屏幕的分辨率已经不低了。所以为了驱动这块儿屏幕的同时保证整个UI系统的流畅性,我们需要一款性能较高的MCU。由于本项目立项时,全世界的范围内正处于“缺芯”状态,各种型号的MCU不是没货就是价格大涨。经过综合的权衡后,这里选择了STM32F746ZG这款MCU作为整个控制系统的核心。此MCU带有LTDC控制器,可以非常方便的驱动RGB接口的显示屏。同时该MCU还带有DMA2D加速器,可以对UI系统的绘制提供加速,保证界面的流畅性。另外,由于该MCU相对比较冷门,所以价格还算可以接受。</p>
<p><img src="//image.lceda.cn/pullimage/TG9W9AQcjzxI00VIj6ILVzjCXi6sOiwkUPJZWy0A.png" alt="image.png"></p>
<p>由于F746ZG的定位是经济型MCU,所以内部的SRAM无法满足屏幕的显存需求,所以这里还添加了一颗型号为W9825G6KH的SDRAM作为系统显存使用。实际制作时,任何容量在8M以上,速度在108MHz以上的SDRAM都可以满足需求。</p>
<p><img src="//image.lceda.cn/pullimage/ak6GSRydyCpaVpGif81YEKdexGOcT0z44AcnQXj5.png" alt="image.png"></p>
<p>本项目使用MCU的内置Flash即可满足所以代码+资源文件的存储,但是为了后期的功能扩展,额外预留了NOR Flash的扩展电路。如果不需要进行高级功能的开发,此部分可以省略:</p>
<p><img src="//image.lceda.cn/pullimage/FbX4BDuuc7MQVerVNwsfftkoRawh6acU3gjXo6HD.png" alt="image.png"></p>
<h3>通讯系统</h3>
<p>为了与上位机通讯,我们需要一款USBUART桥接芯片,在这里,使用经典的CH340E接口芯片即可,便宜稳定性能好。电路中额外设计了一颗RGB灯,可以用来指示通讯状态</p>
<p><img src="//image.lceda.cn/pullimage/PeK0v31WYA42llxwUvvC9SUFxuG0aNHQIVt07f0k.png" alt="image.png"></p>
<p>相关电路(为了防止意外的短路或者过载情况,还设计了有一颗自恢复保险丝)</p>
<p><img src="//image.lceda.cn/pullimage/5mG7CAbDsPnWsUrbrLkcwAK4ygCPfFXKyTaRSZEl.png" alt="image.png"></p>
<h3>供电系统</h3>
<p>整个系统的功耗并不大,所以使用经典的LDO:AMS1117即可满足需求:</p>
<p><img src="//image.lceda.cn/pullimage/NB0CIU6bbrkWGdgi9EF5tpoMxK7Okd8FcdoqNhBd.png" alt="image.png"></p>
<h3>外围/IO系统</h3>
<p>本系统设计了4个轻触按键用来提供对整个系统的控制,四个按键均为通用,功能由所在的UI界面决定:</p>
<p><img src="//image.lceda.cn/pullimage/24sFIAsBJum2R39Xo9pfjACGG8O5Uj3aogCGOGHS.png" alt="image.png"></p>
<p>RTC晶振和后备电池的设计,保证了电脑在关机的情况下,本设备也可以作为一款桌面时钟使用:</p>
<p><img src="//image.lceda.cn/pullimage/AwpO5xV8HxdtyygjLjxMk48yMUeJq3jr7PybjM7L.png" alt="image.png"></p>
<p>在早期的设想中,考虑到了高温和高系统占用率下的蜂鸣器报警功能,实际使用中发现,此功能过于鸡肋(且烦人),所以在最终代码中去掉了该功能。但是考虑到未来可能的功能开发,所以相关电路在硬件设计上依然保留:</p>
<p><img src="//image.lceda.cn/pullimage/Zu7MIE17CyCJhEPuTxjgyGcRLAqdtrWWnsr31lnE.png" alt="image.png"></p>
<h3>PCB设计</h3>
<p>为了节省成本,本项目为双层PCB设计,如果你在实际制作时有更多的预算,推荐使用4层板,并且对SDRAM部分走线进行等长处理。</p>
<p><strong>顶层(背面)</strong></p>
<p><img src="//image.lceda.cn/pullimage/Ee0BoURXBvP7yOYF68K6xZdxl8ZWVAWjo08i9Ne9.png" alt="image.png"></p>
<p><strong>底层(正面)</strong></p>
<p><img src="//image.lceda.cn/pullimage/qeDH14cNJg7xvs0ArrQYU8dEufaJKtKmVJKdDGsI.png" alt="image.png"></p>
<p><strong>3D模拟图</strong></p>
<p><img src="//image.lceda.cn/pullimage/t1qX9YaU0etuRxoJae1m0yzUTnr9nJkBdF4VM5wT.png" alt="image.png"></p>
<p><strong>各部分说明</strong></p>
<p><img src="//image.lceda.cn/pullimage/4uFzpHoGYUsIOuzRcfUZN7iWAMr8a0nLkU4fWzfR.png" alt="image.png"></p>
<h2>5.软件部分</h2>
<h3>MCU端软件开发</h3>
<p>本项目使用ST官方推出的免费IDE:STM32CubeIDE配合STM32 HAL库来开发。开发语言为C语言。编译器为IDE自带的GCC编译器。</p>
<p><img src="//image.lceda.cn/pullimage/UkjFJsyd58iXzIUXCfE5V26oNIlMPc8497pJDeeY.png" alt="image.png"></p>
<p>相较于Keil,CubeIDE的代码编辑器更为友好,与STM32的配合也更加流畅。</p>
<p>因为本项目牵扯到了与上位机的通讯,所以为了方便开发,使用了开源的FreeRTOS系统框架。系统中设计了UI主线程、通讯线程、按键扫描线程和蜂鸣器控制线程(已废弃,仅为兼容性保留)共四个线程协同完成功能,线程具体信息如下</p>
<p><img src="//image.lceda.cn/pullimage/XmBURxPU1ew2GCTFQblvmaRjQJSHNOLLFVaPfliT.png" alt="image.png"></p>
<p>UI系统作为下位机开发终点,使用的是开源的LVGL库来实现:</p>
<p><img src="//image.lceda.cn/pullimage/4ON8qfZ0NlFFtVcc21TgGjeMNG9DfKwbf54CsslM.png" alt="image.png"></p>
<p>LVGL是一个强大的嵌入式UI框架,可以在内存不超过1M的嵌入式系统中提供可以媲美手机等高性能移动设备的UI显示体验。</p>
<p>在本项目中,UI系统的结构如下:</p>
<p><img src="//image.lceda.cn/pullimage/yN1J72RCcuknVPF9UVvTxR7fLqtetyVPUNC8meLy.png" alt="image.png"></p>
<p>其中待机界面为系统上电,但未与PC上位机连接时显示的界面,此时显示内容为时钟。因为大部分的PC主板都可以设计为关机时继续为USB提供电力,所以此功能使得关机后,本设备依然可以作为一个时钟来使用。第一次上电并建立通讯后,会自动从待机界面跳转至概览界面。但是在任何其他界面断开连接进入待机界面后,再次恢复连接时,会自动回到断开连接之前显示的界面。</p>
<p>此界面的壁纸可以在代码中替换。</p>
<p><img src="//image.lceda.cn/pullimage/liN6qyjzB3I8LFksbE7iPMZylHnXSWIKsImSxJIb.png" alt="image.png"></p>
<p>在与上位机成功建立通讯后,系统会自动跳转至概览界面,在此界面下,可以用图标的形式同时查看CPU、内存、硬盘和GPU的主要状态,如CPU/内存占用率,硬盘的活动时间比例等。除了待机界面外的所有界面顶端都有一个状态栏。状态栏除了显示对应四个按钮在当前界面下的功能外,还提供了系统时间显示功能(这在运行全屏程序比如游戏时是很有用的)。</p>
<p><img src="//image.lceda.cn/pullimage/UJIdCyi1WlzMVBWFsRJxujZeFa8IixB2UBxUn9Gu.png" alt="image.png"></p>
<p>在此界面下,可以选择对应的图表进入详情查看界面,显示关于此硬件更多,更加详细的数据。此处显示了CPU的名称,300秒内的使用率,速度和温度:</p>
<p><img src="//image.lceda.cn/pullimage/zWK86A0rTzceGtcfQ7kDOhtXtTrMXohN6WOQKyqw.png" alt="image.png"></p>
<p>在概览界面下,也可以进入设置界面,设置屏幕的亮度:</p>
<p><img src="//image.lceda.cn/pullimage/d4z7eT4DRXY4VRbS01HSPbVLVlgNcVYl3FaGjXAm.png" alt="image.png"></p>
<h3>PC端上位机部分</h3>
<p>PC端上位机部分是整个系统的开发最大的难点,因为需要获取硬件的状态并传输至设备端,而读取硬件的信息已经属于比较底层的部分了,操作系统的库中并未显式提供各项操作的API。我并没有类似的开发经验,所以刚开始的时候一筹莫展。在尝试了驱动法、WMI查询法之后,偶然发现了开源的OpenHardwareMonitor项目,这个项目提供了一套方便的,可以访问底层硬件驱动信息的API框架,并且提供了一个示例WinForm程序,这使得开发的难度大幅度下降。</p>
<p>最终,本项目上位机部分使用C#开发,使用OpenHardwareMonitor项目作为底层驱动框架。因为上位机不需要太多的功能,所以在UI框架的选择上放弃了WPF而是使用了经典WinForm框架以最大成都减小系统消耗,加快启动速度,并防止出现监控软件自己占用了太多系统资源的情况。</p>
<p>开发环境使用的是经典的Visual Studio 2019社区版,开发Win上的程序没有比这个更合适的了。</p>
<p><img src="//image.lceda.cn/pullimage/FeLTH1k4DtJC8YJVVzpTMxOtwbml2kbDVeQRteyc.png" alt="image.png"></p>
<p>上位机的界面很简单,通过选择设备所在的串口,点击开始服务/停止服务即可。这个界面可以完全隐藏到系统后台中,仅在系统栏中展示。</p>
<p><img src="//image.lceda.cn/pullimage/Nrik95TUq8WO4KyVrabxKFPvudgCK9O83mmSZIov.png" alt="image.png"></p>
<p>由任务管理器可以看到,最终的软件运行消耗是非常小的:</p>
<p><img src="//image.lceda.cn/pullimage/U1dpTn1ydOHMlDPcGXjBF1wA61HL9lddffTxiVW3.png" alt="image.png"></p>
<p><strong>需要注意的是,因为需要访问底层驱动,所以PC端服务的运行需要管理员权限。</strong></p>
<h2>6.BOM清单</h2>
<p><img src="//image.lceda.cn/pullimage/CR6NuKLcaoTXS8feeTFoT6Qr1EwS5JwhGb69abNV.png" alt="image.png"></p>
<h2>7.大赛LOGO验证</h2>
<h3>空板</h3>
<p><img src="//image.lceda.cn/pullimage/Nhr7oARwfH9IFNvmd9GQpnTV6lUQAXXOw2KVqE15.png" alt="image.png"></p>
<h3>焊接成品</h3>
<p><img src="//image.lceda.cn/pullimage/5X2pmG4ycvYo1bOaxUiNajvX5UiXg1ACtC2rQwLy.png" alt="image.png"></p>
<h3>更多图片</h3>
<p><img src="//image.lceda.cn/pullimage/L1wvz8HnLfVPfELXFZzIuaKcew9VJ2IJ66qwjoq7.png" alt="image.png"></p>
<p><img src="//image.lceda.cn/pullimage/ySYRJYaT9qDXAlhQNrxqv5as5c4LB07Uv9d3EAjd.png" alt="image.png"></p>
<h2>其他链接</h2>
<p><a href="https://www.freertos.org/" target="_blank">FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions</a><br>
<br>
<br>
<a href="https://lvgl.io/" target="_blank">LVGL - Light and Versatile Embedded Graphics Library</a><br>
<br>
<br>
<a href="https://github.com/openhardwaremonitor" target="_blank">Open Hardware Monitor (github.com)</a></p>
评论(16)