ElgatoのStream Deckや以前私が作ったAZ-Macroをみて、同居人もマクロキーパッドが欲しそうだったのでプレゼントすることにしました。
マクロキーパッドとは、特定のキーコンビネーション(含む単一キー入力)を入力できる小型のキーボード装置のことです。Ctrl+Alt+F4みたいな複雑なキーボードショートカットを押すかわりに1ボタンで同等の操作を完結できるものです。たまにキーボードの上の方にメディア操作ボタン(再生、停止、スキップ、ミュートなど)がついているPCがあると思いますが、あぁいうのの外付け版みたいな感じですね。昨今、テレワークや配信ブームでマイクやカメラのミュート操作なんかを簡単にしたい、みたいな文脈で注目が高まっている感があります。
で、同居人のニーズとしては「ネットショップの出荷作業の際に、注文管理サイトの未出荷オーダーの一覧画面に一発で戻るボタン」という感じ。マウス数クリックのことではありますが、連続して何十件も処理する時に少しでも効率化できたら、という感じでした。
基本1ボタンで済むのですが探してみても1ボタンのマクロキーパッドというのは見つかりませんでした。もっとも少なかったのはこちらのZoomでマイクとカメラをミュートにできる2ボタンのもの。
Linkidea USBズーム ミーティング ミュートボタン ビデオ起動/停止機能 マイクオーディオミュート/ミュート...
しかしこれはMac用とWindows用が別製品になっている。つまり送出できるキーボード入力がハードコーディングされていて変更不可であるということです。カスタマーQ&Aに「私たちはあなたのためにプログラムを編集し、あなたにそれをカスタマイズさせることができます。 自分で設定したい場合は、お問い合わせください。」という返答があるので、なんらかの手段はありそうですが仕様がはっきりしないのでスルーしました。
ちなみにマクロキーパッドや自作キーボードの多くはProMicroという制御基板がデ・ファクトになっていて、これだとUSB経由で設定ファイルを書き込んでキー出力をカスタマイズすることができます。最近はBluetoothキーボードになる互換ボードもあるようです。
私が以前組んだAZ-MacroはProMicroを使わず、独自実装のようでした。設定もWebブラウザからできて扱い易かったです。
さて、今回購入したのはこちら。
1ボタンも2ボタンもいいのが見つからず3ボタンで落ち着きました。アドレサブルRGB LEDがついていて3キー独立で好きな色に光らせることができます。
制御ボードしてなんとRaspberry Pi Zeroを使います。
別売りなので総額はややお高めになります。一番安いスイッチサイエンスは売り切れていたので秋月電子で購入しました。Wi-Fi/Bluetooth機能はいらないので、Zero W/WHである必要はないですが、オスのピンヘッダーが必要なので、最初から装着されているWHが良いかも知れません。
あとはRaspberry Pi ZeroのOSをインストールするmicroSDカード。容量は全然いらないのでこちらの16GBをチョイス(実際には8GBでも4GBでも余裕なので手持ちがあればそれでOKだと思います)。
Kioxia 16GB / 32GB / 64GB / 128GB / 256GB microSD Exceria フラッシュメモリーカード アダプター付き U1...
Raspberry Pi Zeroを使う難点としてはOSの起動に時間がかかる点。PC/MacからのUSB給電で起動し、キーが反応するようになるまで10~15秒ほどかかります。スリープ中でもUSB給電している機種/設定ならあまり気にしなくても良いかも知れません。
ちなみに起動後はオンメモリで動くので、いきなり電源をブチ切ってもSDカードのデータが壊れたりはしないとのことです。
キーユニットやキーキャップはバラバラで送られてきますが、ハンダ付けは要らず、差し込み、ハメ込みのみで完成します。購入時キーユニットがカチカチと静音タイプが選べましたがなぜか2,000円くらい差があったのでカチカチにしました。今は同額のようです。汎用品だしハンダ付けもしないので、その気になればキーユニットもキーキャップも交換できるでしょう。
接続ケーブルはRaspberry Pi Zero側のUSBはmicro B、PC側はAコネクタなケーブルが付属。USB Type-CのMacBookやPCの場合は別途変換アダプタ、ハブをかますか、ケーブルを買い直す必要があります。
■カスタマイズ方法がやや面倒くさく、日本語キーボード環境では問題あり
Raspberry Pieとか聞くとLinuxの知識がないといじれないんじゃ?と思われるかも知れませんが、本製品はそこら辺の知識は基本必要ありません。公式からOSファイルをダウンロードしてzip解凍した中身をSDカードにまるっとコピーします。そしてその中にあるテキストファイル形式の設定ファイルをエディタで編集するだけです。ただその記述方法は多少はプログラミング的な考え方が必要ですし、ドキュメントが公式サイトの英語のものしか見つからないのでそこは多少覚悟が必要かも知れません。
また
- SDカードをPC/Macにマウント
- 設定ファイルを書き換え
- SDカードをアンマウントしてKeybow本体に差し替え
- 起動に10~15秒待ち
- キーを押してみて動作確認
- 電源を落としてSDカードを抜く
の繰り返しになる設定プロセスはかなり面倒です。トラブルなくいけば数回で済むことですが、私はハマって試行錯誤をすることになったのでかなりストレス。
なにに困ったかというとMacで日本語キーボード環境だとキー配列に互換性がないため、意図した文字が送出されない、という点です。本製品は基本的に英語キーボードして動作します。しかしOS側でこれを日本語キーボードだと認識しているおかしなことになります。Macの場合、初めて接続したキーボードに対しては自動的にウィザードが起動して設定できるわけですが、そのステップとして「左右のShiftキーの隣にあるキーを押せ」というステップがあります。このキーが存在しない為、ここを突破できないのです。マニュアルでキーボード個別に配列を変更する箇所は発見できませんでした。標準キーボードともども英語配列設定にすれば問題ないのですが、、、多分Windowsならデバイスマネージャーでキーボード別にドライバ選択で使い分けられる気がします。もしかしたらGUIにこだわらなければMacでも設定できるかも知れませんし、これを書きながら、「一旦Shiftキー隣のキーを割り当ててやればよくね?」とも思いましたが試していません。
で、OS側での認識が日本語キーボードのままで例えば「所定のテキストを送信する」という
1 |
keybow.text("http://do-gaugan.com/hoge_fuga/") |
みたいな設定をしたとしても、「:」や「_」といった日本語キーボードと英語キーボードでキーの位置が違うような記号は正しく送られていきません。あくまでUSBキーボードなのでテキストを転送するのではなく、キーストロークに分解して1文字ずつ送信しているっぽいからでしょう。
ドキュメントも基本的なカスタマイズしか記載されておらず、キーコードを定義するところは見よう見まねで試行錯誤するしかありません。これには16進数のUsage IDというのを使います。こちらの表がわかりやすいですが、例えば左F1キーは10進数で58のところにあり、16進数なら0xをつけて0x3Aを指定します。実際に定義ファイルkeybow.luaをみると、
keybow.F1 = 0x3a
という定義行があります。
では「:」が「+」になってしまう問題を考えます。英語キーボードではShiftキーを押しながら「;」で「:」です。「;」キーのUsage IDは0x33です。実際に「:」を送信するよう設定をすると、日本語キーボード環境では(一番右のJISの列)では「;」のUsage IDは同じ0x33なものの、Shiftコンビネーション時の出力は「+」となっているのがわかります。
逆に辿るとJISで「:」は0x34であり英語では「’」だとわかるので、
keybow.text(“https’//”)
でいけるんじゃないでしょうか(未検証)。私は
keybow.semicoron_jp = 0x34
のように定義を追加しました。とりあえずこれを使ってコロンは出せました。
しかしこれで全て解決とはいかず。今度は同じ方法で「_」を出すために、日本語キーボードで右シフトの左にある「\_ろ」のキーに相当するキーコードを定義してみます。キー名は「International1」であり、Karabinar Elementに付属のEvent Viewerでも確認できます。
keybow.backslash_jp = 0x87
これで「\」が出てくれればShiftキーと一緒に送出するだけです。しかしこれは上手くいきません。原因は不明ですが、International1-9は英語キーボードに相当するキーがない(表でN/Aとなっている)ので、KebowのOSでも動作対象外となっているのかも知れません。「:」が出せたので考え方は間違ってないと思うのですが、これ以上はお手上げ。公式サイトに問い合わせるしかなさそうです。
ちなみに同じファイルkeybow.luaの冒頭にこういう定義あって、
1 2 |
local KEYCODES = "abcdefghijklmnopqrstuvwxyz1234567890\n\a\b\t -=[]\\#;'`,./" local SHIFTED_KEYCODES = "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()\a\a\a\a\a_+{}|~:\"~<>?" |
どうやらこれを書き換えればShiftキー押しながら書くキーをタイプした時の挙動をカスタマイズできそうなんですが、エスケープ(\)されたものとかあって後半のキーまできっちり合わせるのが大変そうで手を付けていません。Shift+9くらいまでならこれでもどうにかなるかも知れません。一般には\tがタブ、\nは改行だと思うんですが、\bがバックスペースで\aは警告音??Shift+TABとかShift+BSが警告音になっちゃうってこと??みたいな。どっかにフルドキュメントないんかな…
■結局記号付きの文字列送出はほぼ諦めた
上述のように1つ設定を書き換えてはSD差し替えてブート待ちして、というサイクルが面倒くさすぎて心が折れました。結局使用者の利用シーンを聞き取りして、記号文字「_」の送出はしなくて良い形でまとめました。参考とバックアップの為に今回の納品設定を晒しておきます。layoutsファイルにあるKeybow mini用のテンプレートmini.luaをコピーしてmy_mini.luaなどを作り、ルートにあるkeys.luaの2行目で呼び出せばOKです。「– 」で始まる行はコメントとして認識されるぽいですが、2バイト文字(日本語)があっていいかは不明です。ここでは可読性を優先して日本語でコメントを追記しておきます。
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 65 66 67 68 69 70 |
require "keybow" -- Keybow MINI -- function setup() keybow.use_mini() keybow.auto_lights(false) keybow.clear_lights() end -- Key mappings -- -- 使えるコマンド例 -- keybow.set_pixel(LED number, R, G, B) -- LEDを指定色で光らせる/消す -- keybow.sleep(500) -- 指定マイクロ秒待つ -- keybow.text("hoge") -- 指定文字列を送出(日本語キーボードでは記号が置き換わるので注意) -- keybow.tap_enter() -- Enterキーを叩く(押して離す) -- keybow.set_modifier(keybow.LEFT_META, keybow.KEY_DOWN) -- 指定モディファイアキーを押しっぱなしにする -- keybow.tap_key("r", pressed) -- 指定キーを叩く(押して離す) -- keybow.set_modifier(keybow.LEFT_META, keybow.KEY_UP) -- 指定モディファイアキーを離す -- 他にもsnippetsフォルダにOS別の便利マクロがあるので、必要に応じてrequire文で取り込んで使用する -- 一番左のキーの処理 function handle_minikey_02(pressed) if pressed then -- 以下、押された時 keybow.set_pixel(2, 20, 20, 255) -- キーボードのLED 2番を青っぽい色で光らせる -- Chromeを開く(起動済みならアクティブにする) keybow.tap_key(keybow.F5, pressed) -- F5を押してSportLight窓を開く(Mac側で変更済み) keybow.sleep(300) -- 300ms待つ keybow.text("Google Chrome") -- 「Google Chrome」と打つ keybow.sleep(300) -- 300ms待つ keybow.tap_enter() -- Enterを叩く else -- 以下、離された時 keybow.set_pixel(2, 0, 0, 0) -- キーボードのLED 2番を消灯させる end end -- 真ん中のキーの処理 function handle_minikey_01(pressed) if pressed then keybow.set_pixel(1, 40, 40, 255) -- (Chromeがアクティブだと仮定して)一番左のタブに移動する(Command + 1) keybow.set_modifier(keybow.LEFT_META, keybow.KEY_DOWN) -- Commandキーを押さえる keybow.tap_key("1", pressed) -- 「1」を叩く keybow.set_modifier(keybow.LEFT_META, keybow.KEY_UP) -- Commandキーを離す else keybow.set_pixel(1, 0, 0, 0) end end -- 一番右のキーの処理 function handle_minikey_00(pressed) if pressed then keybow.set_pixel(0, 70, 70, 255) -- ホームページに登録したURLを開く keybow.set_modifier(keybow.LEFT_META, keybow.KEY_DOWN) keybow.set_modifier(keybow.LEFT_SHIFT, keybow.KEY_DOWN) keybow.tap_key("h", pressed) keybow.set_modifier(keybow.LEFT_SHIFT, keybow.KEY_UP) keybow.set_modifier(keybow.LEFT_META, keybow.KEY_UP) else keybow.set_pixel(0, 0, 0, 0) end end |
以上、かなり単純な操作に落とし込みました。URLをキーボードから送り出すのは諦めて、使っていなかったホームボタンに指定URLを登録し、単にそれを呼び出すだけにしました。
また所定のアプリ起動はSpotlightを使ってアプリ名で検索して起動するアプローチになるんですが、デフォルトのCommand + SpaceはIME切り替えに使っていたので、OS側での呼び出しショートカットもF5にした上であわせています。標準ショートカットの場合はsnippets/mac_snippets.lusに関数が定義されているのでそれを使ってもいいかも知れません。
■PC側のツールでどうにかするアプローチ
今回はセットアップ先が自分のPCではなかったので、極力常駐ものを増やすのは避ける方針でいきましたが、AutoHotKey(Windows)やKeyboard Maestro(macOS)などのユーティリティを使えば、本体側は普段使いとあまり重複しないキーを送信するだけにしておき、あとの処理はPC側でどうにかする、という方向性もアリじゃないかと思います。
■まとめ
このボタン数で活カスタマイズ可能なキーパッドは希少で他に選択肢がなかったんですが、Raspberry Pie Zeroを使った独自実装で資料が少なく設定は難航しました。単純なキーコンビネーションを送出するだけなら問題ないと思いますが、日本語キーボード環境で文字列送信まで視野にいれるとかなりしんどいと思います。そもそもキーストロークを送出するUSBキーボードのふりをするので、OS側のIMEがONかOFFかも意識せず「aiueo」と送ります。「あいうえお」と送りたければ、IME ONにアサインしたキーコンビネーションを送るなどする必要がありますし、漢字変換まで考えると実質制御不能でしょう。そういうことがしたければStream Deckのような常駐ソフトを組み合わせて動作する製品を選ぶ方が幸せになれると思います。
設定が面倒くさい点に関しては、せっかくWi-Fiを内蔵したRaspberry Pi Zero WHをいれたので、sshでログインしてviやemacsで書き換えできるようにならないかな?と思いつつこれも調べていません。おそらくデフォルトでは余計なポートやデーモンは無効化てありそう(してあってほしい)。
色々可能性は感じつつも、試行錯誤の面倒くささとドキュメントの少なさで、とりあえずの動作要件を満たせたところで「もういいや」という気分になっていますが、とにかく小さいキーパッドが欲しいという方、AutoHotKeyなどの使用に躊躇がない方には良いかも知れません。
個人的には価格、ワイヤレスでも使用可能、Web設定インターフェイスなど統合したらAZ-Macroの方が遥かに優秀かなと思います。ハンダ付けが苦手な方には完成品もありますし。