以前に報告した 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 のアップデートで突然動かなくなったりしても(よくある)、対応できる。たぶん…。