pATAq 发表于 2021-12-15 15:18:06

跟着思兼学习Klipper(06) 学用 Fly-Gemini 3D打印机控制板

## 思兼的 Fly-Gemini 硬件简明使用手册(探索版 v1.2)

## 前言

原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎交流指正。

请访问 [**原文链接**](https://mc.dfrobot.com.cn/thread-311661-1-1.html?fromuid=725344) 以获得文章更新。

这篇为什么叫探索版呢,其实就是自己使用过程中记录的流水账,是 `发现问题` - `查阅探索` - `找到答案` 的过程,对于大多数人来说,可能看一下结论就可以了。

本文中我们约定,运行 Linux 的部分称为 MPU,运行 Klipper 固件的部分称为 MCU。关于主板方向,以驱动朝上为正。

本手册内容比较繁杂,尽量先简介开机上电运行 Klipper 的整个理想流程,然后再对于具体细节做介绍。

最重要的是请先阅读官方说明书,除了部分内容我觉得可以补充的,其余就不再赘述。
**【2021年12月19日更新】**

* 修正 adxl345 CS 引脚,优化关机按钮修复脚本路径
* 更正:MCU 部分引脚是 `5V tolerant`,在手册中`Pinouts and pin description` 部分可以看到,FT = 5V tolerant, TT = 3.6V tolerant,[参考](https://www.eevblog.com/forum/microcontrollers/stm32-nucleo-gpios-5v-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 模块,需要进行电平转换。参考 (https://learn.sparkfun.com/tutorials/adxl345-hookup-guide/all) 。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112212227839.png)

**【2021年12月26日更新】**

* 探讨 MPU FAN 电压输出问题的原因
* 探讨 BOOT1 引脚复用问题**【重要】**
* 由于 hub.fastgit.org 离线,更换加速镜像地址,否则安装相关软件包时会报错

## 内容介绍

* 使用 Gemini UART 接口自烧写 MCU BootLoader
* 介绍 MPU GPIO 资源的使用
* 介绍 MPU 的一些硬件资源
* 优化 Armbian 并修复部分问题

## 主板的一些情况与问题

1. 全部信号引脚均为 **3.3V 电平**,实际略低,输出电流较小,不适合大负载。
2. MPU 和 MCU 供电是一起的,无法独立使用。注意 MPU 运行 Linux,相当于一台电脑,**不要频繁强制断电**,会损坏系统及硬件。
3. USB-OTG 为以太网接口旁边上方的 USB0 接口,需要拉高 `USB ID` 引脚,并启用 `usbhost0` overlay。
4. 原理图 SPI 端子座引脚顺序(5v-GND-I2C)与主板丝印顺序(5v-IO-GND)冲突,原理图正确。
5. I2C 的数据脚和时钟脚分在两个端子座上,应该是 I2C1,如是则 overlay 启用错误。
6. `Core FAN` 引脚为 左(-)右(+)和有的风扇的线序相反(比如我的)。此外,此引脚输出为最大为 3.3v 不到,带不动5v风扇,建议接常开风扇
7. 如果使用 MKS 屏幕,其 EXP1 和 EXP2 开口方向与此主板相反,使用屏幕建议购买各主板的配套设备,否则注意线序进行必要修改。

## 0、Fly-Gemini 3D打印机控制主板介绍

* 产品链接 | (https://item.taobao.com/item.htm?id=661670024975)
* 资料镜像地址 | (https://hub.fastgit.org/Mellow-3D/Fly-Gemini),包括主板原理图与拨码开关使用说明
* 官方 QQ 群:786561979

Fly-Gemini(以下简称 Gemini)是 Fly3D(Mellow)新推出的将 MPU 和 MCU 整合到一起的新 3D打印机主板,支持 Klipper 与 RRF 固件,尤其是对于 Klipper 这种需要上位机进行计算的新固件意义重大,由于比较新颖,优点和缺点皆有之。

**硬件规格:**

* MPU:Allwinner H5 4 核 | (https://linux-sunxi.org/H5)
* 内存: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 可控风扇

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140136734.png)

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140135541.png)

## 1、理想使用流程

为了防止劝退新手,先把基本剧本顺一遍,走一遍流程。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140126911.png)

【部分接口分布图】有些是我参考主板原理图和测试出来的。

## 1.1 供电

主板 MPU 和 MCU 是同时供电的,无法独立供电,方式包括 `MPU Type-C`、`MCU Type-C`、`端子` <u>**三种**</u>方式。和树莓派一样,由于 GPIO 区域的引脚一般不存在保护电路,我不推荐通过引脚反向供电的方式(Fysetc Spider 支持该选项),除非你能保证反向供电的电压电流总是稳定可靠。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140139298.png)

> 1. 主板启动过程最大电流约 0.5A(MPUType-C供电,无线网连接状态)
> 2. MPU 信号电平为 3.3v
>

## 1.2 烧录系统镜像

1. 从官方QQ群或者 GoogleDrive 下载系统镜像,文件名:`FLY-Gemini_Armbian_21_12_8_server.img.xz` 。

2. 下载并打开系统烧录工具:(https://gitlab.com/bztsrc/usbimager) 或者 (https://balena.io/etcher/) ,这里以更轻巧的 USBImager 为例。
3. 插入 microSD 卡(8GB 以上即可),如果烧录失败可以先使用 `SDFormatter` 格式化

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20210812154217.png)

4. 将 SD 卡插入 MPU 的 SD 卡插槽,`MPU Type-C` 另一头连接到电脑,根据官方文档操作即可。远程管理工具以免费强大的 (https://mobaxterm.mobatek.net/)为例。

## 1.3 Armbian 优化设置与常见问题解决(重要)

粗看了一眼官方系统,有些地方需要优化,同时还有一些常见问题没有解决。

```shell
#!/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

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】可以参考 [该方法](https://www.jianshu.com/p/6d45af6d8966):`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')`

**优化后效果**:

1. 支持 Fly-Gemini.local 访问设备
2. 支持输入 `lid` 命令查看串口设备,`k` 启动 `kiauh`
3. **【重要】**修复 Fluidd 网页无法使用右上角命令关机/重启 MPU 的问题
4. 加速 git/pypi/apt 下载加速,减少因网络超时导致安装失败等问题
5. 优化 Fluidd 以及摄像头支持包 MJPG-Streamer 配置文件的链接地址,防止下载超时失败
6. 修复环境变量导致的部分命令无法使用的问题
7. 修复可能的权限导致串口设备访问失败的问题
8. 支持切换到 Klipper Python3 运行环境,解决新版本不支持中文名称 Gode 文件的问题,具体请移步 [此链接](https://mc.dfrobot.com.cn/thread-311545-1-1.html?fromuid=725344)。

> 此外可以切换使用我 [自编译的 Fluidd 开发版本](https://mc.dfrobot.com.cn/thread-311596-1-1.html?fromuid=725344),补全了中文本地化翻译,支持更流畅的摄像头视频流方式。

至此,可以愉快使用 Klipper 了。

## 1.4 Klipper 配置与启动

参考官方文档,为 MCU 刷入 Klipper 固件,参数设置如下图所示。编译成功后,下载 `klipper.bin` 重命名为 `firmware.bin`(可选)并拷贝到格式化为 **FAT32文件系统** 的 microSD 中,插入 `MCU SD卡槽` 后按下 `MCU Reset键` 5s 左右,重新把 microSD 卡插入电脑,看到文件重命名为 `fly.cur` 则代表刷入新固件成功。查看说明书,将拨码开关 `3/4` 调到 `ON`。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140233554.png)

如果想对 Fly-Gemini 进行脱机测试,请至少接入挤出头的温敏电阻。这里附上我写的 Gemini MCU 引脚文件,配合我的 `Klipper-Box` 项目使用。

```yaml
#####################################################################
#   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
#####################################################################

# 【重要】插拔主板前后通过 "ls -l /dev/serial/by-id/*" 命令,确认正确的通讯地址
serial: /dev/serial/by-id/usb-Klipper_stm32f405xx_29002A000450314335393220-if00
restart_method: command


sensor_type: temperature_mcu
sensor_mcu: mcu


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 常见问题的解决步骤。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140240544.png)

```shell
# 遇到问题请附上 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](https://mc.dfrobot.com.cn/thread-311525-1-1.html?fromuid=725344)、[番外23-UART通讯设置与stm32线刷方法|3](https://mc.dfrobot.com.cn/thread-311527-1-1.html?fromuid=725344)、(https://shequ.stmicroelectronics.cn/forum.php?mod=viewthread&tid=612782)。画张图示意如下:

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112151215586.png)

如图所示,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` 接口。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140324231.png)

### 2.1.1 使用 USB-TTL 模块刷写 Bootlaoder

我们先尝试群主推荐的 USB-TTL 模块烧写 BL,注意主板信号电平为 3.3v,且不建议连接 VCC 引脚。

1. 主板上 BOOT0-置高(插上跳帽),BOOT1-置低(跳帽短接GND)

2. 按住 `MCU-RESET` 5s左右,重启 MCU 进入 3.3v Serial 烧写状态

3. 从 QQ 群下载 `bootloader.bin` 放入 stm32flash 文件夹

4. 使用以下命令烧录 BL:

   ```shell
   # 查看设备信息
   sudo stm32flash /dev/ttyUSB0
   # 烧录 Fly BL
   sudo stm32flash -w bootloader.bin -v -g 0
   # .\stm32flash.exe -w bootloader.bin -v -g 0
   # 也可以使用 3.3v serial 直接烧录 Klipper 固件,起始地址 0x08000000,编译固件时选择 Bootloader offset (No bootloader)
   # sudo stm32flash -w ~/klipper/out/klipper.bin -v -g 0 /dev/ttyUSB0
   ```

5. 主板上 BOOT0-置低(拔除跳帽),BOOT1-置低(跳帽短接GND),会自动重启 MCU

6. 此时可通过 SD 卡更新 Klipper 固件了

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140330812.png)

【使用 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)。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211213040621.png)

#### UART1 - UART2

分别对应 /dev/ttyS1 和 /dev/ttyS2,查看 ARMBIAN 配置文件可知默认启用 `uart1` 。

```shell
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

```

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211213040330.png)

查看原理图,uart1 和 uart2 位于左上角,最后测试发现左侧那个为 uart1,原来我参考原理图猜测右侧那个为 uart1,终究是错付了。如果想启用 uart2,添加相应的 overlay 即可。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140341424.png)

#### UART3 与 SPI1

参考上方很奇怪的一点,UART3 和 SPI1 是共用引脚的,SPI1 缺少 `CS` 和 `CLK` 引脚。查阅 (https://linux-sunxi.org/File:Allwinner_H5_Manual_v1.0.pdf)P57 可知 SPI1 和 UART3 引脚复用,通过 overlay 切换。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140351959.png)

### 使用 UART1 烧录固件

我们制作连接线,我端子用镊子压的,效果不好,凑活使用吧。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140354614.png)

如上图所示进行接线,不连接 VCC 引脚,方法同上。当然也可以使用 UART1 与主板 Klipper 固件通讯。

```shell
# 查看设备信息
sudo stm32flash /dev/ttyS1
# 烧录 Fly BL
sudo stm32flash -w bootloader.bin -v -g 0 /dev/ttyS1
```

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211213053314.png)

### 2.1.3 使用 USB 刷写固件

因为我测试的时候需要频繁刷写固件,使用 SD 卡频繁插拔太麻烦,所以 USB 线刷是更方便的方法,具体参考我之前的文章:(https://mc.dfrobot.com.cn/thread-311527-1-1.html?fromuid=725344) ,使用 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`

* **** | 音频相关,默认开启,可以关闭
Activates SoC analog codec driver that provides Line Out and Mic In functionality

* **** | 启用 USB-OTG

Activates USB host controller 0,所以我们猜测不能用的那个上面的就是 USB0-OTG。也就是我图中插无线网卡的接口。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211213035227.png)

配套的还有 `USB ID` 引脚,配合 overlay 启用 usb-otg 功能,需要测试验证。

> USB_ID pin 为低电平时,则设备为host模式。比如PC和支持OTG设备做主设备时。USB_ID pin 为悬空(高电平)时,则设备为device模式。比如U盘和支持OTG设备做从设备时。

* **** | 启用硬件 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` 加速度计设置:

```yaml

serial: /tmp/klipper_host_mcu

# Fly-Gemini,#待验证

cs_pin: host:gpiochip1/gpio67
spi_bus: spidev0.0
axes_map: x,y,z


# 探测点,建议放在热床中心上方,一行一个,注意安全位置
probe_points:
    120,120,20
accel_chip: adxl345
min_freq: 30
max_freq: 100
```

* **** | I2C接口,总共有3路

i2c2:多用于连接摄像头 CSI 接口。

原理图上引出 `I2C1`,引脚位置还分开的。。。另外默认启用 `I2C0`,但是我没找到引脚在哪。一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。

## 2.3 MPU FAN 与 GPIO 控制

主板引出一路 MPU 风扇接口位于右上方,可以通过短接 `NC FAN` 引脚切换常开(Normal Close)和可控。 不短接就是由 `FAN(GPIOL3)` 引脚控制。是用了一个 `AO3400场效应管` ,属于电压控制元件,更多信息可以参考 [用MOS管还是三极管?](https://zhuanlan.zhihu.com/p/396355914)

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211213034840.png)

这里介绍一下如何控制该引脚,更多内容可以参考 https://linux-sunxi.org/GPIO。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140422183.png)

#### 2.3.1 使用 sysfs 测试 MPU GPIO

我们查看原理图,发现 `FAN` 引脚为 `GPIOL3`,需要计算其 GPIO 号。全志系列的计算公式为:

```shell
(字母顺序 - 1) * 32 + 引脚号
```

以 GPIOL3 为例,为 (17-1) * 32 + 3 = 355。我们验证一下:

```shell
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。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112140438072.png)


cat /sys/kernel/debug/pinctrl/*/pinmux-pins

#### 2.3.2 使用 libgpiod 测试 MPU GPIO

新版 Linux 内核更多使用 `libgpiod` 来操作 GPIO,更多信息可参考 (https://www.ics.com/blog/gpio-programming-exploring-libgpiod-library)。

```shell
sudo apt-get install gpiod
# 识别 gpiochip 芯片
gpiodetect
# 查看 gpio 引脚信息
gpioinfo
# 输出结果如下
fly@Fly-Gemini:~$ gpiodetect
gpiochip0 (32 lines)
gpiochip1 (224 lines)
fly@Fly-Gemini:~$ gpioinfo
gpiochip0 - 32 lines:
      line   0:      unnamed       unused   inputactive-high
      line   1:      unnamed       unused   inputactive-high
      line   2:      unnamed      "power"   input   active-low
      line   3:      unnamed"moonraker"outputactive-high
      line   4:      unnamed       unused   inputactive-high
      line   5:      unnamed   "vcc-io"output   active-low
      line   6:      unnamed       unused   inputactive-high
      line   7:      unnamed       unused   inputactive-high
      ...

# 读取 gpiochip0/gpio6 引脚值
gpioget 0 6
# 设置 gpiochip0/gpio24 输出高电平1s后恢复低电平
gpioset --mode=time -s 1 0 24=1
```

这里我们想操作 FAN 引脚,试图找到我们计算得到的 355 号引脚,但是并没有,有问题,属实有问题,那它肯定有其他名称,如何获悉呢?

```shell
sudo cat /sys/kernel/debug/gpio
```

【图】如图所示,我们得知,gpio-355 属于 gpiochip0 的第 3 个,输入以下命令测试成功。参考:(https://blog.csdn.net/u014248033/article/details/107956182)

```shel
gpioset 0 3=1
```

#### 2.3.3 演示 moonraker 控制 MPU FAN

既往我会使用电源管理模块连接到树莓派 GPIO 引脚上,然后 使用 Moonraker 控制打印机开/关,这里我们准备演示使用 moonraker 控制 `FAN` 引脚。

moonraker 的 [文档](https://moonraker.readthedocs.io/en/latest/configuration/#power) 关于 `power` 部分格式是这么要求的:

```yaml

type: gpio
pin: gpiochip0/gpio17
initial_state: on
```

于是我先后尝试了 `gpiochip0/gpio355` 、 `gpiochip0/gpio3`、 `gpiochip0/gpioL3`,在 Fluidd 有上角**都没有**出现那个熟悉的电闸开关。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112150923422.png)

查看 `moonraker.log` 日志,报错信息如下:

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112142048747.png)

#### Stage 1、首先搜索关键词 `gpiochip0/gpio3` ,提示无法解析。

报错 `Unparsed config option` ,那我们看看源码对格式是怎么要求的,另外到底应该填入的 GPIO 号是什么,355、3 亦或是 L3?翻阅 (https://github.com/Arksine/moonraker/blob/master/moonraker/components/gpio.py) `moonraker/moonraker/components/gpio.py` ,相关代码如下:

```python
# Line 46
                        try:
            chip = self._get_gpio_chip(chip_id)
            line = chip.get_line(pin_id)
            args: Dict = {
                'consumer': "moonraker",
                'type': self.gpiod.LINE_REQ_DIR_OUT
            }

# Line 70
def _parse_pin(self, pin_name: str) -> Tuple:
      pin = pin_name
      invert = False
      if pin == "!":
            pin = pin
            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
      # Verify pin
      if not chip_id.startswith("gpiochip") or \
                not chip_id[-1].isdigit() or \
                not pin.startswith("gpio") or \
                not pin.isdigit():
            raise self.server.error(
                f"Invalid Gpio Pin: {pin_name}")
      pin_id = int(pin)
      return pin_id, chip_id,
```

* `pin_id = int(pin)` 可知最后只返回 `gpio3` 的数字 `3`
* `line = chip.get_line(pin_id)` 可知最后读取的是 Line 号而非 GPIO 号

至此正式确认格式为 `gpiochip0/gpio3` ,默认为 `gpiochip0` 可省略。我们写个小程序测试一下:

```python
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 的是如何设置的:

```shell
ls -l /sys/class/gpio/
# 查看用户组
cat /etc/group
# 查看当前用户所在组
id $user
# OR
groups
```

可以看到树莓派中,gpiochip 所在 gpio 组,且 pi 用户在此用户组中。依此修复权限不足的问题

```shell
# 我们不建议把用户添加到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", GROUP="gpio", MODE="0660"
_EOF_
# 重启 moonraker 并验证是否成功,relog?
systemctl restart moonraker
cat /sys/kernel/debug/gpio
```

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211215010417.png)

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/20211215010644.png)

**注意:**

* 如上图所示,我们可以使用 Moonraker 通过 `FAN` 引脚控制 LED 灯珠亮灭。
* MPU FAN 线序与我手里的风扇不一样,左(-)右(+),如果你的风扇不转的话可以看下线序。
* `be之间等同个二极管 会有0.3V压降 1k电阻上再降点` 输出电压不高于3.3v,带不动5v风扇,只能常开使用。

**参考:**

* (https://github.com/Arksine/moonraker/issues/266)
* (https://github.com/Arksine/moonraker/issues/24)

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112150853772.png)

#### 2.3.4 MPU FAN 电压问题之研究

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112262122126.png)

查看上面的原理图,理论上风扇接口的电压变化应该是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 处于不稳定状态。具体参考孙老师的视频:

* [扔掉教科书 5分钟带你入门MOS管](https://www.bilibili.com/video/BV1Co4y1Q7rN)
* [既然有了nmos 为啥还要pmos](https://www.bilibili.com/video/BV1Mb4y1k7fd)
* (https://www.bilibili.com/video/BV1YP4y147TF)

看完就明白为什么会这样了。

## 2.4 可用 MPU GPIO 汇总

当所有 overlay 关闭时,对应的引脚为 `unused` 状态,亦即 GPIO(General Purpose Input Output,通用输入输出),对应引脚可用作 GPIO 引脚使用。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112151126241.png)

## 2.4 MPU 控制信号按钮

MPU 有两个按钮,功能分别是 `UBOOT`(左侧) 和 `AP-RESET`(右侧)。其中 AP-RESET 相当于电脑的强制重启,一般情况下不建议使用。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112151143971.png)

| UBOOT    | 烧录按键   | 刷机时使用此按键                                             |
| -------- | ------------ | ------------------------------------------------------------ |
| AP-RESET | 系统复位按键 | 当系统出现死机或者其他异常时,置低AP-RESET 信号大于300ms,系统会强制重启。 |

## 2.5 MCU EXP1 和 EXP2

兼容 Ramps 引脚顺序,但是我手中的 MKS 屏幕与 Gemini 主板的开口方向相反,建议大家购买主板配套屏幕。

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112151512253.png)



**备注:**

* 无法直接控制屏幕上的蜂鸣器
* EXP2 连接 MCU 硬件 SPI2
* ramps 中的 `LCD-R/G/B` 三个引脚应该是控制三色通道灯珠用的,目前常见的 miniRGB 屏采用 WS2812 灯带,使用SPI协议通讯,所以不影响使用

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112151516558.png)

## 2. MCU BOOT1 引脚复用的问题

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112262131471.png)

感谢群友 `↖ǒ↗ (630559633)` 的提醒。现状:

* BOOT1 可用于 3.3v serial 为主板烧录固件时置低使用

* BOOT1 同时连接到 X 电机驱动的 `EN` 使能引脚

驱动的 EN 引脚低电平或者悬空时,可以正常移动电机;高电平时电机锁死。

* BOOT1 作为 HID-BootLoader 的激活引脚,低电平启动 Application,高电平进入 BootLoader。

我们首先分析一下除了 X 其他电机电路部分:

* MCU 设置 EN 为输出接口,输出高低电平,经过 N-MOS 来调节电机驱动 EN 引脚的高低电平。

在 Klipper 配置文件 printer.cfg 的 区域,通过 `enable_pin: ` 来设置输出电平,默认为高电平,为了能转动电机,常添加 `!`。

* X 的 使能被跳帽强行拉高或者拉低,特别在拉低的时候,不过求证石总,此时并没有短路。那也因此失去了设置 EN 的能力。

* 此外,Klipper Boot1 悬空会默认输出低电平

!(https://gcore.jsdelivr.net/gh/sjqlwy/blog_imgs@default/images/202112270117833.png)



* CAN模块的测试使用
* 为 MPU 添加硬件关机按钮以及屏幕关机命令
* 启用 USB-OTG 虚拟串口功能

pATAq 发表于 2021-12-20 15:34:59

图崩了,大家先看这个吧

神奇の海螺 发表于 2022-3-2 08:59:36

思兼老师,Gemini的主板支持pwm拓展吗(自带的或者iic拓展pwm版)?我在使用过程中想多几路pwm控制灯光或者电压

pATAq 发表于 2022-3-2 09:16:55

神奇の海螺 发表于 2022-3-2 08:59
思兼老师,Gemini的主板支持pwm拓展吗(自带的或者iic拓展pwm版)?我在使用过程中想多几路pwm控制灯光或者 ...

klipoer支持sx1509拓展模块,16个gpio,支持pwm,走i2c协议。纯信号脚,不用来带负载。你也可以考虑连接额外的mcu来实现你的需求,比如f103最小系统/树莓派pico等

GeeeeK 发表于 2022-6-3 17:17:41

跟着大佬的脚步
页: [1]
查看完整版本: 跟着思兼学习Klipper(06) 学用 Fly-Gemini 3D打印机控制板