[鍵盤] 羅技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