基于 ESP8266 的微型复合 PC 控制器设计
起因
前几天终于是放了假,好好休息一番后,搞了一套 E3 平台玩,想着搞成服务器,又想在闲置时省点电。从开发板库里面找到了吃灰很久的 ESP8266 (WeMos D1 R1),就它了。
功能要求
- 能够控制 PC 的电源,包括长短按电源键,短按重置键,并读取电源状态
- 能够接收 COM 口的 syslog 数据并记录和读出
- 能够提供串口控制台功能
读取硬盘灯、蜂鸣器
要求 1 很容易实现,因为根据 Intel 的前面板 IO 设计文档并结合实际测试,可以知道按键都是 3v3 上拉输入,而电源灯是推挽 5V 输出。而 COM 口按照标准应该是 RS232 电平,但是我的主板(Z270-Dragon)没有引出来,用的是 COM_Debug 口正好是 TTL 电平。串口控制台最容易了,板子上的 CH340 直接接入 USB 就可以得到 ttyUSB 了。
至于4,原本打算搞的,但是硬盘灯是推挽 PWM 输出 5V,蜂鸣器更迷不知道是什么,猜测是开漏,ESP8266 的正常可用的 IO 就 5 个(别看引脚多,实际上上电有特殊状态/要求的很多),搞起来还得刮板加分压电路;加上硬盘灯不是刚需(正常用谁看啊),蜂鸣器要是响了那是低级硬件问题,远程也无法解决,不如不管。
硬件设计和接线
首先是供电的选择,我们的 IO 全部在机箱内部,所以直接怼 5VSB 就可以了;当然主板上哪里能找到 5VSB,就看具体的了,实在不行就从 ATX 接口那里引一根线好了!当然也必须把 USB 口的电给断开,不然短接 5V 和 5VSB 是有一点不好的。
然后是电源灯的电平问题,它是 5V 推挽输出,所以需要进行分压降压;在这块板子上,注意到 A0 接口有分压电路,ESP8266 只接收 1V 的电平,板子上原来设计的是 104 和 224 分压 3.3V 到 1V,我们直接改掉,用 202 和 123 分压 5V 即可。
魔改以下:

接下来就可以分配下 IO,
ESP8266 | Func |
---|---|
D0 D1 (3 1) | Serial Console |
TX1 (2) | Debug Logger |
SCK (14) | To PWR_BTN |
MISO (12) | To RST_BTN |
A0 (17) | From PWR_LED |
MOSI SS (13 15) | To COM_Debug |
另外,部分华硕主板的 COM_Debug 定义是这样的:
当然经过测试我这块主板就正好是了 :smile
警告
通常主板上的标准 COM 口是 RS232 规范的,这意味着它的电平和 TTL 电平不兼容。在该情况下,您还需要一个转换芯片。
软件设计
交互接口和命令
选定 23 端口作为串口转发,22 端口作为控制台。
电源控制命令前缀 # ,后缀 $ ,中间 R - 短接 RST,P - 长按 PWR_BTN,S - 短按PWR_BTN。
然后就是 L 列出所有日志文件,大于 0x80 的码作为日志读取 index。
D 开启/关闭 COM 实时转出,M 获取当前状态,V 获取版本信息。
串口转发
直接套用 WiFiToSerial 示例的工程,修改一下套个类封装即可。
因为 ESP8266 只有一个可以接收的串口,所以使用 swap 功能切换引脚,当串口端口连接时,切断日志并映射到 USB 串口上,其他时间则映射到 COM 上。
日志记录
基于 LittleFS 实现日志文件分块,3M 大小按 64K 分块,最多有 90 多个文件,为单字符命令读取作一点限制。由于 LittleFS 的掉电安全设计,必须定时进行 sync 才可以保证写入可见,我们也正好连同文件大小检测和删除旧文件一起做了。
WiFi 管理和配置
利用 WiFiManager 库,自动连 WiFi 和在失败时提供 Config Portal。
另外注册一个断连事件重启 ESP8266 即可。
后记
安装的时候发现,进入系统以后长按电源开关的时间要长点才可以强制关机。另外,全金属机箱内的信号太差了,需要更换安装位置,比如前面板缝隙。。。
源码见 仓库。