自作キーボードをビルドして使う

08/29

自作キーボードのあれやこれや

目次

きっかけ

最近、テレワークが多くなってきて、自宅環境での作業が多くなってきてからというもの、作業場の改善というかこだわりたくなってきた。
具体的には、テレカンのためのカメラやマイクの位置とか、ケーブリングとか、ディスプレイの数や大きさとか、プライベートと仕事の環境分離とか、開発環境とか。
そして、特に入出力デバイスについてはこだわりを持ちたいと思っている。

自作キーボードを作りたい

ここ1年のことの話にはなるが、マウスやキーボードを買いまくっている。

マウスだとELECOM
ELECOM M-DT1DRBK

キーボードだと、logicool
logicool K835 TKL メカニカル

あとはRedragonとか
Redragon K617

ROYAL KLUDGEとか
RK ROYAL KLUDGE RK61

あとは、マクロキーボード。

いろいろ欲が出てくるもので、あれもこれもポチポチしていたらこんな結果に。
ただこうだったらいいなみたいな、欲も出てきてついにキーボードを自作してみたいなという想いが募ってきた。
そう思い始めてきたのも、先日購入したRaspberry Pi Picoがキーボードのコントローラになることが分かっていたので、これはやるっきゃないと思い立ったわけ。

思い立ったが吉日

早速、作ってみたいという欲求に駆られたので、作りたいときが作り時とばかりにググってみる。

すると1から全部作ることもできるらしいのだが、先ずは何が必要かを一覧にしてみる。

材料

  • マイコン(ここではRaspberry Pi Pico)
  • 基板
  • キー数分の以下のパーツ
    • ダイオード
    • キースイッチ
    • キーソケット
    • キートップ
    • LED(オプション)
  • ゴム足(オプション)
  • キーボードケース
  • ねじ
  • USBケーブル(ここでは MicroUSB typeA <-> USB typeA)

道具

  • はんだ
  • はんだごて
  • こて台
  • ニッパー
  • ドライバー
  • テスター
  • ラジオペンチ
  • PC(開発環境&試験環境)

こんなところかな?
電気工作を苦ではない人たちには、めちゃくちゃ簡単に作れる。
そもそもキーボードの仕組みが単純で、制御はラズパイに任せられるので、非常に簡便にカスタマイズできるので自作キーボード製作初心者の私でもとっつきやすい。

さてやってみようではないか。
ということで


いってみよう。
やってみよう。

キーボードできた暁には、やーったやったたった、で・き・たーって踊ることとする。

理想

まずはどんなのが欲しいのか。
キーボードの理想を描く。

  • 61キーぐらいのコンパクトなやつ
  • 英語配列
  • 数字キーより上にキーは要らない
  • Enterキーより右にキーは要らない
  • Aの左は絶対Ctrl
  • 矢印キーは出来ればほしい
  • できればBluetoothのマルチ接続
  • 出来れば控えめに光ってほしい
  • 有線接続時のコネクタはできればUSB typeC

このくらいかな。
この前、左右セパレートタイプのやつを触ったときも非常に心地よかったのだが、完全なタッチタイピングが出来ないのでイライラしそうで止めた。

これが取り敢えずの理想。
これを自作できたらとりあえず嬉しいかな。
でも、最初からこのスペックはかなりハードルが高いので、先ずは試しにもっとコンパクトで簡単なやつを作ってみる。
出先でササッと出してパチパチできるコンパクトなのあったら何かと便利だと思うので、多分。
トランジスタなBodyも磨けば光りだすってね。

76th Star

30キー

さて、自作キーボードの登竜門でありメッカである遊舎工房TALP KEYBOARDを覗いてみたところ、かなりたくさんの種類の自作キーボードがある。
まずは何においてもキーボードの基板が全てのベースになってくるので選定は大事。
そこでよさそうなのを調べてみたら、Gherkin for RPPという基板が見つかった。
キー数は30キーで私がほしいものの半分、テストにはもってこい。
このキーボード専用ケースの3Dプリンタデータを公開されている方がいらっしゃっるので、こちらを使うのも手。

あとは、

こんな感じいけそうだな。
Picoは前に買っていて引き出しの奥に眠っているので、それ以外のものを調達することとする。
Ima get them all except rpp.

調達

ボス「もちろん装備は現地調達だ。」

スネーク「梅澤無線に行ってくる。」

ネイキッド

札幌は梅澤ぐらいしかないので、、、いや、流石にコロナの関係でそういうのは憚られる時期なのでネットで調達。

ただ、キーボードケースだけは3Dプリンタがないとダメだな、、って探したらDMM.makeというのを見つけた。
このサイトにレンダリングデータをアップロードして、成形する素材を選んで見積依頼するとすぐに金額を出してくれるので、その場でクレジット決済もでき、そのまま製作までしてくれるというめちゃくちゃ便利なサービス。
他にもこんなサービスあるのかもしれないけど、探していないのでよくわからない。

DMM.make 3D PRINT

組み上げ

さて物がすべて届いたら、組み上げてみる。
基板にハンデ付けするのは、ダイオードとキーソケット。
それと、もう他に流用することもないので、今回はラズパイと基板はハンデで固定してしまった。
そこまでの様子がこちら。

  • キーソケットとダイオードをはんだ付け
  • Picoをはんだ付け
  • キースイッチを差し込む

  • ブランクキーキャップをつけたとこ

  • DMM.makeのケースをつける
  • シリコンシートを底面につける(ゴム足と同じ効果)

これで一応ハード的な組み上げが出来た。

導通チェック

テスター使ってちゃんとハンダ付が出来ているか確認する。
I Don’t Like Mondays.の曲に合わせる(あ、今のBGMね)かのように、合いの手か声援のようにテスターでピーピー言わす。
うん、大丈夫そうだ。
ここ結構大事。

キーソケットというのはこんなにスカスカなんだっけ。
ちょっとした衝撃でスイッチが抜けてしまう。
本来はキャップとスイッチの間にカバーを入れるべきなんだろうな。
最初だからいいかいかイルカ、ハッ、るるるるるるるる。

開発環境構築

さて、ここからはソフト的な環境構築をしていく。

コントローラであるラズパイPicoにファームウェアを書き込む必要があるのだが、その環境を準備する必要があるのでそちらをサラッと紹介。

まずはRaspberry Pi Picoの仕組みとしては、起動にはファームウェアをインストールする必要がある。
インストールするには、本体にあるタクトスイッチを押しながら、PCとUSB接続することで、ファームウェアインストールモードになる。
PCがWindowsの場合はDドライブみたいなかたちでマウントされるので、そこのルートディレクトリにファームウェア(ここではuf2)ファイルを置くと自動的にファームウェアが起動される。

で、ここから大事。
ファームウェアの作り方が2種類あって、どちらも試してみた。

  • QMK Firmware
  • PRK Firmware

まずはQMKの方から。

QMK編

基本的にはこちらのSelf-Make Keyboards in Japanさんの記事を参考にしている。
ただ上記のサイトはrp2040対応をベースに紹介されているので、上記の記事の最後の方でも説明されているとおりカスタマイズが必要だと思う。
作業はWindows 11でWSL2を使っている。
ま、紹介するまでもないのでちゃちゃっと。

python3

gitとpython3がインストールされていれば以下のコマンドは不要。

$ sudo apt-get update 
・
・
・
$ sudo apt-get install git python3 python-pip
・
・
・
$ 

QMK

QMKとは主にキーボード用のファームウェアをビルドできる環境であり、以下を実行すると準備が完了する。

$ python3 -m pip install qmk
・
・
・
$ ls .local/bin/qmk
qmk
$ 

pico-sdk

pico-sdkはRaspberry Pi PicoのSDKでCやC++などで開発するためのプログラミング環境である。
以下の通り実行する。

$ cd ~
$ git clone https://github.com/raspberrypi/pico-sdk.git
$ cd pico-sdk
$ git submodule update --init --recursive
$ pwd | xargs -ICURDIR echo "export PICO_SDK_PATH="CURDIR |tee -a ~/.bashrc
$ bash -l
$ set |grep PICO_SDK
PICO_SDK_PATH=~/pico-sdk
$ 

QMK Firmware

ファームウェアのソース群。rp2040対応版。
こちらをgithubから頂く。

$ cd ~
$ git clone --branch rp2040 https://github.com/sekigon-gonnoc/qmk_firmware.git
・
・
・
$ 

ビルド

pipi_gherkinというキーボードのタイプが今回の対象。
ソース群は、QMK Firmwareの下にpipi_gherkinというのがあるのだが、こちらを使ってビルドしてみる。

$ cd ~
$ cd qmk_firmware
$ find keyboards/40percentclub/pipi_gherkin/ -print |sort
keyboards/40percentclub/pipi_gherkin/
keyboards/40percentclub/pipi_gherkin/config.h
keyboards/40percentclub/pipi_gherkin/info.json
keyboards/40percentclub/pipi_gherkin/keymaps
keyboards/40percentclub/pipi_gherkin/keymaps/default
keyboards/40percentclub/pipi_gherkin/keymaps/default/keymap.c
keyboards/40percentclub/pipi_gherkin/pipi_gherkin.c
keyboards/40percentclub/pipi_gherkin/pipi_gherkin.h
keyboards/40percentclub/pipi_gherkin/readme.md
keyboards/40percentclub/pipi_gherkin/rules.mk
$ 

このソース一覧を使う。
一度何も変更せずにビルドしていく。

$ cd ~
$ cd qmk_firmware
$ make 40percentclub/pipi_gherkin:default:uf2
・
・
・
$ ls -l |grep uf2
-rw-r--r-- 1 me me   94720 Aug  8 21:49 40percentclub_pipi_gherkin_default.uf2
$ 

出来上がったuf2ファイルを先述のインストール手順でコピペすると勝手に再起動されてUSBキーボード(HID)として認識されるはずなので、メモ帳とか起動して、パチパチしてみると。


いやいや、こんな指増やすほどキーないから。

動作チェック

全キー認識できているかを確認して入力テスト終わり。
次にケーブルを抜き差ししても問題なく認識されるか、別のPCに挿しても認識されるかを確認して動作チェック終わり。

ちなみに、このキーボードはキー数が少ないので少し癖のあるカブトムシ仕様である。
キーアサインは以下の通り。

Normal
Q W E R T Y U I O P
A S D F G H J K L ESC
Z X C V BS SPC B N M Ent

で、3行目のキーがそれぞれメタキーになっており、長押しで別のキーとして認識する。
長押しすると、

Macro Keys
Q W E R T Y U I O P
A S D F G H J K L ESC
Ctrl Alt FN3 FN4 FN2 FN1 FN5 ALT Ctrl Shift

こんな感じになる。
FN1~FN5はキーマップを動的に変更するキーになっており、例えばFN2を押し続けている間は以下のキーマップになる。

FN2
1 2 3 4 5 6 7 8 9 0
F1 F2 F3 F4 F5 F6 F7 F8 F9 F10
DEL FN2

なので、SPACE押しながらQって押すと1が入力されるって仕組み。
ちなみに:(コロン)は、V押しながらL
-(ハイフン、ダッシュ)は、C押しながらY
覚えるのが面倒かも。
でも、慣れたら最強になってくれるのかも。
そのタイピング音に耳を傾けて深い安らぎに酔いしれることができるのだろうか。

いろいろ問題が

Linuxターミナルでパチパチしようと思ったら、TABキー、ESCキー、Backspaceキー、Ctrlキー、SPACEバーをかなり多様するんだけど、このキーボードだとかなり苦戦しそう。

例えば

$ LANG=C find . -maxdepth 3 -type f -name "*.js" -mtime +3 -exec ls -l --full-time {} \; |awk '{"echo -n $(basename "$9")"|getline f; print f,$6,$7,$9;}' |sort |sed -e "s/\.[0-9]\{9\}//;s/^[^ ]* //" |tee /tmp/result.txt
$ 

このくらいの長さのコマンドを画面の前で考えながら打っているので、これと同程度のことを新しいキーボードでタッチタイピングできるためにはかなり練習しないと。
あと決定的なのが、CtrlがZのところに割り当てわれているので、Ctrl + Zができない。
ということは、LinuxでProcessをStopさせることができないし、WindowsでUndoができない。
あとは、普段キーアサインを変更してCtrlCapsとしているため、かなり使いづらさがある。

リビルド準備

ということで、現在のキーマップから変更できるかを試す。
現行ソースは以下の通り。
下のLAYOUT_ortho_3x10の引数がキーに当たる。
これを下の変更してちゃんと反映されるかを行ってみる。

qmk_firmware/keyboards/40percentclub/pipi_gherkin/keymaps/default/keymap.c

#include QMK_KEYBOARD_H

#define FN1_SPC     LT(1, KC_SPC)
#define FN2_V       LT(2, KC_V)
#define FN3_X       LT(3, KC_X)
#define FN4_C       LT(4, KC_C)
#define FN5_B       LT(5, KC_B)
#define ALT_Z       ALT_T(KC_Z)
#define ALT_N       ALGR_T(KC_N)
#define CTL_M       RCTL_T(KC_M)
#define SFT_BSPC    RSFT_T(KC_BSPC)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

  [0] = LAYOUT_ortho_3x10(
    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,
    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_ENT,
    KC_LCTL, ALT_Z,   FN3_X,   FN4_C,   FN2_V,   FN1_SPC, FN5_B,   ALT_N,   CTL_M,   SFT_BSPC
  ),

  [1] = LAYOUT_ortho_3x10(
    KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,
    KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,
    _______, _______, _______, _______, KC_DEL,  _______, _______, _______, _______, _______
  ),

  [2] = LAYOUT_ortho_3x10(
    KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN,
    KC_F11,  KC_F12,  _______, _______, _______, _______, _______, _______, _______, KC_GRV,
    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  ),

  [3] = LAYOUT_ortho_3x10(
    KC_ESC,  _______, _______, _______, _______, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS,
    KC_TAB,  _______, _______, _______, _______, KC_COMM, KC_DOT,  KC_SLSH, KC_SCLN, KC_QUOT,
    _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT
  ),

  [4] = LAYOUT_ortho_3x10(
    KC_ESC,  _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
    KC_TAB,  _______, _______, _______, _______, KC_LABK, KC_RABK, KC_QUES, KC_COLN, KC_DQUO,
    _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
  ),

  [5] = LAYOUT_ortho_3x10(
    KC_CALC, KC_WHOM, KC_MAIL, KC_MYCM, _______, _______, _______, _______, _______, KC_PSCR,
    _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC,  BL_INC,
    _______, _______, _______, _______, RESET,   _______, _______, _______, _______, _______
  )

};

行った変更は以下の通り。

Normal
Q W E R T Y U I O P
A S D F G H J K L Enter
Ctrl Z/Alt X/FN3 C/FN4 V/FN2 SPC/FN1 B/FN5 N/Alt M/Ctrl BS/Shift

うーんこれでも若干打ちづらいけど仕方ないかな。
あと、USBコネクタをキーボードの右側に置きたいので、上下反転させることにした。
変更箇所は以下の通り。

qmk_firmware/keyboards/40percentclub/pipi_gherkin/config.h

#pragma once

#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID       0xFEED
#define PRODUCT_ID      0x6060
#define DEVICE_VER      0x0001
#define MANUFACTURER    40 Percent Club
#define PRODUCT         PiPi Gherkin

#define DYNAMIC_KEYMAP_LAYER_COUNT 6

/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 6

/* key matrix pins */
/*
#define MATRIX_ROW_PINS { 8, 9, 10, 11, 12 }
#define MATRIX_COL_PINS { 2, 3, 4, 5, 6, 7 }
*/
/* if u put USB port on the right side, */
/* use this instead */
#define MATRIX_ROW_PINS { 12, 11, 10, 9, 8 }
#define MATRIX_COL_PINS { 7, 6, 5, 4, 3, 2 }
#define UNUSED_PINS

/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW

/* number of backlight levels */
#define BACKLIGHT_PIN B5
#ifdef BACKLIGHT_PIN
#define BACKLIGHT_LEVELS 3
#endif

/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5

/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE

#ifdef RGB_DI_PIN
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 0
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8
#endif

リビルド

以下の通り。

$ cd ~
$ cd qmk_firmware
$ make clean
$ make 40percentclub/pipi_gherkin:default:uf2
$ ls -l 40percentclub_pipi_gherkin_default.uf2
-rw-r--r--   1 me me   96256 Aug 26 16:00 40percentclub_pipi_gherkin_default.uf2

ちゃんとできているようなので、新しいファームウェアをコピーする。
キーボードのBOOTSELボタンを長押ししながらケーブルを接続する。
上記uf2ファイルをRPI-RP2ドライブにコピーしたら完了。
キーボードパチパチしてみる。大丈夫そうだ。

ちょっと慣れるまで時間がかかりそうだ。
でも、まぁ、完成したことに満足していたりする。

次は別の方法としてRubyによるファームウェア構築を紹介。

PRK編

さっきのQMKはCで作るファームウェアなのに対し、このPRKはRubyでうごくFirmware。
こちらも開発環境を用意してみる。
前のQMKはキーマップのソースを変更した結果はビルドしてuf2ファイルを作ってコピーして適用しないと分からなかった。
ま、Cのプログラムなので当然なのだが、対してこちらのPRKは一味違っていてuf2の更新は一度だけ。
その後はkeymap.rbを更新するだけでよい。
なんと便利な時代になったものだな。
思えば遠くへ来たもんだ。

開発環境を用意して、一からビルドしてもよいのだが、先の通りキーマップのファイルだけを更新するだけでよく、githubにファームウェアも公開されているので、今回はありがたく使用させていただくこととする。
今回は、prk_firmware-0.9.17-20220806-df5f361.uf2を使用する。

インストール

このファームウェアをRPI-RP2ドライブにコピーする。
するってーと、ファームウェアがインストールされリブートして、RPKFirmwareというドライブが自動的に出てくる。
で、ここにkeymap.rbをコピーしてケーブル挿しなおすと自動的にそのRubyファイルを解釈してくれてキーマップが適用されるという便利仕様。

で、このkeymap.rbというのは以下の場所に公開されている。

https://github.com/picoruby/prk_pipigherkin

$ cd ~
$ git clone https://github.com/picoruby/prk_pipigherkin.git
$ ls -l prk_pipigherkin/
total 2596
drwxr-xr-x 2 me me    4096 Aug 26 15:16 build
-rw-r--r-- 1 me me    3953 Aug 26 15:16 keymap.rb
-rw-r--r-- 1 me me    1071 Aug 26 15:16 LICENSE
-rw-r--r-- 1 me me 1106307 Aug 26 15:16 pipigherkin_2.jpg
-rw-r--r-- 1 me me 1529301 Aug 26 15:16 pipigherkin.jpg
-rw-r--r-- 1 me me     447 Aug 26 15:16 README.md
$ 

keymap.rbの中身はこんな感じ。

#Initialize a Keyboard
kbd = Keyboard.new

#Initialize GPIO assign
kbd.init_pins(
  #[ 8, 9, 10, 11, 12 ], # row0, row1,... respectively
  #[ 2, 3, 4, 5, 6, 7 ]  # col0, col1,... respectively
  #If you put USB port on the right side, use below instead
  [ 12, 11, 10, 9, 8 ],
  [ 7, 6, 5, 4, 3, 2 ]
)

#default layer should be added at first
kbd.add_layer :default, %i(
  KC_Q      KC_W      KC_E        KC_R      KC_T       KC_Y       KC_U      KC_I      KC_O      KC_P
  KC_A      KC_S      KC_D        KC_F      KC_G       KC_H       KC_J      KC_K      KC_L      KC_BSPACE
  Z_LSFT    X_LGUI    C_LALT      V_LCTL    SPC_LOWER  ENT_RAISE  B_RCTL    N_RALT    M_RGUI    UNDS_RSFT
)
kbd.add_layer :raise, %i(
  KC_EXLM   KC_AT     KC_HASH     KC_DLR    KC_PERC    KC_CIRC    KC_AMPR   KC_ASTER  KC_EQUAL  KC_PLUS
  KC_LABK   KC_LCBR   KC_LBRACKET KC_LPRN   KC_MINUS   KC_LEFT    KC_DOWN   KC_UP     KC_RIGHT  KC_BSPACE
  KC_RABK   KC_RCBR   KC_RBRACKET KC_RPRN   ADJUST     ENT_RAISE  KC_BSLASH KC_COMMA  KC_DOT    KC_SLASH
)
kbd.add_layer :adjust, %i(
  KC_F1     KC_F2     KC_F3       KC_F4     KC_F5      KC_F6      KC_F7     KC_F8     KC_F9     KC_F10
  KC_F11    KC_F12    KC_QUOTE    KC_DQUO   KC_MINUS   KC_LEFT    KC_DOWN   KC_UP     KC_RIGHT  KC_DELETE
  KC_ESCAPE KC_LGUI   KC_LALT     KC_LCTL   UNLOCK     UNLOCK     KC_RCTL   KC_RALT   KC_RGUI   KC_ESCAPE
)
kbd.add_layer :lower, %i(
  KC_1      KC_2      KC_3        KC_4      KC_5       KC_6       KC_7      KC_8      KC_9      KC_0
  KC_TAB    KC_NO     KC_QUOTE    KC_DQUO   KC_MINUS   KC_GRAVE   KC_TILD   KC_PIPE   KC_COLON  KC_SCOLON
  KC_ESCAPE KC_LGUI   KC_LALT     KC_LCTL   SPC_LOWER  ADJUST     KC_RCTL   KC_RALT   KC_RGUI   KC_RSFT
)

kbd.define_mode_key :Z_LSFT,    [ :KC_Z,                               :KC_LSFT,                   150,             150 ]
kbd.define_mode_key :X_LGUI,    [ :KC_X,                               :KC_LGUI,                   150,             150 ]
kbd.define_mode_key :C_LALT,    [ :KC_C,                               :KC_LALT,                   150,             150 ]
kbd.define_mode_key :V_LCTL,    [ :KC_V,                               :KC_LCTL,                   150,             150 ]
kbd.define_mode_key :B_RCTL,    [ :KC_B,                               :KC_RCTL,                   150,             150 ]
kbd.define_mode_key :N_RALT,    [ :KC_N,                               :KC_RALT,                   150,             150 ]
kbd.define_mode_key :M_RGUI,    [ :KC_M,                               :KC_RGUI,                   150,             150 ]
kbd.define_mode_key :UNDS_RSFT, [ :KC_UNDS,                            :KC_RSFT,                   150,             150 ]
kbd.define_mode_key :ENT_RAISE, [ :KC_ENTER,                           :raise,                     150,             150 ]
kbd.define_mode_key :SPC_LOWER, [ :KC_SPACE,                           :lower,                     150,             150 ]
kbd.define_mode_key :ADJUST,    [ Proc.new { kbd.lock_layer :adjust }, :KC_LSFT,                   300,             nil ]
kbd.define_mode_key :UNLOCK,    [ Proc.new { kbd.unlock_layer },       :KC_LSFT,                   300,             nil ]

kbd.start!

こんな感じ。キーマップを可視化したらこんな感じ。

PRK
Q W E R T Y U I O P
A S D F G H J K L BS
Z/Shift X/WIN C/ALT V/CTRL SPC/lower Enter/raise B/CTRL N/ALT M/WIN _/Shift

なかなか面白いキーマップ。
これはこれでとても便利な仕組み。

ただ、なぜか私のキーボードでは誤動作(特にメタキーを設定した3段目で)を繰り返すので、運用は出来なかった。

最後に

ま、兎にも角にも目的のことができたので踊ることとする。


コメント: