[小ネタ] 特殊なショートカットをタイプする、専用キーボードを作る

投稿者: | 2020/01/24

Making a special USB keyboard to send a keyboard shortcut.

今日も小ネタです。

背景

いま、とある仕事で Wayland + Weston で動作する Qt アプリを試作しています。Wayland ってのは私もよく分からないのですが、軽量な X Window サーバーみたいなものでしょうか。

アプリの試作をしているので、ときどき画面のキャプチャを取りたくなるのですが、調べてみると Weston での画面キャプチャには「Super + s」というキー操作をしないといけないのだそうです。(参考

Super ってなんやねん?

Alt とか Meta ってのは聞いたことがありますが、Super は分かりませんでした。いろいろ調べてみると、どうもいわゆる「Windows キー」が該当するそうです。

私は困りました。私は旧 PFU 時代からの Happy Hacking Keyboard(通称 HHK)ファンだからです。私の使っているモデルは PD-KB02 といって、18年ほど前に購入したものです。当たり前(?)ですが、Windows キーなどという軟弱なキーはありません!(← 自慢してどうする)

Arduino で USB キーボードを作る

思い切って Amazon で安いキーボードを買おうかと思ったのですが、それでは私の HHK が可哀想です。意を決して、Arduino の USB HID クラスライブラリで Super + s を押すだけの専用キーボードを作ることにしました。この辺の説明が詳しいですね。

ちなみに、Arduino の Keyboard ライブラリが使えるのは、現状では Atmel の 32u4 か SAMD21 マイコンを搭載したモデルに限られます。(参考

さて、パーツ箱の中をごそごそしてみたのですが、以前に買ったはずの Arduino Pro Micro(32u4 搭載)が見当たりません。何か別の試作に使ってしまったのか、あるいはどこか違う場所にしまったのか。。。(歳は取りたくありませんね。)

キーボードを作るのに 32ビットマイコンはもったいないなあ、と思ったのですが、SparkFun サイトで調べてみると、いまや価格は 1ドルしか違わないのですね。

SAMD21 マイコンで行こう

という訳で SAMD21 マイコンを見つけ出し(これはなぜか、たくさん持ってる)、早速コードを書いてみました。

#include "Keyboard.h"

void setup() {
    Keyboard.begin();
}

void loop() {
    delay(1000);

    Keyboard.press(KEY_LEFT_GUI);
    delay(100);
    Keyboard.press('s');
    delay(100);
    Keyboard.releaseAll();

    for (;;)
        ;
}

KEY_LEFT_GUI というのが Super キー(modifier)ですね。

完成

これで無事に画面キャプチャが取れるようになりました。めでたし、めでたし。

追記(2020/9/27)

まず最初に、USB HID のキーマップはこちらが参考になります。それを読むと、日本語キーボードの「変換」キーはコード(usage ID)が 138、「無変換」が 139 であることがわかります。また、Super というモディファイアキーは、Mac だといわゆる Cmd キーが該当するようです。