几个月前,我的USB键盘制造项目已经完成。 除其他外,我完成了电子电路的设计,设计了印刷电路板,对固件进行了编程,以CAD进行布局并组装了设备。 结果是我每天使用一个舒适的键盘,并亲切地称其为KeeBee:
KeeBee键盘决赛项目的几个目标:
- 计划的自我创造。
- 编写键盘固件。
- 了解USB协议的工作原理。
在工作中,我主要开发用于云服务的软件,其中缺少许多实际设备层。 因此,摆脱一些抽象并进入硬件级别是非常好的:这里是您可以触摸和使用的真实电子设备。
研究和CAD布局
我真的很喜欢简约的
OLKB普朗克和Preonic风格的键盘,由于按键的正交排列,它们非常紧凑。 我也立即知道我想使用Cherry MX Brown开关。 考虑到这两个设计组件,我开始使用
OpenSCAD中的关键布局。 这是一个很棒的开源工具,它比WYSIWYG鼠标界面更像一种编程语言。
考虑到Cherry MX文档中元素的尺寸,我
为顶板进行了布局 ,然后添加了开关和键以了解最终结果。 顶板位于键盘PCB上方,可以用作开关的稳定器。
顶板设计:

添加密钥后:


电路板原型设计和固件设计
作为主要的微控制器,我选择了
STM32F042K6T6 。 如果从一块购买,这大约是每片三美元。 他有足够的接触点可用于
扫描 69个键的
矩阵 (总共32个接触点)。 它在ARM Cortex M0处理器上运行,并包含用于发送USB信号的特殊USB外设,而无需为此任务加载主处理器。 在将其集成到我的PCB设计中之前,我用该芯片购买
了Nucleo原型开发板 。 Nucleo非常方便地放在面包板上,并通过USB供电。
我在面包板上放置了一个四键小电路,以测试我正在研究的
二极管电路 。 忽略方程式的USB端,第一步就是要使Cherry开关在按下按钮时可靠地打开和关闭四个相应的LED。

当开关的数量多于微控制器上的触点时,则需要使用扫描矩阵。
当矩阵
令人满意地工作时,就该使用USB了。
内置固件周期本质上是这样的:
- 扫描矩阵中的所有键。
- 使按钮的位置与所选布局中的相应字符(QWERTY,Dvorak等)匹配。
- 获取比较结果,生成USB HID报告数据包并将其发送到USB外围设备。
- 打开键盘上的LED,如果按下该键,则关闭-否则。
从
main.cc :
static void scan_and_update() { scan_matrix.Scan(key_scans, row_count, column_count); keyboard.SendReport( key_pipeline.MapKeyScans(key_scans, key_count)); update_key_press_status(); } int main() { Init(); status_led.SetOk(true); while (true) { scan_and_update(); } }
keyboard.SendReport
组件实际上将数据包传输到USB主机。 我尽力使USB正常工作。 该协议中有许多不平凡的层,需要准确的时序和
设备的正确
标识 。 最后,我必须运行Wireshark来监听进入我的Linux笔记本电脑的所有USB数据包,并找出丢失的地方。 在Internet上进行搜索几乎没有任何结果,大多数问题的回答大致是这样的:“您的USB设备可能坏了,您需要购买一个新设备。” 如果您实际上是在
设计 USB设备,那么这些答案并不是很有帮助。 我只能使用大量不熟悉的术语来介绍大量的USB规范。
经过一会儿的修改,我仍然用四个键使键盘正确地标识为USB HID(人机接口设备),并且所有按键都正确地传输到了笔记本电脑上:

注册为USB供应商并获取正式的设备ID十分
昂贵 。 如果您只有业余项目,则必须
获取一些类似设备的标识符 。 我认为“齿轮头”听起来很酷,尤其是因为它们释放了键盘,所以我选择了它们。

电路与PCB
收到了或多或少有效的固件和有效的原型后,就该在
KiCAD中绘制电路并设计电路板并制作出真正的电路板了。 当我确保4个按钮的电路正常工作时,相对简单的任务是将所有内容连接在一起:

在开发完电路并安装了组件的焊盘后,您需要制作一个真实印刷电路板的模型:

KiCAD可以精美地渲染3D未来的电路板:


有很多很棒的KiCAD教程。 我从Chris Gammel的出色的
入门到Blinkey 4.0视频
系列开始,他
从头到尾详细解释了在KiCAD中创建LED链接器电路的所有步骤。
订购PCB和组件
在使
电路板设计和设计达到令人满意的水平之后,我开始下很多订单:
- 材料清单中的所有组件:开关,LED,二极管,微控制器等。我通常在DigiKey上订购这些东西。
- 电路板本身。 很多服务已经准备就绪,可以廉价地使您成为原型。 我在OshPark和JLCPCB方面拥有丰富的经验。 在这个项目中,我之所以选择JLCPCB,是因为这种尺寸的价格,也因为他们允许我选择蓝色涂层。
- 所有其他详细信息:封面和内容。 对于这个项目,我的姐夫帮助激光切割了1/4英寸丙烯酸板的上下键盘板。 对于其余零件,如果您无法访问设备,则可以使用在线激光切割和3D打印服务。
包裹到达的那天是最好的:


JLCPCB是一项非常实惠的服务。 这种带有DHL从中国交付的设计的成本不到30美元,从下载文件到包裹到达的整个过程花了一个多星期的时间。
Shurin从OpenSCAD中获取了
DXF文件 ,并将它们扔进了激光切割机中:

最终组装
收到所有细节后,我开始组装。 第一步是组装电路板的组件:用于大型电子组件的
烙铁和用于小型组件(例如STM32微控制器)的表面安装的
焊台 。
电路板的总组装时间约为三个小时-大部分时间是焊接70个二极管和开关。
我添加了用于JTAG调试的标头,通过该标头,我使用
OpenOCD连接了用于微控制器固件的
JLINK Edu mini 。
然后是时候进行最终测试和最终组装了:



儿子认为这对他的动物来说是一架很好的火车:


总结
从最初的想法到最终的组装,该项目耗时约三个月。 作为业余爱好,做我每天仍在使用的工作非常有用。
所有项目文件都
在GitHub上发布 ,包括固件源,电路板,材料列表和CAD模型。
感谢您的阅读,并喜欢这些技巧!