RaspberryPiのキーをカスタマイズする

# やりたいこと
* USBボリュームコントローラーによるRaspberryPiへの入力を`a`や`b`などにカスタマイズしたい

# 環境
* RaspberryPi
    * RaspberryPi OS Lite 64bit
    * 元々はCUIモードで起動
* USBボリュームコントローラー

https://www.amazon.co.jp/gp/product/B09WVZ3FDB/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/505bde65-9d74-aefa-f3a9-0de603462e85.png)

# 結論
1. GUIをインストールして起動する
1. `setxkbmap -print`を流して、どの`symbols`ファイルが使われているかチェックする
1. `usr/share/X11/xkb/symbols/`の中から使われている`symbols`をバックアップした後、編集する
    * (ここで、無理に同時押し(`a+b`とか)をやるとOSが起動しなくなる)
    * 無理は禁物。1キーにつき1キーの割り当て。
1. RaspberryPiを再起動する

# 作業

## 方法の模索(追想)
今回は作業しながらのメモではなく、作業後に書いているので、キャプチャが少なめ

`xkb`を使うと実際のキーボードで入力されたものを、他のものに変換できるらしい。

https://qiita.com/jabberwocky0139/items/40b28406daa6769a9c4d

まずWindows11のPCからRaspberryPiにSSH接続して、`setxkbmap -print`をやってみたが、上記サイト通りの出力にはならない。
```
Cannot open display "default display"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/4076a2d7-b48b-813f-e0bc-965201246e84.png)

SSH接続が原因かもしれない(下記参考サイトより)と思って、直接RaspberryPiにキーボードを接続して同様のコマンドを入力してみたが、出力は変わらなかった。
![WIN_20230307_22_14_34_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/032dd568-3c21-68f0-c9a6-b93f2306ae67.jpeg)

http://denki.nara-edu.ac.jp/~yabu/soft/linux2.html

`export Display:=0.0`っていう風にしてるサイトがあった。

https://inokara.hateblo.jp/entry/2013/10/20/225949

RaspiのCUIに直接打つと
```
Cannot open display ":0.0"
```
てなった。
![WIN_20230307_22_16_20_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/f056ead4-cf85-f645-f22e-8395a4d7cfd8.jpeg)

でも今SSH上でやってみたらうまくいった。不思議。でも当時は気付かなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/25dc5415-430d-d9be-4f1a-404e10c495d2.png)

## GUIの起動
displayがどうたらって言ってるからGUIを起動すればいいんじゃないかってなって、以下の手順でGUIを起動する。SSH接続でも操作可能。
なお、GUIは後付けでもインストールできるらしい。一番下にリンクを貼っておく。

```
sudo raspi-config
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/6daae4ba-4294-95f8-ca5a-076628eea9a3.png)

`1 System Options`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/731766ec-e6ea-0fb0-85f2-953ab8c48c27.png)

`S5 Boot / Auto Login`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/37d2aa19-14d6-97a5-d024-16c3ae310baf.png)

`B4 Desktop Autologin`を選択。(AutoLoginである必要はなく、`B3 Desktop`でも良いはず)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/73f7c231-7311-cca9-e25d-22672e7fbdb7.png)

`Exit`等で`raspi-config`状態を出た後、`sudo reboot`で再起動。

ターミナルで`setxkbmap -print`を実行。表示された。
![WIN_20230307_22_55_54_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/24d8d2c9-d458-6f13-d282-e82964eb13c2.jpeg)

## `xkb`を利用してキーマップの書き換え

以下SSH接続した画面。
大事なのは`xkb_symbols`のところ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/6a497805-6508-242f-dd88-4400fc2bcbb4.png)

これらのファイルは`/usr/share/X11/xkb/symbols/`の中にある。
(X11のXは大文字)
これらのファイルは慎重に編集すること。変なコードを書くとOSの起動に失敗したりする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/b637edc5-f993-0c68-233f-71a6c938665f.png)

`pc`という名前のファイルには`Escape`や`Return`(これがEnterに相当する)などの基幹コードが設定されている。
これを書き換えて、Enterが打てなくなったりしたら大変そう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/49c6a57f-9f00-4df1-0246-1780651e70e3.png)

`us`という名前のファイルにはUSキーボードの基幹コード以外の定義がある。
2つの定義が並んでいるが、このうち`1`はそのまま打ったもの、`excalm`は`!`のことで、`Shift`を打ちながら売った場合の定義。
```
key <AE01> {        [         1,    exclam          ]       };
```
これらを書き換えたあと再起動すると、実際に`1`のキーで`Return(Enter)`が打てたりするようになる。
ただし、書き換える時は元々のファイルにあるキーコードを参考にすること。じゃないとOSがクラッシュする可能性がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/34bc3d6e-5679-2412-35bb-dd376d19456f.png)

`inet`には特殊キーの定義が入っている。この中の`evdev`の記述があるところが採用されている。
ちなみに、使用したUSBボリュームコントローラーがどのようなキー入力をしたかはQMK configuratorのテスト機能を使えば分かりやすい。今回のケースでは`AudioVolumeDown`などのようである。
だから、`inet`の赤矢印の部分を変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/3573f3b1-6e0d-c03c-8e2d-917ecf5038a2.png)

https://config.qmk.fm/#/test

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/a4eeb912-6f04-36c0-6d77-3be3c30e4ac5.png)

RaspberryPi上でも、音量を調整している様子が見られる。
![WIN_20230307_23_02_16_Pro.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/ddd1ef44-650e-22b8-815c-4bec24fed374.gif)

いざ`inet`を編集。赤矢印のところが変更を加えたところ。明らかにインデントがずれている。
`Vol-`で`a`、`Vol+`でbが入力されるようにした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/54b53049-85a5-e1f7-5f90-b903133ebaf4.png)

再起動してキーマップの変更を適用する。狙い通り`Vol-`で`a`、`Vol+`でbが入力されるようになった。
これで`read -n 1 input_str`(入力を1キーだけ受け付けるコード)と組み合わせれば、`a`が入力された度に繰り返したい作業などが実行できる。
![WIN_20230307_23_12_17_Pro.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/b7ff8433-9111-0c7d-e27a-580207de271e.gif)


## CLIに戻すと音量キーがなくなる小話

それで入力できるようになったから、CLIに戻してみた。
するとなんとVol+の回転では何も入力されず、Vol-の回転では`~`が入力される。
`inet`を元に戻しても同様だったから、CLIの時は`Vol+`や`Vol-`は存在しないらしい。
![WIN_20230307_22_23_30_Pro.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/8ab4bb84-1135-b6c0-ba56-1a4e18aa47a9.gif)

だからGUIに戻した。


# 参考サイト

GUIのインストール方法 (筆者はなぜかGUIが元々入っていたのでやっていない)

https://tkyonezu.com/iot/raspberry-pi-os-lite%E3%81%AE%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E5%8C%96/

xkbを使うことになったきっかけ

https://www.reddit.com/r/raspberry_pi/comments/rkpavs/is_there_an_autohotkey_alternative_for_raspberry/

xkbの設定で簡単だったサイトたち

https://qiita.com/jabberwocky0139/items/40b28406daa6769a9c4d

https://www.typea.info/blog/index.php/2021/10/29/macbookair2011_install_ubuntu_backslash/

`cannot open display "default display"`に関するサイト

http://denki.nara-edu.ac.jp/~yabu/soft/linux2.html

`export Display:=0.0`っていう風にしてるサイト

https://inokara.hateblo.jp/entry/2013/10/20/225949