51单片机键盘


(其实是知乎内容的搬运)

知乎链接

低端键盘diy,从入门到放弃 - 知乎 (zhihu.com)

前段时间捣鼓按键的时候突发奇想,想做一块小键盘放在左手边的104布局,方便实验输数据,左手键盘敲数据,右手鼠标,从这学期开学开始谋划,做到现在基本能看了。

这块键盘在开始谋划的时候参考了很多刘威老师的博客,顺便指路一下:

diy从pcb到焊接,到程序调试,真正意思上的diy机械键盘pcb由ad绘制 - 知乎 (zhihu.com)

以及另外一个大神:

你有什么有单片机或开源硬件做的有意思的作品吗? - 知乎 (zhihu.com)

芯片选用

我承认这显得很奇怪,但是我确实采用了51芯片来做这件事,芯片没有办法直接配备hid协议,因此还要单独配一个usb芯片,这里选择的是ch9329,一款可以直接将串口信息转为hid信号的芯片。

CH9329 是一款串口转标准 USB HID 设备(键盘、鼠标、自定义 HID)芯片,根据不同的工作模式, 在电脑上可被识别为标准的 USB 键盘设备、USB 鼠标设备或自定义 HID 类设备。该芯片接收客户端发送过来的串口数据,并按照 HID 类设备规范,将数据先进行打包再通过 USB 口上传给计算机。通过提供的上位机软件,用户也可自行配置芯片工作模式、串口通信模式、串口通信波特率、多种超时时间、VID、PID,以及各种 USB 字符串描述符。

设备清单

STC15W4K32S2

CH9329

TTC金粉轴

CD42锂电池芯片模块

蓝牙JDY-18(废弃)

WS2812反贴灯(废弃)

二极管1N4148

AMS1117-3.3V(废弃)

卫星轴

电容

碳纤维定位板

布局设计(这一段可以参考刘威老师的博客)

键盘的布局可以去 http://www.keyboard-layout-editor.com/ 进行设计

在preset处可以选用一些比较常见的布局,注意复制粘贴的操作,选中某个键以后会在这行后面加上你复制的键位,但如果你复制的键位不止一列,它会在最下方重开一行,如果不选中任何键的话会直接粘贴在最下方新开的一行

properties处可以设定键位的名称和长宽

在rawdata处得到我们需要的数据,全选后复制,进入下一个网站Plate & Case Builder - swillkb

在plate layout处粘贴上我们刚才复制的数据,switch type可以选择按键的类型,如果要对照着来画pcb的话,如果采用跟樱桃轴适配的一类轴体建议采用第三个(也就是我选中的这个),他跟键轴的封装是对应的,当然,在后续找厂家定制定位板的时候,前三个都是可以的。

stabilizer type指的是卫星轴/平衡杆的类型,具体可以点一下看看,比较通用的是cherry+costar{_s1:}。

edge pading指边缘补充,不打开的时候键轴离边缘距离比较短,如果需要打开的话可以适当的增大键轴离边缘距离。

plate corners 是圆角处理,根据需要选择。

custom polygons为自定义多边形,这个就得发挥你的想象力了。

kerf不知道是啥,大家可以试几个参数看看效果。

key unit size是键轴的大小,一般不用改,除非你的轴也是定制的,而且跟公模不一样。

line size 和line color 就不说了,意义不是特别大,也比较好理解。

这里有一个叫做case type的内容,如果选择none的话,就只生成定位板的dxf,如果选择sandwich的话则生成一套的dxf,包括表面层,底层,定位板,和边框。

poker选项就有点类似直接把板子叠起来,放到一个小盒子里固定。

在pcb布线排元件的时候,我们需要把Switch Layer的dxf下载下来,打开ad,左上角file->import->dxf/dwg

到这里前期准备就已经结束了。

程序设计

键盘的客制化目前比较主流的还是用Arduino刷qmk固件,操作比较简单,具体的刷qmk操作可以参考下面这个链接:

低端客制化,一份简单的键盘制作记录 - 知乎 (zhihu.com)

另外一类的就是用stm32来实现矩阵键盘和用stm-cube实现hid协议的配置,像文章开头的两篇文章。

(但是我只会用51啊)

所以虽然很麻烦,外设还需要搭配上usb芯片,但我还是只有这种实现手段了。

矩阵扫描有三种方法,行列反置,行/列扫描,状态机,我们采取的还是列扫描(行扫描和列扫描要根据你二极管的方向决定),具体实现的代码这里就先不摆出来了。

根据矩阵扫描的结果,得到一份符合ch9329通信协议的串口数据,发送给ch9329芯片,配置好ch9329和stc芯片的波特率,就能得到hid信号。

并不需要处理长按或者短触这种操作,只需要把键盘扫描的结果发送过去即可,可以新增一个数组保存上一次的键盘数据,新的一组键盘扫描数据如果跟上次的数据一样,可以不发送新的这份数据(但我这里并没写这一部分,并不是特别重要,哪怕数据重复发送,系统也是可以处理的)。举个例子,如果我什么都没按,那键盘扫描的结果会是八个0,这八个0的数据包通过ch9329不断地发送给电脑,电脑也能够理解你是一直什么都没按;如果你只按下了a,那键盘的扫描结果会是0 0 0x10 0 0 0 0 0,这一组数据包通过ch9329不断地发送给电脑,电脑也是能够理解你是一直按着a的,并不影响实际操作。当然我们采取的是ch9329的协议传输模式,需要有数据包的包头和求和验证。具体的协议要求可以看ch9329的文档:

CH9329芯片串口通信协议.PDF (book118.com)

这里需要讲一下这个求和验证码,键盘码协议里事实上只要把数据帧头的两个hex码当作0x01,求和就是它这里的结果了。

了解了这两个以后,剩下就是很简单的流程了:芯片扫描->得到键盘按键结果->加工成数据包串口发送给ch9329->ch9329发送usb-hid信号给电脑。只需要注意波特率就好了。

蓝牙(弃用)

蓝牙功能有两种方法实现,第一种是用具备hid协议的蓝牙模块,第二种则是再写一块蓝牙适配器,通过蓝牙传输串口数据,串口数据再通过ch9329进行hid协议信号发送。但这里由于我当时偷懒,锂电池芯片并没有画电路,而是直接把一块锂电池芯片模块焊接在pcb上(这里甚至画封装的时候画反了,又画了一块新的转接板),而这块锂电池芯片模块有一点不适合,如果这个模块进入休眠的时候,必须按一下模块自带的一个按钮才能使用锂电池的供电,并不是特别的方便,而且蓝牙放在了pcb板的边缘,为了后续方便做外壳,就把蓝牙模块给阉割了。蓝牙模块阉割以后,ams1117稳压芯片就没有什么意义了,因为已经没有第二个需要3.3v电压的器件了。

ch9329因为有协议传输模式,能够更好的避免因为数据丢包导致的各种操作问题,建议不要使用ch9328而去选用ch9329的协议传输模式,一般具备hid协议的蓝牙都是串口透传,方便但有时会出现些丢包导致的操作问题。

ws2812b贴片灯(弃用)

这一部分弃用的主要原因是因为反贴的封装并没有画好。。。焊接起来并不方便,当初因为担心51系列芯片没办法同时处理串口数据发送和PWM控制,所以灯位留给了另一款块芯片控制。这一段程序参考的是论坛里的一份源码,链接如下:

基于51单片机的WS2812B全彩灯程序,亲测可用 - 单片机DIY制作 (51hei.com)

全键无冲

标准的键盘hid协议一次只能传输6个普通键位,所以一般键盘都是6键无冲,但如果你会配置自定义hid协议,也是可以实现全键无冲的(二极管防鬼键只是在物理层面上实现了这种可能,实现全键无冲还是需要协议支持的),但自定义hid协议有可能导致在一些比较古老的主板上兼容性不好。hid协议的自定义可以参考一本教程叫《圈圈教你玩USB》。这里图方便我并不去配置这个内容了,当然,如果采用stm32的话可以直接用stm-cube搭建hid协议。

原理图和PCB

这里看一下就可以了,事实上这个pcb的布局非常糟糕,当时做键盘的时候啥也不会,以为元件放正面会影响手感,把元件全放在了背面,导致整个pcb非常臃肿,连钉位都没加。

usb接口直接选了usb母头,甚至没有选择micro-usb母口,这个设计直接被我师姐嘲讽。

外壳设计

刚才提到整块pcb是没有留钉位的(只留了smt贴片需要的四个1.1mm的定位孔)因此只能选用一个比较古老的家具结构——榫卯。如果要采用榫卯的话就拿钻头和锯子磨榫眼就是必须的操作了。

这里的结构比较简单,其实就是边缘托起整块pcb,定位板和键轴,定位板和pcb间距大概是3.7mm,做成一种卡扣的形式。但需要注意pcb和定位板之间需要给卫星轴的铁支架留点位置,托住pcb的部分需要留给背面边缘的元件一点空间,具体实践起来并不难,实在有设计不周到的地方就拿锯子和电钻磨掉好了,反正做榫卯就要做这种磨合保证它卡稳。

因为选择了usb母口,太厚了,所以底板加厚到了5mm,因此整个外壳高度去到了17.8mm。剩下的事情就用3d打印好了,这里用的是abs光固化。(这里建议不要去tb,直接找厂家加工)

定位板则是直接选择了碳纤维板,把第一步里得到的switch layer(其实就是定位板)拿去给厂家加工。

键帽

整套键盘应该说就是为了这套键帽服务的,也是去找tb定制的五面热升华

无非就是在photoshop上,把第一步键盘布局的jpg加载的第一个图层,把想要的图放在第二个图层,在第一个图层选中好要抓取的位置以后切到第二个图层,就能把键位的图都抠下来了。(但我师姐还是指出这个搭配并不好看)

其实本来希望的效果是图片中央的部分直接贴在键帽上方,剩下的四边延伸一下贴在四个面,但自己并不会用Illustrator,老板也是第一次做这种形式的,所以最后可能效果并没有那么理想,但也还能接受。

键帽就是圣经诵读了。《我永远喜欢朱迪》《为莉莉娅献上心脏》。

GitHub链接:DidUSeeMyElk/51keyboard: stc15单片机做的一个键盘 (github.com)


文章作者: LYC
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LYC !
评论
  目录