面向软件工程师的极客键盘
前言
我去年做了一款面向软件工程师的开源键盘,可以让程序员朋友高效地输入,还可以自己修改键盘的固件。键盘采用60键设计,有配套的Android APP,可以通过App快速调整布局和设置宏。

键盘特点
硬件功能
-
键盘采用60键结合多层布局可输入104键键盘所有键码,支持全键无冲。
-
采用凯华Box白轴/青轴轴体和类SDA键帽,段落清晰,手指定位准确。
-
硬件包含LCD屏幕,可以显示键盘状态,配置键盘功能,支持扩展。
-
采用了ESP32S3模块,支持BLE、WiFi、USB多种连接方式。
-
支持炫彩LED,预留3.7V NTC电池接口。
软件功能
-
键盘配有Android App,支持快速浏览和动态修改键位键码。
-
支持在App上设置键宏,快速输入自定义内容。
-
支持BLE连接多设备,支持输入目标快速切换。因苹果生态准入原因,BLE不能支持IOS设备。
-
支持OTA,可通过WiFi协议和Web界面升级固件。
-
固件代码开源,支持深度优化。
功能介绍
使用LCD界面设置键盘
极客键盘右上角有一个LCD屏幕,用于显示键盘状态和对键盘进行设置。LCD界面默认显示“输入信息界面”,从左到右显示按键数目、大小写状态、WiFi状态、BLE状态、最后是电源信息。

用户可以通过旋转右上角旋钮来激活设置菜单,菜单结构如下。但配置菜单激活的状态下,所有键盘输入会被LCD界面所截获。设置完功能后需要连续按Esc键返回“输入信息界面”或等待键盘5秒超时自动返回,电脑才能收到键盘的输入。


- 输入信息子菜单
- 输入信息界面(默认显示的界面)
- 重置按键计数
- BLE设置子菜单
- 打开关闭ble
- BLE配对界面
- 切换键盘输入目标
- wifi设置子菜单
- 打开关闭wifi
- wifi设置
- led灯效设置
- 打开关闭led灯效
- 灯效模式设置
菜单之间的切换通过旋钮完成,通过左旋或右旋来选择左边或右边的菜单,按键盘Enter键来选择菜单,按Esc键来返回上一级菜单。在一些需要输入内容的界面,可以使用数字、字母键和Shift键来输入信息,完成设置后按下Enter来保存设置,按Esc放弃修改并返回上一级菜单。
键码布局
极客键盘采用60键三层立体键位布局。我们可以想象成有三层叠加在一起的键盘,每层键盘上有一些按键位置,我们可以为每个键位任意定义键码,例如第0层键盘的第一行第一列我们一般设置为Esc,但是我们也可以设置为`。键盘默认生效的层是层0,其他两层需要通过层激活键来激活。层激活键默认被设置在空格两边,使用了键帽Super和Fn(键帽印刷可能因版本不一样)。按住Super,这时层1的键盘被激活并叠加在层0之上。这时按下一个键时,如果层1上定义了键码,那么生效就是层1的键码;如果层1没有定义键码,生效的还是层0的键码。同样按住Fn,层2的键盘被激活被激活并叠加在层0之上,键位码由层2和层0共同决定。如果输入层1或层2上的键码,我们需要先按下层1或层2的激活码,再按对应位置的键就可以输入该键码。
由于采用了60%键盘,方向键、`、f1~f12等其他键被安排到了其他层上,需要通过层激活键来输入,比如方向键左、上、下、右被设置到层1的j、i、k、l的位置,按下Super+j等于输入方向键左,Super+Esc等于`。如果想要查看当前键盘布局,可以通过Android App来查看,我们还可以依据自己的使用习惯来快速修改键盘布局。
选择连接方式
默认情况下键盘的输入都是发送到USB连接,只有在通过“切换键盘输入目标”子菜单切换到某一个BLE设备时,键盘输入会发送到对应的BLE连接目标。
-
BLE键盘配对
配对之前我们需要通过LCD界面的“BLE配对界面”来查看键盘的BLE设备名。当前键盘采用了配对码的配对策略,当我们在电脑或者手机等设备上点击键盘对应的BLE设备时,电脑或手机会提示我们在键盘上输入配对码,键盘也会显示配对界面。这时我们需要在键盘上输入电脑或手机上的配对码,按Enter确认。我们需要等待键盘和电脑和手机之间建立连接,这时不要操作电脑或手机,完成后电脑或手机上会显示配对成功。
使用Android APP
为了方便快速地查看和设置键位布局,我们开发了一个Android App。这个App目前功能还比较简单,支持修改键盘布局和修改宏两项功能。
-
使用Android APP来设置键位布局
通过APP顶端的Tab菜单,可以选择设置键位布局还是设置宏,下面是设置键盘布局的界面。

界面显示了当前键盘各层的布局,右上角有一个小图标,先了当前显示的键盘层。点击这个图标,通过一个弹出的按钮列表切换到其他键盘层。下面有两个按钮,一个是Sync按钮。第一次使用需要长按Sync按钮扫描键盘,点击“Scan for Keyboards”查找键盘对应的BLE设备。需要注意的是,我们需要确保在Android蓝牙设置中键盘是已配对未连接的状态。如果键盘已经和键盘连接,这时键盘设备会被Android输入系统管理,导致App无法设置键盘。

需要点击键盘对应的蓝牙设备,断开连接。选择好键盘后,轻按Sync按钮可以获取键盘布局或推送修改后键位布局,长按sync按钮可以切换不同的键盘;另一个+按钮用于保存当前键位布局,还可以快速恢复保存的键位布局。如果需要修改键位布局,选中要修改的键位,这时会显示一个对话框。

通过这个对话框,可以修改这个键位在不同层的键码。“Current Keycode”显示当前的键码;下面“Keycode Type”支持选择键码的类型,不同的键码类型,代表了不同功能类型。为了进一步了解如何设置键码,下面介绍一下支持的键码类型。
- BS 基础键码
- BS代表104键键盘上标注的键码,是最基础的键码,也是我们使用频率最高的键码类型。BS类型只有一个参数,即我们想要输入的基础键码。
- MD 修饰键
- MD是组合键,实现输入一个修饰键SHIFT/CTRL/ALT加上基础键码的组合。MD有两个参数,第一个参数是一个修饰键,第二个参数为一个基础键码。
- LT 层激活Tap键
- LT也是组合键,可以实现持续按下激活相应的键盘层,短按输入一个基础键码的功能。LT接收两个参数,第一个参数是待激活的键盘层,第二个参数是一个基础键码。
- TO 层激活键
- TO用于激活某一个键盘层,按下会使得某一层被长期激活,不经常使用。TO有一个参数,代表待激活的键盘层。TO只有一个参数,就是要激活的键盘层。
- MO 临时层激活键
- MO用于按下时激活某一个键盘层,释放该键后恢复初始状态的功能。默认布局中的SUPER和FN对应MO(1)和MO(2)。MO只有一个参数,就是要激活的键盘层。
- DF 修改默认层
- DF用于修改默认层。默认层是一直生效的层,默认布局中层0就是默认层,一般不需要修改。DF只有一个参数,就是要设置为默认层的键盘层。
- TG 层激活状态切换
- TG用于切换目标层的激活状态,如果目标层未激活,则激活该层,反正则取消激活状态。TG只有一个参数,就是要切换的键盘层。
- MT 修饰Tap键
- MT键可以实现在按住不释放时,等效于按住CTRL、SHIFT、ALT或GUI;当短按一下时,可以是一个基础键码。所以MT键接受两个参数,一个修饰键和一个基础键码,可以用一个键位实现两种功能。
- MA 自定义宏
- MA键代表一个宏键码,一共有32个宏键码。用户可以在APP的宏定义页定义这些宏键的内容,实现按一个键输入一长串自定义内容的功能。MA接受一个参数:宏键码的序号,对应Macros页面中的宏的序号。
- FT 功能键
- 功能键是调用键盘内置的特殊功能的键码。目前有info、intro、hotspot、toggle_nkro、clear_bonds、toggle_broadcast。
- info键输出一些设置方面的信息,比如IP地址、蓝牙设备名称等。
- intro键输出关于键盘的英文介绍。
- hotspot键激活键盘的WiFi热点功能。
- toggle_nkro键用于激活键盘全键无冲模式,有些系统和协议对全键无冲模式的兼容性不好,默认是关闭状态。
- clear_bonds键用于清除所有的设备配对信息,一般不需要使用。
- toggle_broadcast键用于打开广播模式,可以同时向所有连接设备输出内容。
- 功能键是调用键盘内置的特殊功能的键码。目前有info、intro、hotspot、toggle_nkro、clear_bonds、toggle_broadcast。
注意由于需要保证层激活键不被激活的层上定义的键码覆盖,层1和层2上对应层激活键的键位需要留空。层0上定义了CTRL、SHIFT等键码的键位,最好也不要在层1和层2上定义其他键码,在同时按下层激活键和CTRL、SHIFT等修饰键时,我们一般希望这些修饰键依然有效。层激活码的设计,可以查看QMK的文档,QMK项目中有详细介绍。
- BS 基础键码
-
定义和使用宏
键盘APP应用上还有一个Macros功能页,用于定义宏键的内容,显示界面如下。

定义宏内容时,我们可能需要输入一些特殊的字符,这些字符无法直接输入。如果需要输入这些特殊字符,需要使用一些特别的语法。
\d表示Delete键。\b表示Backspace键。\t表示Tab键。\)表示)。只有在类似下面\lshift()的()中需要使用表示一个字面上的)需要与\lshift()的)区别开。\e表示ESC键。\lshift(...)表示按下左边的SHIFT键,…表示我们按住SHIFT键不释放,输入的内容。\rshift(...)表示按下右边的SHIFT键,与lshift(...)使用方式一样。\lctrl(...)表示按下左边的CTRL键,与lshift(...)使用方式一样。\rctrl(...)表示按下右边的CTRL键,与lshift(...)使用方式一样。\lalt(...)表示按下左边的ALT键,与lshift(...)使用方式一样。\ralt(...)表示按下有边的ALT键,与lshift(...)使用方式一样。\lgui(...)表示按下左边的GUI键,与lshift(...)使用方式一样。\rgui(...)表示按下右边的GUI键,与lshift(...)使用方式一样。
这些符号支持相互嵌套,例如我们要输入CTRL+ALT+DELETE,对应的语句是
\lshift(\alt(\d)),需要注意括号的匹配。可能有一点需要说明,因为宏的内容本质上是键码序列,所以无法直接输入中文内容,有兴趣的朋友可以自己研究。
后记
最近一直使用这款键盘输入,感觉除了白轴声音有点大之外,手感还不错。为了摊平贴片和定位板的物料成本,我多定制了几套。如果大家有兴趣且愿意冒险(没有售后和保修,只有代码和简单文档),可以后台联系我,我可以按物料价格转让给感兴趣的朋友。
参考链接
- esp32_keyboard - https://github.com/paul356/esp32_keyboard
- QMK Keycodes - https://docs.qmk.fm/keycodes