跟着思兼学习Klipper(14) 卷起来了,手机与Klipper
前言
原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎指正交流。注意本文不是新手教程,仅做个人记录所用。
文章如有更新请访问 DFRobot社区。
欢迎对 Klipper 固件感兴趣,以及对改版 CNC 加工的 Voron 三叉戟、v0、v2.4 感兴趣的朋友加群交流(QQ Group:490111638)
【2022年7月28日 更新】Octo4a 是支持 STM32 虚拟串口打印机的
不得不说国内的Klipper上位机真是啥都有,树莓派,各种派,电视盒子,手机,x86电脑,虚拟机。
这段时间有在手机上运行 KlipperScreen 作为 Klipper 固件彩色触摸屏的实践,后来网友各种骚操作层出不穷。最初是在手机上使用 KlipperScreen 通过安装 XServer XSDL
实现,后来经过网友 摸摸头
的不懈探索工作,成功在 红米2 手机上运行原生主线内核 Linux,再到如今,百花齐放,虽然个人以为折腾意义大于实际意义,不过仍然值得记录如下。
本文介绍 1 种手机作为 KlipperScreen 显示触摸屏的方案和 3 种手机作为 Klipper上位机的方案。
- Xserver XSDL
- Redmi_2 with Mobian Linux
- Android Mobilephone with Termux/Aidlux
- Android Mobilephone with Octo4a
1、XServer XSDL (显示触摸方案)
具体可以参考教程:AndroidKlipperScreen,以及十分推荐 路特皮卡实验室 的独立视频教程 如何使用安卓手机做KlipperScreen。
原理:
X窗口系统(X Window System,也常称为 X11 或 X )是 Linux 系统上常见的一种以位图方式显示的软件窗口系统)。Client 传输图形数据到 Server 上,与 Windows 不同,Server 和 Client 可以不在同一台设备上,用过 Xshell/MobaXterm 的 X 转发(X-Forward)功能的朋友应该都不陌生,这里不再赘述。
【Fig 1】X-客户端与 X-服务端,Source:x11.gweb.info
这里的原理就是在安卓手机上安装一个 X-Server 软件 XSDL,然后通过 adb 将 KlipperScreen 的图像显示到手机上,从而实现有线/无线触摸屏的功能,这在我之前的视频 花式KlipperScreen玩法 里有展示。
2、手机安装原生主线内核 Linux
本方案的最大问题是挑机子,不通用。
这个是最彻底的方法,感谢网友 摸摸头
的探索工作。此方法适合硬核用户,原生 Linux 体验,缺点是挑机子,特定机型才能用。
原理:
在手机上安装完整的 Linux 系统,继而安装 Klipper + Moonraker + KlipperScreen + Fluidd(Optional),甚至可以通过 USB-OTG 接口连接下位机主板,算是 All-in-One 的方案。
2.1 安装 Linux 操作系统
Android 操作系统虽然基于 Linux,但是做了很多改动,缺少一些内容,无法获得完整的 Linux 操作体验,所以便有了一些适用于手机的操作系统,例如 Ubuntu Touch(UBports)、Mobian、PostmarketOS 等,但是由于 Android 手机型号众多,有很多专有硬件驱动,甚至不提供 Linux 内核源码,导致并不是所有设备都能良好支持。
2.1.1 操作系统选择
目前完成度比较好的为 PostmarketOS(以下简称 pos),其基于 Alpine Linux
,而 Klipper 的安装脚本目前还不支持该系统,所以我们把目光转向 Mobian,其基于 Debian
,用起来更加得心应手,同时使用 pos 的主线内核。
2.1.2 手机设备选择
查看 POS Devices 页面可以看到设备的支持情况,其中 RedMi2 脱颖而出,除了目前基本都暂时无法驱动的摄像头外,都可以驱动。同时由于红米手机价格便宜,市场保有量大,所以闲鱼市场50~80就可以收到。这里说两个问题:
为什么红米2支持这么好
最初关注 pos 的时候,最好的支持设备时诺基亚 N900,原因是其默认系统 Maemo 5
就基于 Linux,加上有侧滑键盘,所以是一个极佳的 Hacker Device。不过性能还是有些不足。
后来 ARROW 发布了一款 96boards 开发板 DragonBoard 410c,基于 Qualcomm Snapdragon 410 处理器,受到高通和 Linaro 基金会的良好软件支持,所以一众使用 410/410c (MSM8916) 处理器的设备都坐上了飞机,红米2就是其中之一。
【Fig 2】DragonBoard 410c 开发板,板载 GPS,是高通为数不多的不需要签署保密协议且价格低廉的开发板。
购买什么型号的红米2
红米2型号众多,电信版、移动版,还有使用联发科处理器的红米2A,移动增强版2A,具体从microUSB接口打开后盖,查看手机电池下面的背板编号,图中所示为2014812:
请确认购买的手机背码位以上。
- 确认手机背码在下方列表内,有条件购买 wt88047:
2014811, 2014812, 2014817 2014818, 2014819, 2014821
代表 wt88047
2014813
以及 2014112
代表 wt86047
- 建议购买配置为 2G 内存,16G 存储的高配版
- 购买前确认手机
IMEI
码和背面一致,可以在拨号界面输入 *#06#
查看,以免买到组装机
- 确认为原装显示触摸屏,目前测试发现非原装显示触摸屏刷入 Mobian 后触摸有问题无法使用
以上都是我真实遇到的,由此可见还是比较挑机子的。
2.1.3 烧录前准备
需要原来的系统版本为 5.x,因为要用到它的一些固件(firmware),如果手机系统是 Android 4.x 可以从这里下载 MIUI 5.1 官方系统进行升级:
使用 小米刷机工具 或者 fastboot 进行烧录即可。
也可以烧录 LineageOS,具体借助 TWRP Recovery,教程见此处:Install LineageOS on wt88047 。经常刷机的朋友轻车熟路了。
还可以参考 pos 的教程第 1/2 步。
2.1.4 烧录 Mobian Linux
教程可以参考 红米2刷 Debian 系统,预编译的系统镜像可以从 mobian-wt88047 项目页面右侧 release
处下载。
- 进入手机原厂的 fastboot 模式(音量下+电源键),然后刷入lk2nd
fastboot flash:raw boot lk2nd.img
fastboot reboot
- 在 lk2nd 界面中刷入 debian 的内核和文件系统
fastboot flash boot boot.img
fastboot erase userdata
fastboot flash userdata userdata.img
fastboot reboot
【Fig 3】Mobian 的 Phosh 用户界面
2.2 安装 Klipper 全家桶
注意 KlipperScreen 使用 X11 显示,Phosh 使用 Wayland 显示,所以我们要卸载 Phosh,并需要安装触摸驱动程序
## 1. 此镜像 mobian.list 源有问题,需要修改 unstable 为 bullseye,否则升级后声音会失效。
sudo sed -i 's/unstable/bullseye/g' /etc/apt/sources.list.d/mobian.list
## 2. 常规设置 Pypi 镜像加速
mkdir -p $HOME/.config/pip && sudo remove /etc/pip/pip.conf
cat << _EOF_ > $HOME/.config/pip/pip.conf
[global]
index-url=https://pypi.tuna.tsinghua.edu.cn/simple
# extra-index-url=https://www.piwheels.org/simple
timeout = 600
_EOF_
## 3. 设置 github 镜像加速
git config --global url."https://hub.fastgit.xyz/".insteadOf "https://github.com/"
# git config --global --unset url.https://hub.fastgit.xyz/.insteadof # 取消镜像
## 4. 以下略,请查看 Gemini 的设置文章
... 假装已经安装好 Klipper + Moonraker ...
2.3 安装 KlipperScreen
各单位注意,这个 KScreen 是基于 Raspberrypi OS 开发的,所以在其他操作系统上会出现依赖包没装全的问题。此外新版做了些优化同时引入了新的问题。
# 修改 scripts\KlipperScreen-install.sh,补充软件依赖
PKGLIST="${PKGLIST} xserver-xorg-legacy xserver-xorg-video-fbdev python3-pip fonts-wqy-zenhei librsvg2-common"
# bullseye 以上的 Armbian 有 xserver-xorg-video-fbturbo 包,buster 即使编译也不能用,如果软件源中没有此包则删除。
# 安装触摸驱动,由于 Wayland 自带 libinput,所以更换 X11 之后需要手动安装才能使用。
PKGLIST="${PKGLIST} xserver-xorg-input-libinput"
新版采用 get-pip.py
脚本安装pip,但是改地址有时候网络超时导致安装失败,换回老办法得了:
if [ ! -d ${KSENV} ]; then
- GET_PIP="${HOME}/get-pip.py"
- virtualenv --no-pip -p /usr/bin/python3 ${KSENV}
+ virtualenv -p /usr/bin/python3 ${KSENV}
- curl https://bootstrap.pypa.io/pip/3.6/get-pip.py -o ${GET_PIP}
- ${KSENV}/bin/python ${GET_PIP}
- rm ${GET_PIP}
fi
有的发行版缺少 /etc/X11/Xwrapper.config
文件,直接创建一个( 参考 )。
cat << _EOF_ > /tmp/Xwrapper.config`
needs_root_rights=yes
allowed_users=anybody
_EOF_
sudo mv /tmp/Xwrapper.config /etc/X11/Xwrapper.config
2.3.1 解决横屏显示及触摸校准问题
很多人卡在这里了,虽然竖着也能用,实际上了解 X11 的应该会想到修改 xorg.conf。其实官方文档有示例 DISPLAY:
# 创建 /etc/X11/xorg.conf.d/00-fbdev-rotate.conf
sudo su
cat << _EOF_ > /etc/X11/xorg.conf.d/00-fbdev-rotate.conf
Section "Device"
Identifier "LCD"
Driver "fbdev"
Option "Rotate" "CW"
EndSection
_EOF_
同时修改触摸屏幕的对应矩阵:
# 查看连接到系统的输入设备,测试可知 generic ft5x06 (51) 为触摸屏
DISPLAY=:0 xinput --list
# 创建输入设备校准文件
# 实测 [屏幕 CW] 对应 [触摸 -270°]
cat << _EOF_ > /etc/udev/rules.d/98-touchscreen-cal.rules
ATTRS{name}=="generic ft5x06 (51)", ENV{LIBINPUT_CALIBRATION_MATRIX}="0 1 0 -1 0 1"
2.3.2 杂项
安装 KScreen 之后无法关闭屏幕以及显示电量,可以写个宏借助 shell_cmd
组件输出到控制台,之前介绍过。
# 开关屏幕显示:
export DISPLAY=:0.0
xset dpms force off|on
# 显示电池电量,根据实际替换 ${BATTERY}
cat /sys/class/power_supply/${BATTERY}/capacity
设置显示中文:
# 安装中文字体文泉驿-正黑,此字体支持点阵显示,启用后更锐利
sudo apt install fonts-wqy-zenhei
# 设置系统时区
sudo timedatectl set-timezone Asia/Shanghai
# 生成并设置系统 locale,这段我不记得了,自己测试。Armbian 等可以直接设置。
# edit /etc/locale.gen,取消注释 zh_CN.UTF-8
locale-gen
sudo localectl set-locale LANG=zh_CN.UTF-8
# 修改 KScreen 配置文件或者从界面内选择中文显示即可。重启 KScreen 生效
sudo systemctl restart KlipperScreen
以上应该就可以了。其默认会读取以下三个地方的配置文件,根据情况修改即可。
-
~/KlipperScreen.conf
-
${KlipperScreen_Directory}/KlipperScreen.conf
-
~/klipper_config/KlipperScreen.conf
2.4 供电问题【重要】
现状:
- microUSB 接口的手机,此接口不支持同时充电 + OTG连接主板功能,即使购买
Y 一分二 OTG线
,也似乎只能选择充电或者给下位机供电,导致使用电池时可能一个模型没打完就没电了
- TypeC 接口的手机,似乎支持同时 充电 + OTG功能,但是问题是长时间给电池充电会可能会导致电池鼓包、寿命下降并且有潜在风险,虽然通过改变充电策略,可以降低但无法消除此问题
目前比较好的方案就是使用假电池,改 DC 直供,手机需要检测电池信号,不能只接正负极。借鉴 fix-猫
的方案:
要拆了电池 拿出电池保护板,然后买一个dc-dc板子2元的,dcdc输入直接接usb的5v 和gnd 然后调电位器让他输出4.2V
4.2V调好了 直接把输出 代替电芯 焊接在电池保护板上,然后电池保护板那个塑料套回去保护板就转上去 滴上502即可。
或者打热熔胶,dcdc一并热熔胶弄在电池仓
其他想到再补充吧。
3、Termux + Klipper 全家桶
也就是网友 SYZ-Channel 的方案,感谢作者提供的新思路。
Termux 是 一个运行在安卓系统上的终端模拟器和 Linux 运行环境(Terminal emulator and Linux environment for Android),共享宿主机内核空间,有些类似于 Cygwin 和 容器?我也没研究过,感觉可以这样理解。类似的还有国内的 AidLux,值得一试。
还有一个 Linux Deploy 则是相当于 Android 虚拟机方案:
The application creates a disk image or a directory on a flash card or uses a partition or RAM, mounts it and installs an OS distribution.
开发停滞,而且性能会差一些。
问题
- 视频中最大的难点在于默认没识别串口模块,从而尝试去重新编译内核。
- 其实 Termux 默认支持访问 USB串口模块,不需要 root,不需要重新编译内核。 这样安装难度大大降低,极大提升安装体验和拓展了设备支持。
- 看视频中手机摄像头帧率很低,不知道有没有启用 GPU 加速,Termux 支持吗? AidLux好像支持,IP Cam 是否效果更好?
以上,有空测试一下。
4、Octo4a + Klipper
本方案的最大问题就是安装下载环境时需要挂代理加速。
相信很多人都听说过 Octo4a (以下简称 o4a)这个安卓软件,可以在支持 OTG 的老旧手机上安装 OctoPrint 服务器。
特点:
- 傻瓜式操作,避免繁琐的配置
- 通过 USB-OTG 连接下位机主板,直接支持各种 USB 串口模块,无需 ROOT 权限,无需重新编译内核
- 支持调用手机内置摄像头,作为监控或者延时摄影
- 内置 SSH 远程访问服务
- 经网友
Lynx
的提醒,Octo4a 内置 Klipper 上位机软件的支持
4.1 第一回合:
而我们今天就要会一会 octo4a,简记如下
-
首先从项目主页下载 apk 安装到手机,注意你的手机要是 5.x 以上的系统,并且注意 CPU 是32位还是64位,比较新的手机一般是64位。
-
使用 BifrostV
这款地图软件,据说也可以使用 Adguard home
这款软件添加 github host 文件,但是我没成功。
-
开启 VPN 后,打开 octo4a 软件,选择安装(Installation),等一会有可能在第三部安装依赖(Dependency)时因为网络失败导致闪退,但是再次打开 o4a 可以正常开启 OctoPrint 服务。如下图所示开启 SSH 服务并设置密码:
4.2 到我登场表演了!
关闭地图软件,下面我们把舞台交给 MobaXterm,根据手机的 IP 地址登录,用户名 octoprint
,密码就是你设置的那个,端口号 8022
:
## 1. Linux环境为 Alpine,使用 apk 进行管理软件包,修改软件源并更新软件列表,不需要添加 sudo
sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
apk update
## 2. 参考执行 scripts/里面的三个脚本,分别完成 octo4a/拓展插件/klipper 的安装配置
bash setup-octo4a.sh
apk add python3-dev build-base gcc g++
bash setup-klipper.sh
至此,Klipper 插件安装完成,由于没有安装编译链,所以不支持编译固件。同时也不需要 Moonraker API,由 OctoPrint 直接通讯。
4.3 配置 OctoPrint 和 Klipper
- 打开 OctoPrint,地址为
IP:5000
,设置用户名密码后可以登录
- 安装 OctoKlipper 插件,这时候可以开地图软件,其他时候关闭
- 修改 Klipper 的 printer.cfg 文件,其位于 /root 目录,可以使用
vi
修改
- 下位机的串口地址填写为
/dev/ttyOcto4a
,其他依样。
- 重启 octo4a APP,即可以通过 Klipper 连接打印机。
- 打开摄像头服务器即可以使用,闪光灯控制似乎有问题。
写到这有点泄气了,写累了,先把框架搭进去后面扩充吧。
【Fig 】octo4a 自动识别并连接刷好 Klipper 固件的主板,无需 root,无需重新编译内核
【Fig 】Klipper Ready!
4.4 OctoPrint APP
连接之后,一般的用法就是从网页或者APP登录,手机嘛就安安静静当个摄像头+上位机吧。如果你不甘寂寞,也可以在它上面安装 OctoPrint 的 APP,通过面板进行控制,这里介绍三款:
【Fig 】从左到右分别为 OctoRemote
、Printoid(Lite)
以及 OctoApp
,中间那个高级功能动不动就收钱,喜欢简洁用第 3 个,普通用户选择第 1 个。
详细的介绍可以移步文章: OctoRemote: How to Use OctoPrint on Android