事情还得从日常逛咸鱼捡垃圾开始说起,我无意间刷到了一个颜值非常高的小主机,由于主播从来没有玩儿过小主机,但是对这个小主机却一见种情 -- 零刻GK55 海外版(也是事后才知道的beelink 是海外版。。。)

弹完价格后以479元子拿下,在等待小主机到手期间,顺便了解到飞牛NAS 系统,遂决定组装一个飞牛家庭NAS,不出意外,我的小主机如期而至。在我拿到的第一天就发现,这个小主机散热器噪音异常的大,主播的小卧室比较窄,所以晚上睡觉时噪音非常之大,于是进bios 竟然没有发现风扇调速配置。。。
我不信邪,打开了它的外壳,发现原本应该有温控芯片的地方留了一个空焊盘。。。主播不是专业学电子的,也不知道该怎么补没有安装的电子元件,但是主播是一个半专业的后端开发,于是一个奇怪的想法就出现在了主播的脑海里。

由于主播长时间在网上冲浪,知道一个叫树莓派的神奇小玩意可以做很多事情,于是就在想我能不能写一个虚拟的风扇在系统里,然后通过树莓派去实现对应的功能呢?
于是架构图如下:

查阅资料后发现,飞牛其实是根据debian 开发的,也就是说我完全可以用c去实现一个hwmon 虚拟的风扇设备,说干就干,由于主播从来没有干过内核开发,但难不倒GPT 啊,在我跟GPT 不懈努力下合力(GPT 才是主力)做出了V1版本的C虚拟风扇内核驱动。
此时驱动可以通过简单的echo 指令进行测试
echo 128 | sudo tee /sys/class/hwmon/hwmon4/pwm1 && cat /sys/class/hwmon/hwmon4/fan1_input
但是没有办法实体测试怎么办,于是又查阅资料,最后发现我好像需要正儿八经学一下单片机,于是连夜淘宝下单了新手入门面包板套装以及用于风扇控制的PI pico 树莓派,花费53元子

于是第一个小灯点亮了(当时太激动,忘记拍照纪念,以下为拆散的尸体)

接下来就是编写pico 控制风扇的逻辑了,由于c主播不擅长,于是选择了pico 支持的micro python,这部分比较简单,定义15,14脚干啥活儿,同时控制输出就ok(相关代码大部分均交给了GPT实现)

v1版本的pico 代码就完成啦,通过pycharm 社区版+ microPython 插件,可以很方便的把代码传到pico 上

对了pico 第一次运行需要按住pico 上的boot 按钮,插入电脑USB 口后会有一个文件夹出来,把官网下载的microPython 驱动丢进去就可以让pico 支持micro python啦,这里保留一份驱动文件下载:
https://github.com/tokyohost/virtualFunGo/blob/master/RPI_PICO-20251209-v1.27.0.uf2
运行代码之后可以在控制台 REPL 看到pico 此时输出的内容,主播选择了JSON 格式传输数据,方便解析,duty 为当前风扇的转速百分比,rpm 为风扇当前的实际转速。
那pico 怎么接线呢,主播购买的pico 是没有焊针脚的,所以主播后续自己焊了14,15,GND 三个针脚,针脚也很好找,pico 背面就有针脚的标注

pico 准备好了,但是没办法与写的C内核做关联呢,于是主播拿Go 写了个桥接服务,这个桥接服务干的活儿比较简单,扫描hwmon 设备中有没有主播自己注册的虚拟风扇,通过读取虚拟风扇的pwm1 文件和写入fan1_input 文件实现将USB 口pico 发过来的数据写入到文件中,并同步风扇的速度到Pico,实现对风扇的控制(实际稍微复杂点大家有兴趣可以参考以下代码,代码在文末大家自取哇)
ok 准备工作全部完成,现在将小主机全部拆开找到风扇

主播的小主机是一个暴力涡轮风扇,最高转速能到一万多,拔下风扇的插口,小风扇的插口是四线pwm 风扇如果大家的小主机风扇不是四线的可以重新淘宝买一个四线风扇换上去。

把黄色PWM 线和蓝色的测速线从座子上拆出来,接上导线


由于主播没有好的胶带临时用透明胶带代替了一下,后续主播买的更小的pico 尺寸准备换上去完全藏在主机里面所以这里简单处理了一下
蓝色线接Pico 的15脚,黄色线接Pico 的14脚,主播学到了一点皮毛pico 的GND 该怎么接呢,此时主播灵光一闪,主板周围的螺丝孔不就是GND 么,于是主波找了根导线绕了螺丝一圈,这样螺丝在主板上拧紧时自然就接上了GND

一系列操作之后,安装上去后试试看fancontrol 能不能识别吧~(后续主播对驱动进行了升级,支持了三个虚拟风扇,但是连一个的话就只能控制一个)
连上ssh后运行主播写的内核驱动的安装脚本
curl -fsSL https://raw.githubusercontent.com/tokyohost/virtual_fun_kernel/master/install.sh | sudo bash
Go 桥接服务的一键安装脚本:
curl -fsSL https://raw.githubusercontent.com/tokyohost/virtualFunGo/master/install.sh
重启后执行命令如果能看到输出
lsmod | grep virtual_fan 
就表示成功啦。
检查go 桥接服务的安装状态:
systemctl status pico-fan-bridge 
Active 就表示成功啦
现在把usb 插到主机上,并打开飞牛安装的fancontrol:


可以看见成功识别到了三个虚拟风扇(碍于篇幅主播给驱动做了DKMS等等工作,确保重启后也能正常工作,此处就不赘述啦)
手动控制一下风扇转速看看效果如何

测试完美通过,后续可以通过fancontrol 实现更加精准的温控,现在主播用来测试的pico 尺寸太大啦,等后续主播买的更小尺寸的pico 回来再完全藏进主机内完美实现温控效果~终于能睡个安静的觉啦
linux 内核驱动代码仓库:
https://github.com/tokyohost/virtual_fun_kernel
go 桥接代码仓库
https://github.com/tokyohost/virtualFunGo
pico 代码仓库
https://github.com/tokyohost/virtual_funPico