0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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

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台以上タッチスクリーン+ラズパイのデバイスを組んできましたが、これで安定して動作するようになりました。

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?