stm32 diy 机械键盘

Easter79
• 阅读 1423

程序员对机械键盘的需求不止于情怀,当然,对于算法工程师、逻辑复杂而代码量小的软件工程师来说,平时对键盘的操作并没有那么多,可能对机械键盘并不感兴趣。而我曾经是一个日常大量编码、运维的数据工程师,逻辑简单,键盘操作却很多,特别是对十几台服务器ssh不能用鼠标,更增加了键盘的用量。为了统一工作流程,我使用vim作为Windows、Linux的唯一编辑器,让c/c++/python/shell的工作统一到了一个环境中,效率也增加不少。但是这种工作模式让小拇指难以承受,经常到晚上下班时小拇指疼,加班的时候就不能很爽的敲键盘了。

造成小拇指负荷的主要因素是薄膜键盘的手感不佳,和ctrl键的键位不合理。一般使用的台式机薄膜键盘按键按下时发涩,阻力不确定,有时顺畅,有时突然卡一下。笔记本键盘稍好,但关键问题是薄膜键盘的触发是在按键全部按下后,薄膜触点接触时按键按下,没有滞回效果,按下后需要持续发力,只要发力不均匀,即使按键位置在最底端没动,实际信号仍有可能中断,对组合键持续操作产生致命影响。由于我已经将vim的上下翻页键配置成组合键alt+j/k,日常最多的操作就是快速持续翻页,薄膜键盘的特性让这个操作时常卡顿,很不舒服。

而机械键盘就可以解决这个关键问题,其按键的触发仅取决于按键位置,并具有滞回效果,只要保持按键按下,即使手指的力度已经发生颤抖,按键信号仍然不变。对于长时间的工作,可以使用红轴,让按键力量最小,减少手指疲劳。

我的第一款机械键盘是code,一个厚重的全键盘,大小写转换按钮可配置为ctrl,这样,小拇指的运动距离缩短了不少,施力角度也省力,保证了全天的键盘操作,加班也能狠狠的敲。

但是code的键盘布局与普通键盘并没有太大的变化,常用的操作:上下左右、home、end、page up、page down在右侧,操作时,需要右手离开主键盘,造成操作中断。

stm32 diy 机械键盘

而HHKB的60键布局解决了这些问题,其ctrl键原生就在大小写转换开关的位置上,通过fn组合键实现上下左右等按键,以及F1~F12功能键,让手部活动降低很多。

stm32 diy 机械键盘

但是HHKB的空格键很长,Fn组合键不好按,上下左右与vim不统一。受minila的启发,我决定自己做一个机械键盘。

minila键盘图片:

stm32 diy 机械键盘

自制机械键盘使用59键布局,以小为美(便宜)采用短空格,充分利用大拇指,将fn放在大拇指位置,不仅实现被省略按键的组合(兼容vim习惯),还实现一些常用功能,如shift+del、alt+printscreen等。还加入了鼠标功能,由组合键实现。当然,既然自己做了,就把键盘灯也加上,每个按键有一个LED,可实现20级亮度调节。

stm32 diy 机械键盘

使用stm32f103vbt6作为主芯片,led使用压降3v的高亮管,1k限流电阻,大约1ma电流,59键大约60ma,主芯片单片可承受。

感谢网站http://www.keyboard-layout-editor.com提供了键盘设计自动化图纸生成:

stm32 diy 机械键盘

网站 http://builder.swillkb.com/ 可转换为dxf文件,直接导入pcb软件,大大简化了设计。这种按键配置的键帽肯定是没有现成的,只能买无刻键帽凑合一下。甚至有些按键的长度和高度也找不到匹配的,所以最后空格键选用了很长的右shift,左右各留了一点空隙。实际按键的键帽与设计不符,自己用自己知道就好。就是别人用我的键盘的时候会很麻烦

此键盘的按键并不是扫描键盘,而是每个轴体都有一个引脚。通过一个引脚时分复用,实现led亮度调节和按键状态传感。这是此键盘与众不同之处。我没看过其他键盘的方案,自己的机械键盘也没有拆解过,所以全凭自己想象来了。部分按键原理图:

stm32 diy 机械键盘

这一版用的3.3V电,走asm1117-3.3线性稳压,效率低。下一版应该改成usb 5V直接给LED供电,改大限流电阻,或者找更高导通电压的led

扫描和灯的控制共用0.5ms的时隙,10ms为一组,每个时间组首先扫描按键,扫描完成后按照灯的亮度设定设置引脚是否需要输出。10ms后重新设置为输入模式扫描按键。所以按键扫描频率为100Hz,led的PWM频率为100Hz,占空比为20档。

USB描述符配置申请500mA电流,使用100mA时,键盘容易掉。

我的焊工并不专业,凑合看吧。一开始使用的助焊剂有问题,未洗板上电短路,废了2块板子。后来改用松香助焊,看着磨叽,好使。

stm32 diy 机械键盘  stm32 diy 机械键盘

芯片还好焊,主要是按键定位孔开大了,按键左右摆,要焊完把歪的轴体扭正。usb线本来是要用microusb接口,但是可能买的接口质量太差,插两次就接触不良。后来改用飞线将usb引到外置转接板上,再用热熔胶固定到壳体上,这样插拔时的侧向力能够得到缓冲,就好使了。再后来直接将usb线焊接到电路板上,壳体打孔引出,加热熔胶固定。

stm32 diy 机械键盘

一般人第一眼看到这键盘都会说,你这怎么空了一块,不能补上吗?我就会说:这就是diy的个性风格(不会补)。主要是担心裸露的PCB吃灰进水。这是使用两年效果:

stm32 diy 机械键盘

还不算脏,但轴体吃灰会导致不灵敏,所以长期放置需要套袋,或者盖布。另外,吃外卖的时候会溅到油,弄到电路上没事,弄进按键里边就不好擦了,不过所有键盘都是这样的。

刨去diy过程中个性定制的logo、LED图案和新奇感,使用时带来了不少便利,是很实在的,偶尔换回普通键盘感觉还是很明显:

1、优先使用大拇指,实现组合键

2、将Ctrl移动到caplock处,取消caplock,减轻了小拇指负担

3、方向键使用vim风格,home end pageup pagedown也使用hjkl实现

4、使用键盘模拟鼠标,用于连贯动作,减少键鼠切换,主要鼠标操作仍通过实体鼠标实现

5、键盘尺寸小,降低空间占用,减少手的移动范围,便于携带

6、无段落感的红轴,减缓手部疲劳,易于使用组合键并通过按键时长实现光标鼠标移动以及滚屏的连续控制

7、使用消音胶垫,进一步让感觉变软、变轻,降低噪音

最后给个开源的链接:包括pcb图和基于keil的源码,未使用固件库

https://github.com/yangzigy/yz_keyboard

自己做键盘看似简单实际上挺折腾,关键是麻烦,各种小物件要分别采购,而且非标键盘很难配件,还要焊接。所以有很多朋友要做都没有做成。但是如果习惯了vim体系的操作,不妨花些功夫定制一套,会离不开的

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k