---
title: 固件
description: 给控制板刷上 FluidNC——一条命令（`physiclaw flash`）或手动浏览器流程——以及它会加载的配置文件。
---

PhysiClaw 硬件通过 [FluidNC](https://github.com/bdring/FluidNC) 固件与电脑通信：电脑用 [G-code](https://en.wikipedia.org/wiki/G-code)（GRBL 协议）发送指令，控制电机转动和电磁铁开关，完成点击和滑动等手势。

## 准备工作

- [MKS DLC32 V2.1](https://github.com/makerbase-mks/mks-dlc32) 控制板。
- USB-B 转 USB-A 数据线。
- 12 V 2 A 电源。
- Chrome 浏览器（仅下面的手动方式需要）。

你可以用一条命令烧录 FluidNC，也可以通过 FluidNC 网页安装器手动烧录。

## 命令行烧录（推荐）

通过 USB 连接控制板（接通 12 V 电源、**断开步进电机**），然后运行：

```bash
physiclaw flash
```

:::tip
若 `physiclaw flash` 执行成功，即可跳过下面的步骤。
:::

## 手动烧录

<Steps>

1. **给控制板上电。** 接 **12 V** 电源，用 **USB** 串口线连接到电脑。

2. **打开安装器。** 在 Chrome 里打开 [FluidNC 网页安装器](https://installer.fluidnc.com)。页面会显示两个产品——在 **FluidNC** 下点击 **Continue**。

3. **连接控制板。** 点击 **Connect**。弹出的对话框会列出可用串口。选 **USB Serial**，点击 **Connect**。

4. **进入 Install。** 出现 Home 页。点击左侧栏的 **Install**。

5. **选择固件变体。** 从下拉里选最新版本。会出现三个变体，选择 **`noradio`**。

6. **选择安装类型。** 选择 **fresh-install**。

7. **确认。** 弹出确认框。确保 **Installation speed** 是 **115200 baud**，然后点击 **Install**。

8. **等待。** 出现进度条，等待完成。

9. **安装完成。** 一个 "Done" 对话框确认完成。点击 **Continue**。

10. **打开 File browser。** Home 页会显示红色的 **"invalid configuration"** 警告，这是因为控制板已经刷入固件，但还没有配置。点击左侧栏的 **File browser**。

11. **创建配置文件。** File browser 会提示你创建一个。点击 **Create config**；弹出的对话框里 `config.yaml` 已预填为文件名。点击 **OK**。

12. **打开 Source 标签页。** 编辑器停在 **General** 标签。点击最右侧的 **Source** 标签。

13. **粘贴配置。** 全选已有文本，删掉，再把下面[配置文件](#配置文件)一节的**全部内容**粘进去。

14. **保存。** 点击 **Save**。

15. **进入 Terminal。** 点击左侧栏的 **Terminal**。

16. **重启控制板。** 点击红色的 **Restart** 按钮。控制板重启并打印启动日志。

17. **验证。** 每条消息都应当是**绿色**的，最后一行应为 `<Idle|...>`——说明刷入固件并配置成功。

</Steps>

## 配置文件

命令行烧录会自动帮你刷入；手动烧录则需在第 13 步粘贴。FluidNC 配置：

```yaml
# FluidNC config — MKS DLC32 v2.1 — CoreXY + Solenoid
# Comments ONLY on their own lines (FluidNC YAML subset rule)
# Tune: steps_per_mm, max_travel_mm, acceleration, direction pins

board: MKS-DLC32 V2.1
name: PhysiClaw

# I2S bus — hardwired on DLC32 v2.1, do not change
i2so:
  bck_pin: gpio.16
  data_pin: gpio.21
  ws_pin: gpio.17

# I2S_STATIC only — I2S_STREAM causes drift on this board
stepping:
  engine: I2S_STATIC
  idle_ms: 250
  pulse_us: 4
  dir_delay_us: 1
  disable_delay_us: 0

kinematics:
  corexy:

axes:
  shared_stepper_disable_pin: I2SO.0

  x:
    # Tune: (motor_steps x microsteps) / mm_per_rev
    # e.g. 200 x 16 / 40mm (20T GT2) = 80
    steps_per_mm: 80.000
    max_rate_mm_per_min: 10000.000
    acceleration_mm_per_sec2: 1000.000
    # Set max_travel_mm to your actual X travel
    max_travel_mm: 200.000
    soft_limits: false

    motor0:
      hard_limits: false
      stepstick:
        step_pin: I2SO.1
        # Add :low after I2SO.2 if X runs backwards
        direction_pin: I2SO.2:low

  y:
    steps_per_mm: 80.000
    max_rate_mm_per_min: 10000.000
    acceleration_mm_per_sec2: 1000.000
    # Set max_travel_mm to your actual Y travel
    max_travel_mm: 200.000
    soft_limits: false

    motor0:
      hard_limits: false
      stepstick:
        step_pin: I2SO.5
        # Add :low after I2SO.6 if Y runs backwards
        direction_pin: I2SO.6:low

PWM:
  pwm_hz: 1000
  output_pin: gpio.32
  enable_pin: NO_PIN
  direction_pin: NO_PIN
  disable_with_s0: false
  s0_with_disable: true
  spinup_ms: 0
  spindown_ms: 0
  tool_num: 0
  speed_map: 0=0% 1000=100%
  off_on_alarm: true

start:
  must_home: false
```
