1. 项目概述与核心价值
作为一个长期与键盘打交道的人,我深刻理解“工欲善其事,必先利其器”的道理。几年前,因为高强度编码和游戏,我的左手小指开始出现腱鞘炎的症状,标准键盘的固定布局让手腕和手指长期处于不自然的姿态。市面上的“人体工学键盘”要么价格高昂,要么在键位布局和功能上无法完全满足我的个性化需求——比如,我需要为不同的设计软件和游戏设置独立的宏按键层,还需要一个高精度的拇指摇杆来替代鼠标的部分操作。于是,一个念头诞生了:为什么不自己做一个?
这就是今天要分享的“从零打造自定义键盘”项目的由来。它不仅仅是一个缓解手部疲劳的工具,更是一个融合了3D打印、电路设计、嵌入式编程和人体工程学的综合性DIY作品。最终成品是一个拥有18个可编程机械按键、一个模拟摇杆、一个多向开关以及独立LED指示灯的左手键盘。你可以用它来玩《Apex英雄》或《魔兽世界》,实现复杂的技能组合;也可以在Premiere或Blender里,将常用的剪辑命令或建模操作映射到拇指区,极大提升工作效率。整个过程,从画图建模到写代码调试,全部自主完成。如果你也对个性化输入设备、嵌入式开发或仅仅是享受动手创造的乐趣感兴趣,那么这个项目将为你提供一个极其详实的路线图。
2. 整体设计与核心思路拆解
在动手之前,清晰的顶层设计是避免后期反复折腾的关键。这个自定义键盘项目的核心思路可以分解为三个层次:人体工学结构、电子系统架构和软件功能定义。
2.1 人体工学结构设计解析
市售键盘的键位排列是固定的,但每个人的手型、手指长度和习惯姿势都不同。本项目的结构设计首要原则是“让键盘适应手,而不是手去适应键盘”。
分体与角度:我将传统的单一块状结构分解为五个独立的手指基座和一个拇指基座。每个手指基座都可以通过螺丝单独调整其相对于主底板的角度和高度。这意味着你可以根据自己手指自然弯曲的弧度,将它们调整到最放松的位置。拇指区则集成了摇杆和多个开关,充分利用拇指这个最灵活、力量最大的手指,承担高频次、高精度的操作任务。
材料与工艺选择:结构件使用3D打印(FDM)制作,材料首选PLA。这里有几个关键考量:第一,PLA打印温度相对较低,成品尺寸稳定性好,对于需要精密配合的轴体安装孔和螺丝孔来说至关重要。第二,PLA易于后期打磨处理,可以获得接近注塑外壳的质感。虽然ABS强度更高,但打印难度大、有异味;PETG虽有韧性但容易翘边,影响装配精度。因此,PLA在可加工性、成本和效果上取得了最佳平衡。腕托部分则可以考虑使用柔性TPU材料打印,以提供柔软的支撑。
2.2 电子系统架构规划
电子部分的核心是信号采集、处理和传输。架构上采用了“分布式采集,集中式处理”的模式。
信号采集层:由18个欧姆龙微动开关(D2F-01)、1个双轴模拟摇杆(KY-023)和1个多向开关组成。微动开关负责数字按键信号,模拟摇杆输出X、Y两个方向的模拟电压值,多向开关则提供上下左右及按下共5个方向的数字信号。所有开关的接地端(GND)被统一连接,形成共地,这是电路正常工作的基础。
核心处理层:选用Teensy 2.0++作为主控。这是本项目的一个灵魂选择。相比常见的Arduino Uno,Teensy 2.0++拥有更多的数字I/O口(多达25个)和模拟输入口,足以应对本项目所有开关和摇杆的需求。更重要的是,其USB协议栈非常成熟,可以被电脑直接识别为标准的键盘、鼠标或游戏手柄(HID设备),无需安装额外驱动,兼容性极佳。
电源与指示层:通过USB端口取电。两个LED指示灯通过220欧姆的限流电阻连接到Teensy的GPIO引脚,用于显示设备状态(如层切换、宏录制状态等)。
2.3 功能定义与软件框架
硬件是躯体,软件是灵魂。在编程之前,必须明确你想要键盘做什么。
按键映射:最基本的功能。每个物理按键都可以被定义为任意键盘按键(如A、Ctrl、F1)或组合键(如Ctrl+C)。多层配置:这是实现按键数量“倍增”的关键。通过一个切换开关(Toggle Switch)或组合键,可以在多个“层”(Layer)之间切换。例如,Layer 1是游戏键位,Layer 2是视频编辑快捷键,Layer 3是编程宏。模拟摇杆:将其配置为鼠标或游戏手柄摇杆。需要处理模拟量的读取,并可能涉及死区校准,以忽略摇杆微小中心偏移带来的误操作。宏功能:录制并执行一系列按键操作和延时。比如,在游戏中一键完成“切换武器-开镜-射击”的复杂操作。
软件上,我们将使用Arduino IDE进行开发,并依赖一些优秀的开源库,如Joystick库用于模拟游戏手柄,Bounce2库用于消除按键抖动。固件代码的结构将围绕“扫描-映射-输出”这个核心循环来构建。
3. 材料准备与工具清单
“兵马未动,粮草先行”。一份详尽且准确的物料清单是项目顺利进行的保障。以下清单基于一个完整可用的设备制定,你可以根据自身需求增减。
3.1 核心电子元器件清单
这部分是项目的“神经系统”,建议从可靠渠道采购,确保质量。
| 品类 | 型号/规格 | 数量 | 说明与选购要点 |
|---|---|---|---|
| 主控制器 | Teensy 2.0++ | 1 | 核心大脑。注意是2.0++,不是3.x或4.0,其引脚布局和库支持是本项目基础。 |
| 按键开关 | 欧姆龙 D2F-01F | 18 | 微动开关。手感清脆,寿命长。也可用D2FC-F-7N(更常见,手感稍软)。务必确认是3引脚(C, NO, NC)款式。 |
| 模拟摇杆 | 双轴电位器摇杆 (KY-023) | 1 | 注意选择带按钮(按下功能)的型号。检查其电阻值(通常为10kΩ),需与代码配置匹配。 |
| 多向开关 | 5向导航开关(带按键) | 1 | 类似游戏手柄方向键。确认是4个方向+1个中心按下的5引脚型号。 |
| 状态开关 | 自锁式拨动开关(8x8mm) | 1 | 用于切换配置层或开关背光。 |
| LED指示灯 | 5mm 散光LED(红/蓝) | 2 | 颜色自选。注意区分正负极(阳极+,阴极-)。 |
| 限流电阻 | 220Ω 碳膜电阻 | 2 | 用于LED,防止电流过大烧毁。 |
| 接线端子 | 2.54mm间距 10P端子排 | 5 | 连接杜邦线,使布线整洁且可维护。 |
| 连接线 | AWG24硅胶线或排线 | 若干 | 建议使用多种颜色,便于区分信号。约需3-5米。 |
| USB线 | Micro-B to USB-A | 1 | 用于连接Teensy和电脑。 |
3.2 结构件与辅助材料清单
这部分构成了设备的“骨骼”与“皮肤”。
| 品类 | 规格 | 数量/说明 |
|---|---|---|
| 3D打印件 | PLA材料 | 一套STL文件,包括:主底板、5个手指基座、拇指基座、键帽/杠杆、外壳、腕托等。 |
| 紧固件 | M1.4x10 沉头螺丝 | 约20颗,用于固定内部结构。 |
| 紧固件 | M3x? 圆头螺丝 | 约15颗,用于固定外部外壳和基座。长度需根据打印件厚度确定,通常6-8mm。 |
| 螺母 | M3 方形螺母 (5.5x5.5x2mm) | 约15个,嵌入打印件用于螺丝固定。 |
| 螺母 | M2.5/M3 注塑螺母 | 约10个,用于在塑料件上创建螺纹孔。 |
| 防护套 | Φ5mm PET编织网管 | 1米,用于收纳和整理线束,提升内部美观度和耐用性。 |
| 脚垫 | Φ12mm 硅胶脚垫 | 4个,用于设备底部防滑。 |
| 热缩管 | Φ2mm/Φ3mm | 若干,用于绝缘和保护焊点。 |
3.3 必备工具清单
“工欲善其事,必先利其器”,合适的工具能让制作过程事半功倍。
| 工具类别 | 具体工具 | 用途与注意事项 |
|---|---|---|
| 电子焊接 | 恒温烙铁(建议60W) | 焊接元器件和导线。温度设定在300-350°C为宜。 |
| 电子焊接 | 焊锡丝(含松香) | 建议使用直径0.8mm左右的焊锡丝。 |
| 电子焊接 | 吸锡器/吸锡带 | 修正焊接错误时必备。 |
| 电子焊接 | 助焊膏 | 对于多引脚或氧化严重的焊点有奇效。 |
| 加工装配 | 精密螺丝刀套装 | 必须包含PH0、PH00、一字等小规格批头。 |
| 加工装配 | 尖嘴钳、斜口钳 | 用于弯折引脚、剪切导线。 |
| 加工装配 | 剥线钳 | 精确剥除导线外皮,不伤内芯。 |
| 加工装配 | 手电钻及钻头(1mm-3mm) | 用于扩孔或清理打印件上的支撑残留。 |
| 加工装配 | 锉刀、砂纸(400目以上) | 打磨打印件毛刺,使活动部件顺滑。 |
| 3D打印 | FDM 3D打印机 | 打印精度建议在0.1mm以下。确保平台调平。 |
| 辅助工具 | 热风枪或打火机 | 用于收缩热缩管。 |
| 辅助工具 | 万用表 | 检查电路通断、测量电压电阻,排查故障神器。 |
| 辅助工具 | 导热胶或热熔胶枪 | 固定内部线缆和较轻的元器件。 |
注意:安全第一。使用烙铁、热风枪、电钻时务必注意安全,佩戴护目镜,并在通风良好的环境下操作。焊接时产生的烟雾应尽量避免吸入。
4. 结构件制作与处理要点
3D打印的质量直接决定了最终产品的手感和可靠性。这一步需要耐心和细致。
4.1 3D打印参数设置与后处理
打印前,请务必使用切片软件(如Cura、PrusaSlicer)仔细检查每个零件的摆放和支撑。
核心打印参数建议:
- 层高:0.15mm或0.12mm。更低的层高意味着更精细的表面纹理和更小的层间缝隙,对于需要紧密配合的轴孔和螺丝孔至关重要。
- 壁厚:至少3-4层。增加壁厚能显著提升零件的结构强度,防止在螺丝紧固时开裂。
- 填充密度:100%。对于承受按键压力和经常握持的外壳、基座等核心结构件,满填充能提供最佳的刚性和耐用性。虽然耗材和时间增加,但绝对值得。
- 打印温度:对于PLA,可以尝试在215-225°C之间寻找最佳温度。稍高的温度有助于层间融合,提高强度。
- 打印速度:外壁速度建议降至40-50mm/s,内壁和填充可稍快。低速打印能提升表面质量和尺寸精度。
后处理技巧:
- 去支撑与打磨:小心去除所有支撑材料。对于轴杆与基座的配合孔,使用1.5mm钻头轻轻旋转,手动清理孔内毛刺,切勿用电钻高速扩孔,容易导致孔位变形。用400目以上的水砂纸蘸水轻轻打磨结合面和外表面,直到触感光滑。
- 螺纹孔处理:对于需要嵌入方形螺母或注塑螺母的槽位,务必确保槽内清洁无碎屑。嵌入螺母时,如果过紧,可以用烙铁头(约250°C)轻轻触碰螺母金属部分,利用其热量轻微软化周围塑料,再将其压入。注意控制温度和时间,防止塑料过度熔化导致槽位变形。
- 试装配:在焊接电路之前,进行一次完整的“干装配”。将所有结构件用螺丝初步组装起来,检查各手指基座能否顺畅调节角度,杠杆装入后是否活动自如无卡涩。这个步骤能提前发现并解决所有的结构干涉问题。
4.2 关键结构件的组装心得
微动开关的安装:微动开关有三个引脚:公共端(C)、常开端(NO)、常闭端(NC)。我们使用常开端(NO)和公共端(C)构成回路。安装时,务必参考设计图纸或照片中的开关方向,确保杠杆按下时能准确触发开关的弹片。开关应能“咔哒”一声卡入基座的定位槽中,不松动。
拇指摇杆模块的固定:模拟摇杆模块通常有5个引脚(VCC, GND, VRx, VRy, SW)。其底座需要精确地卡入拇指基座的预留位置。如果感觉过紧,务必用锉刀小心打磨安装槽的内壁,直到模块能严丝合缝地放入。过紧的安装会导致塑料件长期受力,可能开裂,也可能使摇杆杆身受到侧向应力,影响回中和手感。
线束的管理与保护:这是保证内部整洁和长期可靠性的关键。建议:
- 将通向每个手指基座的微动开关线(共4根:1根公共线,3根信号线)预先按长度剪好,并用扎带或胶带捆成一小束。
- 在穿入PET编织网管前,先给所有线缆的焊接端点上锡。
- 使用热缩管保护每一个焊点,特别是LED引脚、电阻引脚等细小部位。
- 线束从“塔楼”(手指基座上部结构)引出后,用一点点热熔胶在出口处固定,防止线缆被反复弯折导致内部金属丝断裂。
5. 电路焊接与系统集成
电路部分是连接物理世界和数字世界的桥梁,稳定的电路是功能实现的基础。
5.1 焊接核心:Teensy 2.0++与端子排
Teensy 2.0++是核心,其引脚定义决定了我们的接线方式。
引脚规划策略:
- 数字引脚(D0-D25):分配给18个微动开关、多向开关的4个方向、摇杆的按键(SW)、状态开关和两个LED。需要先在代码中规划好,并制作一个引脚映射表,焊接时严格按表施工。
- 模拟引脚(A0-A12):分配A0和A1给摇杆的VRx和VRy,用于读取模拟量。
- 电源:VCC(5V)输出给摇杆、开关等元件供电。GND建立统一的接地。
焊接实操步骤:
- 安装端子排:将5个10针的端子排插到Teensy的引脚排母上。至关重要的一步:将Teensy板子平放在桌面上,确保所有端子排底部紧贴桌面,然后再进行焊接。这样可以保证所有端子排高度一致、绝对平行,方便后续接线。
- 制作公共地(GND)板:这是本项目的一个巧思。由于有多达数十个元件需要接地,如果全部焊接到Teensy的一个GND引脚上,会非常拥挤。解决方案是:用一小块洞洞板或铜板,切割成合适大小,钻上孔,将其作为一个“GND集线器”。将所有元件的GND线都焊接到这块板上,再用一根较粗的导线将这块板与Teensy的GND引脚连接。这样布线清晰,可靠性高。
- 焊接元器件:按照“先低后高,先小后大”的原则。先焊接贴片的限流电阻,再焊接LED、开关等。给LED引脚弯折成L形并焊接时,动作要快,避免过热损坏LED。焊接微动开关的引线时,确保焊点圆润光滑,无虚焊或桥接。
5.2 系统集成与布线艺术
当所有子模块(手指塔楼、拇指摇杆区)的电路都准备好后,就进入了总装阶段。
集成顺序建议:
- 固定主控与GND板:先将Teensy和GND板用螺丝或尼龙柱固定在主底板的预定位置。确保USB接口的位置对准外壳的开孔。
- 连接手指塔楼线束:将每个手指塔楼的线束穿过PET网管,引入主壳体内部。根据之前规划的引脚映射表,将每根信号线逐一接入对应的端子排。强烈建议在此处使用不同颜色的导线,并在接线图上做好标记。公共地线则统一接到GND板上。
- 集成拇指区:连接摇杆和多向开关的线束。模拟摇杆的VRx、VRy、SW以及多向开关的各个方向线,分别接入Teensy的指定引脚。
- 连接状态开关与LED:状态开关用于切换功能层,其输出线接入一个数字引脚。LED通过限流电阻后接入数字引脚(用于控制开关)和GND。
- 最终检查与理线:在所有连接完成后,不要急于盖上外壳。先用扎带将内部线缆整齐捆扎,避免其接触到活动部件(如摇杆的机械结构)。留出一定的余量,防止拉扯。
关键排查点:在通电前,用万用表的“通断档”做一次全面的检查。一是检查每个开关在按下时,其信号线与GND之间是否导通(按下导通,松开断开)。二是检查所有电源(VCC)和地(GND)之间是否短路。这是避免“上电冒烟”的最后一道防线。
6. 固件开发与功能编程
硬件搭建完毕,接下来是注入灵魂的时刻。我们将使用Arduino IDE为Teensy编写固件。
6.1 开发环境搭建与基础库
- 安装Arduino IDE:从Arduino官网下载并安装最新版IDE。
- 添加Teensy支持:在IDE的“首选项”中,附加开发板管理器网址:
https://www.pjrc.com/teensy/package_teensy_index.json。然后在“工具”->“开发板”->“开发板管理器”中搜索并安装“Teensy”。 - 安装必要库:在“项目”->“加载库”->“管理库”中,搜索并安装:
Bounce2:用于处理按键消抖,这是获得稳定按键响应的关键。Joystick:这是PJRC(Teensy制造商)官方提供的库,允许Teensy模拟成USB游戏手柄,完美支持模拟摇杆和多个按钮。
6.2 核心代码逻辑剖析
代码的核心是一个循环执行的loop()函数,其内部逻辑流如下:
#include <Bounce2.h> #include <Joystick.h> // 1. 引脚定义与映射 const int buttonPins[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18}; // 18个按键引脚 const int joystickXPin = A0; // 摇杆X轴 const int joystickYPin = A1; // 摇杆Y轴 const int joystickButtonPin = 19; // 摇杆按下 const int hatSwitchPins[] = {20, 21, 22, 23}; // 多向开关的上下左右 const int layerSwitchPin = 24; // 层切换开关 const int ledPin = 25; // 状态LED // 2. 创建对象 Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, 32, 0, // 按钮数32, hats数0 true, true, false, // X轴, Y轴, Z轴 false, false, false, // Z旋转, 油门, 舵 false, false, false, false, false); // 模拟开关 Bounce buttonBouncers[18]; Bounce joystickButtonBouncer = Bounce(); Bounce hatBouncers[4]; Bounce layerSwitchBouncer = Bounce(); // 3. 层管理变量 int currentLayer = 0; // 当前层,0为基础层 const int totalLayers = 3; // 总共3层 // 4. 按键映射表(示例:Layer 0 -> 游戏WASD, Layer 1 -> 视频编辑快捷键) const uint8_t keyMap[totalLayers][18] = { {KEY_W, KEY_A, KEY_S, KEY_D, KEY_SPACE, KEY_LEFT_SHIFT, ...}, // Layer 0 {KEY_F1, KEY_F2, KEY_F3, KEY_F4, 'c', 'v', ...}, // Layer 1 (假设是剪辑软件) // ... Layer 2 }; void setup() { // 初始化所有引脚模式 for (int i = 0; i < 18; i++) { pinMode(buttonPins[i], INPUT_PULLUP); // 启用内部上拉电阻 buttonBouncers[i].attach(buttonPins[i]); buttonBouncers[i].interval(5); // 设置5ms消抖间隔 } // 初始化摇杆按钮、多向开关、层切换开关(类似上拉和绑定) // ... Joystick.begin(); // 启动虚拟游戏手柄 Joystick.setXAxisRange(0, 1023); // 设置摇杆模拟量范围(10位ADC) Joystick.setYAxisRange(0, 1023); } void loop() { // 1. 更新所有消抖器状态 for (int i = 0; i < 18; i++) { buttonBouncers[i].update(); } // ... 更新其他开关 // 2. 检查层切换开关 layerSwitchBouncer.update(); if (layerSwitchBouncer.fell()) { // 开关状态改变时 currentLayer = (currentLayer + 1) % totalLayers; // 可以在这里让LED闪烁指示当前层数 } // 3. 处理普通按键 for (int i = 0; i < 18; i++) { if (buttonBouncers[i].fell()) { // 按键按下 Joystick.pressButton(keyMap[currentLayer][i]); // 按下映射后的键 } if (buttonBouncers[i].rose()) { // 按键释放 Joystick.releaseButton(keyMap[currentLayer][i]); // 释放键 } } // 4. 处理模拟摇杆 int xValue = analogRead(joystickXPin); int yValue = analogRead(joystickYPin); // 死区校准:忽略中心附近的微小波动 if (abs(xValue - 512) > 50) Joystick.setXAxis(xValue); // 假设中心值是512 else Joystick.setXAxis(512); if (abs(yValue - 512) > 50) Joystick.setYAxis(yValue); else Joystick.setYAxis(512); // 5. 处理多向开关(作为4个独立按钮或一个POV Hat处理) // ... 根据库支持情况实现 delay(1); // 短暂延时,稳定循环 }代码要点解析:
- 消抖(Debouncing):机械开关在接触瞬间会产生物理抖动,导致单片机误判为多次按下。
Bounce2库通过软件延时过滤了这些抖动,interval(5)表示状态稳定5毫秒后才认为有效。 - 层切换逻辑:通过读取一个物理开关的状态,循环切换
currentLayer变量。每个层对应一个完整的按键映射数组keyMap,实现了按键功能的动态切换。 - 模拟摇杆处理:
analogRead读取0-1023的值。死区校准是必须的,因为摇杆物理中心可能不是精确的512,且存在微小漂移。通过设置一个阈值(如50),忽略中心附近的波动,可以防止游戏角色或光标无故移动。 - USB HID报告:
Joystick库负责将我们的按键和摇杆状态打包成标准的USB游戏手柄数据包发送给电脑,兼容性极好。
6.3 固件烧录与测试
- 在Arduino IDE中选择开发板为“Teensy 2.0++”,端口选择对应的串口。
- 点击“上传”按钮。此时,Arduino IDE会编译代码,并调用Teensy Loader程序。
- 关键步骤:当Teensy Loader窗口弹出,并显示“按下按钮以开始编程”时,你需要手动按下Teensy板上的物理复位按钮。Teensy 2.0++没有自动复位功能,这一步必不可少。
- 烧录成功后,拔掉USB线再重新插入。此时电脑会识别出一个新的游戏控制器。
- 打开电脑的“游戏控制器设置”(在Windows中可通过搜索“设置USB游戏控制器”找到),测试每个按钮和摇杆轴是否响应正常。
7. 调试、优化与个性化
设备能工作只是第一步,让它工作得顺手、稳定,才是体现DIY精髓的地方。
7.1 常见问题与排查实录
即使按照指南操作,你也可能会遇到一些问题。以下是我在制作和帮助他人过程中总结的“故障树”:
| 现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 电脑无法识别设备 | 1. USB线或端口故障。 2. Teensy固件未正确烧录。 3. 电脑USB驱动问题。 | 1. 更换USB线和端口。 2. 检查Arduino IDE中开发板型号和端口选择是否正确。重新烧录,确保烧录时按下了复位键。 3. 尝试在其他电脑上测试。 |
| 某个按键无响应 | 1. 该按键微动开关损坏或焊接不良。 2. 连接该按键的导线断路。 3. 代码中引脚定义错误。 | 1. 用万用表通断档,测量开关按下时两端是否导通。 2. 检查从开关到Teensy端子的整条线路是否连通。 3. 核对代码中该按键对应的引脚编号与实际焊接是否一致。 |
| 多个按键同时触发 | 1. 线路短路(特别是信号线之间)。 2. 代码中引脚模式设置错误(如应设上拉却设为输出)。 | 1. 断电后,用万用表仔细检查相关信号线之间是否存在不应有的连接。 2. 检查 pinMode语句,确保按键引脚都设置为INPUT_PULLUP。 |
| 摇杆光标漂移 | 1. 摇杆模块中心电位不准。 2. 代码中死区设置过小。 3. 供电不稳定。 | 1. 在代码中读取摇杆静止时的analogRead值,将其作为新的“中心值”。2. 增大死区阈值(如从50调到80)。 3. 确保Teensy的5V输出稳定,检查所有GND连接是否牢固。 |
| 设备间歇性失灵 | 1. 内部线缆接触不良,随设备移动时断时续。 2. 焊点存在虚焊。 3. USB接口松动。 | 1. 打开外壳,仔细检查所有接线端子是否插紧,焊点是否牢固。对关键焊点进行补焊。 2. 在USB接口处用热熔胶稍作加固(注意不要影响插拔)。 |
7.2 性能优化与个性化设置
当基础功能稳定后,可以深入优化:
响应速度优化:loop()函数中的delay(1)会带来至少1ms的延迟。对于追求极限响应的游戏场景,可以移除这个延时,并考虑使用中断(Interrupt)来检测按键。但对于大多数应用,1ms的延迟人体无法感知,且能保证系统稳定性。
宏功能实现:在代码中定义一个“宏录制模式”。进入该模式后,记录下一系列按键事件(哪个键、按下、释放)及其时间间隔。然后可以将这个序列保存到Teensy的EEPROM(非易失存储器)中。之后,可以将一个物理按键绑定为“执行宏”,按下时自动播放整个操作序列。这需要更复杂的状态机编程。
手感调校:这是硬件层面的个性化。你可以尝试不同品牌、不同压力克数的微动开关(如欧姆龙红点、蓝点、灰点),找到最适合自己手感的。拇指摇杆也可以更换不同长度和形状的摇杆帽。甚至可以通过在杠杆支点处添加特氟龙垫片或润滑脂,来改变按键的顺滑度和声音。
外观美化:对打磨好的外壳进行喷漆。推荐使用模型用的水补土打底,再喷上色漆,最后喷一层消光或半光保护漆。键帽也可以使用不同颜色的PLA打印,或者购买第三方键帽进行适配。
完成这一切之后,你得到的不仅仅是一个输入设备。它是一个完全按照你的想法塑造、贴合你手掌每一处轮廓、响应你每一个操作意图的伙伴。从建模时的一个个曲面调整,到焊接时的一个个焊点,再到代码里的一行行逻辑,它的每一个细节都承载着你的思考和汗水。这种深度的定制化和完成项目带来的成就感,是任何市售产品都无法给予的。希望这份详尽的指南,能帮助你顺利开启自己的创造之旅。如果在制作中遇到任何问题,随时可以带着具体的现象和你的排查步骤来交流,社区里总有热心的高手愿意分享他们的经验。