Armadilloフォーラム

Qt タッチパネル操作

sankyo_fukuzawa

2023年3月10日 15時56分

お世話になります、福澤と申します。

Armadillo-640からLCD、タッチパネルを制御しようとしています。
LCD、タッチパネルはオプション品以外の製品になり、主な仕様は以下です。

■LCD
 サイズ:7インチ
 解像度:1024x600
 I/F:RGBパラレル

■タッチパネル
 抵抗膜方式

タッチパネルの入力は以下Pinに接続しています。
CON11_37
CON11_36
CON11_35
CON11_34

また、Armadillo-640とLCD、タッチパネルの間には弊社で設計した基板があり、I/Fを変換しています。

上記設定で、Qt5のサンプルプログラム(/usr/lib/arm-linux-gnueabihf/qt5/examples/touch/fingerpaint/fingerpaint)を実行した際、タッチパネルの操作が反応しません。
Qtのサンプルプログラム実行前には以下コマンドを実行してあります。

export QT_QPA_PLATFORM=linuxfb
export QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event0

また、evtest /dev/input/event0を実行してタッチパネル操作を行った場合、コンソールにタッチパネル操作ログが表示されます。

Qtを使用した際にタッチパネルが反応しない現象の原因を教えていただきたいです。

コメント

お世話になります。
福澤と共同で作業しております高田と申します。

本件について補足情報になります。
以下の状況なのですが、タッチパネルが反応しない原因として考えられることがありましたら
ご教示いただけますと幸いです。

■find /dev/inputの実行結果
/dev/input
/dev/input/by-path
/dev/input/by-path/platform-gpio-keys-event
/dev/input/by-path/platform-2040000.tsc-event
/dev/input/event1
/dev/input/event0

■evtest /dev/input/event0実行結果
タッチパネルをタッチすると以下の表示となり、座標は取得できているようです。
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x0 product 0x0 version 0x0
Input device name: "iMX6UL Touchscreen Controller"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 330 (BTN_TOUCH)
Event type 3 (EV_ABS)
Event code 0 (ABS_X)
Value 0
Min 0
Max 4095
Event code 1 (ABS_Y)
Value 0
Min 0
Max 4095
Properties:
Testing ... (interrupt to exit)
Event: time 1678858792.263144, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1678858792.263144, type 3 (EV_ABS), code 0 (ABS_X), value 3305
Event: time 1678858792.263144, type 3 (EV_ABS), code 1 (ABS_Y), value 2483
Event: time 1678858792.263144, -------------- SYN_REPORT ------------
Event: time 1678858792.283167, type 3 (EV_ABS), code 0 (ABS_X), value 3300
Event: time 1678858792.283167, -------------- SYN_REPORT ------------
Event: time 1678858792.303137, type 3 (EV_ABS), code 0 (ABS_X), value 3346
Event: time 1678858792.303137, type 3 (EV_ABS), code 1 (ABS_Y), value 2497

■デバッグ情報出力
試しに以下の環境変数を指定してデバッグ情報を出力してfingerpaintを実行すると以下の表示が出ますが、
タッチパネルに触れてもデバッグ情報が出力されず、画面も変化しない状況です。
export QT_LOGGING_RULES=qt.qpa.input=true

root@armadillo:/usr/lib/arm-linux-gnueabihf/qt5/examples/touch/fingerpaint# ./fi
ngerpaint
qt.qpa.input: libinput: event1 - gpio-keys: is tagged by udev as: Keyboard
qt.qpa.input: libinput: event1 - gpio-keys: device is a keyboard
qt.qpa.input: libinput: event0 - iMX6UL Touchscreen Controller: is tagged by udev as: Touchscreen
qt.qpa.input: libinput: event0 - iMX6UL Touchscreen Controller: device is a touch device
qt.qpa.input: Using xkbcommon for key mapping
qt.qpa.input: evdevtouch: Adding device at "/dev/input/event0"
qt.qpa.input: evdevtouch: Using device /dev/input/event0
qt.qpa.input: evdevtouch: /dev/input/event0: Protocol type B (mtdev) (multi), filtered=no
qt.qpa.input: evdevtouch: /dev/input/event0: min X: 0 max X: 0
qt.qpa.input: evdevtouch: /dev/input/event0: min Y: 0 max Y: 0
qt.qpa.input: evdevtouch: /dev/input/event0: min pressure: 0 max pressure: 0
qt.qpa.input: evdevtouch: /dev/input/event0: device name: iMX6UL Touchscreen Controller
qt.qpa.input: evdevtouch: Updating QInputDeviceManager device count: 1 touch devices, 0 pending handler(s)

よろしくお願いいたします。

アットマークテクノの古賀です。

高田さん:
>本件について補足情報になります。
>以下の状況なのですが、タッチパネルが反応しない原因として考えられることがありましたら
>ご教示いただけますと幸いです。

evtest は反応していますので、タッチパネルドライバは問題なく、Qt 側に要因のある可能性が高いですね。

福澤さん(2023年3月10日 15時56分):
>LCD、タッチパネルはオプション品以外の製品になり、主な仕様は以下です。

>■タッチパネル
> 抵抗膜方式

抵抗膜方式のタッチパネルということですから、Armadillo-640 用「LCD オプションセット」のタッチパネルとは違い、静電容量式ではなく感圧式ですね。
とすると、Qt が tslib も使うようにする必要があるのかも知れません。Qt のドキュメントの、こちらをご覧ください:
 https://doc.qt.io/qt-5/inputs-linux-device.html#touch

以上、もし参考になりましたら幸いです。

高田です。
ご返信ありがとうございます。

>抵抗膜方式のタッチパネルということですから、Armadillo-640 用「LCD オプションセット」のタッチパネルとは違い、静電容量式ではなく感圧式ですね。
はい、ご認識のとおりです。
ご連絡いただいたサイトは確認しており、以下を実行したうえでfingerpaintを試してみましたが、やはりタッチパネルは反応がありませんでした。
export QT_QPA_FB_TSLIB=1
export TSLIB_TSDEVICE=/dev/input/event0

Armadillo640にtslibを追加する必要があるでしょうか。
apt-getで追加してみようとしましたが、"Unable to locate package tslib"となってしまいインストールすことができません。
また、以下の記事も拝見しましたが、Armadillo640にも適用できるのか判断ができず。
https://armadillo.atmark-techno.com/blog/750/737

お手数ですがご確認いただけますと幸いです。
よろしくお願いいたします。

アットマークテクノの古賀です。

高田さん:
>>抵抗膜方式のタッチパネルということですから、Armadillo-640 用「LCD オプションセット」のタッチパネルとは違い、静電容量式ではなく感圧式ですね。
>はい、ご認識のとおりです。
>ご連絡いただいたサイトは確認しており、以下を実行したうえでfingerpaintを試してみましたが、やはりタッチパネルは反応がありませんでした。
>export QT_QPA_FB_TSLIB=1
>export TSLIB_TSDEVICE=/dev/input/event0
>
>Armadillo640にtslibを追加する必要があるでしょうか。
>apt-getで追加してみようとしましたが、"Unable to locate package tslib"となってしまいインストールすことができません。

指定するパッケージ名を、tslib ではなく libts-bin または libts0 にした場合は、どうなるでしょうか?
 https://packages.debian.org/buster/libts-bin
 https://packages.debian.org/buster/libts0
 https://packages.debian.org/search?arch=armhf&searchon=sourcenames&keyw…

高田です。

ご返信ありがとうございます。

> 指定するパッケージ名を、tslib ではなく libts-bin または libts0 にした場合は、どうなるでしょうか?
ご教示いただいたパッケージ名を指定したところ、インストールできました。
以下の環境変数を指定してts_calibrateを実行したところ、キャリブレーション画面が表示されタッチパネルも反応しました。
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0
export QT_QPA_FB_NO_LIBINPUT=0
export QT_QPA_PLATFORM=linuxfb
export QT_QPA_FB_TSLIB=1
export TSLIB_TSDEVICE=/dev/input/event0

また、ts_testでもタッチパネルに触れると軌跡が表示されることを確認しております。
しかし、上記環境変数を指定してfingerpaintを実行しても、やはりタッチパネルは反応しないようです。
Qtアプリがうまく認識していと思われますが、タッチパネルを紐づける方法がわかりません。

よろしくお願いいたします。

アットマークテクノの古賀です。

高田さん:
>>指定するパッケージ名を、tslib ではなく libts-bin または libts0 にした場合は、どうなるでしょうか?
>ご教示いただいたパッケージ名を指定したところ、インストールできました。
>以下の環境変数を指定してts_calibrateを実行したところ、キャリブレーション画面が表示されタッチパネルも反応しました。
>export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0
>export QT_QPA_FB_NO_LIBINPUT=0
>export QT_QPA_PLATFORM=linuxfb
>export QT_QPA_FB_TSLIB=1
>export TSLIB_TSDEVICE=/dev/input/event0
>
>また、ts_testでもタッチパネルに触れると軌跡が表示されることを確認しております。

tslib の動作は問題ないということですね。

>しかし、上記環境変数を指定してfingerpaintを実行しても、やはりタッチパネルは反応しないようです。
>Qtアプリがうまく認識していと思われますが、タッチパネルを紐づける方法がわかりません。

アプリケーションを実行する際のコマンド引数に、
 -plugin tslib:/dev/input/event0
を追加すると、どうなるでしょうか?
 https://doc.qt.io/qt-5/qguiapplication.html#supported-command-line-opti…

高田です。

> アプリケーションを実行する際のコマンド引数に、
>  -plugin tslib:/dev/input/event0
> を追加すると、どうなるでしょうか?

上記引数を指定して実行したところ、以下のメッセージが表示され、タッチパネルは反応しませんでした。
No such plugin for spec "tslib:/dev/input/event0"

このメッセージでWeb検索するといくつかヒットしますが、すみません、解決策がわからず。

よろしくお願いいたします。

アットマークテクノの古賀です。

高田さん:
>>アプリケーションを実行する際のコマンド引数に、
>> -plugin tslib:/dev/input/event0
>>を追加すると、どうなるでしょうか?
>
>上記引数を指定して実行したところ、以下のメッセージが表示され、タッチパネルは反応しませんでした。
>No such plugin for spec "tslib:/dev/input/event0"

了解しました。

高田さん(2023年3月16日 23時50分):
>以下の環境変数を指定してts_calibrateを実行したところ、キャリブレーション画面が表示されタッチパネルも反応しました。
>export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0
>export QT_QPA_FB_NO_LIBINPUT=0
>export QT_QPA_PLATFORM=linuxfb
>export QT_QPA_FB_TSLIB=1
>export TSLIB_TSDEVICE=/dev/input/event0
>
>また、ts_testでもタッチパネルに触れると軌跡が表示されることを確認しております。
>しかし、上記環境変数を指定してfingerpaintを実行しても、やはりタッチパネルは反応しないようです。

export QT_QPA_FB_NO_LIBINPUT=0

ですが、Qt のドキュメントを見ると、0 ではなく 1 を指定するのが正しいような気がします:
 https://doc.qt.io/Boot2Qt-5.15/qtee-customization.html

ただし、このページに以下の注意書きがあります:

Note: The tslib plugin provides no multitouch events (QTouchEvent). It only generates mouse events (QMouseEvent).

fingerpaint のソースを見ると、QEvent::type() の値が QEvent::Touchxx のイベント、つまり QTouchEvent に対してのみ有意な応答動作を行う実装になっています:
 https://github.com/mburakov/qt5/blob/master/qtbase/examples/touch/finge…
ですので、もしかするとタッチスクリーン操作により QMouseEvent の生成は行われているものの、それに fingerpaint アプリケーションが応答していない、という状況なのかも知れません。

高田です。

環境変数に以下を与えて自作アプリ(画面にボタンだけを配置したもの)を実行してみました。
(ts_calibrateでキャリブレーション後に自作アプリを実行)

export QT_QPA_FB_NO_LIBINPUT=1
export QT_QPA_PLATFORM=linuxfb
export QT_QPA_FB_TSLIB=1
export TSLIB_TSDEVICE=/dev/input/event0
export QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0
export QT_LOGGING_RULES=qt.qpa.input=true

結果、以下の挙動となりました。
1、マウスカーソルが表示され、タッチしたまま指を動かすとX軸方向にはカーソルが追従するが、Y軸方向は上下が反転する
2、画面から指を離して別の位置をタッチすると、カーソルはタッチ位置に移動しない
3、画面をタップしてもボタンが反応しない(イベントが発生していない?)

> export QT_QPA_FB_NO_LIBINPUT=0
> ですが、Qt のドキュメントを見ると、0 ではなく 1 を指定するのが正しいような気がします:
ご指摘いただいたように、QT_QPA_FB_NO_LIBINPUT=1が正しいようです。

参考に、サンプルプログラム実行時のログは以下になります。
/dev/input/event0(タッチスクリーン)はマウスとして認識しているように見受けられますが、上記挙動になる理由がわかりません。

qt.qpa.input: evdevkeyboard: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Keyboard)
qt.qpa.input: Found matching devices ("/dev/input/event1")
qt.qpa.input: Adding keyboard at "/dev/input/event1"
qt.qpa.input: Try to create keyboard handler for "/dev/input/event1" ""
qt.qpa.input: Opening keyboard at "/dev/input/event1"
qt.qpa.input: Create keyboard handler with for device "/dev/input/event1"
qt.qpa.input: Unload current keymap and restore built-in
qt.qpa.input: numlock=0 , capslock=0, scrolllock=0
qt.qpa.input: Adding mouse at "/dev/input/event0"
qt.qpa.input: create mouse handler for "/dev/input/event0" ""
qt.qpa.input: evdevtouch: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Touchpad|Device_Touchscreen)
qt.qpa.input: Found matching devices ("/dev/input/event0")
qt.qpa.input: evdevtouch: Adding device at "/dev/input/event0"
qt.qpa.input: evdevtouch: Using device /dev/input/event0
qt.qpa.input: evdevtouch: /dev/input/event0: Protocol type B (mtdev) (multi), filtered=no
qt.qpa.input: evdevtouch: /dev/input/event0: min X: 0 max X: 0
qt.qpa.input: evdevtouch: /dev/input/event0: min Y: 0 max Y: 0
qt.qpa.input: evdevtouch: /dev/input/event0: min pressure: 0 max pressure: 0
qt.qpa.input: evdevtouch: /dev/input/event0: device name: iMX6UL Touchscreen Controller
qt.qpa.input: evdevtouch: Updating QInputDeviceManager device count: 1  touch devices, 0 pending handler(s)

よろしくお願いいたします。

アットマークテクノの古賀です。

高田さん:
>環境変数に以下を与えて自作アプリ(画面にボタンだけを配置したもの)を実行してみました。
>(ts_calibrateでキャリブレーション後に自作アプリを実行)

export QT_QPA_FB_NO_LIBINPUT=1
export QT_QPA_PLATFORM=linuxfb
export QT_QPA_FB_TSLIB=1
export TSLIB_TSDEVICE=/dev/input/event0
export QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0
export QT_LOGGING_RULES=qt.qpa.input=true

>
>結果、以下の挙動となりました。
>1、マウスカーソルが表示され、タッチしたまま指を動かすとX軸方向にはカーソルが追従するが、Y軸方向は上下が反転する
>2、画面から指を離して別の位置をタッチすると、カーソルはタッチ位置に移動しない
>3、画面をタップしてもボタンが反応しない(イベントが発生していない?)

1 について、Qt5 のソースを眺めた感じでは、QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS に inverty を渡すと解決するかも知れません:
 https://github.com/qt/qtbase/blob/1c6bf3e09ea9722717caedcfcceaaf3d60761…

2 と 3 については、ログの中の

qt.qpa.input: evdevtouch: /dev/input/event0: Protocol type B (mtdev) (multi), filtered=no

という行を見ると、マルチタッチデバイスとして認識してしまっているのが原因のようです:
 https://github.com/qt/qtbase/blob/1c6bf3e09ea9722717caedcfcceaaf3d60761…

これを防ぐには、Qt5 をビルドする際のコンフィグレーションで mtdev を無効にする必要がありそうです:
 https://github.com/qt/qtbase/blob/1c6bf3e09ea9722717caedcfcceaaf3d60761…

以上、もし参考になりましたら幸いです。

高田です。

> >1、マウスカーソルが表示され、タッチしたまま指を動かすとX軸方向にはカーソルが追従するが、Y軸方向は上下が反転する
> 1 について、Qt5 のソースを眺めた感じでは、QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS に inverty を渡すと解決するかも知れません:
上記を試してみたのですが、症状は変わりませんでした。

> 2 と 3 については、ログの中の

> qt.qpa.input: evdevtouch: /dev/input/event0: Protocol type B (mtdev) (multi), filtered=no

> という行を見ると、マルチタッチデバイスとして認識してしまっているのが原因のようです:
>  https://github.com/qt/qtbase/blob/1c6bf3e09ea9722717caedcfcceaaf3d60761…
>
> これを防ぐには、Qt5 をビルドする際のコンフィグレーションで mtdev を無効にする必要がありそうです:
>  https://github.com/qt/qtbase/blob/1c6bf3e09ea9722717caedcfcceaaf3d60761…
>

Qt自体のビルドが必要ということですね。
ビルド手順の知識がなく、手順もしくは参考になる情報をご教示いただけないでしょうか。
以下の記事のイメージになりますか。
https://armadillo.atmark-techno.com/forum/armadillo/2137

お手数おかけしますが、よろしくお願いいたします。

アットマークテクノの古賀です。

高田さん:
>>という行を見ると、マルチタッチデバイスとして認識してしまっているのが原因のようです:
>> https://github.com/qt/qtbase/blob/1c6bf3e09ea9722717caedcfcceaaf3d60761…
>>
>>これを防ぐには、Qt5 をビルドする際のコンフィグレーションで mtdev を無効にする必要がありそうです:
>> https://github.com/qt/qtbase/blob/1c6bf3e09ea9722717caedcfcceaaf3d60761…
>>
>
>Qt自体のビルドが必要ということですね。
>ビルド手順の知識がなく、手順もしくは参考になる情報をご教示いただけないでしょうか。
>以下の記事のイメージになりますか。
>https://armadillo.atmark-techno.com/forum/armadillo/2137

Qt の GitHub ページにある README にビルド手順が載っていますので、こちらを試してみてください:
 https://github.com/qt/qt5/tree/5.15