noodlefighter

导航

 

项目描述:

制作一个开源的两键无冲usb机械键盘,旨在舒服和廉价的打osu(一个音乐游戏,standard模式下一般只用得到两个按键)

(廉价=成本控制在30元左右,舒服=降低疲劳度,开源=项目到了可用的状态即公布所有制作方法、源码、pcb)

==============================================

2014/03/29

音游狗,穷,买不起机械键盘,看到osu贴吧上有人做一种叫“触盘”的东东就寻思着自己也弄一个玩玩。

然后发现手上给atmel芯片烧程序的ISP线是用低端avr做的(atmega8),也就几块钱,usb接口芯片都要十块钱这样(求别提CH340),就琢磨着做个键盘。

查资料发现市面上的avr芯片搞起的小玩意都是用一个叫avr-usb的开源库做的,开源工程还挺多,就随便找了个hid工程来改了。

一开始的设计是这样的:

外壳用易加工的软木做。

然后一下子就被玩osu的朋友们否决了,因为制作困难,预期手感不佳。

后来重新考虑了外壳设计,看到淘宝上有钣金加工服务,一问价,这样大小的一只大概50元,10只起做,GG.

闲时自己重新布线手工做了个板子,买了个接线盒当外壳看看手感如何,结果成品效果比较差,延迟大概10ms和稳定感差(固定不好),且两键互相冲突(开源项目的程序 没改就用了),无法正常使用,图如下:

 

接下来这个小工程就搁置了几个月,后来寒假看到有人用亚克力做电子制作的外壳,淘宝上找了一下似乎只要提供图纸就能加工,就自己画了个图纸:

作好图之后想说开学再找店家加工,后来一开学就做起项目,又搁置了,现在有点空,就再画了个板子直接送厂加工,大小5x5cm足够小了,外壳之后怎么做这个板子都能用吧:

osu这个游戏需要触发快键程短的按键,一开始想说用红轴,但是红轴的提前触发让人难掌握,所以试制时用的是茶轴。

发现淘宝有一种胶圈能改变机械按键的键程,这个胶圈在这里应该能派上用场,等工厂把板子发来就焊上红轴+胶圈吧。

 

提高工作频率到16M,自己改改程序成无冲的,希望能把延迟降下来,提升手感。

 

2014/04/09

板子到了 焊上了 程序还在调,不知道怎么修改usb设备描述才能做到同时发送两个按键按下的信息。。。

贴吧上有人能做到1ms延迟简直碉堡了,试着鼓捣鼓捣。。

 

2014/04/20

亚克力外壳拿到手了,但是由于压克力板不是标准的3mm导致外壳组合性差,故重新设计(一层一层堆砌到合适的高度的设计)

 

关于程序,用的是http://symlink.dk/electro/c64key/ 的,拿起就随手改了。

能达到平均4ms延迟,加入了严格的10ms才算放开的按键检测。放弃使用16M晶振了,这样的延迟已经满足需求了,上了茶轴,连打杠杠的(自我感觉)

自己试玩了几天,没发现什么问题。

两天前让大触帮试了,电路板和程序应该是没有问题的。(目前最大的问题是键帽,希望能找到惯性更小的键帽)

所以现在已经可以把pcb和程序放出来了。pcb的cad是dxp,已经生成cam文件了。

http://pan.baidu.com/s/1dDinlIx

外壳方案还有待验证.

2014/05/13

外壳做出来了,效果良好。

玩了几天,没发现明显问题,共制作了10台,让亲友们试用。

效果良好,极限测试中能DT BPM180(稳定DT BPM175)

改进建议如下:

1.希望能添加ESC键

2.有时候上电无法工作,试第二次才行

3.usb口大小有些勉强(by本人)

4.突起的帽型螺钉影响手感

5.应把外壳痛贴层放到底层之下(by本人)

6.希望能自定键距(by超级叫了姥爷)

 

于是欲制作第二版,改进如下:

1.增加esc键

2.晶振电容改为22pf 因27pf有可能无法起振。。。(囧没看好手册)

3.usb接口稳压管改成贴片封装,大滤波电容改为钽电容,进一步降低板上除了机械按键以外期间的高度

4.帽型螺丝改为扁螺丝

5.外壳痛贴层放到底层之下

6.自定义键距(22 30 37mm三种距离)

7.增加几个功能设置位,支持用pcb跳线改变按键映射设置(配合改变键距功能)(AS ZX AD ZC)

8.avr单片机从atmega8换为atmega48,晶振改用20M,进一步提高扫描率

9.增加一个RGB,LED.....=-=自己爽爽~呵呵呵

10.取消按键灯设置跳线,将背景光开关跳线做成了pcb跳线

11.选用直插minii-USB-typeB,更加稳(焊贴片usb口苦了我,而且还买到了劣质的口)

12.为了配合外壳的usb开口,将pcb上的螺丝孔改变了位置

 

板子已经在制作中了,有望下周拿到,给他制作外壳。

5/28

试验板,功能正常

今天花了点时间修改pcb:

1.为了配合mini外壳,稍微变更了一下元件布局,使元件离开边缘,并把四角改为圆角

2.只保留4个螺丝位

3.功能设置跳线数量变更为7个 把按键灯开关跳线设置到了正面(io用占用了程序下载口,防电平冲突)

3.按键灯可控

4.按键部分 增加了5脚轴用的固定孔

 

画了个迷你壳:把板子作为外壳的一部分,迷你壳不支持可变按键间距,只能使用标准的22mm间距

做迷你壳是为了尝试小壳的稳定性和使方案更廉价。

改进了外壳,用2mm亚克力板,usb口更合理,支持自定义键距(牺牲了美观我觉得..)

共6层 不算脚垫和螺丝 厚12mm ,esc键无键帽。

最近比较忙 ,等外壳到了再写程序把。

把一些计划的设定放上来:

RGB灯可以搞做很多花样,于是跳线数量又得增加。

蛋蛋说希望按键灯可控,于是又有花样可以玩了。

最近也是在做别的项目,正好写了个软件PWM花样变换的程序,换20M晶振之后,花一点资源去搞些花样应该不为过吧。

 

跳线设置设计:

JP1 按键ZX ZC选择
JP2 JP3 JP4 rgb灯于闲置时的颜色:RGB灯无效/RGB闲时不亮/米黄/暖红/艳紫/亮蓝/暖橙/瞎眼白
JP5 JP6 按键灯模式:闲时呼吸灯/常亮/按下才亮,渐暗/按下就灭 ,渐亮

 补个当时第一版的q君帮测试键盘的视频:

http://www.tudou.com/programs/view/pmLWTsbN1Uk/?resourceId=0_06_02_99

5/31

(请无视这只无用的手)

花了点时间写了个PWM调光程序,现在能调出任意颜色的LED了。。。玩法就多啦哈哈

目前打算做成手速计的样子,击打时,统计3秒内的打击次数

根据统计结果(BPM?),底部发出不同的颜色(蓝->黄->红->紫)大致这样..软件上也不难实现,也不会吃太多资源。

(精确统计有点麻烦,但是单纯的分时段进行统计的话,空间上只需要一个uint8变量;时间上,扫描按键时做一次加法,每3s进行一次计算次而已;硬件资源上,占用一个定时器资源(或者和其他功能复用一个定时器))

 

程序改用新版的v-usb库,运行频率提升到20Mhz,测试一切正常。 按键延迟能达到1ms了,平均3ms。

外壳紧固件打算吸收超级叫了姥爷的方案(;w;这个算抄袭了喂!),法兰螺丝一部分高度藏在底板内。

而用来连接亚克力外壳的螺丝,改用平头的,亚克力的顶面板把口开大一点,就能把螺丝头部高度缩小。

P.S.收到了骗钱盘咯感谢超级叫了姥爷!!

6/3

写出了手速计程序,差不多是这样

/* 颜色表 (尽可能多一点) 只有非闲置状态才显示颜色(闲置:20s无按键即闲置,闲置时呼吸灯或无灯)
* 序号 BPM上限 颜色 折算3.2Sec打击次数 色值
* 0 20 淡蓝 4 100,149,237
* 1 60 亮蓝 12 65,100,225
* 2 110 淡绿 24 180,238,180
* 3 140 米黄 32 255,222,173
* 4 170 亮橙 36 255,140,0
* 5 190 暖红 40 250,128,114
* 6 205 大红 44 255,0,0
* 7 225 紫红 48 255,20,147
* 8 245 深紫 52 148,0,211
* 9 260 白偏紫 56 255,230,255
* 10 260以上 金 60以上 255,201,0
*/

=-=反正我只能按到大红....................于是我临时用了个慢了四倍速。。。拍了一段效果。

某人说直接变换太突兀了 闪来闪去的。。。

后来分析是颜色之间过度太少

还有光强度不一致导致的,修改程序让光强统一了。。(搞这灯真是麻烦啊)

还硬着头皮做了个渐变..hha效果自己看着还行

又拍了一段效果 这回是全速的...(我能上225我自己都不信..=-=)

视频:http://www.tudou.com/programs/view/AncpiJOtSm8/

 

2014/06/05

鼓捣了一天 发现atmega48的程序空间不够用了。。。就不该省这点钱的。

总之受空间限制,功能就只能做到这里了。

最终设置能力如下:

以及三个键同时按下:

切换按键3的定义:ESC/F1/F2/F8/space

 

P.S.本来计划是做成可以多设置几项,然后用电脑屏幕当作命令行输出的,这个创意不错吧,只是需要占用的程序空间又要进一步增加,做不了了。看着键盘自己打字什么的。。T T现在做不了了,只能稍后编出来自己爽了。。。还是在纠结要不要做这个功能。。。因为很帅啊!!!很帅!!这功能肯定要做的。。只不过没办法在这一批的量产中做了。

6/6

咳咳昨天的想法被推翻了

现在做出了用按键定义按键1 2 以及按键3 和闲置时背景光 的程序 效果还不错,就是容易勿触发(已经有改善方法了,就是保持按键后1s后才触发)

操作方法:

(按键1+按键2)+(按键3) =定义:ESC/F1/F2/F8/F12/space/右

(按键2+按键3)+(按键1)= 定义:zx zc as ad qw qe

(按键1+按键3)+(按键2) = 定义:闲置背景光设置 16色

修改结果能掉电保存

然后经过这样的测试

http://www.tudou.com/programs/view/Ebb5NSTBDM4/

让我觉得“=-=结果是比较失望的,这张图的串子不是很长,还有由于渐变功能,3.2sec达到较高的bpm好像对于这种不太吃手速的图效果不是很明显。。。接下来会缩短手速的采样时间...”

之后修改了采样时间为1.2sec 缩短了一半的渐变时间

然后经过这样的测试

http://www.tudou.com/programs/view/wIJdYYCzPaA/

发现效果明显有改善,短串子也能看到一点黄光了。。。比较能体现实时手速。

06/09

艰难的把程序减小到了正好4k ;w;

其中缩减了一些功能,比如说闲置时的呼吸灯效果... 闲置时背景光从16个降到了14个..

 

顺便对设置功能进行了优化,为了防止误触发,已将触发时间设置为0.5s。

可设置项目修改为:

JP2   JP1    按键光
0    0     常亮
0    1     常暗,按下变亮
1    0     常亮,按下变暗
1    1     不亮

JP3-JP6     未定义

(按键1+按键2)+(按键3 0.5s) = 按键3定义:ESC/F1/F2/F8/F12/space/enter

(按键2+按键3)+(按键1 0.5s)= 按键1 2定义:zx zc as ad PageUp/down 上下 左右

(按键1+按键3)+(按键2 0.5s) = 闲置背景光设置 16色

 

06/11

这回外壳成本一下子提高了好多

不过组装起来要简单很多了吧,

试做一批 30只 卖27只这样,剩几只备用,万一有问题,还能补发。

到这个阶段了 重新估一次成本吧

 

用了亚克力做了几次外壳

最大的感受就是 厚度各种不统一,一般都不会有2mm 3mm足厚的

比如这次打样,2mm的只有1.8mm 3mm的只有2.8mm

只好重新修改设计。

累。

 

6/18

/*关于性能测试和对下一代键盘的展望*/

优化了程序,让程序更专注于发送按键信息。

研究了一下延迟的问题,

网上流传的测延迟的方法,是用keyboardtest.exe同时按下两个按键,取pc收到两个按键被按下的时间间隔。

这种方法,测出来的应该是按键从“pc成功接收第一个按键信息”到“pc成功接收第二个按键信息”的时间。

而不是“按键被触发”到”pc成功收到数据“的时间

不过多少也能说明些问题了。

这个时间能回答“传输时间大概是多少?”这个问题

这个测试的大致结果是7ms,由于avr单片机只能拟出个低速usb口,这个速度应该是正常的。

至于从“触发”到“被检测按键按下”再到“程序打包完usb包,开始发送数据”的时间,是难以检测的,除了使用片上调试的手段(残念,这款atmega48没有jtag口,手头没有调试工具。。。)

不管怎么说,用低性能8位单片机软件模拟usb口,本来就是出于对成本的妥协(当前已经用20M晶振在跑了,效果仍不尽人意)(当然,还可以用键盘专用芯片,但是要加炫哭的其他功能的话是难以做到的。)

下一版本,直接上stm32的硬件usb口吧。(当前淘宝卖得比较多的64脚stm32f103rc大约8元,只是用来做键盘的话有点浪费了,关于选型,之后找到销售商再研究)

 

当前计划,是把ver2.1完成,然后公布制作方案。(拖延症患者。。。。。。 

 

2014/07/09

文章已转移到http://noodlefighter.tk/blog/

posted on 2014-03-29 20:05  noodlefighter  阅读(2415)  评论(1)    收藏  举报