もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

Pirate Audioの前面ボタンを/dev/input/eventXなキーボードとして使うソフトを作ってみた

サマリー

f:id:moguno:20201227155857j:plain:w400

  • 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つのボタンが搭載されてます。

f:id:moguno:20210105181648j:plain:w200

もともとはラズパイを高音質なオーディオプレーヤーにするためのプロダクトなんですが、見事に上記のヒューマンインタフェース問題を解決してくれるHATになってます。

有志による解析も進んでて、独自のプログラムからでも使える感じになってます。

  • 液晶:ごにょればフレームバッファとして使用可。コンソールもXも使えるぜ!(すごいぜ@akkiesoftさん)
  • スピーカー:もともとALSA経由で使用可
  • ボタン:もともとGPIO経由で読み込み可

しかしながら、ボタンがGPIOなのがちょっと残念ポイント。
これがキーボードになれば、dialogコマンドとシェルスクリプトで超簡単に対話型のアプリが作れるのに・・・。

と言うわけで前面ボタンをキーボードに見せかけるアプリを作ってみました!

github.com

使い方

準備

Raspberry PiのGPIOを制御するwiringpiをインストールしてください。

sudo apt-get install wiringpi

コマンドライン引数

./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 $?'


f:id:moguno:20210105195008j:plain:w400

終了方法

killしてください(爽やかな笑顔)

kill $PID

参考

Pirent Audioの液晶をコンソールとして使う方法

akkiesoft.hatenablog.jp

デスクトップPCのキーボード・マウスをBluetoothのにしたら辛いことが多すぎたのでラズパイでBT→USBコンバータを作った

これまでのあらすじ

引っ越しを機にPCデスクをお洒落にしたい!
お洒落 is ケーブルレス!これ正義!!!

そんな訳でキーボードとマウスをBluetooth接続にした俺。もぐの。
その直後から数々の不幸が俺に降りかかってきたんだ!

f:id:moguno:20201122215238j:plain

あれぇ?BTスピーカーの調子が悪いなぁ。一回Bluetoothオフにしてみるか。

マウス・キーボードが使用不可に。USBトラックポイントキーボードをジャンク箱から探してきてなんとか復旧。

あ、UEFI触りたいな。

操作不可。さっき仕舞ったUSBトラックポイントキーボードをまた引っ張り出してきてなんとか設定変更。

よーし!パパ最新のLinuxで遊んじゃうよー!

インストーラが操作不可。またUSBトラックポイントキーボードを引っ張り出してきて事なき。

結論

デスクトップPCにBluetoothキーボード・マウスは不適

ノートPCなら内蔵のキーボード&ポインティングデバイスがあるのでどうとでもなるんですが、代替手段のないデスクトップPCでは即GAME OVERなパターンが「KANOSO*1」なみに存在します。
長男だけどくじけたよ。ネ右一くん。

しかしながらBluetoothキーボードはドングル式に比べて種類が豊富

HHKBとかマジェスタッチとか、高級キーボードの有名どころは無線にBluetoothを採用してることが多い気がします。
なかなか捨てがたいです。

USBトラックポイントキーボードはエマージェンシー用途にマジ優秀なのでみんな持ってた方がいい

キーボードとポインティングデバイスがUSBケーブル1本でつなげて便利なのと、薄いし軽いから何かと取り回しがいいのです。必携。

f:id:moguno:20201123123024j:plain


辛すぎたのでRaspberry PI Zero WでBluetooth → USBコンバータを作った

github.com

要はWindowsBluetoothを管理してるから悲しい事件が起きるので、それをラズパイにやらせてPCからはただのUSBキーボード・マウスに見れるようにすればいいって発想です。

f:id:moguno:20201123122602j:plain

ラズパイZero WはLinuxのUSB Gadget機能でUSBデバイスとして振舞うことができます。また、Zero WはBluetoothを内蔵してます。と言うわけでこの用途にジャストミートなんですね。

使い方

リポジトリを/opt/event2usbhidに展開する。

同梱してる各種スクリプトは/opt/event2usbhid決め打ちにしてるのでそこに展開してください。

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/

リブートする

これでもう泣かなくてもよくなります。きっと。

*1:20年くらいコミケに行ってる先輩に聞いてみよう!

ラスパイテンキー"Keybow"のソースコードを読んでみる

Keybowって?

ラズパイ搭載のUSBプログラマブルテンキーです。

moguno.hatenablog.jp

今日急にラズパイでUSBキーボードを作りたくなって、その参考資料としてそいつのファームウェアのソースを読んでみました。

github.com

ちょい解説

ラズパイの一部の機種は、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を開く。

ちなみに、MIDIバイスも開いてた。

どうも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に定義されている。