在這篇文章中我簡單地介紹了 Mitosis 這個基於 QMK 的無線分離式人體工學鍵盤,而在這篇文章中,我將參考其架構來做出一個我自己的無線分離式鍵盤的雛形。
要達成這樣的功能,會需要用到 QMK 的 Custom Matrix 和 UART 功能,並且使用 LoRa 無線通訊模組 HC-12 來暫時替代藍牙作為無線通訊。
在 QMK 中使用 Custom Matrix 與 UART
由於 Mitosis 不是和一般的鍵盤一樣透過按鍵掃描來取得按鍵狀態,而是藉由 UART 通訊,所以我們需要改變 QMK 的掃描程式,改成使用 UART 取得按鍵狀態。以下將會說明要如何達成。
rules.mk
首先,要完整地啓用「Custom Matrix」功能的話,要在 rules.mk
中增加 CUSTOM_MATRIX = yes
與 SRC += matrix.c
,並在鍵盤資料夾中增加 matrix.c
檔案。而自定的掃描程式就要按照格式寫在 matrix.c
中。
然後,因為我們還會需要使用 UART 功能,所以在 rules.mk
中還要增加 SRC += uart.c
。因此,rules.mk
大概會長這樣:
matrix.c
自行新增的程式檔案 matrix.c
是用來放自定的掃描程式的,我們要在掃描程式中使用 UART 進行通訊。
根據 QMK 文件的說明,matrix.c
需要實作以下的函式:
對我們來說,只需要注意 matrix_init()
與 matrix_scan()
這兩個函式就好了。matrix_init()
就是初始化矩陣掃描(只會被呼叫一次),我們要在此函式中完成 UART 的初始化,而 matrix_scan()
就是矩陣掃描的程式,也就是每次要進行掃描是要執行的程式,我們要在此函式中接收 UART 的封包並告訴 QMK 有哪些按鍵狀態改變了(被壓下或釋放)。
一個簡單的測試程式大概長這樣:(我根據 Mitosis 的程式進行修改的,未檢查是否有不必要的程式)
上面這段程式比較重要的有幾點:
#include "uart.h"
:引用 QMK 的 UART 功能,否則會編譯錯誤。
uart_init(9600)
:在 matrix_init()
中初始化 UART,並將鮑率(Baud Rate)設定為 9600 bps。
uart_available()
:有用過 Arduino 的 Serial Port 的人應該都看得懂這一段,就是只要 UART 的接收緩衝區有值(有接收到資料),就使用 uart_read()
將收到的資料讀出,在透過 switch-case
來處理並改寫 matrix[]
的值,以完成按鍵狀態的更新。
利用 QMK 移動滑鼠遊標
因為我要做的無線分離式鍵盤上預計裝有軌跡球,所以我也一併測試了 QMK 要如何控制滑鼠遊標。
首先,在 rules.mk
中增加 MOUSEKEY_ENABLE = yes
、POINTING_DEVICE_ENABLE = yes
和 POINTING_DEVICE_DRIVER = custom
就可以啓用滑鼠與遊標的相關功能。
在 matrix.c
中加入 #include "quantum.h"
,並將剛剛的 matrix_scan()
的程式改成:
其中,report_mouse_t
就是 QMK 中滑鼠遊標的 Data type,其原型為:
x
與 y
分別代表滑鼠遊標 X 軸與 Y 軸移動的距離,範圍是 -128 ~ 127
。
v
與 h
代表滑鼠滾輪垂直與水平滾動的距離,範圍是 -128 ~ 127
。
buttons
代表各個滑鼠按鈕按下的情況。
LoRa 無線通訊模組 HC-12
因為我手邊沒有其它適合的無線通訊模組,所以就先拿「HC-12」這款 LoRa 模組來使用。
這個模組的好處是使用簡單方便,就自己把它當成一般的 UART 就好,Tx 與 Rx 接好,不用特別設定什麼就可以無線通訊了。
而我用來控制 HC-12 的是 Nucleo-F302R8(STM32F302R8),因為只是要簡單的測試無線通訊及 QMK,所以就寫了一個按下按鈕會透過 UART 傳送特定資料的程式作為測試。STM32 韌體函式庫使用「libopencm3」,IDE 為「PlatformIO for VS Code」。
最終效果如影片所示:
結語
這次簡單地分享了 QMK 使用 Custom Matrix、UART 和控制滑鼠遊標的方法,有些功能我自己也是找了不少資料才知道要怎麼做,並且也測試了很多次。
然而對 QMK 的瞭解也還很粗淺,很多細節沒辦法講解,而如果上述內容有任何錯誤也請指正。
相關文章
留言可能不會立即顯示。若過了幾天仍未出現,請 Email 聯繫:)