跟着思兼学习Klipper(23) 玩一玩必趣 BTT Pi 上位机
前言
本文感谢必趣 (BigtreeTech) 赞助的 BTT Pi 上位机。此款设备很早之前就开始接触了,目前淘宝上是最新的v1.2版。
<img src="https://www.klipper3d.org/img/sponsors/BTT_BTT.png" style="zoom: 25%;" />
原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎指正交流。
文章如有更新请访问 DFRobot 社区 或者 cnblogs 博客园。
欢迎对 Klipper 固件,以及对改版 CNC 加工的 Voron 三叉戟、v0、v2.4 感兴趣的朋友加群交流(QQ Group:490111638)。
我们约定:上位机
——运行Klipper系统的设备,主板
——3D打印机主板,工具板
——热端工具板。
BTT Pi 相当于原来的 CB1 + Pi4B底板 + 散热片
,价格更便宜(178 Vs 236元)。当然 CB1 模块也是非常有意义的产品,相比于 Banana Pi BPI-CM4 和 Radxa CM3 价格要便宜不少,同样支持各种 树莓派 CM4 计算模块的底板。以前觉得香橙派是价格屠夫,现在传统 3D 打印机主板厂商也能出来搅一搅。同时 BTT Pi 拥有后发优势。
本文介绍如下内容:
- BTT Pi 硬件介绍与横向对比
- RatOS 介绍
- 另一种方式将手机作为 KlipperScreen 屏幕使用的方法(NoMachine)
- 使用网盘拓展上位机存储空间(Alist + Rclone)
- 使用红外遥控器控制打印机(灯光、通断电、关闭系统等)
0、文档资料
BTT Pi 软件系统上沿用 CB1 的资源。所以部分资料互通,可供参考。注意两者部分引脚顺序不同:
-
CNX-Software 关于 BTT Pi 的介绍
-
还有一些 UP 主的开箱,这里呼吁不要云评测,你又不是没有实物,实测后再说结论,尊重自己尊重别人。
-
除了必趣官方提供的系统,RatOS 目前也支持 CB1 了,这位作者是个大牛,RatOS 非常值得学习。
-
当然 BTT Pi 并不是开发板,所以给的资料也不多,将将堪用。
1、外观规格对比
目前 3 大主板厂商都有了自己的上位机,我们大概对比一下:
- 加黑的为我认为 Klipper 上位机比较看重的部分
以前觉得 MKS Pi 带屏幕套餐性价比高,但是对比以及使用过 MKS Skipr 后发现其软硬件提升空间很大。BTT Pi 板载 WiFi 好评,少占用一个 USB 接口,另外178的价格真不是故意的吗 xD。
2、硬件规格、部分芯片及备注
-
SoC – CPU: Allwinner H616 四核 A53 @ 1.5GHz 处理器,GPU: Mali G31 MP2 支持 OpenGL ES 3.2
-
系统内存 – 1GB DDR3L
-
存储 – MicroSD 卡槽,未来支持 eMMC 板载存储模块(有相关 dtb 文件)
-
视频输出
- Micro HDMI 2.0a 接口,支持 4K@60fps 输出
- 支持专有 SPI 屏幕( FPC 接口)
-
音频输出 – 3.5mm 音频接口
-
网络 – 10/100 Mbps 有线网口 和 2.4 GHz 无线模块,注意必须要连接外置天线使用
-
USB – 4个 USB 2.0 接口, 1个 USB Type-C (用于供电和串口调试)
-
CANbus – 用于 CANBus 通讯(G/H/L),需要搭配 U2C 模块使用
-
拓展接口
- 40-pin GPIO(兼容树莓派)
- ADXL345 加速度计接口 (SPI)
- 板载 红外接收器(IR)
- 5v 2线可控风扇接口
-
供电接口
- 5V TypeC 接口(注意电流不够时可能会不稳定)
- 端子座供电(支持12-24v)
-
外观尺寸 – 85 x 56 mm,安装孔与树莓派一致
2.1 硬件杂谈
- CPU:这三家的CPU性能相近,都是足够Klipper使用了。如果 RK3399 未来降价也是个不错的选择,RK3588 价格太贵就算了,0.05s 和 0.01s 感受不出来的。
- GPU:H616 发布时间比较晚,搭载的 G31 图形性能相比 Mali-450 高些,支持高分辨率输出(2k、4k等),不过我对街机系统无感,所以不做对比测试了,当然还有一点就是主线内核一般对 GPU 的硬件加速支持不够好,很多需要用到 Legacy Kernel,搭配厂商提供的驱动。
【Arm Mali 图像处理器性能天梯】可见 H616 使用的 G31 性能强于 其他两者使用的 Mali-450,来源:ARM GPU mali系列产品规划图或天梯图。G31 支持HDMI 2.0a up to 4K @ 60Hz,Mali450-MP4 支持到 HDMI 1.4。
-
虽然三者都支持 SPI 屏,其优势是便宜,但是现在想开了,要不用 12864 状态屏,要不就用个分辨率高色彩显示更好的 HDMI 屏,然后显示点花里胡哨的东西,默认的 KlipperScreen 打印中界面没啥用。
-
3.5mm 音频接口,可以接扬声器做语音播报,但是用耳机测试时输出有问题,可能我的耳机线序不对,有空测试下。
-
有线网络接口:BTT Pi 后期使用 H616 内置有线网控制器,所以板子上省了一个芯片。
-
无线网卡:采用量大便宜的 rtl8189,新版驱动稳定性还不错。至于天线,“理论上不用天线也可以的” ,这种说法不可能成立的,因为其没有板载 PCB 天线,以下为信号对比图。
- USB 接口:总计 4 个好评,这点比 MKS Pi 强多了。和 Fly Pi 一样支持 TypeC 调试串口,我觉得这点非常重要,保证设备不失联。
- CANBus:需要插入 U2C 模块使用,占用一个 USB 接口,和 Fly3D 的 CAN-HAT 相比,好处是 U2C 一个模块两种用法,只需要出一份钱。
- 板子尺寸以及开孔位置和 RPi3、RPi4 相同的,所以有些结论我也不知道如何得出的:树莓派机械图纸、Pi4b机械图纸
3、软件系统
目前可以使用官方系统,也可以使用 RatOS for CB1(底层也是官方系统,版本略有滞后)。由于做了裁剪与优化,系统启动与关机速度很快。
这里主要介绍 RatOS,主要特性包括:
-
现代化的配置文件形式,目前支持 RatRig V-core3 和 V-Minion,以及实验性支持 Voron 0.1 和 2.4
-
支持多种主控板、挤出机和热端
-
自动编译主板固件并更新(如果支持)
-
基于 Klipper, Moonraker 以及 Mainsail
-
使用 RatOS Configurator
网页界面方便配置无线网络和进行打印机、主板初始化设置
-
除此之外,还有很多高级宏命令,RatOS 这个操作系统技术细节值得学习的地方很多
- RatOS for CB1 仍然基于必趣的 Armbian 系统,部署了其软件项目
- 设置网络信息同样可以修改 boot 分区的
system.cfg
文件,目前 AP 模式直接设置无法使用,听说需要手动编译安装 create_ap
- 默认 Klipper 全家桶部署在 pi 目录,但同时保留了 biqu 用户
3.1 RatOS Configurator 介绍
首次启动后如果没有连接网络,则会创建名为 “RatOS” 的热点,连接后访问 http://ratos.local/configure 即可打开 RatOS 配置器。
目前还在持续开发中,支持 1. 无线网络设置 2. 主板固件烧录 3. 工具板固件烧录与连接 4. 打印机设置与初始化
RatOS 既往仅支持 树莓派,近来更新实验性支持必趣 CB1,所以也支持 BTT Pi。更是支持了大量必趣的 3D 打印机主板,从而对于组装上述打印机的用户来说,BTT Pi/CB1 + Manta 成为一个非常值得选择的高性价比组合。
BTT Pi 和之前版本的对比,可以看到整体布局差异还是很大的,相当于重新设计,不知道出自哪位大佬之手。
3.2 BTT Pi 系统自带设备树
/boot/BoardEnv.txt
bootlogo=true
overlay_prefix=sun50i-h616
## 'sun50i-h616-biqu-sd' for CB1, 'sun50i-h616-biqu-emmc' for CB1 eMMC version
fdtfile=sun50i-h616-biqu-sd
## default 'display' for debug, 'serial' for /dev/ttyS0
console=display
monitor=hdmi
hpd=0
disp_mode=1920x1080
overlays=ir ws2812 spidev1_0
## Specify HDMI output resolution (eg. extraargs=video=HDMI-A-1:800x480-24@60)
#extraargs=video=HDMI-A-1:1024x600-24@60
## uncomment for ws2812
#overlays=ws2812
## uncomment for i2c-gpio, pwm3, disable uart0 for pwm3
#overlays=light
## uncomment for TFT35_SPI screen
#overlays=tft35_spi
## uncomment MCP2515 spi to canbus module
#overlays=mcp2515
## uncomment to release 'spidev0.0' to user space
#overlays=spidev0_0
## uncomment to release 'spidev1.0' to user space
#overlays=spidev1_0
## uncomment to release 'spidev1.1' to user space
#overlays=spidev1_1
## uncomment to release 'spidev1.2' to user space
#overlays=spidev1_2
## uncomment to set 'PH10' for IR
#overlays=ir
## write the config after the 'overlays' and separate it with a space when multiple functions are enabled
#overlays=disable_uart0 pwm ws2812 light tft35_spi mcp2515 spidev0_0 spidev1_0 spidev1_1 spidev1_2 ir
- 可以看到有 eMMC 版本
- 目前支持 ws2812 炫彩灯、灯光控制、spi屏、mcp2515 spi can模块、ir 红外接收等
- dtb 文件位置位于
/boot/dtb-5.16.17-sun50iw9/allwinner/
,必要时
3.3 BTT Pi 系统简析
这里就不深入谈了。
-
APT 软件源默认配置为国内。/etc/apt/sources.list
-
system.cfg
- timedatectl 看到实际配置为 UTC 0 时间,所以 system.cfg 里说的不对,没有默认东 8 区
###########################################
# System time zone setting, default Beijing time (East 8)
# More settable time zones can be viewed by running the command: timedatectl list-timezones
#TimeZone="Asia/Shanghai"
-
脚本功能解释,风格像是老师傅
-
/etc/scripts/init.sh | 由 rc.local 每次开机调用。以下脚本位于 /etc/scripts
-
pwr_status.sh | 开机后控制 gpio229 上的 led 闪烁,间隔 0.5s,引脚变了?没反应
-
system_cfg.sh | 读取配置文件配置值并进行设置,fly pi 则是配置文件也是 shell 脚本。
-
移动 sd 卡 boot
分区 gcode
文件夹内的文件到 Klipper Gcodes 目录,但是此分区只有 256MB。
-
ex_rootfs.sh | 首次开机扩展分区并删除此脚本
-
reconnect_wifi.sh | 创建热点确实需要编译安装 create_ap,不过目前看此服务暂不开放
4、手机无线 KlipperScreen 屏(Yet Another)
本方案借助 NoMachine 软件实现桌面共享,最早在 树莓派400 上进行测试,树莓派强制开启 HDMI 输出(不需要 HDMI 诱骗器),启用 GPU 从而支持硬件解码,支持硬件加速,显示效果良好。
Tips:如果您的 server computer 的 HDMI 接口没有接显示屏,这会禁止 GPU 加速,让远程桌面运行非常慢。
后来看到网上有另一个方案,就是与在手机上安装 X-Server 如 XSDL ,此方案比想象中的简单多了。详情见《跟着思兼学习Klipper(14) 卷起来了,手机与Klipper的四次结缘 》 一文。
4.1 X-Server:XSDL 的缺点
此方案相当于图像转发到手机上的 X-Server 软件上,本身图像没有进行压缩,且受到无线内网通讯质量的影响,当分辨率设置较高时,传输图像数据量较大,导致响应卡顿,实际使用效果差强人意。
4.2 远程桌面
KlipperScreen 有一个特点,为了节省资源,没有完整桌面环境。这里想到三种方案:VNC、NoMachine、AnyDesk/TeamViewer/向日葵/RustDesk,虽然都属于远程桌面,但是还是有不同的。此外桌面共享和远程桌面的概念也不同。我们首先以所有设备在同一无线局域网内为例,后面拓展。我们想要找一种 <u>跨平台,高性能,低延迟,多功能的方案</u>,这里对多种连接方式、多种显示方案进行比较。
- VNC 协议类似于抓取图片,支持 jpeg 硬解。RealVNC 也支持声音传输,但是属于付费功能
- NoMachine 的 NX协议传输视频,使用VP8/H264,H264 的 CPU 占用比较低
- AnyDesk/TeamViewer 则支持广域网连接。
分述如下:
4.2.1 VNC
使用配置可以参考官方文档 VNC (Virtual Network Computing)。主观评价:免费版不支持音频,功能较少。相当于截图传输,图像质量及流畅性上差一些。支持 Headless 无显示器使用
4.2.2 Anydesk
类似 Teamviewer,下载的deb安装包会提示缺少依赖,需要在 Client 设置启用一些选项
-
Server:启用自动发现 | 局域网无需知悉 RPi 的 IP 地址
-
Server:允许自主访问并设置密码 | 无需在 RPi 确认接入访问
-
Client: 启用显示远程电脑的光标 & 跟随远程电脑的光标
-
Client(Android):会话设置 > 输入 > 直接鼠标模式 | 隐藏 Client 光标
主观评价:操作流畅,无需安装,支持 MineCraft 显示。支持远程连接。但是由于我们没有安装完整桌面环境,所以初步测试使用不了,登不进去。
4.2.3 Nomachine
注意 arm7hf 是针对 32 位系统,arm8 是针对 64 位系统。其采用 NX 协议。传输视频流编码可选择付费的 H.264 和免费的 VP8,H.264 需要授权,但是 Nomachine 支付了这笔费用。
主观评价:之前讲 LattePanda 用法的时候介绍过,对于默认无法启用硬件加速的设备比较友好。由于树莓派硬件加速支持比较好,所以这点上优势不是那么明显。支持功能更丰富。免费版服务端每次仅允许创建一个会话。文档异常丰富。
4.2.4 常见问题
- 什么是自动发现,有什么好处
树莓派连接到网络之后,需要知道它的 IP 地址例如 192.168.0.110
才能访问,而启用自动发现之后,所有运行 Nomachine/Anydesk 的设备都可以在局域网中自动显示出来,无需知晓互相的 IP 地址,这无疑十分方便。
- RealVNC 有类似自动发现的功能吗?
我猜想自动发现是借助 Zero-configuration networking
零配置网络实现的,如果 Windows 以及苹果设备,则可以通过安装 Bonjour 服务(法语:你好,又叫 zeroconf ,由苹果公司开发),Linux 安装 Avahi 服务( Bonjour 的开源实现),则局域网中 BTT Pi 的地址总是 BTT-CB1.local
,如果改过 hostname
,则为 [hostname].local
。当然,这需要服务端和客户端都开启了 Bonjour 协议服务。由于 Andorid 设备不支持 Bonjour,所以麻烦一些,无法直接通过 BTT-CB1.local
访问设备。后文介绍一个解决方法。
- 没有连接显示器时,使用 VNC 访问树莓派,显示为黑屏?
之前介绍 LattePanda 时提到一个东西叫做 HDMI假负载/显卡欺骗器,为的是使设备启用 GPU 并输出视频信号,否则就会看到黑屏。
<img src="https://raw.iqiq.io/sjqlwy/blog_imgs/default/images/202305281351680.png" alt="image-20230528135042795" style="zoom:25%;" />
解决方法1:
针对 VNC,在树莓派上运行以下命令:
vncserver -randr=1366x768 # 创建一个分辨率为 1366x768 的虚拟显示
# vncserver -kill :<display-number> # 关闭某个显示
而运行 AnyDesk 和 Nomachine Client 时会提示你是否自动创建一个虚拟显示。此方法的缺点是,没有实际启用 GPU,创建的虚拟显示无法启用硬件加速,视频解码、图像绘制都是通过 CPU 软件渲染,导致极大降低性能。不过 Nomachine 借助 VirtualGL 实现类似硬件加速的性能一定程度上缓解此问题。
4.3 使用 NoMachine
综合下来我们选择 NoMachine。
4.3.1 安装 NoMachine
## 下载 64 位版本 NoMachine,并在手机上搜索安装对应版本
wget https://download.nomachine.com/download/8.5/Arm/nomachine_8.5.3_1_arm64.deb
sudo apt install ./nomachine_8.5.3_1_arm64.deb
没接 HDMI 显示器的话插电启动,发现默认分辨率非常低,原因是:
in some cases users can get only a small screen resolution without the possibility to change it ('stuck resolution'). This depends on the GPU which makes available only one resolution when the monitor is not present.
—— How to solve 'stuck resolution' problems on headless machines
4.3.2 解决分辨率低的问题
有两种方案,一是强制 HDMI 输出,一是使用 xorg-video-dummy 驱动。
强制开启 HDMI 输出 实测未生效,等待研究
# 修改 /boot/BoardEnv.txt (armbianEnv.txt),也可以指定刷新率
monitor=hdmi
hpd=0
disp_mode=1920x1080p30
# 以下也不生效
extraargs=video=HDMI-A-1:1920x1080-24@30
参考:
使用 dummy 驱动
# 安装 dummy 驱动
sudo apt install xserver-xorg-video-dummy
# 生成指定分辨率刷新率的 Modeline
cvt 1024 600 60
# 创建 xorg 配置文件
sudo nano /etc/X11/xorg.conf.d/80-dummy-1024x600.conf
Section "Monitor"
Identifier "Monitor0"
HorizSync 28.0-80.0
VertRefresh 48.0-75.0
# https://arachnoid.com/modelines/
# 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz
#Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
# 1024x600 59.85 Hz (CVT) hsync: 37.35 kHz; pclk: 49.00 MHz
Modeline "1024x600_60.00" 49.00 1024 1072 1168 1312 600 603 613 624 -hsync +vsync
EndSection
Section "Device"
Identifier "Card0"
Driver "dummy"
VideoRam 256000
EndSection
Section "Screen"
DefaultDepth 24
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
SubSection "Display"
Depth 24
Modes "1024x600_60.00"
EndSubSection
EndSection
# 重启 KlipperScreen (xorg) 生效
sudo systemctl restart KlipperScreen
参考:
软件名称 |
安装依赖大小 |
向日葵 |
39.9M |
Todesk |
88.2M |
Rustdesk |
18.4G |
Anydesk |
192MB |
结论:除了 Windows 用户和 Rust 开发者,不建议用 RustDesk。
5、利用网盘给上位机扩容
了解 WiFi 棒子的过程中,由于其默认只有 4G 存储,多数情况下不够用,除了物理更换存储进行扩容,还可以利用网盘,这种方案的要求就是稳定且选择速度快的网盘服务,同时网络质量要好,也支持使用内网 NAS。最初想到 rclone,但对国内网盘支持少且配置略嫌麻烦。后来想到另一个流行的软件:Alist,看了一下配置简单且对国内网盘支持好,用起来非常棒。
挂载网盘扩容:
- 访问网盘文件
- 挂载为本地目录
- 测试通过
5.1 安装 Alist
这里以 天翼云盘
进行演示。
## 安装 Alist,自动下载对应平台的版本,支持自动启动。https://alist.nn.ci/zh/guide/install/script.html
sudo bash -c "curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install"
Alist 安装成功!
访问地址:http://YOUR_IP:5244/
配置文件路径:/opt/alist/data/config.json
---------管理员信息--------
INFO[2023-05-25 07:29:59] reading config file: data/config.json
INFO[2023-05-25 07:29:59] config file not exists, creating default config file
INFO[2023-05-25 07:29:59] load config from env with prefix: ALIST_
INFO[2023-05-25 07:29:59] init logrus...
INFO[2023-05-25 07:30:04] Successfully created the admin user and the initial password is: rqmswxGn
INFO[2023-05-25 07:30:04] admin user's info:
username: admin
password: rqmswxGn
--------------------------
启动服务中
查看状态:systemctl status alist
启动服务:systemctl start alist
重启服务:systemctl restart alist
停止服务:systemctl stop alist
温馨提示:如果端口无法正常访问,请检查 服务器安全组、本机防火墙、Alist状态
安装完毕后会自动生成访问密码:
5.2 Alist 初始化配置
控制面板并修改访问密码,添加天翼网盘。
5.3 挂载 webdav 到本地文件系统
目前我们已经可以访问网盘内容了,但是需要挂载到本地才能被 Klipper 访问。好在 Alist 支持 WebDAV,参考文档配置即可。目前有两款软件:davfs2 比较小巧,rclone 配置复杂些,都来试试。
5.2.1 davfs2
参考 ArchWiki:davfs2、davfs挂载与使用缺陷
sudo apt install davfs2
# mount -t davfs http://address:<port>/path /mount/point
# 挂载 alist webdav
sudo mount -t davfs http://localhost:5244/dav /home/pi/printer_data/gcodes/alist -o uid=1000,gid=1000
# 读取并预处理 gcode 文件测试,需要已连接打印机
time ~/klippy-env/bin/python ~/klipper/klippy/klippy.py ~/printer_data/config/printer.cfg -i ~/printer_data/gcodes/alist/kklipper/stls/STH-36_sherpa_mini_mounting_plate_strain_relief.gcode -o /dev/null -d out/klipper.dict
# 测试失败,报错读写错误
OSError: [Errno 5] Input/output error: '/home/pi/printer_data/gcodes/alist/189/kklipper/stls/STH-36_sherpa_mini_mounting_plate_strain_relief.gcode'
5.2.2 rclone
换 rclone 上场,参考文档 WebDAV 和 rclone mount。
其中 VFS File Buffering 很关键,将网盘文件下载并放入内存中缓存。
-
Each open file will try to keep the specified amount of data in memory at all times.
-
If the buffer is empty, only a small amount of memory will be used.
-
vfs-cache-mode 很重要
至于有没有缓存到本地磁盘,有待进一步验证
## 下载并配置 rclone
wget https://downloads.rclone.org/v1.62.2/rclone-v1.62.2-linux-arm64.zip
unzip rclone-v1.62.2-linux-arm64.zip && cd rclone-v1.62.2-linux-arm64
sudo cp rclone /usr/bin/
sudo chown root:root /usr/bin/rclone
sudo chmod 755 /usr/bin/rclone
## 添加 alist webdav 存储
rclone config
# http://localhost:5244/dav # 密码手动输入不能黏贴
- type: webdav
- url: http://localhost:5244/dav
- vendor: other
- user: admin
- pass: *** ENCRYPTED ***
# 列举网盘文件,请将 "189"更改为你设置的名字
rclone ls 189:
## 挂载 webdav 到本地存储
sudo apt install fuse3
# rclone mount 189:189 /home/biqu/189 --vfs-cache-mode full
# 以下为手动后台挂载,可以设置开机等待联网后自动挂载,参考 nm dispatch
rclone mount 189:189 /home/biqu/printer_data/gcodes/alist/ --vfs-cache-mode full --daemon
## 卸载挂载点
fusermount -u /home/biqu/printer_data/gcodes/alist/
具体选项根据实际选择,如 46 webdav,不清楚的留空即可,不需要进入高级模式。
5.2.3 打印测试
如下图所示,我们在网页 Gcode 标签可以看到网盘中的文件,实际打印也没问题。
成品展示:
5.2.4 多打印机使用
Klipper 支持配置文件 内置开始/结束 Gcode
,以及 固件回抽(Firmware Retract)
,一定程度上对于相近的打印机,可以实现一个 Gcode 文件被多台打印机使用。
6、小试 红外接收器
BTT Pi 板载一个红外接收器(Infrared Remote,IR),比如可以实现红外遥控器控制灯光、播放 Music、开始打印、关闭打印机(需要二次确认)等操作。
红外遥控器坏了,待续