HelixにBL652-breakout を載せてワイヤレスに改造した物。
スイッチ1つ1つに一意なIDが振られていて、スレーブマスター間では押されたスイッチのIDを通信でやり取りする、 マスター側では受け取ったスレーブ側で押されたIDと自分側で押されたIDをキーマップからキーコードに変換してPCに送る。 キーマップはマスター側で持っているのでキー配列を変更する時はマスター側のプログラムを変更が必要となる。
-
BL652-breakoutには予めFeather nRF52のブートローダーを書き込んでおく。
参考URL
https://learn.adafruit.com/bluefruit-nrf52-feather-learning-guide/flashing-the-bootloader https://qiita.com/ogatatsu@github/items/37f4888c885c4e287df1
-
ArduinoをインストールしてボードマネージャーからFeather nRF52用の物をインストールしておく。
参考URL
https://learn.adafruit.com/bluefruit-nrf52-feather-learning-guide/arduino-bsp-setup
-
ArduinoのライブラリマネージャからBounce2ライブラリをインストールする。
-
Arduino IDEで.inoファイルを開いて右側のボードにはSlave用のファームウェア、左側にはMaster用のファームウェアを書き込む。
キーのカスタマイズはマスター側のソースのkeymap.cpp
ファイルを書き換えることでできる。
通常の入力時のカスタマイズはkeymap[]
配列を変更する。
static Key keymap[] = {
{1, L(NK(_GRAVE), CK(_SHIFT, _GRAVE), NK(_GRAVE))},
{2, L(NK(_1), CK(_SHIFT, _1), NK(_1))},
{3, L(NK(_2), CK(_SHIFT, _2), NK(_2))},
{4, L(NK(_3), CK(_SHIFT, _3), NK(_3))},
{5, L(NK(_4), CK(_SHIFT, _4), NK(_4))},
...
左側の数字は仕組みで説明した一意なID、右側の関数呼び出しはファームウェア内でコマンドと呼ばれる物でこれの組み合わせを変更することでIDを割り当てられたスイッチを押したときの挙動を変更できる。
どのスイッチが何番のIDに割り当てられているかは以下となる。
/* ID
* ,-----------------------------------------. ,-----------------------------------------.
* | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 10 | 11 | 12 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | 13 | 14 | 15 | 16 | 17 | 18 | | 19 | 20 | 21 | 22 | 23 | 24 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | 25 | 26 | 27 | 28 | 29 | 30 | | 31 | 32 | 33 | 34 | 35 | 36 |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 |
* `-------------------------------------------------------------------------------------------------'
*/
Command *NOP
何もしないコマンド、以下の例ではSW1
を押しても何も起こらない。
static Key keymap[] = {
{1, NOP},
};
Command *NK(uint8_t keycode)
通常キー用のコマンド、以下の例ではSW1
はA
,SW2
はB
,SW3
はC
のキーコードを送出する。
(keycode.h
ファイルにキーコードに対して_A
などの名前が割り当てられているのでそちらも参照のこと。)
static Key keymap[] = {
{1, NK(_A)},
{2, NK(_B)},
{3, NK(_C)},
};
Command *MO(Modifier modifier)
修飾キー用のコマンド、以下の例ではSW1
はSHIFT
のキーコードを、SW2
はCTRL
とSHIFT
のキーコードを同時に送出する。
修飾キーは|
演算子で同時押しの組み合わせを表現できる。
static Key keymap[] = {
{1, MO(_SHIFT)},
{2, MO(_CTRL | _SHIFT)},
};
Command *CK(Modifier modifier, uint8_t keycode)
コンビネーションキー用のコマンド、修飾キーと通常キーの同時押しを表現できる。以下の例はSW1
はCTRL+C
、SW2
はCTRL+ALT+DELETE
のキーコードを送出する。
static Key keymap[] = {
{1, CK(_CTRL, _C)},
{2, CK(_CTRL | _ALT, _DELETE)},
};
Command *MT(Modifier modifier, uint8_t keycode)
スイッチを押した後リリースせずにに別のスイッチを押したときは第1引数の修飾キー、スイッチ単体でタップすると第2引数の通常キーとして機能するコマンド、以下の例でSW1
を押した後離さずにSW2
を押すとSHIFT
キー(結果としてSHIFT+A
)、SW1
を押して何もせずにそのまま離すとSPACE
キーのキーコードが送出される。
static Key keymap[] = {
{1, MT(_SHIFT, _SPACE)},
{2, NK(_A)},
};
Command *OSM(Modifier modifier)
スイッチを押して離すと次にスイッチを押した時に送出されるキーコードと同時に引数の修飾キーも送出される、スイッチを押して離さずに別のスイッチを押した場合は通常の修飾キーコマンドの様に動作する。下の例ではSW1
を押して離した後にSW2
を押すとSHIFT+A
のキーコードが送出される。
static Key keymap[] = {
{1, OSM(_SHIFT)},
{2, NK(_A)},
};
Command *L(Command *first, Commands... rest)
レイヤー分けをするコマンド、現在のレイヤーの状態によって動作させるコマンドを変更する。以下の例ではSW1
を押すとレイヤー2がONの時はC
、2がOFFで1がONの時はB
、2と1がOFFの時はA
のキーコードを送出する、0レイヤーはデフォルトでONとなる。
static Key keymap[] = {
// 0 , 1 , 2
{1, L(NK(_A), NK(_B), NK(_C))},
};
Command *SL(uint8_t layerNumber)
スイッチを押してる間だけ引数の番号のレイヤーをONにする。以下の例ではSW1
単体で押すとA
、SW2
を押しながらSW1
を押すとB
、SW3
を押しながらSW1
を押すとC
のキーコードを送出する。レイヤー番号の数字が高いほうのコマンドが優先されるのでSW2
とSW3
を同時に押しながらSW1
を押すとSW3
のレイヤー番号の2
が優先されC
のキーコードが送出される。
static Key keymap[] = {
{1, L(NK(_A), NK(_B), NK(_C))},
{2, SL(1)},
{3, SL(2)},
};
Command *TL(uint8_t layerNumber)
スイッチを押したら引数の番号のレイヤーをトグルする、SLコマンドと違いスイッチを離したあとでもレイヤーをONにし続ける事ができる。以下の例だと1回SW2
を押すとレイヤー1がONになりその状態でSW1
を押すとB
のキーコードを送出する。もう1回SW2
を押すとレイヤー1がONからOFFに変わりその状態でSW1
を押すとA
のキーコードを送出する。
static Key keymap[] = {
{1, L(NK(_A), NK(_B))},
{2, TL(1)},
};
Command *LT(uint8_t layerNumber, uint8_t keycode)
MTコマンドのレイヤー版。
Command *OSL(uint8_t layerNumber)
OSMコマンドのレイヤー版。
続く