「ラズパイの液晶タッチパネルを使う」の続き。自前でキャリブレーションのプログラムを書いていたのだが、tslib
を使えばいいじゃない、と今さらながら気がついた。ということで、再トライしてみた。液晶は前と同じで、Waveshare 3.2inch RPi LCD (B), 320×240。
まず、tslib
のインストール。
pi@raspberrypi:~ $ sudo apt-get install evtest tslib libts-bin
evtest
でデバイス番号を確認。/dev/input/event0
だった。
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
Select the device event number [0-0]: 0
ts_calibrate
でキャリブレート。+印が5箇所に順に表示されるので、スタイラスでタッチする。
pi@raspberrypi:~ $ sudo TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/event0 ts_calibrate
ts_test
でテスト。やっぱりX方向はノイジーで、ときどきポインタが飛んでしまう。
pi@raspberrypi:~ $ sudo TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/event0 ts_test
C で使おうとすると、もう一手間かかる。tslib
のライブラリは /usr/lib/arm-linux-gnueabihf/libts-0.0.so.0
なのだが、これをフルパスで指定する必要があるみたい。また、tslib.h
がどこにもインストールされていないので、必要な宣言をソースに埋め込む。
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
struct tsdev;
struct ts_sample {
int x, y;
unsigned int pressure;
struct timeval tv;
};
extern struct tsdev *ts_open(const char *dev_name, int nonblock);
extern int ts_config(struct tsdev *);
extern int ts_read(struct tsdev *, struct ts_sample *, int);
extern int ts_close(struct tsdev *);
int main(int argc, const char **argv)
{
struct tsdev *ts;
ts = ts_open("/dev/input/event0", 1);
if (ts == NULL) {
printf("Failed to open /dev/input/event0.\n");
exit(1);
}
if (ts_config(ts) != 0) {
printf("Failed to configure touchscreen.\n");
exit(1);
}
while (1) {
struct ts_sample samp;
if (ts_read(ts, &samp, 1) == 1) {
printf("%d %d %d\n", samp.x, samp.y, samp.pressure);
}
}
return 0;
}
コンパイルして実行してみた。
pi@raspberrypi:~ pi@raspberrypi:~$ gcc -o tstest tstest.c /usr/lib/arm-linux-gnueabihf/libts-0.0.so.0
pi@raspberrypi:~$ ./tstest
133 180 65063
132 180 65104
131 180 65116
132 180 65114
135 186 0
^C
pi@raspberrypi:~$
ここまで来れば簡単に使えるのだが、道のりが妙に長いな。Raspbian のパッケージで tslib
をもう少しちゃんとサポートしてくれたら、楽に使えるんだけどな。
タグ:Raspberry Pi