> 攻略 > 手游攻略 > 详情

造一块机械键盘,其实本质上就是一个开关

2024-04-24 09:07:22 | 来源: 互联网整理

前排警告

警告

您将在考试周中浪费宝贵的12分钟阅读此推送,其中包含但不限于以下内容:

我的电脑如何知道我的鼠标是鼠标,我的键盘是键盘?

为什么我的机械键盘只能同时按六个键,而笔记本电脑的内置键盘却可以按“ASDFGHJKL;” 同时十个键没有问题吗?

为什么我无法同时按下笔记本电脑键盘上的四个 QWAS 键?

自娱自乐/随意科普/自我抱怨/作者傻

自从加了显示器之后,我就一直想加一个机械键盘。 但本着买不如做(?)的原则,我决定自己打造一个机械键盘。

“打造机械键盘”的目标大致分为两个任务:

如何制作你认为是键盘的东西

如何让电脑知道自己是键盘

下面我们分别谈谈如何实现这两方面:

01

机械键盘结构介绍

想要打造机械键盘,首先要知道机械键盘包括哪些部件:

键轴

机械键盘作为键盘诞生以来一直沿用的结构,至今仍然受到很多人的青睐。 关键在于它的感觉(和噪音)。 按键开关是赋予机械键盘独特手感的关键。

所谓钥匙轴本质上就是一个开关:钥匙轴内部有一个弹簧和一个接触开关。 按下时,触点开关接通; 释放时,弹簧弹起,接触开关关闭。

通过改变弹簧的刚度系数和接触开关的结构,键轴可以得到多种手感(和声音)。 不同手感的按键开关往往通过颜色来区分。 之前没接触过机械键盘,所以这次本着好玩的原则,买了绿轴和静音红轴。

绿轴

静音红轴

图是我买的国产轴。 谁有钱就可以买Cherry斧头。 反正我没买。 一根Cherry轴可以买三把国产轴……

除了颜色之外,按键开关还可以按照许多不同的维度进行分类:

PCB(印刷电路板)

如果说键轴是机械键盘的灵魂,那么PCB可以说是机械键盘的生命:键轴焊接/插装在PCB板上后,PCB板上的芯片完成的功能读取按键状态并与电脑通讯。

键盘的PCB非常简单,只需将按键与控制芯片连接即可。 简单来说,就是在芯片的GPIO口上连接几个开关。

然而,全键盘上有 104 个轴。 我们需要一个具有 104 个 GPIO 端口的芯片吗?

不! 我们可以将按键轴连接成棋盘状,读取按键状态时,向每一行输入高电平,观察每一列的电平是否升高。 这就是为什么只有4+4=8个接口的矩阵键盘才能读取4×4=16个按键的状态。

暑假选过硬件的读者应该对矩阵键盘很熟悉。

但这种结构仍然存在问题:按下位于第 i 行 j 列的按键 A(i, j) 后,如果再次按下 B(i, n) 和 C(m, j),则m 行的输入会通过 C→A→B 传递到 n 列,使键盘认为 D(m, n) 也同时被按下。

问题的关键是我们希望信号从行到列单向传输,但按键开关是双向的。 因此只需将一个二极管与每个按钮串联即可。

题外话

对于笔记本自带的薄膜键盘来说,没有足够的空间来添加二极管,所以我们必须使用软件来管理按键:当A(i,j)、B(i,n)、C(m,j) ) 被检测到, ),则强制认为 D(m, n) 处于未按下状态。 也就是说,两行两列交出的四个按钮不能同时按下。 读者可以自行测试:同时按下笔记本电脑键盘上的QWAS时,会发现最多只能输入三个键; 但同时按下四个ASDF键时,四个键都可以正常读取。 (虽然PCB的电气排列并不一定与位置排列完全一致,一般会改变电气连接方式,以减少四键冲突的影响。例如同一排的RFUJ和可以同时按下同一位置,这是因为电气连接是专门为避免将它们放在同一排而设计的。)

其他结构

以下是普通键盘的其他不太深情但通常需要的结构:

定位板

采用与按键布局和形状相对应的钢板/碳纤维板进一步固定键轴。 如果键轴是三销键轴,没有定位板就会晃动(但有些人特别喜欢这种感觉); 如果键轴是五脚键轴,有没有定位板也没关系。 本着节省成本的原则,笔者没有做定位板(我在淘宝上问过,做一个板要100多,还不如直接买个五脚轴,省掉定位板。 ..)

键帽

不能直接按下键轴。 其次,不美观,主要是对手有刺激。 键帽是键盘的脸面,分类也越来越多。 从材质上来说,有ABS塑料,成本低,易加工,但用久了会变光滑(沾油); 还有PBT塑料,硬度高,有颗粒感,不会上油。 从雕刻位置来看,也有正面雕刻、侧面雕刻、不雕刻、隐藏雕刻等区分。 如果PCB板上加跑马灯,还需要进一步考虑键帽的透明度。 笔者直接买了一个纯白色的键帽,没有刻字。

卫星轴

有的键帽比较大,只有下面贴的小键轴不稳定,所以加了卫星轴。 我没有使用过,所以就不详细介绍了。

02

如何让计算机相信这确实是键盘

作者对底层协议的细节不是很了解,所以这里我形而上的讲一下协议顶层的东西。

常见的键盘接口协议有两种:PS/2和HID,可以通过接口的形状大致区分。

PS/2 使用的连接器

(有没有开始怀念?)

HID 使用的连接器

(是的,就是USB接口)

PS/2是较老的协议,在HID协议出现后逐渐被取代。 如今,外接 PS2 键盘已经很少见了。 由于各种原因,只有笔记本电脑附带的键盘继续使用 PS/2 协议。 大多数外接键盘都是 HID。

那么,HID 协议是如何工作的呢? 粗略地说,键盘上的芯片会向计算机发送一份报告描述,告诉计算机它要传输的数据报告(Report)是什么格式以及应该如何解释。 并不断向计算机发送相应格式的数据报告。

键盘设备的默认报告是一个八字节的数据字符串。 第一个字节的八位代表左/右Shift、Ctrl、Alt、GUI共八个按键的按下状态。 第三到第八个按键总共代表 6 个字节,分别存储 6 个按键码,表示当前按下的按键。 (至于哪个键码对应哪个键,HID协议中规定了)

买过机械键盘的同学应该都听说过“六键无滚”这个词,就是说最多只能同时按六个键,按多了就无法输入了通常情况下。 这是因为默认报告只能同时发送六个关键代码。

题外话

六键无滚虽然正常使用已经足够了,但在某些时候(比如两个人打拳皇)还是很不方便,所以我们希望“全键无滚”,即即使所有键都按下同时(如104台)计算机也可以全部接收。 通常有两种方法:

一种是让芯片告诉电脑这不是键盘而是N个键盘,从而向电脑发送N个报告,这样就可以同时按6N个键(结果就是当你插上键盘时,电脑会发现自己突然连接了十几个键盘……)。

另一种不太暴力的方法是操纵报告:在特定位置使用一个位来表示特定按键的按下,这样只需要 13 个字节即可表示 104 个按键的状态。 然而,为了让计算机知道哪个位对应于哪个按键,需要下载相应的驱动程序并在计算机上运行,​​这不像以前的方法那样即插即用。

此外,与发送键盘按下状态的 HID 协议不同,PS/2 协议发送按下和释放每个键的动作,因此不存在 HID 六键翻转限制。 读者可以自己尝试一下:按“ASDFJKL;” 笔记本电脑键盘上同时有八个键(大拇指长的读者可以加GH),八个键都可以正常输入。

基础知识已经完成(大概)了,现在就开始干吧!

03

开始制作键盘!

键盘和键帽都是现成的产品,唯一需要你自己设计的就是PCB。 由于笔者比较懒,所以选择使用现成的STM32F103C8T6开发板作为控制模块。 这样,我只需要将按钮引导到PCB上的插针孔中,然后将插针插入开发板即可。 不需要自己添加STM32F103C8T6。 芯片设计外围电路。

PCB设计与制造

当然,你可以直接使用EDA工具来绘制PCB,但是这里我们使用一些辅助工具来帮助我们完成一些繁琐的工作:

。 在这个网站上,您可以直观地设计键盘的键位和布局(布局是关键,以后重新烧录程序可以随时调整键位),并帮助您生成相应的描述布局的json文件。

作者根据个人习惯设计了关键位置。 104个全键盘键的大部分按键和鼠标功能通过三个翻页键塞进了42键键盘的40%。 由于我发现我从来不用左手按空格键,所以我把空格符放在右侧,左半个空格就成了翻页键。

。 将刚才的json文件上传到本网站即可生成对应的CAD文件。 如果您正在制作定位板,这会很有帮助。

。 将刚才的json文件上传到本网站,可以帮助你绘制电路原理图,并生成可以用EDA工具编辑的文件,这样你就不用自己画矩阵键盘连接原理图了。

使用KiCAD(AltiumDesigner当然更好,但是我没有足够的电脑空间来安装这么大的软件,所以我必须使用轻量级的开源KiCAD)打开刚刚生成的文件,并根据STM32开发板引脚位置。 引脚并连接相应的引脚

示意图,左侧是生成的矩阵键盘,右侧是根据开发板上GPIO口位置设计的排针连接。

然后将原理图转换成相应的PCB板。 经过一系列的布局和布线操作,得到如下图所示的结果。

PCB板。 记得把二极管放在背面,否则键轴会被夹住,无法完全插入PCB。

KiCAD 生成的 3D 效果预览。 由于我们不打算做外壳,所以我们在PCB背面画了丝印作为装饰。 本来想用实心图案,但发现KiCAD不支持填充的CAD文件,不得已才改成对角线填充。

PCB设计出来后,不可能自己制造,废液也无法自行处理,只能送到深圳嘉利创。 这时候你就能感受到KiCAD作为开源软件的好处了。 只要安装第三方插件,就可以一键导出嘉利创生产制造所需的所有文件(参考/toopoo/article/details/106454874)。 一周后,我收到了五块PCB,如下。

焊接STM32开发板和键轴

(同时使用室友快乐轴和室友痛苦轴)

焊接工艺就不多说了。 主要说一下我们做过的傻事:

STM32F103C8T6的HID功能需要将PA14和PA15两个引脚直接连接到板载Micro-USB端口。 一般的开发板都是这样连接的。 但我之前买的开发板是将Micro-USB口的数据连接到USB转UART芯片上,所以我必须手动连接两根线。

在设计排针布局时,我忘记了PA14和PA15应该为HID保留,而直接将它们用作普通GPIO端口。 最后只好把对应的两个排针剪掉,飞出本应连接PA14和PA15的两个接口。 连接到其他 GPIO 端口。

HID 协议要求从机上的 D+ 引脚(连接到 PA11)通过 1.5kΩ 上拉电阻上拉至 3.3V。 STM32F103C8T6中没有这个上拉电阻,所以需要手动焊接。

我在 PCB 的四个角上添加了机械孔。 我想用铜柱将一块未使用的PCB安装在键盘下方作为外壳。 原来是机械孔太小,螺丝拧不进去……(所以最后没有套管。)

编程

关于如何使用HID我就不详细说了。 如果您使用STM32开发版,只需参考配置中的步骤即可。 如果你想添加鼠标功能,也可以参考/developer/article/1652367进行配置。 作者指的是后者。

配置好报告后,检测击键的主要逻辑也非常简单:

遍历所有行和列并标记所有按下的按键

根据三个翻页功能键是否被按下来确定当前使用的按键布局。

遍历每个按下的按键,并将当前按键布局上对应位置对应的键值存入报表中

将报告发送到计算机

根据/s/7DDPovGxbz83S95lFQZC2g配置使用VSCode开发STM32的环境。 VSCode太好吃了,赞一下怀神!

完成品

虽然可以用,可惜最近太忙准备考试了,没时间做shell(这是借口,真正的原因是不会用Solidworks,懒得学) ,所以我只有这样的半成品外观。

另外,虽然把104键+鼠标放在40%的键盘上既方便又美观,但有了这个纯白色的无刻键帽,就让这款键盘特别难驯服,只能放在桌子上做装饰。 看起来像。

撰写者 | 于子涵

审稿人| 刘洋

部分图片来源于网络

热门手游排行榜