もうラズパイのタッチスクリーンでハマりたくない
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台以上タッチスクリーン+ラズパイのデバイスを組んできましたが、これで安定して動作するようになりました。
設定ひとつでラズパイの性能を引き出せたり不安定になったりする面倒くささもラズパイの魅力の一つですね。