思兼的 Fly-Gemini 硬件简明使用手册(探索版 v1.2)
前言
原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎交流指正。
请访问 原文链接 以获得文章更新。
这篇为什么叫探索版呢,其实就是自己使用过程中记录的流水账,是 发现问题
- 查阅探索
- 找到答案
的过程,对于大多数人来说,可能看一下结论就可以了。
本文中我们约定,运行 Linux 的部分称为 MPU,运行 Klipper 固件的部分称为 MCU。关于主板方向,以驱动朝上为正。
本手册内容比较繁杂,尽量先简介开机上电运行 Klipper 的整个理想流程,然后再对于具体细节做介绍。
最重要的是请先阅读官方说明书,除了部分内容我觉得可以补充的,其余就不再赘述。
【2021年12月19日更新】
- 修正 adxl345 CS 引脚,优化关机按钮修复脚本路径
- 更正:MCU 部分引脚是
5V tolerant
,在手册中Pinouts and pin description
部分可以看到,FT = 5V tolerant, TT = 3.6V tolerant,参考。
- 补充:对于 MPU 部分,有说 AW 的 SoC UART 引脚支持 5v,有说仅 Rx 支持 5v,反正不要接 5v 输入脚最好。
【2021年12月21日更新】
- 增加代码行号显示,便于新手理解。
- MCU 部分 MCP2542 CAN收发器暂时不可用。
- MPU 的引脚电平为 3.3v,其 SPI 接口可用于连接 ADXL345 加速度计(内置电压转换电路,可以使用 5v/3.3v 供电),查看原理图和手册可知,其信号电平 3.3v,所以可以正常连接 MPU 引脚。
- 也因此我们知道,ADXL345 加速度计模块不要直接接在 Arduino Nano 等 8位 MCU 上使用,其信号电平为 5v,仅是 MCU 接收信号时可以使用,但是交互时有可能损坏 ADXL345 模块,需要进行电平转换。参考 ADXL345 Hookup Guide 。
【2021年12月26日更新】
- 探讨 MPU FAN 电压输出问题的原因
- 探讨 BOOT1 引脚复用问题【重要】
- 由于 hub.fastgit.org 离线,更换加速镜像地址,否则安装相关软件包时会报错
内容介绍
- 使用 Gemini UART 接口自烧写 MCU BootLoader
- 介绍 MPU GPIO 资源的使用
- 介绍 MPU 的一些硬件资源
- 优化 Armbian 并修复部分问题
主板的一些情况与问题
- 全部信号引脚均为 3.3V 电平,实际略低,输出电流较小,不适合大负载。
- MPU 和 MCU 供电是一起的,无法独立使用。注意 MPU 运行 Linux,相当于一台电脑,不要频繁强制断电,会损坏系统及硬件。
- USB-OTG 为以太网接口旁边上方的 USB0 接口,需要拉高
USB ID
引脚,并启用 usbhost0
overlay。
- 原理图 SPI 端子座引脚顺序(5v-GND-I2C)与主板丝印顺序(5v-IO-GND)冲突,原理图正确。
- I2C 的数据脚和时钟脚分在两个端子座上,应该是 I2C1,如是则 overlay 启用错误。
Core FAN
引脚为 左(-)右(+)和有的风扇的线序相反(比如我的)。此外,此引脚输出为最大为 3.3v 不到,带不动5v风扇,建议接常开风扇
- 如果使用 MKS 屏幕,其 EXP1 和 EXP2 开口方向与此主板相反,使用屏幕建议购买各主板的配套设备,否则注意线序进行必要修改。
Fly-Gemini(以下简称 Gemini)是 Fly3D(Mellow)新推出的将 MPU 和 MCU 整合到一起的新 3D打印机主板,支持 Klipper 与 RRF 固件,尤其是对于 Klipper 这种需要上位机进行计算的新固件意义重大,由于比较新颖,优点和缺点皆有之。
硬件规格:
- MPU:Allwinner H5 4 核 | linux-sunxi.org
- 内存:512MB
- GPU:Mali450
- USB 2.0 × 3,USB 2.0 OTG × 1
- UART × 3,SPI × 2(引脚复用)
- microHDMI × 1(注意区分 miniHDMI)
- 100Mbps Ethernet
- MCU:STM32F405RGT6
- 其他特性:
- 支持 CAN模块
- 支持 ST-Link 调试
- 支持一路 MPU 可控风扇
1、理想使用流程
为了防止劝退新手,先把基本剧本顺一遍,走一遍流程。
【部分接口分布图】有些是我参考主板原理图和测试出来的。
1.1 供电
主板 MPU 和 MCU 是同时供电的,无法独立供电,方式包括 MPU Type-C
、MCU Type-C
、端子
<u>三种</u>方式。和树莓派一样,由于 GPIO 区域的引脚一般不存在保护电路,我不推荐通过引脚反向供电的方式(Fysetc Spider 支持该选项),除非你能保证反向供电的电压电流总是稳定可靠。
- 主板启动过程最大电流约 0.5A(MPUType-C供电,无线网连接状态)
- MPU 信号电平为 3.3v
1.2 烧录系统镜像
-
从官方QQ群或者 GoogleDrive 下载系统镜像,文件名:FLY-Gemini_Armbian_21_12_8_server.img.xz
。
-
下载并打开系统烧录工具:USBImager(100+ KB) 或者 balenaEtcher(100+ MB) ,这里以更轻巧的 USBImager 为例。
-
插入 microSD 卡(8GB 以上即可),如果烧录失败可以先使用 SDFormatter
格式化
- 将 SD 卡插入 MPU 的 SD 卡插槽,
MPU Type-C
另一头连接到电脑,根据官方文档操作即可。远程管理工具以免费强大的 MobaXterm 为例。
1.3 Armbian 优化设置与常见问题解决(重要)
粗看了一眼官方系统,有些地方需要优化,同时还有一些常见问题没有解决。
#!/bin/bash
#////////////////////////////////////
# Armbian Setting Up for Klipper Script
#
#////////////////////////////////////
# Created by 思兼 / sjqlwy#gmail.com
# 1. 根据个人习惯,添加名为 pi 的用户
# adduser --gecos GECOS --add_extra_groups pi
# su pi
# 2. armbian-config 会访问 github.com 测试网络连接,改为 baidu.com
sudo sed -i 's/http:\/\/github.com/https:\/\/baidu.com/g' $(which armbian-config)
sudo apt-mark showhold
armbian-bsp-cli-orangepipcplus
armbian-config
armbian-firmware
linux-dtb-legacy-sunxi
linux-image-legacy-sunxi
linux-u-boot-orangepipcplus-current
https://www.jianshu.com/p/f284bc90944f Ubuntu删除多余内核
https://github.com/dotnetcore/FastGithub/
https://github.com/guumaster/hostctl
https://github.com/ineo6/hosts
https://github.com/hunshcn/gh-proxy
## 3. 加速 Python Package Index(Pypi),启用清华大学镜像
## 请注意:首次创建虚拟环境时,使用加速源可能会造成某些包安装失败,保险起见再次禁用清华源,请酌情启用
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_
## 4. 加速 git,使用 fastgit.org 镜像
git config --list
git config --global --unset url.https://github.com.cnpmjs.org/.insteadof
/usr/lib/arm-linux-gnueabihf/libproxychains.so.3
fd-find
# git config --global url."https://hub.fastgit.org/".insteadOf "https://github.com/"
git config --global url."https://github.com.cnpmjs.org/".insteadOf "https://github.com/"
## 5. 加速 APT 源与 Armbian 源(重要)
sudo sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's|security.debian.org|mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list
sudo sed -i 's|apt.armbian.com|mirrors.ustc.edu.cn/armbian|g' /etc/apt/sources.list.d/armbian.list
sudo sed -i 's/http:/https:/g' /etc/apt/sources.list
sudo sed -i 's/http:/https:/g' /etc/apt/sources.list.d/*
# 10. 设置系统时区
sudo timedatectl set-timezone Asia/Shanghai
nmtui
# 6. 更新系统软件包
sudo apt update #&& sudo apt upgrade -y
# 7. 安装必要组件,注意如果使用 Klipper Python3,可以不安装 python-pip
sudo apt install -y avahi-daemon python3-pip fonts-wqy-microhei python3-dev # python-pip fonts-wqy-zenhei
# 8. 添加常用命令别名
echo 'alias lid="ls /dev/serial/by-id/*"' >> ~/.bashrc && source ~/.bashrc
echo 'alias k="~/kiauh/kiauh.sh"' >> ~/.bashrc && source ~/.bashrc
# 9. 添加系统环境变量,修复 Fluidd 网页关机/重启功能,修复可能的串口操作权限问题
echo 'export PATH="/sbin:/usr/sbin:$PATH"' >> ~/.bashrc && source ~/.bashrc
git clone https://github.com/th33xitus/kiauh
sed -i 's|python2|python3|g' kiauh/scripts/install_klipper.sh
sudo usermod -a -G tty $USER
sudo usermod -a -G dialout $USER
k
~/moonraker/scripts/sudo_fix.sh
# 11. 优化 Fluidd/MJPG-Streamer 配置文件下载链接
# sed -i '0,/FLUIDD_DL_URL/{s/FLUIDD_DL_URL/FLUIDD_DL_URL_ORI/}' kiauh/scripts/install_klipper_webui.sh
# sed -i '/FLUIDD_DL_URL_ORI/a\\ FLUIDD_DL_URL=${FLUIDD_DL_URL_ORI\/github.com\/download.fastgit.org}' kiauh/scripts/install_klipper_webui.sh
# sed -i.bak 's/githubusercontent.com/fastgit.org/g' kiauh/scripts/install_mjpg-streamer.sh
# 12. 【可选】切换 Klipper Python3
git clone https://github.com/th33xitus/kiauh
sed -i 's|python2|python3|g' kiauh/scripts/install_klipper.sh
cp kiauh/scripts/install_klipper_webui.sh 1.sh
sed "s/FLUIDD_DL_URL/{s_head -1_sed 's/github.com/download.fastgit.org/g'_}/1" 1.sh
nmcli dev wifi connect TP password 65446414 list
nmcli dev wifi connect nww password njjiswang
# 修复gpio
host,builtin wifi,优先级
# 复原wlan0
wlx70f11c577968: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
https://blog.csdn.net/weixin_42409052/article/details/113065704
python3-dev
注:【11】可以参考 该方法:FLUIDD_DL_URL=$(curl -s https://api.github.com/repositories/295836951/releases/latest | grep browser_download_url | cut -d'"' -f4 | sed 's/github.com/download.fastgit.org/g')
优化后效果:
- 支持 Fly-Gemini.local 访问设备
- 支持输入
lid
命令查看串口设备,k
启动 kiauh
- 【重要】修复 Fluidd 网页无法使用右上角命令关机/重启 MPU 的问题
- 加速 git/pypi/apt 下载加速,减少因网络超时导致安装失败等问题
- 优化 Fluidd 以及摄像头支持包 MJPG-Streamer 配置文件的链接地址,防止下载超时失败
- 修复环境变量导致的部分命令无法使用的问题
- 修复可能的权限导致串口设备访问失败的问题
- 支持切换到 Klipper Python3 运行环境,解决新版本不支持中文名称 Gode 文件的问题,具体请移步 此链接。
此外可以切换使用我 自编译的 Fluidd 开发版本,补全了中文本地化翻译,支持更流畅的摄像头视频流方式。
至此,可以愉快使用 Klipper 了。
1.4 Klipper 配置与启动
参考官方文档,为 MCU 刷入 Klipper 固件,参数设置如下图所示。编译成功后,下载 klipper.bin
重命名为 firmware.bin
(可选)并拷贝到格式化为 FAT32文件系统 的 microSD 中,插入 MCU SD卡槽
后按下 MCU Reset键
5s 左右,重新把 microSD 卡插入电脑,看到文件重命名为 fly.cur
则代表刷入新固件成功。查看说明书,将拨码开关 3/4
调到 ON
。
如果想对 Fly-Gemini 进行脱机测试,请至少接入挤出头的温敏电阻。这里附上我写的 Gemini MCU 引脚文件,配合我的 Klipper-Box
项目使用。
#####################################################################
# FLY flyboard FLY-Gemini 引脚别名,用于思兼的 Klipper-Box 项目
# - 整合全志H5+512MB MPU,STMF405RGT6 32bit MCU
# - 编译选项 8MHz、32KB BL,默认SD卡刷,firmware.bin -> fly.cur
# - 支持 DC12-24v 输入
# - 默认支持4轴驱动
# - 1路热床
# - 1路加热头
# - 支持2个温度传感器
# - 支持 TMC UART 和 SPI模式,12-48v,支持TMC5160
# - 1路可控风扇(并联2路?),1路不可控风扇,1个 MPU 风扇
# - 3个限位开关+1个BLTouch
# - EXP1、EXP2 支持 LCD 显示
# 资料镜像地址:https://hub.fastgit.org/Mellow-3D/Fly-Gemini
# Klipper CAN:https://github.com/Klipper3d/klipper/blob/master/src/stm32/can.c
# MKS 3D TOUCH: https://www.bilibili.com/video/BV1gT4y1g78z
#####################################################################
[mcu] # 【重要】插拔主板前后通过 "ls -l /dev/serial/by-id/*" 命令,确认正确的通讯地址
serial: /dev/serial/by-id/usb-Klipper_stm32f405xx_29002A000450314335393220-if00
restart_method: command
[temperature_sensor mcu]
sensor_type: temperature_mcu
sensor_mcu: mcu
[board_pins]
aliases:
# Stepper drivers
MOT0_EN=PB2, MOT0_STEP=PC13, MOT0_DIR=PC1, MOT0_UART=PB11, # MOTOR_X
MOT1_EN=PB6, MOT1_STEP=PC14, MOT1_DIR=PC4, MOT1_UART=PB9, # MOTOR_Y
MOT2_EN=PB5, MOT2_STEP=PC15, MOT2_DIR=PC5, MOT2_UART=PB8, # MOTOR_Z
MOT3_EN=PB4, MOT3_STEP=PC3, MOT3_DIR=PC7, MOT3_UART=PB7, # MOTOR_E0
# Heaters
BED_OUT=PA2,
HE0=PA0,
# Thermisors
TB=PC2, T0=PC0,
# Fans
FAN0=PC6,
# End stops
ESTOP0=PA3, # X_Min
ESTOP2=PB1, # Y_Min
ESTOP4=PB10, # Z_Min
# EXP1
EXP1_1=<NC>, EXP1_2=PA4,
EXP1_3=PA13, EXP1_4=PA10,
EXP1_5=PA9, EXP1_6=PA8, # !注意!开口在反面
EXP1_7=<NC>, EXP1_8=<NC>,
EXP1_9=<GND>, EXP1_10=<5V>,
# EXP2, spi2, connect with core spi0 (optional)
EXP2_1=PB14, EXP2_2=PB13,
EXP2_3=PA15, EXP2_4=PB12,
EXP2_5=PA14, EXP2_6=PB15, # !注意!开口在反面
EXP2_7=PB3, EXP2_8=<RST>,
EXP2_9=<GND>, EXP2_10=<NC>,
# BL Touch/3D Touch
BLT_5=<GND>,
BLT_4=<5V>,
BLT_CTL=PB0, # BL Touch servo pin
BLT_2=<GND>,
BLT_SNSR=PA1, # BL Touch end stop pin
# SWD-ST Link
SWDIO=PA13,
SWCLK=PA14,
# 3.3v Serial UART,Screen1
TX1=PA9,
RX1=PA10,
BOOT1=PB2,
# CAN
USB_CAN_TX=PA12,
USB_CAN_RX=PA11
另外附上 Klipper 和 Moonraker 常见问题的解决步骤。
# 遇到问题请附上 Klippy.log 和 Moonraker.log 文件,点击上图中的按钮即可下载.
# 手动执行以下命令,并附上输出截图
systemctl status klipper
systemctl status moonraker
/home/fly/moonraker-env/bin/python /home/fly/moonraker/moonraker/moonraker.py -l /home/fly/klipper_logs/moonraker.log -c /home/fly/klipper_config/moonraker.conf
2、正文
好,流程走完,我们开始去深入讲讲 Gemini 的硬件。主要分为三部分:MPU、MCU 和两者的通讯手段。
2.1 刷写 MCU BootLoader
有些 Gemini 的 MCU 出厂没有刷入 Bootloader(以下简称 BL),导致无法使用 SD 卡刷入固件。我们首先尝试进入 STM32F4 的 USB DFU
模式,发现 MPU Linux 系统使用 lsusb
和 dmesg | tail
命令都无法识别设备。后来发现,不仅没有刷入 Fly BL
,也没有ST官方 DFU BL
。如此想要刷入 BL 或者 Klipper 固件,只能使用 3.3v Serial。具体参考: 加速度计与输入整形器|1、番外23-UART通讯设置与stm32线刷方法|3、USB DFU培训。画张图示意如下:
如图所示,STM32的存储包括只读存储器(ROM)和存取存储器(RAM),后者起始地址为 0x08000000
,这是基本固定的,可以将 0x08000000 ~ 0x08002000 这 8KB 的空间存放Bootloader 代码。前者可以使用 3.3v serial + stm32flash 工具烧写 BL 和 APP。
0x08002000 |
8KB |
0x08004000 |
16KB |
0x08008000 |
32KB |
0x08010000 |
64KB |
8 * 1024 = 8192 =0x2000
这里我们只能使用 3.3v serial 进行烧录,STM32 默认使用 PA10(Rx)和 PA9(Tx) 引脚,查看原理图发现位于主板下方的 Screen1
接口。
2.1.1 使用 USB-TTL 模块刷写 Bootlaoder
我们先尝试群主推荐的 USB-TTL 模块烧写 BL,注意主板信号电平为 3.3v,且不建议连接 VCC 引脚。
-
主板上 BOOT0-置高(插上跳帽),BOOT1-置低(跳帽短接GND)
-
按住 MCU-RESET
5s左右,重启 MCU 进入 3.3v Serial 烧写状态
-
从 QQ 群下载 bootloader.bin
放入 stm32flash 文件夹
-
使用以下命令烧录 BL:
# 查看设备信息
sudo stm32flash /dev/ttyUSB0
# 烧录 Fly BL
sudo stm32flash -w bootloader.bin -v -g 0 [/dev/ttyUSB0]
# .\stm32flash.exe -w bootloader.bin -v -g 0 [COM11]
# 也可以使用 3.3v serial 直接烧录 Klipper 固件,起始地址 0x08000000,编译固件时选择 Bootloader offset (No bootloader)
# sudo stm32flash -w ~/klipper/out/klipper.bin -v -g 0 /dev/ttyUSB0
-
主板上 BOOT0-置低(拔除跳帽),BOOT1-置低(跳帽短接GND),会自动重启 MCU
-
此时可通过 SD 卡更新 Klipper 固件了
【使用 USB 串口模块刷入 BootLoader】注意 Rx-Tx,Tx-Rx,GND-GND,信号电平为 3.3v
2.1.2 使用 Gemini UART 自刷写 BootLoader
之前文章说过,可以通过 MPU 的板载 UART 接口与主板通讯,当然也可以用来烧录 BL。H5 有四组UART,TTL 电平3.3V,其中UART0 可用于调试,UART3 可以复用为SPI 接口。
UART0
Gemini 板载 CH340N 串口芯片,一端连接 MPU TypeC
,一端与 UART0(ttyS0,CP-Tx,CP-Rx)连接,用于内核调试 (Kernel Console)。
UART1 - UART2
分别对应 /dev/ttyS1 和 /dev/ttyS2,查看 ARMBIAN 配置文件可知默认启用 uart1
。
fly@Fly-Gemini:~$ cat /boot/armbianEnv.txt
verbosity=1
bootlogo=true
console=both
disp_mode=1920x1080p60
overlay_prefix=sun50i-h5
overlays=i2c0 spi-spidev uart1
rootdev=UUID=7c4fee6e-3d75-4497-9764-fe4a130f862a
rootfstype=ext4
param_uart1_rtscts=1
param_spidev_spi_bus=0
user_overlays=spi
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u
查看原理图,uart1 和 uart2 位于左上角,最后测试发现左侧那个为 uart1,原来我参考原理图猜测右侧那个为 uart1,终究是错付了。如果想启用 uart2,添加相应的 overlay 即可。
UART3 与 SPI1
参考上方很奇怪的一点,UART3 和 SPI1 是共用引脚的,SPI1 缺少 CS
和 CLK
引脚。查阅 H5手册 P57 可知 SPI1 和 UART3 引脚复用,通过 overlay 切换。
使用 UART1 烧录固件
我们制作连接线,我端子用镊子压的,效果不好,凑活使用吧。
如上图所示进行接线,不连接 VCC 引脚,方法同上。当然也可以使用 UART1 与主板 Klipper 固件通讯。
# 查看设备信息
sudo stm32flash /dev/ttyS1
# 烧录 Fly BL
sudo stm32flash -w bootloader.bin -v -g 0 /dev/ttyS1
2.1.3 使用 USB 刷写固件
因为我测试的时候需要频繁刷写固件,使用 SD 卡频繁插拔太麻烦,所以 USB 线刷是更方便的方法,具体参考我之前的文章:UART通讯设置与stm32线刷方法|3 ,使用 HID-BootLoader,需要对源码修改后编译。但是该方法会覆盖 Fly BootLoader,使 SD 卡刷方法失效,需要的时候重刷官方 FLY BL 即可。
2.1.4 SD-Updates 伪线刷(不可行)
Klipper 对一些支持 SD 卡刷的主板,提供了伪线刷的方法,需要将 SD 卡插在主板上,然后上位机把编译好的固件通过 SPI 协议传到 SD 卡上,重启主板刷机。但是这种方法在 Gemini 上不可行,原因是其 SD 卡通讯采用的是 SDIO 接口。
2.2 Allwinner H5 MPU overlays
参考文档:https://docs.armbian.com/User-Guide_Allwinner_overlays/
H5 的 overlays 相关信息可以在此文件内查看:/boot/dtb/allwinner/overlay/README.sun50i-h5-overlays
-
[analog-codec] | 音频相关,默认开启,可以关闭
Activates SoC analog codec driver that provides Line Out and Mic In functionality
-
[usbhost0] | 启用 USB-OTG
Activates USB host controller 0,所以我们猜测不能用的那个上面的就是 USB0-OTG。也就是我图中插无线网卡的接口。
配套的还有 USB ID
引脚,配合 overlay 启用 usb-otg 功能,需要测试验证。
USB_ID pin 为低电平时,则设备为host模式。比如PC和支持OTG设备做主设备时。USB_ID pin 为悬空(高电平)时,则设备为device模式。比如U盘和支持OTG设备做从设备时。
-
[spi-spidev] | 启用硬件 SPI
可以用于连接加速度计和灯带等 SPI 通讯设备,可以在 /dev/spidevX.Y
看到。for userspace SPI access,
where X is the bus number and Y is the CS number。默认启用 SPI0
,即右侧那个,可以通过拨码开关与 MCU 的 SPI 连接。SPI1 与 UART3 复用引脚。
此外,原理图引脚顺序(5v-GND-I2C)与主板丝印顺序(5v-IO-GND)冲突,是i0还是io?哪个正确?使用万用表测得原理图正确。
附上 ASXL345
加速度计设置:
[mcu host]
serial: /tmp/klipper_host_mcu
# Fly-Gemini,#待验证
[adxl345]
cs_pin: host:gpiochip1/gpio67
spi_bus: spidev0.0
axes_map: x,y,z
[resonance_tester]
# 探测点,建议放在热床中心上方,一行一个,注意安全位置
probe_points:
120,120,20
accel_chip: adxl345
min_freq: 30
max_freq: 100
2.3 MPU FAN 与 GPIO 控制
主板引出一路 MPU 风扇接口位于右上方,可以通过短接 NC FAN
引脚切换常开(Normal Close)和可控。 不短接就是由 FAN(GPIOL3)
引脚控制。是用了一个 AO3400场效应管
,属于电压控制元件,更多信息可以参考 用MOS管还是三极管?
这里介绍一下如何控制该引脚,更多内容可以参考 https://linux-sunxi.org/GPIO。
2.3.1 使用 sysfs 测试 MPU GPIO
我们查看原理图,发现 FAN
引脚为 GPIOL3
,需要计算其 GPIO 号。全志系列的计算公式为:
(字母顺序 - 1) * 32 + 引脚号
以 GPIOL3 为例,为 (17-1) * 32 + 3 = 355。我们验证一下:
sudo su
# 启用 GPIOL3
echo 355 > /sys/class/gpio/export
# 设置引脚方向为输出
echo "out" > /sys/class/gpio/gpio355/direction
# 设置引脚输出值为1
echo 1 > /sys/class/gpio/gpio355/value
# 释放引脚
echo 355 > /sys/class/gpio/unexport
可以使用万用表直流电压档验证输出,高电平为 ~3.3v 输出。说明测试成功。附一张方便记忆的图:PL3 = 352 + 3。
cat /sys/kernel/debug/pinctrl/*/pinmux-pins
2.3.2 使用 libgpiod 测试 MPU GPIO
新版 Linux 内核更多使用 libgpiod
来操作 GPIO,更多信息可参考 GPIO Programming: Exploring the libgpiod Library。
sudo apt-get install gpiod
# 识别 gpiochip 芯片
gpiodetect
# 查看 gpio 引脚信息
gpioinfo
# 输出结果如下
fly@Fly-Gemini:~$ gpiodetect
gpiochip0 [1f02c00.pinctrl] (32 lines)
gpiochip1 [1c20800.pinctrl] (224 lines)
fly@Fly-Gemini:~$ gpioinfo
gpiochip0 - 32 lines:
line 0: unnamed unused input active-high
line 1: unnamed unused input active-high
line 2: unnamed "power" input active-low [used]
line 3: unnamed "moonraker" output active-high [used]
line 4: unnamed unused input active-high
line 5: unnamed "vcc-io" output active-low [used]
line 6: unnamed unused input active-high
line 7: unnamed unused input active-high
...
# 读取 gpiochip0/gpio6 引脚值
gpioget 0 6
# 设置 gpiochip0/gpio24 输出高电平1s后恢复低电平
gpioset --mode=time -s 1 0 24=1
这里我们想操作 FAN 引脚,试图找到我们计算得到的 355 号引脚,但是并没有,有问题,属实有问题,那它肯定有其他名称,如何获悉呢?
sudo cat /sys/kernel/debug/gpio
【图】如图所示,我们得知,gpio-355 属于 gpiochip0 的第 3 个,输入以下命令测试成功。参考:IMX8 GPIO 编号计算和控制
gpioset 0 3=1
2.3.3 演示 moonraker 控制 MPU FAN
既往我会使用电源管理模块连接到树莓派 GPIO 引脚上,然后 使用 Moonraker 控制打印机开/关,这里我们准备演示使用 moonraker 控制 FAN
引脚。
moonraker 的 文档 关于 power
部分格式是这么要求的:
[power light_strip]
type: gpio
pin: gpiochip0/gpio17
initial_state: on
于是我先后尝试了 gpiochip0/gpio355
、 gpiochip0/gpio3
、 gpiochip0/gpioL3
,在 Fluidd 有上角都没有出现那个熟悉的电闸开关。
查看 moonraker.log
日志,报错信息如下:
Stage 1、首先搜索关键词 gpiochip0/gpio3
,提示无法解析。
报错 Unparsed config option
,那我们看看源码对格式是怎么要求的,另外到底应该填入的 GPIO 号是什么,355、3 亦或是 L3?翻阅 moonraker 源码 moonraker/moonraker/components/gpio.py
,相关代码如下:
# Line 46
try:
chip = self._get_gpio_chip(chip_id)
line = chip.get_line(pin_id)
args: Dict[str, Any] = {
'consumer': "moonraker",
'type': self.gpiod.LINE_REQ_DIR_OUT
}
# Line 70
def _parse_pin(self, pin_name: str) -> Tuple[int, str, bool]:
pin = pin_name
invert = False
if pin[0] == "!":
pin = pin[1:]
invert = True
chip_id: str = "gpiochip0"
pin_parts = pin.split("/")
if len(pin_parts) == 2:
chip_id, pin = pin_parts
elif len(pin_parts) == 1:
pin = pin_parts[0]
# Verify pin
if not chip_id.startswith("gpiochip") or \
not chip_id[-1].isdigit() or \
not pin.startswith("gpio") or \
not pin[4:].isdigit():
raise self.server.error(
f"Invalid Gpio Pin: {pin_name}")
pin_id = int(pin[4:])
return pin_id, chip_id,
pin_id = int(pin[4:])
可知最后只返回 gpio3
的数字 3
line = chip.get_line(pin_id)
可知最后读取的是 Line 号而非 GPIO 号
至此正式确认格式为 gpiochip0/gpio3
,默认为 gpiochip0
可省略。我们写个小程序测试一下:
import gpiod
chip=gpiod.Chip('gpiochip0')
line = chip.get_line(3)
line.request(consumer='moonraker', type=gpiod.LINE_REQ_DIR_OUT)
提示 Permission Denied
(权限不足),使用 sudo 执行 python 成功。此时再回头去看 moonraker.log,以 gpio
为关键词搜索,同样发现权限不足的问题,至此我们找到了新思路。
Stage 2、修复权限不足问题
我们查看树莓派 FluiddPi_OS 的是如何设置的:
ls -l /sys/class/gpio/
# 查看用户组
cat /etc/group
# 查看当前用户所在组
id $user
# OR
groups
可以看到树莓派中,gpiochip 所在 gpio 组,且 pi 用户在此用户组中。依此修复权限不足的问题
# 我们不建议把用户添加到root组,所以新建gpio组添加当前用户进去,重新登录 (Relogin) 生效
sudo su
groupadd gpio
gpasswd -a fly gpio
#####################################################
# 不建议使用usermod,会覆盖辅用户组
# sudo usermod -a -G gpio $user
# usermod -a -G tty,disk,dialout,sudo,audio,gpio,fly,plugdev,users,systemd-journal,input,netdev,ssh,mnrkrsudo $user
# chown -R root:gpio /sys/class/gpio 似乎不需要
#####################################################
# 添加 /etc/udev/rules.d/60-gpiod.rules
# sudo bash -c '' # https://www.cnblogs.com/sparkdev/p/10287164.html
cat << _EOF_ > /etc/udev/rules.d/60-gpiod.rules
# udev rules for gpio port access through libgpiod
SUBSYSTEM=="gpio", KERNEL=="gpiochip[0-4]", GROUP="gpio", MODE="0660"
_EOF_
# 重启 moonraker 并验证是否成功,relog?
systemctl restart moonraker
cat /sys/kernel/debug/gpio
注意:
- 如上图所示,我们可以使用 Moonraker 通过
FAN
引脚控制 LED 灯珠亮灭。
- MPU FAN 线序与我手里的风扇不一样,左(-)右(+),如果你的风扇不转的话可以看下线序。
be之间等同个二极管 会有0.3V压降 1k电阻上再降点
输出电压不高于3.3v,带不动5v风扇,只能常开使用。
参考:
2.3.4 MPU FAN 电压问题之研究
查看上面的原理图,理论上风扇接口的电压变化应该是0-5v,但示波器显示实际为1.629~2.845v。其使用 A3400 N-MOS,查看手册可知 Vgs (th) 最大值为1.45v,FAN
引脚高电平时,Vgs = 3.3v,N-MOS 导通,然后 Vg=3.3v,Vs=5v,Vgs 处于不稳定状态。具体参考孙老师的视频:
看完就明白为什么会这样了。
2.4 可用 MPU GPIO 汇总
当所有 overlay 关闭时,对应的引脚为 unused
状态,亦即 GPIO(General Purpose Input Output,通用输入输出),对应引脚可用作 GPIO 引脚使用。
2.4 MPU 控制信号按钮
MPU 有两个按钮,功能分别是 UBOOT
(左侧) 和 AP-RESET
(右侧)。其中 AP-RESET 相当于电脑的强制重启,一般情况下不建议使用。
UBOOT |
烧录按键 |
刷机时使用此按键 |
AP-RESET |
系统复位按键 |
当系统出现死机或者其他异常时,置低AP-RESET 信号大于300ms,系统会强制重启。 |
2.5 MCU EXP1 和 EXP2
兼容 Ramps 引脚顺序,但是我手中的 MKS 屏幕与 Gemini 主板的开口方向相反,建议大家购买主板配套屏幕。
备注:
- 无法直接控制屏幕上的蜂鸣器
- EXP2 连接 MCU 硬件 SPI2
- ramps 中的
LCD-R/G/B
三个引脚应该是控制三色通道灯珠用的,目前常见的 miniRGB 屏采用 WS2812 灯带,使用SPI协议通讯,所以不影响使用
2. MCU BOOT1 引脚复用的问题
感谢群友 ↖ǒ↗ (630559633)
的提醒。现状:
-
BOOT1 可用于 3.3v serial 为主板烧录固件时置低使用
-
BOOT1 同时连接到 X 电机驱动的 EN
使能引脚
驱动的 EN 引脚低电平或者悬空时,可以正常移动电机;高电平时电机锁死。
-
BOOT1 作为 HID-BootLoader 的激活引脚,低电平启动 Application,高电平进入 BootLoader。
我们首先分析一下除了 X 其他电机电路部分:
-
MCU 设置 EN 为输出接口,输出高低电平,经过 N-MOS 来调节电机驱动 EN 引脚的高低电平。
在 Klipper 配置文件 printer.cfg 的 [stepper_]区域,通过 enable_pin:
来设置输出电平,默认为高电平,为了能转动电机,常添加 !
。
-
X 的 使能被跳帽强行拉高或者拉低,特别在拉低的时候,不过求证石总,此时并没有短路。那也因此失去了设置 EN 的能力。
-
此外,Klipper Boot1 悬空会默认输出低电平
- CAN模块的测试使用
- 为 MPU 添加硬件关机按钮以及屏幕关机命令
- 启用 USB-OTG 虚拟串口功能