[键盘] 罗技K375S的研究

楼主: dream4magi (dream4magi)   2021-08-12 21:52:14
大约一两年前我买了一支罗技K375S
想要把他的主控改到其他键盘上(那时候很流行XD)
所以到货第一天就分解了 一直躺到现在
迟迟没有动手是因为有某些点
我觉得弄起来不完美
在找不到好的方案之前 就懒得开工
最近做了一些研究
把这些资讯分享给各位
主要分为三部分
1.电压
2.电流
3.内部原理
/**************************/
1.电压部分:
使用可调电压电源供应器
测试电压跟罗技Option软件内显示的键盘电量的对应关系
结果如下:
above 2.67V ->High (电池符号满格3格)
2.32~ 2.67V ->Mideium (2格)
2.10~ 2.32V ->Low (1格)
2.00~ 2.10V ->Empty (0格 跳警示)
below 2.00V -> 不开机
一直到不到2.0V才关机
可以说把2*AAA电池彻底利用
同时也对镍氢充电电池很友善 因为单颗镍氢电池1.0V也差不多是放电终止
这是得力于内部所使用的IC-> nRF51802
Datasheet:https://tinyurl.com/3vrth3bk
工作电压 1.8V~3.6V 刚好覆蓋2*AAA 或是2*MiMH电池电压
2.电流部分
使用电表串接测量工作电流
测得结果如下:
(1)开机时电流 最大3.643mA (此时LED指示灯亮着)
https://imgur.com/Ycc2HZV
(2)待机电流 最大0.072mA
https://imgur.com/8oW0E08
(3)单一按键按住时电流 最大0.355mA
https://imgur.com/gjZUjxs
(4)两颗按键按住时电流 最大0.846mA
https://imgur.com/xhyugY0
(5)闲置330秒后进入睡眠 最大0.00405mA(电表uA档测得4.05uA) (任一键唤醒)
https://imgur.com/OOrL2W2
电流这段的结论是: 超省电的!!
一般小型LED做为指示灯使用时差不多设定在3~5mA
所以说开机时电流消耗基本上是LED亮起造成的
待机电流0.072mA的概念就是1/40颗led指示灯的耗电量XD
单键连发时也只不过用了 1/8颗led耗电量
真的很可怕!
所以导致我想去探索一下到底是用什么方式才有办法这么省电
->也就是下一个部分
3.内部工作方式
一般键盘都是用矩阵的方式逐个扫描按键是否被按下
我本来觉得这么省电 应该是动态调整扫描频率吧?
例如: 按下按键之后的一小段时间维持高扫描频率
所以如果不断按键就会一直维持高扫描频率
超过一段时间后(逐渐)降低扫描频率已达省电的目的
这是非常容易达成的
但我后来发现我错了 这键盘内部才不是用这么简单的方式来省电呢!XD
以下我用我浅薄的知识来做解释
col1 col2 col3
row1 A B C
row2 D E F
row3 G H I
这是按键排列的线路示意图
ABCDEFGHI代表9个按键
实体线路则是 col1 col2 col3 row1 row2 row3 ->6条
(以此类推如果有20条线路 "最多"可以有10*10=100颗按键)
所以这就是一个二维阵列
键盘IC就是不断的在扫描这个阵列
来判断 任意一个col 是否与 任意一个row 导通
导通就是对应的按键被按下了
大概就是这个结构:
//rows:output
//cols:input with pulldown resistor
foreach(row in rows){
row.voltage = high
foreach(col in cols){
if(col.voltage==high){} //表示col与row相通->查表可知哪个键被按下
}
row.voltage=low
}
(high/low逻辑可以相反 col/row可以调换 具体看各键盘设计 没有好坏差别)
接下来我们看一张图
https://imgur.com/apVvdNO
这是我用示波器抓取我的FILCO 104键 数字区+号的row讯号
可以把这个讯号想做是active low的讯号
也就是 讯号在低的时候才该row正在被扫瞄
可以看到两次轮到同一个row的间隔是1.19 ms 换句话说扫描频率840.3hz
另外 在低位的时间长度是 52us (=0.052ms) Low的占空比为4.24%
这支键盘有18个row 8个col
100%/18(row数量) = 5.5% 跟 low的占空比很接近了
5.5-4.24 =1.26 有可能MCU在做其他工作
而在这row短暂的52us内 mcu会把col全都读取一遍(在示波器上看不到读取)
由于有8个col 所以单一键读取时间是52/8 = 6.5us
说这么多....
总之! 这是很标准的一支键盘.......
罗技K375S就完全不是这样了....
这是我得到的第一个画面 这是待机状态测得的
乍看跟FILCO不太一样 是因为HIGH/LOW是相反的
这是OK的 逻辑相反而已
https://imgur.com/YDdyoBh
可以看到row讯号的间隔是504ms 频率是1.98hz
一开始我觉得 "看吧 果然是降低扫描频率"
但是越想越不对 因为1.98hz太太太太慢了
扫描间隔504ms 所以平均按钮的反应时间会是504/2 =252ms = 0.252秒
这是人很明显会察觉的延迟
所以再夹上同一按键的col
跟另一个row来对照
如果是传统扫描式
不同row彼此之间扫描的间会是错开的
以这个案例来说 也就是两个row会不同时间拉高
来看一下这张图
https://imgur.com/xKnGrHT
黄色:某按键的row
绿色:某按键的col
粉红色:别的row
在中间偏左的地方可以看到
黄色跟粉红色明明是不同的row
却在同时间上拉 明显重叠了
所以这根本不是一般键盘用的阵列扫描......
以下是我推断的工作方式:
本键盘不是用传统的阵列扫描
而是使用中断来侦测按键
第一阶段:
cols(绿色):output high
rows(黄色):interrupt input (with internal "pulldown" resistor)
首先"所有的col"全部都输出high
所以当某一按键被按下时
该按键的row因为跟col导通所以为high
所以该row触发了中断
此时mcu知道有按键被按下了 也知道是哪一个row(就是触发了的那个)
但是此时mcu还不知道是哪个按键被按下(因为要同时知道col跟row才能确定是哪一键)
第二阶段:
先前触发中断的row目前的电压是high(因为跟col接触著 而所有的col都是high)
接下来就是将上一阶段的输出输入对调
也就是
cols(绿色):interrupt input (with internal "pullup" resistor)
rows(黄色):output (电位请见下方说明)
这张图正中间是我按了按键
https://imgur.com/Mvr2wqi
跟上阶段相反
这边所有的row都先输出high(所以可以看到黄色跟红色都上拉了)
黄色row在上阶段就因为跟col碰触变成high了 所以虽然转主动输出high实际上电位没变
粉红色row也变成输出high
虽然是两个阶段 但是因为速度太快了 第一阶段从触发到进入第二阶段只是转瞬之间
(事实上是黄色row因为接触col而变high 进入第二阶段主动输出high
粉红色row是因为进入第二阶段主动输出high
两者有时间差 但太短了 所以看不出来)
接着 黄色row因为在第一阶段就触发中断 mcu知道
所以在第二阶段 mcu每隔一小段时间
就会把黄色row的电位 从high拉成low 又马上拉回high
为什么这样做
因为黄色row拉low又回去的过程
会把目前在输入中断状态的cols 当中与黄色row实体相连(就是按下)的对应col(绿色)
的电位给拉下来 导致该col触发中断
(示波器的图不太明显 中后段那几段尖尖相下刺 是黄色跟绿色同步 粉红色没有下来)
这样一来mcu就知道哪个col被触发了
https://imgur.com/mJuI6vB
所以这下mcu终于知道是 黄色col 跟 绿色row
就确实知道是哪一颗按键了
这种做法完全不是传统键盘的作法
大概也是得力于较先进的mcu每根gpio都可以做interrupt(51802的规格书里有)
所以K375S这种使用中断的作法
是非常即时的
比起 例如FILCO的840hz(0.6ms的平均时间其实已经很短了),但K375S绝对更快
这边的快是指mcu取得哪颗按键被按下的速度
并不是指传到电脑的总时间 这是两回事
已程式来比喻
传统扫描就是 polling(轮询)
使用中断就是 subscription(订阅) 或是 event(事件)
效率差很多 同时在硬件上 就会影响功耗(甚多)
我在此之前不是知道原来还有这种作法
真是大开眼界了XD (可能眼界本来就小 毕竟不是学硬件的)
结论两个字: 佩~~~服~~~!!
以上是我最近的研究心得
如果你一行一行看到这边 同样结论也送给你:佩服XD
作者: sformosa (天蠍的阿助)   2021-08-12 22:19:00
头推
作者: GYshiang (GY翔)   2021-08-12 22:29:00
想知道k375改在哪知键盘比较好 我的k375也躺在柜子里G80 3000的下盖空间比较多好像比较方便?
作者: corlos (ナニソレ、イミワカンナ)   2021-08-12 23:09:00
我一把375s也是难按+油 想丢了
作者: Fortis931 (吾手发炎 其形微贱)   2021-08-13 00:52:00
我以为键盘都是用trigger的... 轮询??
作者: a619063 (tension)   2021-08-13 07:44:00
推心得,期待原po制作出一把再分享教学XD
作者: waroz (沃君)   2021-08-13 11:19:00
学到新姿势了
作者: tim19131 (业子)   2021-08-13 11:24:00
推研究精神!
作者: ayanami00 (39's 4 shar3)   2021-08-14 11:56:00
想改用电池的,但是壳都比较适合锂电池的*用 AAA电池
作者: Knuckleslee (Knuckles)   2021-09-03 00:41:00
没研究过键盘用那种,但中断跟轮询是可以看状况用的

Links booklink

Contact Us: admin [ a t ] ucptt.com