Raspberry Pi 4でタッチスクリーン(タッチパネル)モニターの回転や座標変換、安定した接続・設定方法

## もうラズパイのタッチスクリーンでハマりたくない

Raspberry Pi 4でタッチスクリーンを使っていて画面を回転させたいときに結構ハマっていたのを解決できたのでメモします。

## OSのバージョン

ラズパイあるあるですが、OSのバージョンで挙動がかなり異なります。
私の場合、タッチスクリーンであることが前提のシステムを組んでいるので少し古いですがこちらのバージョンを使っています。

Raspberry Pi OS(Legacy) 2023-05-03
32bitの方が安定している気がします。

## /boot/config.txtの設定

```
sudo vi /boot/config.txt
```

```
# 画面の回転
display_hdmi_rotate=3

# ラズパイのGPU性能に関わってくる
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=82
hdmi_drive=2
dtoverlay=vc4-kms-v3d
```

dtoverlay=vc4-kms-v3d をコメントアウトしましょう、という意見も見つかりますが、Chromiumなどのパフォーマンスが著しく低下する場合があります。

## タッチパネルモジュールの有効化

### hid-multitouchというモジュールを読み込ませる

これが最も重要です。
タッチスクリーン、タッチパネルにUSBで接続する場合、hid-multitouchモジュールが読み込まれず、タッチしてもマウスの座標操作のみになってしまうなど、期待した動作になりません。

タッチスクリーンを接続した状態で起動すると反応が悪いが、起動後にタッチスクリーンのUSBを再度抜き差しすると正常に動作する、といった時はこの設定で治ることが多いです。

また、/boot/config.txtでdisplay_hdmi_rotate=3で回転をしておけば画面回転時の座標の設定も不要になります。
とはいえタッチスクリーンのデバイスによるとは思うので完璧に動作するかは不明です。

```
sudo vi /etc/modules
```
に↓を追記する
```
hid-multitouch
```

## タッチ座標の回転

これはhid-multitouchモジュールが読み込まれていれば不要な場合が多いですが、念のためhid-multitouchが読み込まれてない場合の座標回転するときの設定です。

私の場合、TSTP MTouchというモニターを使っていたのでシェルでデバイスIDを特定しています。
ポインターデバイスなのでpointer:TSTP MTouchとなります。
このあたりのシェルを組むときはChatGPTが非常に優秀です。

```
sudo vi ~/.config/autostart/browser.sh
```

```
#!/bin/sh

# 重要です
export DISPLAY=:0

# ポインターデバイスの場合
TOUCHSCREEN_DEVICE_NAME="pointer:TSTP MTouch"

# デバイスIDを取得
DEVICE_ID=$(xinput list --id-only "$TOUCHSCREEN_DEVICE_NAME" 2>/dev/null)

# デバイスIDが取得できた場合のみプロパティを設定
if [ -n "$DEVICE_ID" ]; then
    xinput set-prop $DEVICE_ID 'Coordinate Transformation Matrix' 0 -1 1 1 0 0 0 0 1 2>/dev/null
fi
```


実行権限
```
chmod 766 ~/.config/autostart/browser.sh
```

自動起動設定

```
cat <<EOF > ~/.config/autostart/browser.desktop
[Desktop Entry]
Type=Application
Name=BrowserAutoStart
Comment=POS
Exec=lxterminal -e ~/.config/autostart/browser.sh
Terminal=true
EOF

```

Xでの設定

```
$ sudo vi /usr/share/X11/xorg.conf.d/40-libinput.conf
```

Option "TransformationMatrix" "0 -1 1 1 0 0 0 0 1"
をタッチ系のセクションに設定します。ちなみに270度回転のパラメータです。

```
Section "InputClass"
        Identifier "libinput pointer catchall"
        MatchIsPointer "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
EndSection

Section "InputClass"
        Identifier "libinput keyboard catchall"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
EndSection

Section "InputClass"
        Identifier "libinput touchpad catchall"
        MatchIsTouchpad "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
        Option "TransformationMatrix" "0 -1 1 1 0 0 0 0 1"
EndSection

Section "InputClass"
        Identifier "libinput touchscreen catchall"
        MatchIsTouchscreen "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
        Option "TransformationMatrix" "0 -1 1 1 0 0 0 0 1"
EndSection

Section "InputClass"
        Identifier "libinput tablet catchall"
        MatchIsTablet "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
        Option "TransformationMatrix" "0 -1 1 1 0 0 0 0 1"
EndSection
```

## 再起動

```
sudo reboot
```

以上です。
10台以上タッチスクリーン＋ラズパイのデバイスを組んできましたが、これで安定して動作するようになりました。

設定ひとつでラズパイの性能を引き出せたり不安定になったりする面倒くささもラズパイの魅力の一つですね。