2017年12月13日水曜日

Raspberry PiのGPIOが引き出せる小型タッチスクリーンが届いたので電子工作に使ってみた

0. はじめに

(2022/4/14動作確認済)
2017年12月10日頃、Raspberry Pi用の小型タッチスクリーンでGPIOを引き出せるものが、amazonでセールされているというので話題になっていました。こちらです。
セール中は2656円でしたが、通常時でも十分安いですね。

この手の小型液晶はGPIOが塞がれてしまうものが多いのですが、それが利用可能なものは珍しいと思い、入手して利用してみました。

利用イメージはこちらです。ターミナルソフトウェアのLXTerminalが映った画面がこのタッチスクリーンです。そこから下方向に横向きにGPIOのピンが出ており、電子工作などに利用可能になっています。


以下、利用時におこなった設定などをメモしていきます。

1. まずは起動してみる

2017/11/29にリリースされたNOOBS 2.4.5でRaspbianをインストール済のRaspberry Pi 3が手元にあったので、そのままタッチスクリーンを差して起動してみたのが次の写真です。

特に何の設定もすることなく画面が映りました。画面の解像度は1280x720でした。さすがにこの解像度では文字が小さすぎて全く読めず、解像度を変更する必要があります。また、この状態ではタッチには反応しません。

以下でそれらの設定を行っていきます。

2. 設定

設定方法は付属のDVDのドキュメントに書いてあります。DVDにある圧縮ファイル Driver/LCD-show.tar.gz を展開すると LCD-show というディレクトリが現れるのですが、その中のスクリプトファイル MPI3508_480_320-show を管理者権限で実行すると設定が完了するようです。

しかし、/boot/config.txtなどのファイルを丸ごと差し替えられるのが嫌なので、 MPI3508_480_320-show の中身を見ながら必要な設定を行っていくことにしました。

まず、/boot/config.txt に設定を記します。例えば、下記のように管理者権限のテキストエディタで/boot/config.txt を開きます。テキストエディタはviなどお好みのものをどうぞ。
sudo leafpad /boot/config.txt
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
sudo mousepad /boot/config.txt
開いたファイル末尾に下記の内容を追記し、保存してからファイルを閉じます。
hdmi_drive=2
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=87
#hdmi_cvt 480 320 60 6 0 0 0
#hdmi_cvt 800 480 60 6 0 0 0
hdmi_cvt 800 600 60 6 0 0 0

dtparam=spi=on
dtoverlay=ads7846,cs=1,penirq=25,penirq_pull=2,speed=50000,keep_vref_on=0,swapxy=0,pmax=255,xohms=150,xmin=200,xmax=3900,ymin=200,ymax=3900
最後の2行がタッチの設定を行っており、それ以外は解像度の設定です。800x600のみを有効にしています。実用に耐える解像度は800x480か800x600ではないでしょうか。

なお、2022年に久しぶりに最新の Raspberry Pi OS Bullseye で設定を試してみたところ、上記内容の追加だけでは駄目で、「左上のメニューボタン」→「設定」→「Screen Configuration」を起動し、 そこから「Configure」→「Screens」→「HDMI-1」→「解像度」→「800x600」を選択する必要がありました。「解像度」にはデフォルトで利用可能な解像度に、 /boot/config.txt で有効にした解像度が追加されて現れるようです。

このとき、/boot/config.txt の解像度を(例えば800x600から800x480に)後から変更する場合、GUI アプリでデフォルトで利用可能な解像度(例えば1024x768 など)に一旦変更しておかないと、画面表示できなくなりますので注意しましょう。

さて、このままではタッチの位置が上下逆転してしまうので、キャリブレーションによりタッチの位置を正しく反映するようにします。

次に、まず、下記のコマンドを実行し、/etc/X11/xorg.conf.d/99-calibration.conf を管理者権限で開きます。テキストエディタはお好みで。
sudo mkdir -p /etc/X11/xorg.conf.d
sudo leafpad /etc/X11/xorg.conf.d/99-calibration.conf
空のファイルが開きますので、下記の内容を記して保存し、ファイルを閉じます。
Section "InputClass"
        Identifier      "calibration"
        MatchProduct    "ADS7846 Touchscreen"
        Option  "Calibration"   "3936 227 268 3880"
        Option  "SwapAxes"      "1"
        Option  "InvertY"      "1"
EndSection
この内容は、LCD-show/usr/99-calibration.conf-3508 を元にした内容です。

なお、上の設定にある「Option "InvertY" "1"」という行は、
2018年3月にリリースされた NOOBS 2.7.0 (Raspbian 2018-03-13) 以降で
横方向の軸の向きを正しくするための設定です。
後で動作確認する際、上記の設定で「横方向の向きが正しくない」という方は「Option "InvertY" "1"」の行を削除して保存し、Raspberry Piを再起動してください。

さて次に、以下のコマンドで xserver-xorg-input-evdev をインストールします。
sudo apt update
sudo apt install xserver-xorg-input-evdev
最後に、下記のコマンドを実行します。設定ファイルの優先順位を変更しているようです。
sudo cp -rf /usr/share/X11/xorg.conf.d/10-evdev.conf /usr/share/X11/xorg.conf.d/45-evdev.conf
以上で再起動すると、/boot/config.txtで設定した解像度で、冒頭の写真のような画面の向きでタッチが効くようになっていると思います。

この解像度でもターミナルの文字を読むのはやや厳しいので、私の場合LXTerminalのメニューの「編集」→「設定」から、フォントサイズを14、ウインドウサイズを70x16(解像度800x480の場合)または70x22(解像度800x600の場合)に変更しました。この設定もお好みで。
LXTerminalの設定画面で「OK」ボタンが画面外にあるので苦労しますが、キーボードのTABキーで選択肢のフォーカスを画面範囲内の最下部のものに移動し、そこから「TABキー二回押してからEnter」で「OK」ボタンを押したことになります(この表現で伝わるか不安ですが)。

3. 画面タッチのキャリブレーションについて

以上で画面タッチによる操作が可能になったと思いますが、タッチ位置と画面上のカーソルの位置の微妙なずれが気になる方がいるかもしれません。その場合、xinput_calibrator というソフトウェアでキャリブレーションを行うと良いでしょう。まず、以下のコマンドで xinput_calibrator をインストールします。
sudo apt update
sudo apt install xinput-calibrator
インストールが終わったら下記のように xinput_calibrator を起動します。
xinput_calibrator
画面を4か所タッチするよう指示がありますので、指示通りペンでタッチします。すると、キャリブレーション結果が表示されますので、それを参考に /etc/X11/xorg.conf.d/99-calibration.conf を編集し、再起動すればよいのです。 私の場合、下記の3行を
        Option  "Calibration"   "3936 227 268 3880"
        Option  "SwapAxes"      "1"
        Option  "InvertY"      "1"
下記の2行に置き換えることになりました。
        Option  "Calibration"   "3948 236 3823 328"
        Option  "SwapAxes"      "1"
気になる方は色々試してみてください。

4. GPIOについて

GPIOはそのまま使えますが、下図のSPI関係のピンとGPIO 25はタッチスクリーンで使用済であるようなので使わないようにしましょう。


5. 終わりに

この手の小型タッチディスプレイは沢山出ていますが、GPIOが利用可能なものは貴重ですね。設定もそれほど難しくありませんし、3000円前後なら十分試す価値はあるのではないでしょうか。



「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。