天天看點

四步教你DIY“終極黑客鍵盤”

四步教你DIY“終極黑客鍵盤”

如何去建構一個鍵盤

第一步:沒有鍵的鍵盤

首先讓我們做一個發出x字元(基于每秒一次)的USB鍵盤,Arduino Micro開發闆是實作該目标的一個不錯的選擇,因為它的功能ATmega32U4microcontroller(一種AVR microcrontroller)和相同的處理器是UHK的大腦。

四步教你DIY“終極黑客鍵盤”

說到USB-capable AVR microcontrollers,用于AVR(LUFA)的輕量級USB架構是庫的選擇。它使得這些處理器成為列印機、MIDI裝置、鍵盤或任何其他USB裝置類型的“大腦”。

當裝置插入USB端口時,裝置會傳遞一些被稱為USB描述符的特殊資料結構。這些描述符會告知主機所連接配接裝置的類型和性質,并由一個樹結構表示。一個裝置可以實作的不止一個函數,而是多個。這讓事情更加複雜。讓我們看看UHK描述符的結構:

  • Device descriptor
  • Configuration descriptor
  • Interface descriptor 0: GenenricHDI
  • Endpoint descriptor
  • Interface  descriptor 1: Keyboard
  • Endpoint descriptor
  • Interface descriptor 2: Mouse
  •  Endpoint descriptor

大多數鍵盤隻暴露單一的鍵盤接口描述符,這是有道理的。然而UHK也會暴露滑鼠接口描述符,因為使用者可以指令鍵盤的任意鍵來控制滑鼠指針,是以鍵盤可以當作滑鼠使用。GenericHID接口服務相當于一個為所有特性鍵盤交換配置資訊的通信通道。

現在我們已經建立了描述符,下面代碼則示範了其每秒一次發送x字元:

四步教你DIY“終極黑客鍵盤”

USB是一種查詢協定,這意味着主機定期間隔(通常是125次/s)查詢裝置,以此來找出是否有任何新的資料發送。與此相關的回調是CALLBACK_HID_Device_CreateHIDReport()函數,在isSecondElapsed變量為1情況下向主機發送x字元的掃描碼,isSecondElapsed在每秒的基礎上循環的設定為1,回調時設定為0。

第二步:四個鍵的鍵盤

在這一點上我們的鍵盤不是非常有用的,如果我們在這上面作出實際類别,那樣會很好。為此我們需要一些鍵,這些鍵需被置入一個鍵盤矩陣。一個全尺寸的104鍵鍵盤可以有18列6行,而我們必須把它簡化為2x2的鍵盤矩陣,這是示意圖:

四步教你DIY“終極黑客鍵盤”

它在開發闆上是這樣呈現的:

四步教你DIY“終極黑客鍵盤”

假設ROW1連接配接PINA0、ROW2連接配接PINA1、COL1連接配接PORTB0以及COL2連接配接PORTB1,那麼掃描代碼會是這樣:

四步教你DIY“終極黑客鍵盤”
四步教你DIY“終極黑客鍵盤”

代碼一次掃描一列,并讀取個人鍵開關的狀态,然後将這種狀态儲存到一個數組中,通過我們前文所說的CALLBACK_HID_Device_CreateHIDReport()函數,相關的掃描代碼将發送這些基于數組的狀态。

第三步:一個鍵盤兩個部分

到目前為止,我們已經建構了一個普通鍵盤的開端。但是我們的目标是先進的人體工程學,鑒于人都有兩隻手,我們最好添加另一半鍵盤。

另一半的鍵盤将具有另一個鍵盤矩陣,重複之前的步驟。而其中令人興奮的是兩部分鍵盤之間的通信,這裡有三個最受歡迎的電子裝置互連協定:SPI、I2C和UART。在實際當中,我們會在這種情況下用到UART:

四步教你DIY“終極黑客鍵盤”

UART需要同行使用相同的波特率、資料位和停止位。現在左鍵盤通過UART将一個位元組的資訊發送到右鍵盤,以此代表按下鍵或釋放鍵,右鍵盤對這些資訊進行半加工并在相應的記憶體中對這些全鍵盤矩陣數組的狀态進行操作。

左鍵盤發送資訊示例:

四步教你DIY“終極黑客鍵盤”

右鍵盤接受資訊如下:

四步教你DIY“終極黑客鍵盤”

KeyboardRxCallback()中斷處理程式會在一個位元組通過UART被接收時觸發,考慮到中斷處理程式應該盡快執行,是以收到的資訊會放到一個環形的緩沖區留待後面處理。環形緩沖區最終會被主循環處理,鍵盤矩陣也會基于資訊而被更新。

上面所說的是實作該點的最簡單的方法,但是最終的協定要更加複雜。你需要考慮多位元組資訊的處理,而且個人資訊也要通過CRC-CCITT校驗來檢查其完整性。

在這一點上,我們的實驗闆模型或許會讓你印象深刻:

四步教你DIY“終極黑客鍵盤”

第四步:滿足LED顯示屏

這是為了讓使用者能夠定義多個特定于應用的鍵映射來提高生産效率。使用者需要意識到一些正被用于鍵映射的方式,一個內建的LED顯示屏被建構于鍵盤内,下圖展示了這種模型:

四步教你DIY“終極黑客鍵盤”

LED顯示是由一個8x6矩陣實作的:

四步教你DIY“終極黑客鍵盤”

每兩行紅色LED符号代表14-segment LED顯示的分段,白色LED符号則代表了額外的三個狀态名額。

通過LED驅動電流并使其亮起來,相應的列設為高電壓,相應的行設為低電壓。該系統一個有趣的結果是,在任何給定的時刻,隻有一列是可以被啟用的,而其他列是被禁用的。有人可能會認為這套系統不能工作于整個LED,但是在現實中,列和行更新的太快以至于憑人的肉眼無法看到明顯的閃爍。

LED矩陣由兩個內建電路(IC)驅動,一個驅動行,一個驅動列,驅動列的源IC是PCA9634 I2C LED驅動:

四步教你DIY“終極黑客鍵盤”

驅動行的為TPIC6C595:

四步教你DIY“終極黑客鍵盤”

讓我們看下相關代碼:

四步教你DIY“終極黑客鍵盤”

LedMatrix_UpdateNextRow()将以每毫秒的速度被調用,更新LED矩陣的一行,LedMatrix數組存儲單個LED燈的狀态,狀态資訊源于通過UART的按/釋鍵事件。

整體情況

到這裡我們已經逐漸為自己的鍵盤建立了所有的必需元件。現在需要從全局出發,鍵盤的内部就像一個微型計算機網絡:大量節點互相連接配接。所不同的是測量節點之間的距離不是米或公裡,而是厘米,并且節點不是成熟的計算機,而是微型的內建電路。

四步教你DIY“終極黑客鍵盤”

但是到目前為止說的大多都是鍵盤裝置方面的細節,關于UHK代理提的不多。UHK代理是配置器應用,通過鍵盤來滿足使用者的自定義需求。可以見于下段代碼:

四步教你DIY“終極黑客鍵盤”

建立原型

一切制造之前都需要有一個CAD設計:

四步教你DIY“終極黑客鍵盤”

3D列印的鍵盤會是這個樣子:

四步教你DIY“終極黑客鍵盤”

基于機械設計和原理、印刷電路闆設計。右半部分的PCB在KiCad中會是這樣:

四步教你DIY“終極黑客鍵盤”

PCB表面貼裝元件必須手工焊接:

四步教你DIY“終極黑客鍵盤”

最後經過3D印刷、抛光、組裝等,我們會得到這樣一個原型:

四步教你DIY“終極黑客鍵盤”

繼續閱讀