[自製QMK鍵盤-番外] 旋轉編碼器 (Encoder)

系列:自製QMK鍵盤 Posted on 2020-11-21

在之前的文章中我們已經完成了 QMK 的基本操作,已經可以作出一個基本鍵盤。

在某些鍵盤上可以看到旋轉編碼器(Encoder,以下簡稱編碼器)。編碼器最常見的地方就是滑鼠的滾輪,它可以朝兩個不同的方向無限地一直旋轉下去,用在音量調整或選單控制會非常方便。

在 QMK 中加入編碼器的功能是非常簡單的,只需要多加幾行程式碼就可以。

修改程式碼

以下個步驟將示範爲 QMK 加入編碼器的程式。詳細可以參考 QMK 官方文件-Encoder

修改 rules.mk

首先要在 rules.mk 檔案中啓用編碼器。在該檔案中加入以下之程式碼:

1ENCODER_ENABLE = yes  # 致能編碼器

修改 config.h

接著要定義腳位。每個編碼器都有 2 隻腳(通常分別稱爲 A 腳與 B 腳)需要接到你的微控制器(開發板)上。在 config.h 中加入以下之程式碼:

1// 編碼器接腳定義
2#define ENCODERS_PAD_A { B12 }
3#define ENCODERS_PAD_B { B13 }

如果你需要使用多個編碼器的話,可以像下面這樣來編輯。如果這樣打的話,就是第一個編碼器的 A 腳接到微控制器的 B12 腳、B 腳接到 B13 腳;第二個編碼器的 A 腳接到微控制器的 D1 腳、B 腳接到 D2 腳。要加入更多的編碼器就以此類推。

1// 多個編碼器接腳定義
2#define ENCODERS_PAD_A { B12, D1 }
3#define ENCODERS_PAD_B { B13, D2 }

如果你想法改變編碼器的旋轉方向的話,可以透過互換 A、B 兩腳的接腳定義,或是加上這一含程式:

1// 反轉編碼器方向
2#define ENCODER_DIRECTION_FLIP

此外還可以改變其解析度(預設爲 4):

1// 調整編碼器解析度
2#define ENCODER_RESOLUTION 4

修改 keymap.c

最後要來設定觸發編碼器時要按下的按鍵,需要在 keymap.c 中加入該程式碼。下面程式中的 KC_PGDNKC_PGUP 就分別是編碼器在順/逆時鐘轉動時會按下的按鍵,請自行修改成自己想要的按鍵,至於 QMK 的按鍵代碼(Keycodes)請參考 QMK 官方文件-Keycodes

 1// 編碼器程式
 2void encoder_update_user(uint8_t index, bool clockwise) {
 3    if (index == 0) { /* First encoder */
 4        if (clockwise) {
 5            tap_code(KC_PGDN);
 6        } else {
 7            tap_code(KC_PGUP);
 8        }
 9    }
10}

如果有多個編碼器的話可以這樣打:

 1// 編碼器程式
 2void encoder_update_user(uint8_t index, bool clockwise) {
 3    if (index == 0) { /* First encoder */
 4        if (clockwise) {
 5            tap_code(KC_PGDN);
 6        } else {
 7            tap_code(KC_PGUP);
 8        }
 9    } else if (index == 1) { /* Second encoder */
10        if (clockwise) {
11            tap_code(KC_DOWN);
12        } else {
13            tap_code(KC_UP);
14        }
15    }
16}

完成程式修改

完成修改後就可以將程式編譯、燒錄。其方法請參考[自製QMK鍵盤-3] 編譯並燒錄

硬體

硬體的部分就只有接線。編碼器通常有 3 個接腳,照順序分別是 A、Gnd、B。將編碼器 Gnd 與微控制器的 Gnd 接起來,而 A、B 就接到上面在 config.h 中設定的腳位。這樣就完成硬體的部分了。

值得注意的是有些編碼器會整合一個按鈕,所以可能會有 5 個接腳,使用時還請確認清楚。

結語

這次簡單地介紹了在 QMK 中加入編碼器功能的方法,接下來我還會繼續增加更多不同零件的介紹,盡情期待。

相關文章與資源



留言可能不會立即顯示。若過了幾天仍未出現,請 Email 聯繫:)

comments powered by Disqus