基比 从头开始制作自己的USB键盘

几个月前,我的USB键盘制造项目已经完成。 除其他外,我完成了电子电路的设计,设计了印刷电路板,对固件进行了编程,以CAD进行布局并组装了设备。 结果是我每天使用一个舒适的键盘,并亲切地称其为KeeBee:


KeeBee键盘决赛

项目的几个目标:

  1. 计划的自我创造。
  2. 编写键盘固件。
  3. 了解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了。

内置固件周期本质上是这样的:

  1. 扫描矩阵中的所有键。
  2. 使按钮的位置与所选布局中的相应字符(QWERTY,Dvorak等)匹配。
  3. 获取比较结果,生成USB HID报告数据包并将其发送到USB外围设备。
  4. 打开键盘上的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和组件


在使电路板设计和设计达到令人满意的水平之后,我开始下很多订单:

  1. 材料清单中的所有组件:开关,LED,二极管,微控制器等。我通常在DigiKey上订购这些东西。
  2. 电路板本身。 很多服务已经准备就绪,可以廉价地使您成为原型。 我在OshParkJLCPCB方面拥有丰富的经验。 在这个项目中,我之所以选择JLCPCB,是因为这种尺寸的价格,也因为他们允许我选择蓝色涂层。
  3. 所有其他详细信息:封面和内容。 对于这个项目,我的姐夫帮助激光切割了1/4英寸丙烯酸板的上下键盘板。 对于其余零件,如果您无法访问设备,则可以使用在线激光切割和3D打印服务。

包裹到达的那天是最好的:





JLCPCB是一项非常实惠的服务。 这种带有DHL从中国交付的设计的成本不到30美元,从下载文件到包裹到达的整个过程花了一个多星期的时间。

Shurin从OpenSCAD中获取了DXF文件 ,并将它们扔进了激光切割机中:



最终组装


收到所有细节后,我开始组装。 第一步是组装电路板的组件:用于大型电子组件的烙铁和用于小型组件(例如STM32微控制器)的表面安装的焊台

电路板的总组装时间约为三个小时-大部分时间是焊接70个二极管和开关。

我添加了用于JTAG调试的标头,通过该标头,我使用OpenOCD连接了用于微控制器固件的JLINK Edu mini

然后是时候进行最终测试和最终组装了:







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





总结


从最初的想法到最终的组装,该项目耗时约三个月。 作为业余爱好,做我每天仍在使用的工作非常有用。

所有项目文件都在GitHub上发布 ,包括固件源,电路板,材料列表和CAD模型。

感谢您的阅读,并喜欢这些技巧!

Source: https://habr.com/ru/post/zh-CN441032/


All Articles