news 2026/9/16 11:24:08

QMK 中 ai03 Soyuz 单 PCB 数字小键盘固件:键盘配置解析与键位定制实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QMK 中 ai03 Soyuz 单 PCB 数字小键盘固件:键盘配置解析与键位定制实战

QMK 中 ai03 Soyuz 单 PCB 数字小键盘固件:键盘配置解析与键位定制实战

【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware

QMK 固件仓库中的ai03/soyuz是一款单 PCB(single-PCB)数字小键盘(numpad kit)的官方键盘定义,由 ai03 Design Studio 维护,基于 Atmel ATmega32U4 微控制器。本篇以 keyboards/ai03/soyuz/readme.md 为出发点,结合 keyboards/ai03/soyuz/keyboard.json 与两份随附键位文件,完整讲清这款键盘的硬件配置、矩阵引脚、两种内置布局宏、默认数字键盘键位的含义,以及如何仿照仓库现成示例编写自定义键码(custom keycode)——读完后你可以独立完成make ai03/soyuz:default编译,并理解每个配置项在构建系统中的实际作用。

一、键盘概况与维护信息

原 readme 中给出的基本事实如下:

  • 键盘类型:single-PCB numpad kit(单 PCB 数字键盘套件);
  • 维护者:ai03(QMK 目录位于 keyboards/ai03/readme.md 所述的 ai03 定制 PCB 系列中);
  • 硬件支持:Soyuz PCB;
  • 硬件获取:多家厂商渠道,清单以 PCB 仓库为准。

从 keyboards/ai03/soyuz/keyboard.json 可以看到更精确的硬件身份标识:

"usb": { "vid": "0xA103", "pid": "0x0018", "device_version": "0.0.1" }, "processor": "atmega32u4", "bootloader": "atmel-dfu", "manufacturer": "ai03 Design Studio"

这些字段的含义可参照 docs/reference_info_json.md:keyboard_name/manufacturer会作为 USB 产品/厂商字符串上报给主机;processorbootloader决定编译工具链与烧录方式(AVR 工具链 + ATmega DFU);vid/pid则是主机识别该键盘设备的唯一依据。由于使用atmel-dfu引导加载器,刷写流程可参考 docs/flashing.md 中针对 AVR DFU 的说明(qmk flashdfu-util均可)。

二、编译命令与构建环境

原 readme 给出的构建入口命令是:

make ai03/soyuz:default

其中ai03/soyuz是键盘路径,default是键位名,对应 keyboards/ai03/soyuz/keymaps/default/keymap.c。QMK 的构建规则会自动把keyboards/ai03/soyuz/下的keyboard.json解析为编译参数(这是 QMK 数据驱动配置机制,详见 docs/reference_info_json.md),无需再手写rules.mkconfig.h

构建环境准备与 make 用法请分别参考仓库文档 docs/getting_started_make_guide.md、docs/getting_started_docker.md(Docker 方式)以及新手总入口 docs/newbs.md。若只想了解键盘本身有哪些功能选项,还可以运行make ai03/soyuz:default:help查看该键盘可用的 feature 开关。

三、矩阵配置:5 行 × 4 列与 COL2ROW 二极管方向

keyboard.json中的矩阵引脚定义:

"matrix_pins": { "cols": ["F4", "B3", "D7", "B5"], "rows": ["D4", "C6", "B6", "E6", "B4"] }, "diode_direction": "COL2ROW"

即 4 列(F4/B3/D7/B5)× 5 行(D4/C6/B6/E6/B4)共 20 个矩阵位置,二极管方向为COL2ROW(列驱动、行检测)。引脚命名F4B3等是 ATmega32U4 的端口/引脚表示法。矩阵扫描原理可参阅 docs/how_a_matrix_works.md。

该键盘在features中声明了:

"features": { "bootmagic": false, "command": true, "extrakey": true, "mousekey": true, "nkro": true }
  • command: true:启用命令模式,其中就包括MAGIC_KEY_NKRON键切换 N-Key Rollover),见 docs/features/command.md;
  • extrakey: true:启用KC_LCTLKC_LSFT等修饰/控制键与KC_P*数字小键盘键码;
  • mousekey: true:启用鼠标键;
  • nkro: true:编译期默认开启 NKRO,绕开 AVR 双列按键的固件模拟滚转限制(AVR 双列硬件下通常只能达到 2KRO,NKRO 通过固件手段提升滚转能力);
  • bootmagic: false:关闭 Bootmagic 恢复键(进入 DFU 的方式改为command模式下的R键或 RESET 键)。

另外qmk.locking被显式开启:

"qmk": { "locking": { "enabled": true, "resync": true } }

含义是启用锁键(Caps Lock 等)支持,并在连接时以物理开关状态重新同步锁键 LED 状态,字段语义同样定义在 docs/reference_info_json.md 的qmk一节。对数字键盘这类常用 Caps Lock 的设备,这一默认开启是合理的。

四、两种内置布局:ortho_5x4 与 numpad_5x4

keyboard.json声明了"community_layouts": ["ortho_5x4", "numpad_5x4"],并定义了各自的LAYOUT_*宏。两者都由 20 个矩阵坐标构成,但物理形状不同:

  1. LAYOUT_ortho_5x4:标准 5 行 × 4 列正交布局,每个键位都是 1U,x/y与矩阵[row, col]一一对应;
  2. LAYOUT_numpad_5x4:按标准数字键盘形态排布的布局宏,其中包含宽/高键位:
{"matrix": [2, 3], "x": 3, "y": 1, "h": 2}, {"matrix": [4, 1], "x": 0, "y": 4, "w": 2}, {"matrix": [4, 3], "x": 3, "y": 3, "h": 2}

从源码结构看,w: 2表示该键占 2U 宽(对应数字键盘的0键),h: 2表示占 2U 高(对应+Enter键)。该布局在 QMK Configurator 的可视化界面中会以正确的物理比例展示,而LAYOUT_ortho_5x4则用于纯网格视图;两份键位文件当前都采用LAYOUT_ortho_5x4书写。

五、default 键位:标准数字键盘键码

仓库随附的 default 键位(keyboards/ai03/soyuz/keymaps/default/keymap.c)完整内容如下:

#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ortho_5x4( /* Base */ KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_P1, KC_P2, KC_P3, KC_PENT, KC_P0, KC_P0, KC_PDOT, KC_PENT ) };

要点解析:

  • PROGMEMkeymaps[][MATRIX_ROWS][MATRIX_COLS]是 QMK 键位表的标准声明方式:行数为 5、列数为 4,来自keyboard.jsonmatrix_pins
  • 所有键码均为KC_P*系列数字小键盘键码(KC_P0KC_P9KC_PDOTKC_PENTKC_PPLSKC_PMNSKC_PASTKC_PSLS)与KC_NUM(Num Lock 切换),完整列表见 docs/keycodes.md;
  • 布局上第一行是NUM / ÷ / × / −,底部两列是横跨两键位的0Enter(在 1U 矩阵宏中各占一个键位,与真实 PCB 的 2U 物理键一一对应)。

六、1U 键位示例:自定义键码与 process_record_user

仓库还提供了一个1U键位(keyboards/ai03/soyuz/keymaps/1U/keymap.c),它是最有教学价值的部分——展示了如何为 Soyuz 这类小键盘增加自定义行为。完整键位表与处理函数:

enum custom_keycodes { DBLZERO = SAFE_RANGE }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ortho_5x4( /* Base */ KC_NUM, KC_PSLS, KC_PAST, KC_BSPC, KC_P7, KC_P8, KC_P9, KC_MINS, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_P1, KC_P2, KC_P3, KC_EQL, DBLZERO, KC_P0, KC_PDOT, KC_PENT ) }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case DBLZERO: if (record->event.pressed) { SEND_STRING("00"); } break; } return true; }

这段代码示范了三个 QMK 核心机制:

  1. SAFE_RANGE起始的自定义键码枚举DBLZERO = SAFE_RANGE确保自定义键码从安全数值起分配,避免与 QMK 内置键码冲突;
  2. process_record_user钩子:每个按键事件都会经过该用户函数,record->event.pressed为真表示按下瞬间,返回true表示事件已被处理、不再走默认行为;
  3. SEND_STRING发送字符串:此处按下DBLZERO键即向系统发送00两个字符,等价于数字键盘上宽0键的“双击”语义。SEND_STRING的用法与限制见 docs/features/send_string.md。

与 default 键位的差异还体现在把部分修饰位置替换成了KC_BSPCKC_MINSKC_EQL等编辑类键码,说明该键位面向的是“在 1U 网格上更侧重编辑操作”的使用习惯。编译时通过make ai03/soyuz:1U即可产出该键位固件。

七、构建产物与刷写流程小结

结合上述信息,完整工作流为:

  1. 准备 QMK 构建环境(make 工具链或 Docker,见 docs/getting_started_make_guide.md);
  2. make ai03/soyuz:default生成固件(AVR 编译产物为.hex,可用make ai03/soyuz:default:flashqmk flash烧录);
  3. 进入 DFU 模式的方式:由于bootmagic关闭,可通过命令模式(command: true)按R键触发 DFU 重启,或短接 RESET 引脚;
  4. 主机侧以 VID0xA103、PID0x0018识别该设备。

需要定制时,推荐的做法是复制keymaps/default目录为新键位、修改keymap.c中的LAYOUT_ortho_5x4(...)参数,然后以make ai03/soyuz:<新键位名>编译;布局宏的物理映射关系始终以 keyboards/ai03/soyuz/keyboard.json 中的layouts定义为唯一事实来源。

参考资料(仓库内路径)

  • 键盘定义与 readme:keyboards/ai03/soyuz/readme.md、keyboards/ai03/soyuz/keyboard.json
  • 键位实现:keyboards/ai03/soyuz/keymaps/default/keymap.c、keyboards/ai03/soyuz/keymaps/1U/keymap.c
  • 文档:docs/reference_info_json.md(keyboard.json 字段)、docs/keycodes.md(键码)、docs/features/command.md(命令模式)、docs/features/send_string.md(SEND_STRING)、docs/how_a_matrix_works.md(矩阵原理)、docs/flashing.md(刷写)、docs/newbs.md(新手指南)

【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 11:21:43

OpenSandbox元数据存储架构:SQLite本地存储与快照记录管理

OpenSandbox元数据存储架构&#xff1a;SQLite本地存储与快照记录管理 【免费下载链接】OpenSandbox Secure, Fast, and Extensible Sandbox runtime for AI agents. 项目地址: https://gitcode.com/GitHub_Trending/ope/OpenSandbox OpenSandbox 是一个面向 AI Agent 的…

作者头像 李华
网站建设 2026/9/16 11:21:27

Android音频框架:AudioTrack原理与最佳实践

1. Android音频框架与AudioTrack概述在Android系统中&#xff0c;音频播放功能主要由AudioTrack类实现&#xff0c;它提供了将PCM音频数据从应用层传输到音频硬件的完整通路。作为Android音频框架的核心组件之一&#xff0c;AudioTrack的工作流程跨越了Java层、JNI层、Native层…

作者头像 李华
网站建设 2026/9/16 11:17:04

企业微信API单聊和群聊消息怎么区分?

在进行星云企业微信二次开发的过程中&#xff0c;让机器人实现自动问答和工单流转是最基础的业务场景。但在实际的客户服务中&#xff0c;我们经常会遇到这样一个问题&#xff1a;机器人既在单聊中服务客户&#xff0c;又被拉进了各种 VIP 专属服务群。 当系统同时接收到海量的…

作者头像 李华
网站建设 2026/9/16 11:14:09

C++命令模式实战:从基础实现到高级应用

1. 命令模式&#xff1a;从理论到实战的跨越第一次接触命令模式是在重构一个老旧的C游戏引擎时。那个项目里充斥着这样的代码&#xff1a;if (input A) player.moveLeft(); else if (input D)...。当我需要添加新操作时&#xff0c;不得不修改这段已经超过300行的输入处理函数…

作者头像 李华
网站建设 2026/9/16 11:13:19

开关电源损耗本质:一张贯穿设计与失效的诊断地图

1. 为什么开关电源的“损耗”不是个技术参数&#xff0c;而是一张故障诊断地图&#xff1f;“开关电源中的损耗有哪些&#xff1f;”——这个问题看似简单&#xff0c;但几乎所有刚接触电源设计的工程师、维修技师甚至资深硬件爱好者&#xff0c;第一次认真拆解它时都会掉进同一…

作者头像 李华