前言
原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎交流指正。
文章如有更新请访问 DFRobot 社区及 cnblogs 博客园,前者内容较全,后者排版及阅读体验更佳。
先有三后有一,你说奇怪不奇怪。
去年 Ash 老板问我行空板能否安装使用 Klipper 全家桶作为 3D 打印机上位机使用,答案那肯定可以,不过要对原有的系统做一些修改。
软硬件环境:
- 行空板(Unihiker),Debian 10(Buster)
本文涉及的内容:
- 在 Unihiker 上安装 Klipper 全家桶
1、硬件介绍
行空板是一款来自于 DFRobot ,拥有自主知识产权的国产教学用开源硬件,采用微型计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。同时,其自带Linux操作系统和python环境,还预装了常用的python库,让广大师生只需两步就能开始python教学。
基本配置为:RK3308-四核 64 位 Cortex-A35 处理器,512MB 内存,16GB 内存,RTL8723DS 无线蓝牙模块,GD32VF103C8T6 RISC-V 协处理器,搭载一块 2.8 寸 240x320 可触控彩色屏幕。
2、系统及软件
默认的操作系统采用 Debian 10,稍微有些老了,默认的 Python3 版本为 3.7,测试时发现 ESPHome 直接运行时有错误。默认采用 Rockchip 4.4.143 legacy 内核,由于没有专门的处理模块,应该也不支持 MPP 硬件加速。由于我们有 FDT 设备树文件,并且 RockpiS 已经支持 6.x 主线内核,所以我们有条件制作基于最新版 Armbian + 主线内核的系统,希望官方有空更新,或者我们自己丰衣足食。
同样采用此 SoC 的开发板有 Radxa RockpiS 和 Firefly ROC-RK3308-CC。前者有 Armbian 支持,相关资料可供参考。默认的启动配置文件如下:
注意:
原理图显示 RK3308 UART0 连接到 T1、T2,猜测用于输出内核消息,但是板子上没找到具体的触点丝印,可以调试时会比较麻烦。
UART3 则用于与 MCU 协处理器通讯。
板载似乎没有电源管理芯片,使用 poweroff 命令关机后仍会耗费较多电力。
行空板开机后自动打开 PyboardWeb 界面,竖屏显示,可以进行触摸设置,界面如下图所示:
连接到 MCU 的外设使用 pinpong 库 进行操作。
3、基本设置与安装全家桶
# 根据个人习惯,添加名为 pi 的用户,设置密码及必要组
sudo adduser --gecos GECOS --add_extra_groups pi --disabled-password
sudo usermod -a -G sudo,render,dialout,tty,video,audio,netdev,docker pi
echo "pi:52mxpi" | chpasswd
# 安装基本必要组件
sudo apt install -y avahi-daemon iw
# 禁用 PyboardWeb 服务自启动,解除屏幕占用,方便显示 KlipperScreen
# 比较特殊,使用 systemctl --user list-units --type=service --state=active 找到相关服务
sudo systemctl --user disable PyboardWeb
sudo systemctl disable lightdm
# 以下使用 pi 用户重新登陆
# 设置国内镜像地址
sudo sed -i 's|security.debian.org|mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list
sudo sed -i 's/httpredir.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/http:/https:/g' /etc/apt/sources.list
sudo sed -i 's/http:/https:/g' /etc/apt/sources.list.d/*
echo "Acquire::http::Pipeline-Depth \"0\";" > /tmp/99nopipelining
sudo mv /tmp/99nopipelining /etc/apt/apt.conf.d/99nopipelining
sudo rm /etc/pip.conf > /dev/null 2>&1
mkdir -p $HOME/.config/pip
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_
cat << _EOF_ > $HOME/.gitconfig
[url "https://github.moeyy.xyz/https://github.com/"]
#[url "https://hub.0z.gs/"]
insteadOf = https://github.com/
_EOF_
# 设置时区
sudo timedatectl set-timezone Asia/Shanghai
## 安装 Klipper 全家桶 ##
# 安装 kiauh 助手
git clone https://gitee.com/miroky/kiauh
# 设置快捷指令
echo 'alias lid="ls /dev/serial/by-id/*"' >> ~/.bashrc
echo 'alias k="~/kiauh/kiauh.sh"' >> ~/.bashrc && source ~/.bashrc
# 使用 kiauh 助手安装必要组件
# 选择 1) [Install] 如下图所示安装1/2/4/5
至此我们已经安装完毕 Klipper 全家桶,crowsnest 需要安装 Legacy 版,具体看之前便携式延时摄影机器的文章。但是想要打开触摸屏幕功能,还需要额外的设置。
4、设置屏幕旋转和触摸功能
默认屏幕为竖屏显示,我们需要改成横屏显示,使用 lsmod
命令查看相关驱动。
pi@unihiker:~$ lsmod
Module Size Used by
hci_uart 36864 1
mousedev 20480 0
rtl8723ds 1708032 0
keyboard_ab 16384 0
ns2009 16384 0
fb_ili9341 16384 2
usb_f_ecm 16384 2
usb_f_rndis 20480 2
u_ether 20480 2 usb_f_ecm,usb_f_rndis
libcomposite 40960 16 usb_f_ecm,usb_f_rndis
fbtft_device 49152 0
fbtft 28672 2 fb_ili9341,fbtft_device
这里看到了老熟人:ns2009
触摸驱动,以及 fbtft_device/fbtft/fb_ili9341
SPI 显示驱动。
4.1 彩色屏幕功能测试
# 查看本机 framebuffer 设备
pi@unihiker:~$ ls /dev/fb*
/dev/fb0
# 测试 fb0 设备显示
sudo fbi -d /dev/fb0 -T 1 -noverbose -a DFRobotLogo.png
# Bonus: 使用 mplayer 播放视频
sudo apt-get install -y mplayer
wget https://raw.githubusercontent.com/devdotnetorg/Site/master/Uploads/minions-320x180.mpg
# 使用格式工厂等软件转换为 240x320 mkv
mplayer -nolirc -vo fbdev2:/dev/fb0 -vf rotate=1 minions-320x180.mkv -cache-min 80 -fps 10
# 查看 SPI 屏幕信息,最大帧率 20 FPS
pi@unihiker:~$ dmesg |grep spi
[ 4.342541] spidev spi2.0: spidev spi2.0 48000kHz 8 bits mode=0x00
[ 4.342660] spidev spi2.0: Deleting spi2.0
[ 4.343369] spi spi2.0: fb_ili9341 spi2.0 32000kHz 8 bits mode=0x00
[ 5.148260] graphics fb0: fb_ili9341 frame buffer, 240x320, 150 KiB video memory, 16 KiB buffer memory, fps=20, spi2.0 at 32 MHz
# 设置横向显示,具体可以查看我手机 Klipper 那篇文章,其中 CW UD CCW 多测试几次就好了。
# 创建 /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_
4.2 触摸校准
查看连接到系统的输入设备 ns2009
,使用 半导小芯 查询可知为 I2C 接口 4 线电阻触摸屏控制器
。
# 查看连接到系统的输入设备,测试可知 generic ft5x06 (51) 为触摸屏
DISPLAY=:0 xinput --list
# 或者使用如下命令:
# less /proc/bus/input/devices
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="rockchip,rk3308-acodec Headphones"
P: Phys=ALSA
S: Sysfs=/devices/platform/acodec-sound/sound/card1/input0
U: Uniq=
H: Handlers=event0
B: PROP=0
B: EV=21
B: SW=4
I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="ns2009_ts"
P: Phys=input/ts
S: Sysfs=/devices/platform/ff060000.i2c/i2c-2/2-0048/input/input1
U: Uniq=
H: Handlers=event1 cpufreq mouse0
B: PROP=0
B: EV=b
B: KEY=400 0 0 0 0 0
B: ABS=3
I: Bus=0016 Vendor=0000 Product=0000 Version=0000
N: Name="keyboard_ab"
P: Phys=input/kbd
S: Sysfs=/devices/virtual/input/input2
U: Uniq=
H: Handlers=kbd event2 cpufreq
B: PROP=0
B: EV=100003
B: KEY=1000050000000
# 查看 i2c 设备
sudo i2cdetect -l
# i2c-2 i2c rk3x-i2c I2C adapter
sudo i2cdetect -r -y 2
# 48: ns2009电阻式触摸传感器
## 校准屏幕显示和触摸
sudo apt install xinput-calibrator
DISPLAY=:0 xinput_calibrator
# 根据上述结果创建 /etc/X11/xorg.conf.d/99-calibration.conf
Section "InputClass"
Identifier "calibration"
MatchProduct "ns2009_ts"
Option "MinX" "138"
Option "MaxX" "139"
Option "MinY" "123"
Option "MaxY" "125"
Option "SwapXY" "1" # unless it was already set to 1
Option "InvertX" "0" # unless it was already set
Option "InvertY" "0" # unless it was already set
EndSection
4.2.2 直接修改触摸矩阵
# 创建输入设备校准文件
# 实测 [屏幕 CW] 对应 [触摸 -270°]
cat << _EOF_ > /etc/udev/rules.d/98-touchscreen-cal.rules
ATTRS{name}=="ns2009_ts", ENV{LIBINPUT_CALIBRATION_MATRIX}="0 1 0 -1 0 1"
_EOF_
5、最终效果
至此,我们禁用了原来屏幕显示的 PyboardWeb 界面,安装了 Klipper 全家桶,修改了屏幕和触摸方向,获得了一个小巧的 Klipper上位机设备。
其实由于带宽限制,SPI 屏幕分辨率不高,我们可以使用点阵字体如文泉驿-sharp,具体会在将来介绍如何移植 SPI 屏幕中详述。
6、预告
- Klipper 测试神器:皇帝的新打印机
- 调用行空板协处理器传感器模块资源
- 玩转 ESP32 + MQTT + Moonraker
- 如何修改 KlipperScreen 图标,系统启动图标,Fluidd 图标