2017年09月04日

ラズパイ用 3.5 インチ HDMI ディスプレイ:タッチパネルを使う

 以前に報告した HDMI 接続の 3.5 インチディスプレイ。タッチスクリーンを使いたくなったので、調べてみました。

 まず、/boot/config.txt に次の一行を書き加える。

dtoverlay=ads7846,cs=0,penirq=25,penirq_pull=2,speed=10000,keep_vref_on=0,swapxy=0,pmax=255,xohms=150,xmin=199,xmax=3999,ymin=199,ymax=3999

 リブートすると、タッチスクリーンが認識される。最近の Raspbian には最初からドライバが入ってるんですね。ただし、キャリブレーションはされていないので、位置はめちゃくちゃ。

 コンソールモードでは、ちょっと前に試した tslib を使うやり方でキャリブレーションできる。HDMI ディスプレイなので、TSLIB_FBDEVICE=/dev/fb0 であることに注意。

pi@raspberrypi:~ $ evtest
No device specified, trying to scan all of /dev/input/event*
Not running as root, no devices may be available.
Available devices:
/dev/input/event0:	ADS7846 Touchscreen
/dev/input/event1:	vnc-keyboard
/dev/input/event2:	vnc-abspointer
/dev/input/event3:	vnc-relpointer
Select the device event number [0-3]: ^C
pi@raspberrypi:~ $ sudo TSLIB_FBDEVICE=/dev/fb0 TSLIB_TSDEVICE=/dev/input/event0 ts_calibrate
xres = 800, yres = 480
Took 10 samples...
Top left : X = 3476 Y =  354
Took 8 samples...
Top right : X = 3523 Y = 3722
Took 10 samples...
Bot right : X =  502 Y = 3713
Took 11 samples...
Bot left : X =  514 Y =  381
Took 6 samples...
Center : X = 2011 Y = 2029
-27.441528 0.000618 0.208943
493.320007 -0.127012 0.000669
Calibration constants: -1798408 40 13693 32330220 -8323 43 65536 

 今回は X Window も使いたいので、そちらのキャリブレーションも必要。これは苦戦した。Web に出ている情報通りにやってもうまくいかない。結局、以下の方法に落ち着いた。まず、次のものをインストール。

pi@raspberrypi:~ $ sudo apt-get install xinput xinput-calibrator xserver-xorg-input-evdev

 次に、/usr/share/X11/xorg.conf.d に移動して、次のコマンドを実行。これは、libinput.conf よりも evdev.conf を後に読ませるため。

pi@raspberrypi:~ $ cd /usr/share/X11/xorg.conf.d
pi@raspberrypi:~ $ sudo mv 10-evdev.conf 45-evdev.conf

 さらに、同じディレクトリ中で、sudo nano 99-calibration.conf として、次の内容を入れておく。Option "Calibration" の行の数字は、ts_calibrate の時に画面に表示される X, Y の値を使う。

Section "InputClass"
    Identifier    "calibration"
    MatchProduct    "ADS7846 Touchscreen"
    Option    "Calibration" "502 3523 3720 354"
    Option    "SwapAxes"  "1"
EndSection

 念のため、デバイス番号を確認。これは ssh 経由ではなくて、X Window 上でターミナルを開いて実行すること。

pi@raspberrypi:~ $ DISPLAY=:0.0 xinput_calibrator --list
Device "ADS7846 Touchscreen" id=6
Device "vnc-abspointer" id=8

VNC 経由でアクセスしているため、vnc-abspointer が見えています。こちらをキャリブレーションしないように。

 デバイス番号は "6" だったので、これを指定してキャリブレーション。

pi@raspberrypi:~ $ DISPLAY=:0.0 xinput_calibrator --device 6
Calibrating EVDEV driver for "ADS7846 Touchscreen" id=6
    current calibration values (from XInput): min_x=502, max_x=3523 and min_y=3720, max_y=354

Doing dynamic recalibration:
    Setting calibration data: 98, 3952, 3885, 111
    --> Making the calibration permanent <--
  copy the snippet below into '/etc/X11/xorg.conf.d/99-calibration.conf' (/usr/share/X11/xorg.conf.d/ in some distro's)
Section "InputClass"
    Identifier    "calibration"
    MatchProduct    "ADS7846 Touchscreen"
    Option    "Calibration" "98 3952 3885 111"
    Option    "SwapAxes"  "1"
EndSection

 上に表示されている Option "Calibration" の値を使って、/usr/share/X11/xorg.conf.d/99-calibration.conf を書き直す。


pi@raspberrypi:~ $ sudo nano /usr/share/X11/xorg.conf.d/99-calibration.conf
...
    Option    "Calibration" "98 3952 3885 111"
...

 リブートすると、タッチパネルが X Window で使えるようになる。めっちゃ大変だったけど、これを一度経験しておくと、OS のアップデートで突然動かなくなったりしても(よくある)、対応できる。たぶん…。

タグ:Raspberry Pi
posted by toshinagata at 00:17| 日記