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 キーが該当するようです。