Noodlefighter_OSU_keyboard_v2_工作日志
2015-07-30 将原日志转至新网站并拆分成两篇文章
项目描述:
制作一个开源的两键无冲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)
改进建议如下:
- 希望能添加ESC键
- 有时候上电无法工作,试第二次才行
- usb口大小有些勉强(by本人)
- 突起的帽型螺钉影响手感
- 应把外壳痛贴层放到底层之下(by本人)
- 希望能自定键距(by超级叫了姥爷)
于是欲制作第二版,改进如下:
- 增加esc键
- 晶振电容改为22pf 因27pf有可能无法起振。。。(囧没看好手册)
- usb接口稳压管改成贴片封装,大滤波电容改为钽电容,进一步降低板上除了机械按键以外期间的高度
- 帽型螺丝改为扁螺丝
- 外壳痛贴层放到底层之下
- 自定义键距(22 30 37mm三种距离)
- 增加几个功能设置位,支持用pcb跳线改变按键映射设置(配合改变键距功能)(AS ZX AD ZC)
- avr单片机从atmega8换为atmega48,晶振改用20M,进一步提高扫描率
- 增加一个RGB,LED…..=-=自己爽爽~呵呵呵
- 取消按键灯设置跳线,将背景光开关跳线做成了pcb跳线
- 选用直插minii-USB-typeB,更加稳(焊贴片usb口苦了我,而且还买到了劣质的口)
- 为了配合外壳的usb开口,将pcb上的螺丝孔改变了位置
板子已经在制作中了,有望下周拿到,给他制作外壳。
05-28
试验板,功能正常
今天花了点时间修改pcb:
- 为了配合mini外壳,稍微变更了一下元件布局,使元件离开边缘,并把四角改为圆角
- 只保留4个螺丝位
- 功能设置跳线数量变更为7个 把按键灯开关跳线设置到了正面(io用占用了程序下载口,防电平冲突)
- 按键灯可控
- 按键部分 增加了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
05-31
(请无视这只无用的手)
花了点时间写了个PWM调光程序,现在能调出任意颜色的LED了。。。玩法就多啦哈哈
目前打算做成手速计的样子,击打时,统计3秒内的打击次数
根据统计结果(BPM?),底部发出不同的颜色(蓝->黄->红->紫)大致这样..软件上也不难实现,也不会吃太多资源。
(精确统计有点麻烦,但是单纯的分时段进行统计的话,空间上只需要一个uint8变量;时间上,扫描按键时做一次加法,每3s进行一次计算次而已;硬件资源上,占用一个定时器资源(或者和其他功能复用一个定时器))
程序改用新版的v-usb库,运行频率提升到20Mhz,测试一切正常。 按键延迟能达到1ms了,平均3ms。
外壳紧固件打算吸收超级叫了姥爷的方案(;w;这个算抄袭了喂!),法兰螺丝一部分高度藏在底板内。
而用来连接亚克力外壳的螺丝,改用平头的,亚克力的顶面板把口开大一点,就能把螺丝头部高度缩小。
P.S.收到了骗钱盘咯感谢超级叫了姥爷!!
06-03
写出了手速计程序,差不多是这样
1 | /* 颜色表 (尽可能多一点) |
=-=反正我只能按到大红………………..于是我临时用了个慢了四倍速。。。拍了一段效果。
(图大,略)
某人说直接变换太突兀了 闪来闪去的。。。
后来分析是颜色之间过度太少
还有光强度不一致导致的,修改程序让光强统一了。。(搞这灯真是麻烦啊)
还硬着头皮做了个渐变..hha效果自己看着还行
又拍了一段效果 这回是全速的…(我能上225我自己都不信..=-=)
视频:http://www.tudou.com/programs/view/AncpiJOtSm8/
2014/06/05
鼓捣了一天 发现atmega48的程序空间不够用了。。。就不该省这点钱的。
总之受空间限制,功能就只能做到这里了。
最终设置能力如下:
以及三个键同时按下:
切换按键3的定义:ESC/F1/F2/F8/space
P.S.本来计划是做成可以多设置几项,然后用电脑屏幕当作命令行输出的,这个创意不错吧,只是需要占用的程序空间又要进一步增加,做不了了。看着键盘自己打字什么的。。T T现在做不了了,只能稍后编出来自己爽了。。。还是在纠结要不要做这个功能。。。因为很帅啊!!!很帅!!这功能肯定要做的。。只不过没办法在这一批的量产中做了。
06-06
咳咳昨天的想法被推翻了
现在做出了用按键定义按键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
只好重新修改设计。
累。
06-18
/关于性能测试和对下一代键盘的展望/
优化了程序,让程序更专注于发送按键信息。
研究了一下延迟的问题,
网上流传的测延迟的方法,是用keyboardtest.exe同时按下两个按键,取pc收到两个按键被按下的时间间隔。
这种方法,测出来的应该是按键从“pc成功接收第一个按键信息”到“pc成功接收第二个按键信息”的时间。
而不是“按键被触发”到”pc成功收到数据“的时间
不过多少也能说明些问题了。
这个时间能回答“传输时间大概是多少?”这个问题
这个测试的大致结果是7ms,由于avr单片机只能拟出个低速usb口,这个速度应该是正常的。
至于从“触发”到“被检测按键按下”再到“程序打包完usb包,开始发送数据”的时间,是难以检测的,除了使用片上调试的手段(残念,这款atmega48没有jtag口,手头没有调试工具。。。)
不管怎么说,用低性能8位单片机软件模拟usb口,本来就是出于对成本的妥协(当前已经用20M晶振在跑了,效果仍不尽人意)(当然,还可以用键盘专用芯片,但是要加炫哭的其他功能的话是难以做到的。)
下一版本,直接上stm32的硬件usb口吧。(当前淘宝卖得比较多的64脚stm32f103rc大约8元,只是用来做键盘的话有点浪费了,关于选型,之后找到销售商再研究)
当前计划,是把ver2.1完成,然后公布制作方案。(拖延症患者。。。。。。
2014/7/9
好吧 我把日志搬来这个博客了。
(上图是手工痛制后的键盘)
于是现在这个v2.1也算是告一段落了,写个总结吧。
这次总共做出了30套,每套最终物料成本约45元,售价70。(售价浮云了,就拿了个手工费)
http://tieba.baidu.com/p/3082921069 这是tonystore写的评测
http://tieba.baidu.com/p/3145125672 http://tieba.baidu.com/p/3147198799 这是Lynch的评测和实拍录像
http://www.tudou.com/programs/view/uBJ0LA49yZM/ 甜草Q的实拍游戏录像
http://www.tudou.com/programs/view/sbXESmsUZPg 组装演示
http://www.tudou.com/programs/view/mSUck6N8cYk 设置演示
已基本达到预期效果。
性能和手感还有很大的加强空间,让我分点来说。
性能:
由于使用avr-usb软件实现usb协议,性能不佳,两次传输间隔在6ms-12ms之间,虽已达到一般玩家的使用要求,但这个结果还不是我想要的。
(改用自带硬件usb的芯片,目前看中了功能强大的stm32系列)
手感:
还是倾斜角度的问题,希望能整体倾斜20-30度。
(亚克力材料是没办法做到这点的,考虑加其他材料,目前觉得以木材作为材料不错,希望成本增加不超过10元)
键帽斜度,当前使用的是R2键帽,对于无倾斜角度的键盘,R3似乎更加合适
回弹问题,有人希望加钢板来增强手感
(这个还在考虑中,采用钢板设计会让成本攀升,对外壳内部空间要求提升)
稳定性问题,键盘
(pcb纵向尺寸略减,横向尺寸略加)
按键重心高度较大问题
(由于底板3mm,支撑板2mm,pcb1.6mm,按键高度其实挺高,影响到了稳定感。
可以将pcb厚度改到1.2mm,再把“底板3mm+支撑板2mm”变成“底板2mm +支撑板2mm”,能降低1.4mm高度)
外观
东西太大 两个按键,体积为9.56.51.3cm,而mini版就很便携
(下一版将做出一个折中的方案,毕竟这个项目最初的目的不是便携,而是替代完整的机械键盘)
以位于底部的RGBLED做的手速计效果不明显
(由于项目的初衷,元件必须是容易入手的,rgb轴啥的是不会加入考虑的,但是能把RGBLED安装在正面或底部靠前的位置,让效果更加明显)
晚上关灯后按键灯瞎眼
(增加感光功能即可通过调光解决这个问题)
手速计希望能辨别出单点然后并使用单点的方法计算bpm
(可以增加单点识别,设置条件:1.2sec内采样到的为同一个按键即变为单点模式,一旦另一个按键被按下,即变为普通模式)
其他:
key3使用的微动按键,普遍质量不佳,容易损坏。
(这没办法,键帽简直是这种按键的杀手,要不就不用键帽,要不就只能换!)
key3有可能被误按,它太高了。
(改用其他按键试试吧,其实可以考虑不用键帽,高度刚刚好,手感也还行,就是外观。。。不知道大家买不买单)
key3这样的按键只有一个,太少了
(我也是这样觉得的,我希望能增加到3-4个)
能设定的映射太局限
(下一版本将使用我首创的设置方法,不需要特殊的pc程序即可实现更个性化的设定)
mini版外壳抗性太差
(这是由于pcb板设计时没考虑到mini版出现的可能性,没做整体设计造成的,下一版本想沿用mini版外壳的设计思路,只需要4组紧固件就能完成安装)
防滑垫太过于突出的问题
(有考虑使用2mm底板+3mm防滑垫,在底板上,将要安装防滑垫的位置空出来,这样防滑垫就只突出1mm且由于粘贴位置于内部,稳固程度要增加不少)
pcb的问题,组装时无法直接看pcb判断出按键灯led的正负方向。。
有人希望能使用MICRO-USB接口,这样就能和目前主流手机用同一种数据线了。
(其实现在用mini-usb是考虑到手工焊接难度和成品耐久度。)
pcb设置用的跳线数量过多,实际上应该把设置项都以软件来实现,只留少量pcb跳线。
量产的话,元件应尽量选用贴片的
还会有下一版本的,相信会更加完善,项目本身的定位我也会重新考虑下,毕竟自己diy,成本还是次要的,主要是最终效果。
总结完毕。发些图,有些可能和键盘本身没太大关联。。
发货单
各种灯的效果(不得不说白色真的好瞎;w;)
过渡版本(左为大壳设计。。后被自己否定。。呜呜呜我的痛贴不能大幅面了!!! )以及mini版试制品
痛贴测试
v2.1成品 两种版本
2015-07-30
由于折腾新博客,把旧的文章手工搬运过来,把v2 v3日志拆分了,重新排版了一下。
重新读了一次自己的日志,回想这一路上,全凭着各种“好运”才坚持下来——
- 正好进入了学校里某协会,有了制简单PCB版的条件
- 有大触学长Q君带我入机械键盘坑(嘛 虽然第一把机械键盘是自己做的),而且在我osu功力尚浅时,告诉我什么是“好手感”
- 开坑之后,正好遇到使用相似方案且量产的超级叫了,一起讨论收获颇多
- 尧山中的各位osuer帮试键盘,Q君、米酱、小麟子、蛋蛋……
- 遇到了热心的朋友们——鸡鸭死、jb king、lynch、hhx008等等等……提了各种宝贵建议(以及资料翻译支持)
- 还有第一批30只v2.1版的购买者们,真的很感谢你们!
osu键盘v2有一些意料之外的事情
- RGBLED的手速计竟然成了卖点,哈哈哈
- 从v2.0到v2.1卖出的那30只,键盘上的标识“Noodlefighter”全部打错成了“Noolefighter”,对的,无一幸免!!(笑 (鸡鸭死姥爷吐槽了才发现
- mini版外壳,成了v3的原型
- 和超级叫了一拍即合一起做v3版
算是给v2键盘画个句号吧,完毕。