#原创新人# 极客范:打造一把程序员专属无线机械键盘
前言
作为一个程序猿,外设是工具,是饭碗,是每天接触时间最长的东西。这其中,机械键盘无疑是提高生产力及工作愉悦感的神器。本人三年前已经购入了两把机械键盘,一把雷蛇黑寡妇青轴放家里用,一把凯酷红轴放公司用。然而,面对着机械键盘越来越火的形势,张大妈不停的推送,以及值友们层出不穷的晒单,看着手上两把老家伙,自己忍不住又想剁手了。可是,市面上提到机械键盘,似乎都是为游戏而生,我只是想要一把办公用的,无线小巧,功能强大的键盘,选择却少之又少。2.4G的基本没有,蓝牙的大概只有大F符合要求,然而荷包君异常羞涩,信仰充值不得。
这样,只能选择自己DIY的路了。之前也翻过很多帖子,改造现有的有线键盘为无线的,要么是用蓝牙,需要画板子或搭一堆模块,并且加装一块体积不小的锂电池,作为只粗懂硬件的程序员,没有这个技能点,只能放弃。另外一种就是用罗技优联改造。作为一个手残党,我也天真地飞了一把优联无线,改造对象为:
优派(ViewSonic)KU520背光游戏机械键盘?87键8键发光青轴 白银色 金属面板...这把键盘百元不到,87键,PCB又是单面板,比较好割线。主控是收了一个二手的罗技K230,对应87键没有问题。现在看着这密密麻麻的蜘蛛网似的飞线,我也是醉了,制作过程及其艰辛,这里暂且不表。其实一开始这把用用还是可以的,但后来发现老是串线,反应也迟钝,有时按下去几个键只能出来一部分按键。小心翼翼拆开用万用表测也测不出什么原因,估计不用二极管直飞也会造成按键冲突,我飞线的时候有些地方可能也有短路或断路。于是用了两星期就弃用了,真是一个伤心的故事。
后来,看到了这篇晒单,又激活了我折腾的心。作者提供的思路使得改造小键盘成为了可能,而且得益于TMK固件的强大,提供了键盘无限强大的可能性。
DIY的极致追求—极轻极薄极小的 YD40w 优联无线机械键盘[前言]可能有不少人看过我去年发的优联40%键盘的DIY帖子,主要的原理部分已经在那篇文章里全部解释了,有兴趣的可以去查看,这次我不再花篇幅介...果断把原来的键盘拆掉,取出K230的主控,并利用狗东键鼠大促的机会,低价入了一把小巧颜值较高的键盘,用优惠券加白条后仅149,作为本次改造的主体。
魔蛋(magicforce)68键机械键盘青轴 白金 背光其实这款键盘分为两个版本,常规版和普及版。区别是常规版用的凯华轴,有背光,以及前板高光边工艺,而普及版用的是高特轴,颜值也稍差一点。狗东促销时,常规版降价加优惠券后甚至比普及版价格还低,果断入了常规版。作为一把小键盘,魔蛋68有方向键以及Del键,平常使用还是比GH60之类客制化的小键盘方便一点,这也是选择它的原因。
DIY的思路:
虽然前面引用的晒单里前辈已经描述的挺详细了,但这里再阐述一下原理,帮各位看官理一理思路,不然可能还是稀里糊涂不知道我要干什么。反正我智商堪忧,看别人的晒单看了几遍才明白这种DIY到底是怎么搞出来的。
罗技K230是薄膜键盘,其原理和机械键盘一样,每个键上的两个引脚对应着主控上的行列信号,按键按下去之后,信号被激活,主控就会知道哪一行那一列被触发了,然后翻译成对应的key code发送给电脑。
改造68键键盘,使其68个轴的引脚都连到K230主控芯片的引脚上。
受限于68键键盘的限制,如果不通过usb2usb转换,直接把优联接收器插在电脑上,那么只能发送68个键的key code,其它键位不能触发。
使用usb2usb转换,得益于tmk固件的强大,那么键位就不是问题,我们完全没必要让键盘的键位和K230的键位一一对应,避免了漫天的飞线。举例说,我们把ESC键连了两根线到K230主控上,这时候在K230眼里这两根线不是ESC,而是F4键,但usb2usb会截获键位码,帮你把F4键转成ESC键发送给电脑端。
68个键以外的按键,通过修改tmk固件里usb_usb converter的keymap实现。
成本方面:
魔蛋68: 149
Arduino Leonardo R3开发板: 28
Arduino USB Host Shield: 45
二手罗技K230: 35
材料若干: 20
总共280左右,一把国产杀马特风格机械键盘的价格。我准备把取下来的PCB出掉,还能回点血,这样总共才200出头的成本。
硬件改造
硬件改造分为几个部分:1. 取下PCB。 2. 装轴飞线。 3. 连优联主控。 4. 装USB2USB转换器。在改造之前需准备的工具:烙铁、吸锡器、焊锡、锡膏、镊子、0.1mm漆包线、电池CR2016、二极管1N4148。
取下PCB
第一步要把每个轴先取下来,我买的常规版带灯的还有68个LED灯珠也要一并取下来,这样每个轴都有四个焊孔需要去锡。
轴的两个脚由于焊孔比较大,很容易清理干净,而LED就麻烦一些,由于手头的烙铁没有刀头,只能用尖头加吸锡器先把LED的两个脚的锡都尽量吸掉,同时加热的时候拨动灯珠的引脚使其松动并居中,最后在另一面勾住灯珠再同时加热两个焊孔把灯珠给拔出来。
吃完晚饭开搞,也一直搞到晚上11点才把整个PCB取下来。
搭桥飞线实现键盘矩阵
搭键盘矩阵之前,我们还是要分析一下K230的原有矩阵。网上已有矩阵图,不用对着薄膜一个一个测了,省了很多时间。看这个图的时候K230的芯片向上,右边第一根金手指为1,一直到最左边是23。
看一下68键盘,横向有5行,竖向有16列,而K230是11X12的结构,这意味着起码有4列是与其它列并用的,并且规划行列时要考虑到每一行每一列对应到K230矩阵里是有按键触发的。下面这张图便是我冥思苦想之后得出的矩阵图。这里A键是个坑,我后面会填。
从图中可以看出,我一共用满了12列,并且右边4列我是和左边几列复用的,那么在实际连线的时候就要飞4根线线过去。行数我用了10行,第18行没用到。之所以这么排列,就是为了最大程度的对应K230的键,不是要一一对应,而是确保不能有用到的行列不能触发的。看一下对应的实际按键矩阵图:
好了,有了理论基础,我们可以装轴搭桥飞线了。先把所有的轴装到钢板上,轴上面和钢板接触的地方有两个小卡扣,会让轴卡在钢板上,虽然不是很牢靠,但也能确保翻过来时轴不会掉下来,焊接时够用了。但这样轴毕竟不是焊在PCB上的,比较松动,以后换键帽时可能会把轴拔下来,那就坏菜了。我这里先临时这么用着,等都弄好了用一段时间觉得没问题了再把每个轴用热熔胶黏在钢板上固定死,就不会松动了。
中间的主键我是用的G茶轴,用惯了青轴红轴想换换口味,而且因为以后要在办公室用,所以还是静音一点好,四边一周大键及方向键等用的青轴,保持一种爽脆感。
开始连线了,我先连的行线,也就是用二极管连。二极管起到的作用就是防止按键冲突,具体的原理有兴趣的看看这里,没兴趣的只要知道把二极管弯成这样:
然后把每一个轴其中一个脚和二极管相连,二极管的红端朝上黑色朝下,把我上面提供的矩阵里一行的二极管都连起来,最后连到对应的K230引脚上。
空格键太长了,只能用导线接了一下。把所有轴的二极管按矩阵连起来后便是这样的:
再用导线把所有的列相连,其中几根长导线就是右边4列和左边几列复用的。
连优联主控
下一步就是用漆包线把K230的引脚引出来。这里借用一张图:
每一个金手指上要刮开石墨涂层,要能看到铜,然后用漆包线焊接在金手指上。建议一次性把所有金手指的石墨刮掉然后用无水酒精擦拭干净再焊接,不然会弄得很脏,并且用锡膏涂在漆包线上再往金手指上焊可能好焊一些,记着把漆包线留长一点,好往键盘上焊。我这23根线反反复复焊了好久,最后焊成这么丑,各位看看就好,反正是能用了。
当你确定每个脚都可以用的时候用热熔胶将其固定住,漆包线还是很脆弱的。
最后再把K230主控的每根引脚按照矩阵图和每行每列相连。
我把K230的主控放在如图所示的位置。这个位置非常好,背面有个小口,本来是魔蛋68的三个拨动开关所在位置,用来实现键盘几个键切换的功能,现在把K230的主控放在这里可以露出主控背面的小开关,不用的时候把开关关了可以省电,要与新的优联接收器配对时也能用到。主控背面用点双面胶就可以粘在外壳上,正面用点黑胶布贴一下做绝缘。
因为魔蛋68用的是键线分离,有个小板子取下来后,背面的usb口就会留个小洞出来,正好引出两根线连接到K230主控的电源引脚,然后恰巧这个地方凹进去一块,我们可以焊一个纽扣电池的底座放在这里,一颗纽扣电池能提供3v的电,满足K230的供电需求,然后用胶布固定住电池底座,以后需要换电池的时候很方便。
▲ 用胶布封好电池底座现在可以将优联接收器插到电脑上,试试每个按键能不能触发了。运气好的话每个键都好使,嗯,除了“A”键。本来我也没放在心上,"A"对应的是“Fn”键,一般都不能识别。但后来在用usb2usb转换时还是出问题了,tmk的固件识别不了罗技的fn键,我只能把这个键拆下来重新飞线连在了17行上面,也就是和Enter键连起来了。所以我那个矩阵图里A所在的位置列是对的,行不对,应该是17。
usb2usb
接下来要做的是usb2usb转接器,usb2usb有三种规格,还是借用原作者一张图给大家看看区别:
中间一个是成品,卖50刀,太贵了而且国内不方便买。右边一个我也买了,我天真的以为把两块小板子叠起来就行,结果排针焊上去连起来后发现不好使,放狗搜后发现还要改造一下,结果排针取不下来了,最后强行取下来时焊盘掉了。
后来我索性就买了最左边这种,这个用起来很简单,直接叠加起来就行了。回头再搞右边那种小的吧,有大神做好出我一个更好。
▲ Arduino Leonardo 和 USB host shield合体
软件篇
终于搞定硬件了,真心不容易,下面是软件,作为软件工程师,还是码代码得心应手,而且,最重要的是,硬件要花钱,软件怎么折腾都不要花钱!!!!其实这套东西最强大的还是软件,通过软件,我们可以实现很多功能。网上有些教程讲怎么改键位刷配列,并且有些图形化的工具来实现。其实仔细看看代码你会发现这个固件能实现的不仅仅是按个键这么简单的功能,它能实现很多高级功能,直接改代码才能够玩得High!
搭环境
我这里用的Windows平台,装一个Mingw以及WinAvr就可以编译tmk固件了
Mingw在这里,不会的网上搜一搜安装教程,很简单,装完后加bin目录到环境变量,命令行里敲gcc有用就行。
WinAVR在这里WinAVR-20100110-install
然后从github上下载下来tmk_keyboard firmware的整个工程,会用git的直接git clone,不会也没关系,github上点download zip包然后解压到随便一个目录就行。然后命令行进入tmk_keyboardconverterusb_usb目录,敲个make试试,应该就能编译了。编译完了会在当前目录下产生一些名字为usb_usb不同后缀的文件,其中usb_usb.hex就是我们即将下载到Arduino Leonardo R3开发板里的固件。这里会用到一个国人写的工具: Arduloader
Arduloader里选好Arduino Leonardo,按一下开发板上的复位开关,这时开发板进入boot模式,电脑会多出来一个串口,Arduloader会自动扫描到这个串口,选好hex文件并点upload就可以烧录固件了。注意boot模式时间很短,大概8秒,一些设置请提前做好。
修改按键对应关系
这时候编译的是标准键盘,什么键还是什么键,我们的目的是要把F4改成ESC这样68个转换。打开usb_usb目录下的keymap_common.c文件,在最后面加入这样一个宏:
我这里定义了一个宏KEYMAP_68,里面是68个按键值,这些值怎么来的呢?看见这个文件上面原来的KEYMAP宏没有,这是一个标准键盘,我们定义的宏和他类似,只不过精简成了68个值,然后每个值的排列发生了变化,比如第一个K3D,在KEYMAP里是在F4的位置,我把它放在第一个,就代表ESC那个位置,以后我用这个宏的时候,定义第一个键为ESC,那么usb2usb实际接收到了优联接收器发来的F4的key code,但它转换了一下,发给电脑是ESC的key code。以此类推,把其它的键都按照我的矩阵找出来,一一对应好,并把随后的KEYMAP_ALL里除了这68个键的其它值都改为定义成NO。
接下来要做的事情是新建一个keymap_my.c的文件。在usb_usb的目录下除了keymap_common还有好几个其它以keymap开头的c文件,我们可以先copy其中一个并进行修改。在修改之前,我先介绍一下几个基本概念。具体的文档可以从这里找到。
TMK的固件里有层的概念,也就是layer。每个层里可以对每个键进行定义,也就是说,不同层里同一个物理按键可能代表不同的键。
你可以定义最多32层(这么多足够用了)。层的切换有好几种方式,最普通的就是按住一个功能键Fn0来切换,类似于普通键盘上的Fn键,比如K230里Fn+F12是静音,TMK里完全可以实现。
另外一个概念就是Fn0,Fn1...Fn32这样的function key。这种功能键可以实现很多高级功能,最简单的就是用来切换层。
tmk提供了一些函数和宏来组合Fn键和layer,具有很大的灵活性。
好了,我们先来实现一个基本的键位,也就是第0层默认层。
用先前实现的宏KEYMAP_68映射出一个基本键位,然后在fn_actions里用ACTION_DEFAULT_LAYER_SET把第0层设为默认层。OK,命令行里编译一下,用这个命令:“make KEYMAP=my”,注意大小写,编译好了烧录进去,看一下键位是不是和你实际键盘的相吻合了吧。
高级功能
在fn_actions里可以使用的宏ACTION_DEFAULT_LAYER_SET只提供了设置默认层的功能,实际上,还有另外一些以ACTION开头的宏,借助于这些宏我们可以实现很多高级功能。我粗略介绍一下这些宏,更详细的还是要看tmk的文档。
ACTION_LAYER_MOMENTARY(layer); // 按住fn瞬间切换到layer层
ACTION_LAYER_TOGGLE(layer); // 按一下fn切换到layer层,再次按fn切换回来
ACTION_LAYER_TAP_KEY(layer, key); // 按住key键瞬间切换到layer层,比如key是;,在当前层仍然是;,按住;可以切换到layer层
ACTION_LAYER_TAP_TOGGLE(layer); // 按fn键多次后切换到layer层,默认次数5次
ACTION_LAYER_MODS(layer, MOD_LSFT | MOD_LALT); // 用modifier键(Alt,Ctrl等)切换layer
ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT); // 双角色键,比如这里按一次是Enter,按住不动是右边的Ctrl
ACTION_MODS_ONESHOT(MOD_LSFT); // 当你输入The时按Shift有时会来不及松开就按下t了,Shift+t此时只起一次作用,t为大写T,此时再按住LShift+h,h是小写
ACTION_MODS_TAP_TOGGLE(MOD_LSFT); // hold住时是LShift,按多次时换层,和ACTION_LAYER_TAP_TOGGLE类似
ACTION_MACRO(ALT_TAB); // 组合键实现的宏
有了这些宏,我们可以实现下一层也就是第1层的内容了,这里用到的是ACTION_LAYER_MOMENTARY,注意到在第0层里我在左下角Win键的位置设置的是Fn1,这时按住这个键再按别的键就是第1层的键啦。Win键被我放在右边了,平常不怎么用到。
最上面一排已经变成了“~ F1-F12”了,WSAD变成上下左右了,h改成了浏览器后退,l改成了浏览器前进,p改成了打开音乐播放器,zxcvbnm改成了音乐播放音量调整这些媒体键。要说明的是TRNS,这个意味着和上一层的键一样的,不需要重复设置了。这里需要按住fn1才能实现这些功能,当然你也可以用ACTION_LAYER_TOGGLE,按一下fn1就可以切换1层了,然后wsad就是上下左右,可以用来玩游戏了。
好玩吧,我们再加一层试试:
这一层的作用是改Caps这个键,先把0层里Caps改成Fn2,然后用到了这个宏ACTION_LAYER_TAP_KEY。现在单独按Caps键一下,它还是切换大小写,当你按住它时就能切换到第2层了。作为一个标准Vim党,我把hjkl改成了左下上右,左手小指勾住Caps键就可以实现全平台用hjkl移动光标了。然后右上角四个键改成了“我的电脑,计算器,浏览器,音乐播放器”。另外,还能控制鼠标!上下左右改成了鼠标移动,空格键改成了鼠标左键,回车变为鼠标右键。
目前实现的还是键位映射,更高级的功能还可以借助于ACTION_FUNCTION和ACTION_MACRO来实现。晒单时大段大段贴代码还是不好,有兴趣的可以看看我提供的这个gist代码。利用这两个宏,我还实现了:
Shif+ESC=~,Fn+ESC=`
程序员专属,按一下左边的Shift是左括号,右边的是右括号,一直按住还是shift的功能。真是懒到极致了,觉得括号太远,并且要按两个键。
Fn1+Space=Win+Space。这样Win10里还是用习惯的键位切换输入法。
右边的Alt+4=Alt+F4。
借助于ACTION_MACRO,一键输入账号或密码。可以把密码隐藏在某一层的一个键上,网上登录方便多了。
总结
没什么可以总结的,放工位图吧,usb2usb藏在了那个金属盖板下了,桌面非常清爽。
































hughie_zhu
校验提示文案
jiayuan929
校验提示文案
a买买买
校验提示文案
zhuce
校验提示文案
lifekitchen21
校验提示文案
percylin
校验提示文案
阳光的少昊
校验提示文案
阳光的少昊
校验提示文案
HOUSs
校验提示文案
TimmyTimi
校验提示文案
兔子要物有所值
校验提示文案
丞相
校验提示文案
值友8190985618
校验提示文案
辰时夏
校验提示文案
蛋蛋爱笑笑
校验提示文案
九尾Sylar
校验提示文案
洪流我無
校验提示文案
你都对不客气
校验提示文案
零度的开水
校验提示文案
Trafalgar_kim
校验提示文案
不要买第三方太差劲
校验提示文案
绝恋之夏
校验提示文案
Lonely木头人
校验提示文案
杏玉墙
校验提示文案
值友8190985618
校验提示文案
矮脚长颈鹿
校验提示文案
肥仔斌12M
校验提示文案
蒹葭苍苍v32
校验提示文案
善格佳物
校验提示文案
宁绍
校验提示文案
宁绍
Mingw和WinAvr也装好了,但是make命令提示出错。唉,傻眼了
楼主啊,你可方便留个企鹅?
校验提示文案
jiayuan929
校验提示文案
霸气释放
校验提示文案
pcform
校验提示文案
ljcad
校验提示文案
丞相
校验提示文案
苏浅雪
还是不习惯亮灯。
校验提示文案
wanderlust
校验提示文案
[已注销]
校验提示文案
辰时夏
校验提示文案