Pirate Audioの前面ボタンを/dev/input/eventXなキーボードとして使うソフトを作ってみた
サマリー
- Raspberry Pi用のコンパクトな液晶 & スピーカー & ボタンHATのPirate Audio Speaker for Raspberry Piがすごく良い。
- そのボタンを/dev/input/eventXなキーボードにするプログラムを書いた。
Raspberry Piの弱点を完全にカバーしてくれるときめきデバイスをゲット
前から思ってたんです。ラズパイってヒューマンインタフェースが弱いなって。
ヒューマンインタフェースと言うのは、人間とコンピュータが対話するための入出力の手段のこと。
モニタやスピーカーのような人間の五感に訴える出力手段とか、キーボードとかタッチセンサーみたいな人間の意志をコンピュータに伝える入力の手段すね。
ラズパイのデフォルトだとそれがほぼないんですよね。
- 出力する手段:一応アクセスランプのちっちゃなLEDを制御可能
- 入力する手段:なし
まぁそのための拡張用40Pinなんですが、ジャンパ線がぴょんぴょんしてる基板をライフをハックするデバイスとして日常的に使えるかと言うと厳しいところがあると言うのが個人的な見解です。
(なおもぐのさん。はんだ付けがとても苦手なのは秘密です。)
そんなことを思いながら生きてたところ、公式サイトにときめくプロダクトが。
革命的だぜPirate Audio Speaker for Raspberry Pi!
それは、Pirate Audio Speakerと言うHAT基板。
ラズパイW Zeroサイズの基盤にちっちゃい液晶、モノラルスピーカー、小さな4つのボタンが搭載されてます。
もともとはラズパイを高音質なオーディオプレーヤーにするためのプロダクトなんですが、見事に上記のヒューマンインタフェース問題を解決してくれるHATになってます。
有志による解析も進んでて、独自のプログラムからでも使える感じになってます。
しかしながら、ボタンがGPIOなのがちょっと残念ポイント。
これがキーボードになれば、dialogコマンドとシェルスクリプトで超簡単に対話型のアプリが作れるのに・・・。
と言うわけで前面ボタンをキーボードに見せかけるアプリを作ってみました!
使い方
コマンドライン引数
./pirate_audio_buttons Aボタンのキーイベントコード Bボタンの〃 Xボタンの〃 Yボタンの〃
イベントコードは以下を参照。キーボードのCキーを模擬するならKEY_Cに対応する46を指定します。
linux/input-event-codes.h at master · torvalds/linux · GitHub
0を指定するとそのボタンは無効になります。
起動方法
&を付けてバックグラウンド起動してください。
Bボタンを"yキー"、Yボタンを"nキー"にする場合はこんな感じ。
./pirate_audio_buttons 0 21 0 49 & PID=$!
例えば、コンソールでdialogコマンドを実行してBボタン or Yボタンを押すと結果が得られると思います。
openvt -f -c 1 -- sh -c 'dialog --ascii-lines --yesno test 0 0; echo $?'
終了方法
killしてください(爽やかな笑顔)
kill $PID
デスクトップPCのキーボード・マウスをBluetoothのにしたら辛いことが多すぎたのでラズパイでBT→USBコンバータを作った
これまでのあらすじ
引っ越しを機にPCデスクをお洒落にしたい!
お洒落 is ケーブルレス!これ正義!!!
そんな訳でキーボードとマウスをBluetooth接続にした俺。もぐの。
その直後から数々の不幸が俺に降りかかってきたんだ!
結論
デスクトップPCにBluetoothキーボード・マウスは不適
ノートPCなら内蔵のキーボード&ポインティングデバイスがあるのでどうとでもなるんですが、代替手段のないデスクトップPCでは即GAME OVERなパターンが「KANOSO*1」なみに存在します。
長男だけどくじけたよ。ネ右一くん。
しかしながらBluetoothキーボードはドングル式に比べて種類が豊富
HHKBとかマジェスタッチとか、高級キーボードの有名どころは無線にBluetoothを採用してることが多い気がします。
なかなか捨てがたいです。
USBトラックポイントキーボードはエマージェンシー用途にマジ優秀なのでみんな持ってた方がいい
キーボードとポインティングデバイスがUSBケーブル1本でつなげて便利なのと、薄いし軽いから何かと取り回しがいいのです。必携。
辛すぎたのでRaspberry PI Zero WでBluetooth → USBコンバータを作った
要はWindowsがBluetoothを管理してるから悲しい事件が起きるので、それをラズパイにやらせてPCからはただのUSBキーボード・マウスに見れるようにすればいいって発想です。
ラズパイZero WはLinuxのUSB Gadget機能でUSBデバイスとして振舞うことができます。また、Zero WはBluetoothを内蔵してます。と言うわけでこの用途にジャストミートなんですね。
使い方
systemdのserviceファイルをインストールする。
cp -p /opt/event2usbhid/misc/*.service /etc/systemd/system/ systemctl enable mkusbhid systemctl enable event2usbhid_keyboard systemctl enable event2usbhid_mouse
Bluetoothキーボード・マウスをペアリングする。
trustで自動接続できるようにするのがポイントです。
bluetoothctl [bluetooth]# devices Device 7C:1E:52:B0:87:49 Microsoft Wedge Mobile Keyboard ・・・ [bluetooth]# pair 7C:1E:52:B0:87:49 [bluetooth]# connect 7C:1E:52:B0:87:49 [bluetooth]# trust 7C:1E:52:B0:87:49
udevルールの設定
/opt/event2usbhid/misc/99-bluetooth.rulesのATTRS{name}に先ほどペアリングしたキーボード・マウスの名前を登録した上でインストールします。
cat /opt/event2usbhid/misc/99-bluetooth.rules KERNEL=="event*", ATTRS{name}=="Microsoft Wedge Mobile Keyboard", TAG+="systemd", SYMLINK+="input/keyboard", ENV{SYSTEMD_ALIAS}="/sys/class/input/keyboard" KERNEL=="event*", ATTRS{name}=="Microsoft Sculpt Comfort Mouse", TAG+="systemd", SYMLINK+="input/mouse", ENV{SYSTEMD_ALIAS}="/sys/class/input/mouse" cp -p /opt/event2usbhid/misc/99-bluetooth.rules /etc/udev/rules.d/
リブートする
これでもう泣かなくてもよくなります。きっと。
ラスパイテンキー"Keybow"のソースコードを読んでみる
Keybowって?
ラズパイ搭載のUSBプログラマブルテンキーです。
今日急にラズパイでUSBキーボードを作りたくなって、その参考資料としてそいつのファームウェアのソースを読んでみました。
ちょい解説
ラズパイの一部の機種は、libcompositeと言うドライバを使うとUSB機器として振る舞えるようになります。
libcompositeにどんなUSB機器を模擬させるかの設定は、設定用のファイルシステムconfigfs経由で行います。
実際のデータ通信はデバイスファイルのread/writeで行います。
keybow/gadget-hid.c
libcompositeにUSBキーボード、マウス、LED?を登録する。(initUSB())
libusbgxと言うライブラリを使用している。
(aptにはなし。今回はGitHubから取ってきたけど、よく見たらkeybow-firmwareリポジトリにlibusbgxディレクトリがあった。)
keybow/keybow.c
initUSB()を呼ぶ。
デバイスファイル/dev/hidg0を開く。
どうもKeybowをMIDIコントローラーにするlua命令があるっぽい。
リリース当初こんな機能あったっけ?
今度ポケットミクと組み合わせて遊んでみたい。
keybow/lua-config
開いた/dev/hidg0にキーコードとかのリポートを書く。(sendHIDReport())
パラメータは引数じゃなくてグローバル変数。
マウスのボタンを押すとかにも対応してそう。(sendMouseReport())
sendHIDReport()
通常のキー
レポートは16バイト
- 0バイト目:リポートID(1:通常のキー)
- 1バイト目:Shift,Alt,Ctrlとかが押されているか
- 2バイト目:パディング(0固定)
- 3バイト目~15バイト目:スキャンコード
マルチメディアキー
レポートは2バイト
- 0バイト目:リポートID(2:マルチメディアキー)
- 1バイト目:メディアキーが押されているか
1バイト目のビット位置とキーの対応
sdcard/keybow.luaに定義されている。