2021-12-15 15:18:06 [显示全部楼层]
23962浏览
查看: 23962|回复: 4

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

[复制链接]

思兼的 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 输入脚最好。

内容介绍

  • 使用 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 开口方向与此主板相反,使用屏幕建议购买各主板的配套设备,否则注意线序进行必要修改。
  • 产品链接 | taobao.com
  • 资料镜像地址 | github.com,包括主板原理图与拨码开关使用说明
  • 官方 QQ 群:786561979

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 可控风扇

image-20211214013628463

image-20211214013556278

1、理想使用流程

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

image-20211214012600153

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

1.1 供电

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

image-20211214013910535

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

1.2 烧录系统镜像

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

  2. 下载并打开系统烧录工具:USBImager(100+ KB) 或者 balenaEtcher(100+ MB) ,这里以更轻巧的 USBImager 为例。

  3. 插入 microSD 卡(8GB 以上即可),如果烧录失败可以先使用 SDFormatter 格式化

image-20210812154217806

  1. 将 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' /usr/bin/armbian-config

# 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 --global url."https://hub.fastgit.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

# 6. 更新系统软件包
sudo apt update && sudo apt upgrade -y

# 7. 安装必要组件,注意如果使用 Klipper Python3,可以不安装 python-pip
sudo apt-get install -y avahi-daemon python-pip python3-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
~/moonraker/scripts/sudo_fix.sh
sudo usermod -a -G tty $USER
sudo usermod -a -G dialout $USER

# 10. 设置系统时区
timedatectl set-timezone Asia/Shanghai

# 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 's/githubusercontent.com/fastgit.org/g' kiauh/scripts/install_mjpg-streamer.sh

# 12. 【可选】切换 Klipper Python3
sed -i 's|python2|python3|g' kiauh/scripts/install_klipper.sh

:【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')

优化后效果

  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 文件的问题,具体请移步 此链接

此外可以切换使用我 自编译的 Fluidd 开发版本,补全了中文本地化翻译,支持更流畅的摄像头视频流方式。

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

1.4 Klipper 配置与启动

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

image-20211214023317389

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

image-20211214024042404

# 遇到问题请附上 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 系统使用 lsusbdmesg | tail 命令都无法识别设备。后来发现,不仅没有刷入 Fly BL,也没有ST官方 DFU BL。如此想要刷入 BL 或者 Klipper 固件,只能使用 3.3v Serial。具体参考: 加速度计与输入整形器|1番外23-UART通讯设置与stm32线刷方法|3USB DFU培训。画张图示意如下:

image-20211215121534454

如图所示,STM32的存储包括只读存储器(ROM)和存取存储器(RAM),后者起始地址为 0x08000000,这是基本固定的,可以将 0x08000000 ~ 0x08002000 这 8KB 的空间存放Bootloader 代码。前者可以使用 3.3v serial + stm32flash 工具烧写 BL 和 APP。

0x08002000 8KB
0x08004000 16KB
0x08008000 32KB
0x08010000 64KB

这里我们只能使用 3.3v serial 进行烧录,STM32 默认使用 PA10(Rx)和 PA9(Tx) 引脚,查看原理图发现位于主板下方的 Screen1 接口。

image-20211214032453078

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:

    # 查看设备信息
    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
  5. 主板上 BOOT0-置低(拔除跳帽),BOOT1-置低(跳帽短接GND),会自动重启 MCU

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

image-20211214033011046

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

image-20211213040621794

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

image-20211213040330004

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

image-20211214034132307

UART3 与 SPI1

参考上方很奇怪的一点,UART3 和 SPI1 是共用引脚的,SPI1 缺少 CSCLK 引脚。查阅 H5手册  P57 可知 SPI1 和 UART3 引脚复用,通过 overlay 切换。

image-20211214035130740

使用 UART1 烧录固件

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

image-20211214035425292

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

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

image-20211213053314498

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。也就是我图中插无线网卡的接口。

    image-20211213035227290

    配套的还有 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
  • [i2c] | I2C接口,总共有3路

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

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

2.3 MPU FAN 与 GPIO 控制

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

image-20211213034840385

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

image-20211214042231713

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。

image-20211214043849929

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/gpio355gpiochip0/gpio3gpiochip0/gpioL3,在 Fluidd 有上角都没有出现那个熟悉的电闸开关。

image-20211215092355306

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

image-20211214204821510

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
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 并验证是否成功
systemctl restart moonraker
cat /sys/kernel/debug/gpio

image-20211215010409840

image-20211215010644509

注意:

  • MPU FAN 线序与我手里的风扇不一样,左(-)右(+),如果你的风扇不转的话可以看下线序。
  • be之间等同个二极管 会有0.3V压降 1k电阻上再降点 输出电压不高于3.3v,带不动5v风扇,只能常开使用。

参考:

image-20211215085346513

2.3.2 可用 MPU GPIO 汇总

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

image-20211215112617107

2.4 MPU 控制信号按钮

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

image-20211215114357821

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

2.5 MCU EXP1 和 EXP2

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

image-20211215151230977

备注:

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

image-20211215151613319

预告

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

pATAq  版主
 楼主|

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

图崩了,大家先看这个吧

gemini_review.zip

11.42 MB, 下载次数: 440

回复

使用道具 举报

神奇の海螺  学徒

发表于 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

跟着大佬的脚步
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail