1. 项目缘起为什么选择60%配列与XIAO RP2040如果你和我一样桌面空间有限或者厌倦了每次打字都要大幅度移动手臂那么60%配列的键盘绝对是一个值得尝试的“退烧”选择。它砍掉了数字小键盘、功能键区和方向键区只保留了最核心的字母、数字和部分修饰键通过组合键Layer来实现所有功能。这种极简设计带来的不仅是桌面空间的解放更是一种高效、专注的输入体验。我给自己这个60%键盘项目起名“Purple Owl”紫枭一方面是喜欢紫色带来的神秘与科技感另一方面猫头鹰象征着在黑夜或复杂的代码中也能精准定位这很符合DIY键盘时那种不断调试、寻找问题根源的状态。那么核心控制器为什么是Seeed Studio的XIAO RP2040而不是更常见的Arduino Pro Micro或者专门的开源键盘主控如QMK支持的ATmega32U4系列这里有几个非常实际的考量。首先是成本与性能的极致平衡。XIAO RP2040板载了树莓派基金会那颗大名鼎鼎的RP2040双核ARM Cortex-M0处理器主频133MHz性能远超8位AVR单片机。这意味着你可以运行更复杂的键位逻辑、宏定义甚至在上面跑一些轻量级的自定义程序。而其价格却非常亲民与一块Pro Micro相差无几性价比极高。其次是极致的体积与接口友好度。XIAO RP2040的尺寸只有21mm x 17.5mm比你的大拇指指甲盖大不了多少这为紧凑的60%键盘PCB布局留下了巨大空间。它原生支持USB Type-C接口正反插拔的便利性在2024年的今天已经是刚需。板载的RGB LED和可编程按钮虽然在这个键盘项目中不一定用得上但也提供了额外的扩展可能性。第三也是最重要的一点是开发环境的友好性。RP2040完美支持CircuitPython这是一种基于Python 3的微控制器编程语言。对于键盘固件我们可以直接使用基于CircuitPython的KMK固件。KMK的语法非常直观配置键盘矩阵、定义层、设置组合键就像写Python脚本一样简单完全避免了传统QMK固件需要搭建本地编译环境、学习C语言的陡峭学习曲线。你只需要一个文本编辑器修改一个code.py文件保存后键盘会自动重新加载配置调试效率提升了不止一个量级。最后是社区与生态。Seeed Studio提供了完善的中文文档和社区支持RP2040和CircuitPython在全球都有庞大的用户群遇到问题很容易找到解决方案。这对于一个DIY项目能否顺利从“想法”走到“成品”至关重要。所以“Purple Owl”项目的核心就是利用XIAO RP2040的强大性能和易用性结合60%配列的极简美学打造一把完全个性化、易于二次开发且成本可控的客制化键盘。接下来我将从PCB设计开始带你一步步实现它。2. PCB设计实战从原理图到布局布线的完整流程键盘的PCB是整个项目的骨架它决定了键盘的电气连接、结构强度和最终手感。设计PCB是一个系统工程需要兼顾电气特性、机械结构和生产工艺。我使用国产的立创EDA专业版来完成设计它对个人用户免费且功能强大云端操作也省去了安装软件的麻烦。2.1 原理图设计定义键盘的“神经网络”原理图是PCB的逻辑蓝图。对于键盘核心是按键矩阵。60%标准配列通常有61个键我们不可能为每个键单独拉一根线到主控那样需要67个IO口61个键至少6个其他功能。矩阵扫描的原理是将按键排列成行和列通过扫描行线、读取列线状态来检测哪个键被按下61个键的矩阵可以压缩到仅需17个IO口例如8行9列。在立创EDA中新建原理图创建元件库首先需要创建键盘的专属元件。主要是两种MX轴体的热插拔轴座如凯华或佳达隆的PCB热插拔插座和Type-C接口。可以从立创商城找到对应的元件生成原理图符号和PCB封装。对于轴座注意区分正反面原理图符号要标明引脚1的位置。绘制矩阵放置61个轴座符号并按照你设计的键位布局Layout在心理上或纸上先规划好行列。例如将同一行的所有轴座的其中一个引脚比如上引脚连接在一起形成“行线”将同一列的所有轴座的另一个引脚连接在一起形成“列线”。连接主控放置XIAO RP2040的原理图符号。你需要仔细阅读其数据手册找到所有GPIO引脚的定义。选择足够数量的GPIO至少17个作为矩阵的行线和列线。一个关键技巧尽量选择同一Bank组的GPIO并且预留一些备用IO方便后期调试或增加功能如RGB底灯、旋钮编码器。将行线、列线分别连接到选定的GPIO上。添加必要电路Type-C接口除了VBUS、GND、D、D-别忘了连接CC1和CC2引脚通常通过5.1k电阻下拉到地这是实现正反插拔和USB PD通信虽然这里用不上所必需的。去耦电容在XIAO RP2040的电源引脚3V3附近放置一个0.1uF和一个10uF的陶瓷电容用于滤除电源噪声确保芯片稳定工作。ESD保护在USB数据线D/D-上可以串联小阻值电阻如22欧姆并添加ESD保护二极管到地增强抗静电能力这是一个提升可靠性的好习惯。复位电路XIAO板载了复位按钮原理图中可以不用额外添加。绘制完成后务必使用立创EDA的ERC电气规则检查功能检查是否有未连接的网路、短路、单端网络等错误。2.2 PCB布局在有限空间内排兵布阵原理图检查无误后进入PCB设计环节。点击“设计”-“转换原理图到PCB”软件会根据你的原理图生成一个充满杂乱飞线的PCB初稿。板框定义首先确定键盘的物理尺寸。60%键盘的外形尺寸长宽和螺丝孔位通常为M2需要与你的外壳设计或购买的外壳严格匹配。在“Mechanical 1”层绘制板框并放置螺丝孔作为非镀铜的NPTH孔。预布局先将所有元件大致拖到板框内。将XIAO RP2040模块、Type-C接口放在PCB的顶部或底部中间位置方便出线。61个轴座按照键位图严格对齐。这里有个大坑不同键帽的菊花位置十字柱是标准化的但轴体本身的针脚两个金属脚和中间的LED灯脚位置也是固定的。你必须确保轴座的封装方向正确否则轴体插不进去建议先打印1:1的键位图或者用现成的开源PCB文件作为位置参考。布局优化原则信号流清晰矩阵走线应尽量从主控向外辐射减少交叉。电源优先先布置电源路径VBUS到3V3 LDO保证电源线宽足够通常1mm以上。模块化将功能相关的元件如主控及其去耦电容靠近放置。考虑结构避开螺丝孔、外壳支柱、定位板卡扣等位置。2.3 PCB布线艺术与技术的结合布线是PCB设计中最耗时也最体现功力的部分。键盘PCB的布线相对简单主要是低速数字信号但仍有讲究。规则设置在布线前先设置设计规则Design Rules。对于这种双层板我的常用设置是线宽信号线0.25mm电源线0.5mm-1mm。线间距0.2mm嘉立创的工艺能力可以做到0.15mm但0.2mm更稳妥。过孔外径0.6mm内径0.3mm这是嘉立创的免费打样标准。铺铜间距0.3mm。矩阵布线行线/列线分组尽量将同一行或同一列的走线布在同一层比如顶层另一层底层用于交叉连接和电源。这能使走线更规整。使用“差分对”思维处理长走线虽然不是高速差分信号但对于同一组如相邻的两行列线的长距离平行走线尽量保持它们长度近似、走向一致可以减少干扰也更好看。善用跳线在双层板中过孔Via就是你的跳线。当顶层走线无法绕过时打一个过孔换到底层继续走这是完全正常的。但要注意过孔不要太多太密尤其是信号线换层后最好在附近打回原层形成完整的参考平面。电源与地处理电源通道从Type-C的VBUS到XIAO的VIN引脚线宽要加粗。XIAO模块内部有LDO将5V转为3.3V。地平面这是最关键的一步。在布线基本完成后对顶层和底层进行大面积铺铜Pour Copper并连接到GND网络。一个完整的地平面可以提供稳定的参考地屏蔽噪声是电路稳定工作的基石。在立创EDA中使用“铺铜”工具选择GND网络设置好间距框选整个板框即可。DRC检查与丝印调整布线完成后运行DRC设计规则检查确保没有违反你设定的线宽、间距、孔距等规则。然后调整丝印层Silkscreen将元件标识如R1 C1和方向标记摆放整齐、清晰不要被焊盘或过孔挡住。可以在PCB空白处添加你的键盘Logo如“Purple Owl”和版本号。踩坑实录嘉立创DRC规则与过孔放置在放置过孔时立创EDA可能会提示“过孔不在DRC规则范围内”。这通常是因为过孔太靠近板框或机械孔。嘉立创的工艺要求孔边缘到板边缘、到其他铜皮/走线需保持一定距离通常0.2mm以上。解决方法是要么移动过孔位置要么在嘉立创的订单页面选择“扩展工艺参数”并适当增加“板边孔距”的补偿值。最稳妥的办法是在布局阶段就预留好足够的空间。最后导出Gerber文件和钻孔文件就可以发给PCB制造商如嘉立创打样了。第一次打样建议选择最便宜的套餐做两三块回来测试确认无误后再进行后续步骤。3. 固件烧录与KMK配置让键盘“活”起来PCB焊接组装完成后它还是一块“哑巴”板子。我们需要通过固件赋予它灵魂。得益于CircuitPython和KMK这个过程比传统方式简单太多。3.1 环境准备与CircuitPython刷入获取固件访问CircuitPython官网找到Seeed XIAO RP2040的专用.uf2固件文件并下载。进入Bootloader模式用USB线连接XIAO和电脑。快速双击XIAO板载的复位按钮RST此时电脑上会出现一个名为RPI-RP2的可移动磁盘。如果没出现检查USB线是否支持数据传输或者尝试在按住BOOT键的同时按一下RST再松开。刷入固件将下载好的.uf2文件直接拖入RPI-RP2磁盘。磁盘会自动弹出几秒钟后电脑上会出现一个新的磁盘名为CIRCUITPY。这表明CircuitPython已经成功运行在XIAO上了。3.2 KMK固件部署与基础配置KMK本质上是一个运行在CircuitPython上的Python键盘程序。获取KMK文件访问KMK的GitHub仓库下载最新版本的KMK。你需要的是kmk文件夹内的全部内容。文件部署将kmk整个文件夹以及KMK仓库中boot.py和main.py示例文件复制到CIRCUITPY磁盘的根目录下。然后将main.py重命名为code.py。CircuitPython在启动时会自动执行code.py。核心配置kb.py这是键盘的主配置文件。我们需要在CIRCUITPY磁盘根目录创建它。以下是一个最基础的60%配列配置框架import board from kmk.kmk_keyboard import KMKKeyboard from kmk.scanners import DiodeOrientation from kmk.scanners.keypad import KeysScanner # 初始化键盘对象 keyboard KMKKeyboard() # 1. 定义引脚 # 你需要根据你的PCB实际布线填写行和列对应的GPIO引脚 # 引脚名参考 CircuitPython 的 board 模块如 board.GP0, board.GP1 col_pins (board.GP0, board.GP1, board.GP2, board.GP3, board.GP4, board.GP5, board.GP6, board.GP7, board.GP8) row_pins (board.GP9, board.GP10, board.GP11, board.GP12, board.GP13, board.GP14, board.GP15, board.GP16) # 2. 配置按键矩阵扫描器 keyboard.matrix KeysScanner( row_pinsrow_pins, col_pinscol_pins, diode_orientationDiodeOrientation.COL2ROW, # 关键取决于你PCB上二极管的朝向 interval0.02, # 扫描间隔单位秒 ) # 3. 定义键位映射 # 这是一个61键ANSI布局的示例键值参考KMK的Keycodes from kmk.keys import KC keyboard.keymap [ # Layer 0: 默认层 [ KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.MINS, KC.EQL, KC.BSPC, KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.LBRC, KC.RBRC, KC.BSLS, KC.CAPS, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT, KC.ENT, KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT, KC.LCTL, KC.LGUI, KC.LALT, KC.SPC, KC.RALT, KC.RGUI, KC.MO(1), KC.RCTL # MO(1) 是切换到Layer 1的瞬时键 ], ] # 4. 调试输出可选 if __name__ __main__: keyboard.go()关键参数解析diode_orientation这是最容易出错的地方。如果你的PCB在每个按键上或行列线上串联了二极管防止鬼键必须正确设置方向。COL2ROW表示二极管正极接列线负极接行线ROW2COL则相反。如果没焊二极管这里填DiodeOrientation.NONE。务必与PCB设计一致interval扫描速度。默认0.02秒50Hz足够如果感觉响应慢可以适当减小但会增加CPU负担。keymap键位映射列表。每个子列表是一个层Layer。KC.MO(1)是瞬时切换键按住时激活Layer 1松开返回Layer 0。保存kb.py后需要修改code.py让它导入我们的配置import kb from kb import keyboard if __name__ __main__: keyboard.go()保存code.py键盘会自动重启。此时你应该能听到电脑识别新USB设备的声音并且按键可以输入字符了3.3 高级功能配置层、组合键与宏KMK的强大之处在于其灵活的配置。多层键位你可以定义多个keymap层。例如Layer 1可以作为功能层将原本的字母区映射为方向键、F1-F12等。keyboard.keymap [ # Layer 0 (默认层)... # Layer 1 (功能层) [ KC.GRV, KC.F1, KC.F2, ... # 将第一排数字键变为F1-F12 KC.TRNS, KC.TRNS, KC.UP, ... # TRNS表示透明继承下层键值 KC.TRNS, KC.LEFT, KC.DOWN, KC.RIGHT, ... ], ]使用KC.MO(1)、KC.LT(1, KC.SPC)点击是空格长按是Layer 1或KC.TG(1)切换开关来激活不同层。修饰键与组合键KMK原生支持所有标准修饰键Ctrl, Alt, Shift, Win/GUI。组合键如CtrlC可以直接写成KC.LCTL(KC.C)。宏定义你可以录制一系列按键动作。from kmk.handlers.sequences import simple_key_sequence # 定义一个输入邮箱的宏 EMAIL simple_key_sequence([ KC.MY_EMAIL_ADDRESS, # 假设你定义了这个字符串键 KC.ENTER, ]) # 然后在keymap中将其分配给某个键配置完成后任何对kb.py或code.py的修改只需保存文件键盘会在几秒内自动重新加载并生效实现了真正的“热重载”调试体验无比流畅。4. 组装、调试与进阶优化当PCB、固件都准备好就可以进行最终的组装和调试了。4.1 焊接与组装焊接元件按照先矮后高的顺序焊接贴片电阻电容 - XIAO RP2040的排母强烈建议使用排母不要直接焊接 - Type-C接口 - 热插拔轴座。焊接轴座时务必使用定位板或已经焊好部分轴体来固定确保所有轴座与PCB垂直且高度一致否则会导致轴体安装歪斜或无法安装。轴体与键帽将机械轴体按压入热插拔轴座确保两个金属针脚和中间LED灯脚如果支持完全插入。然后盖上定位板如果有最后安装键帽。外壳安装将PCB组件放入底壳对准螺丝孔位均匀拧紧螺丝。注意不要过紧以免压裂PCB或导致变形。4.2 上电调试与常见问题排查组装完成后首次上电可能会遇到一些问题问题电脑无法识别键盘或识别为未知设备。排查首先检查USB线是否完好Type-C接口焊接是否有虚焊、短路。然后检查XIAO RP2040的CIRCUITPY磁盘能否出现。如果不能重新进入Bootloader模式刷写CircuitPython固件。如果能出现检查code.py和kb.py是否有语法错误CircuitPython会在磁盘根目录生成一个boot_out.txt文件里面有错误信息。问题部分按键无反应或串键按A出现B。排查这是最典型的问题。首先确认kb.py中的row_pins和col_pins定义是否与PCB布线完全一致。然后重点检查diode_orientation设置是否正确。如果设置错误会导致整行或整列按键失效。可以用万用表蜂鸣档逐个检查问题按键对应的行、列线与主控引脚是否导通检查轴座焊点是否有虚焊。问题按键连击Chatter。排查这是机械开关的物理抖动导致的。KMK内置了防抖算法。你可以在kb.py中调整去抖参数keyboard.debounce_time 0.05 # 增加去抖时间单位秒默认可能为0.001如果问题依旧可能是轴体本身质量问题或者焊点有细微的松香残留导致接触不良可以用洗板水清洁一下。4.3 进阶优化与扩展基础功能稳定后可以考虑一些进阶玩法RGB灯光XIAO RP2040有足够的GPIO和性能驱动RGB灯带。你可以使用KMK的RGBMatrix扩展在PCB背面焊接WS2812B灯带实现炫酷的背光效果。这需要在配置中添加RGB模块并定义数据引脚。OLED屏幕利用I2C或SPI接口连接一块小尺寸OLED屏幕可以显示键盘状态、层信息、自定义动画甚至系统信息需要主机端配合。旋钮编码器在60%键盘上通过旋钮实现音量调节、页面滚动是非常实用的。KMK支持编码器你需要为其分配两个GPIO和一个接地引脚并在配置中定义。VIA/Vial兼容虽然KMK配置已经很方便但有些人仍喜欢图形化配置工具。可以让KMK模拟成支持VIA协议的键盘这需要额外的配置和编译步骤复杂度较高。优化功耗对于无线键盘项目XIAO RP2040本身不支持蓝牙但可以外接模块KMK提供了休眠功能可以大幅延长电池寿命。整个“Purple Owl”项目从设计到落地的过程充满了硬件与软件交织的乐趣。它不仅仅是一把键盘更是一个完全受你控制的可编程输入终端。当你第一次用自己设计、焊接、编程的键盘敲出“Hello, World!”时那种成就感是购买任何量产键盘都无法比拟的。最重要的是KMK和CircuitPython降低了固件开发的门槛让你可以更专注于键盘本身的功能和体验设计。如果在过程中遇到问题KMK活跃的Discord社区和CircuitPython的丰富文档都是强大的后盾。