Raspberry Pi2 + Volumioに3.5インチ液晶をつないでみた

前回の続きでRaspberry Pi2 とラズパイ・オーディオのOSに3.5インチ液晶をつけてみた
f:id:yukimi0721:20171028004017j:plain
yukimi0721.hatenablog.com

液晶いろいろあるよ

ラズパイには色々液晶があるが接続方式としてDSIHDMI、SPIがある
DSIは純正の7インチ液晶とかがDSI接続です。
純正はよさげなケースもあるが一万円と高いので却下。
SPIは表示がもっさりだし設定めんどくさそうなので却下 。
HDMIであればケーブルつなげるだけで表示されそうなので楽そう。

といういことでAmazonで3250円のKuman(クマン?)の液晶を買ってみたが、思いのほか苦労したので何をしたか色々書いておきます。
www.kumantech.com

今回買ったやつ
Kuman 3.5インチ HDMI ディスプレイ タッチスクリーン LCDモニター SC6AC

純正はお高い

GPIOを分岐してるやつを見つけてしまったこれ買えばよかった

開封と接続

今回はケース付を買ってみた
f:id:yukimi0721:20171029220523j:plain
f:id:yukimi0721:20171029221308j:plain
f:id:yukimi0721:20171029221332j:plain

2枚のアクリルで本体をサンドイッチする構造とシンプルだが無いよりはマシである。
そもそも液晶とラズパイが一体になるケースって種類が少ない。
液晶も付けれてI2SのDACが付けれるような大きめのケース作れば売れるのではと思う。
f:id:yukimi0721:20171029221321j:plain
f:id:yukimi0721:20171029221245j:plain
液晶にはKumanと書いてある。どこかのメーカ液晶のパクリなのだろうか
インストールマニュアルにMPI3508の文字があるのでそれと同じなのだろうか
接続はラズパイのボードに挿してHDMIの小さいコの字コネクタで接続するだけで完了

f:id:yukimi0721:20171029221341j:plain
f:id:yukimi0721:20171029221350j:plain


液晶にはボタンがひとつだけあって、押すと画面の明るさが変わる。
長押しで消灯。

なおHDMIがノーシグナルのとき放置すると消灯するような機能はないようだ。
これがあればもっとよかったのだが。

電源投入すると画面が表示されたがこのままでは解像度が大きすぎる。
またタッチパネルをタッチしてもカーソルの位置がおかしい。
具体的には大文字アルファベットの箇所をタッチすると小文字の場所にカーソルが移動します

⎡ C  B  A ⎤   ⎡ g  d  a ⎤ 
⎜ F  E  D ⎥   ⎜ h  e  b ⎥ 
⎣ I  H  G ⎦   ⎣ i  f  c ⎦ 

設定

解像度の変更

/boot/config.txt の設定ファイルに追記
なおBOOTエリアはFATなのでSDをカードリーダーで読んでWindows上からでも編集できる

sudo nano /boot/config.txt

下記をまるごと追記して選択したい解像度の#hdmi_cvtのコメントを外す
下記は810x540になってる

# Uncomment some or all of these to enable the optional hardware interfaces
dtparam=spi=on
enable_uart=1

hdmi_drive=2
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=87

# HDMI Setting
#hdmi_cvt 480 320 60 6 0 0 0 #480x320
#hdmi_cvt 600 400 60 6 0 0 0 #600x400
#hdmi_cvt 720 480 60 6 0 0 0 #720x480
hdmi_cvt 810 540 60 6 0 0 0 #810x540
#hdmi_cvt 960 640 60 6 0 0 0 #960x640

# Touch Panel Setting
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

タッチパネル座標補正

補正するには結果としては40-libinput.confに
TransformationMatrix形式で記入すると正しく表示された。

sudo nano /usr/share/X11/xorg.conf.d/40-libinput.conf

下記の2行をSection内に追加(libinput touchscreen catchall)

#SwapX,Y and inverting X,Y
Option "TransformationMatrix" "0 -1 1 -1 0 1 0 0 1"

追加後の内容

# Match on all types of devices but tablet devices and joysticks
Section "InputClass"
        Identifier "libinput pointer catchall"
        MatchIsPointer "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
EndSection

Section "InputClass"
        Identifier "libinput keyboard catchall"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
EndSection

Section "InputClass"
        Identifier "libinput touchpad catchall"
        MatchIsTouchpad "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
EndSection

Section "InputClass"
        Identifier "libinput touchscreen catchall"
        MatchIsTouchscreen "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"

        #SwapX,Y and inverting X,Y
        Option "TransformationMatrix" "0 -1 1 -1 0 1 0 0 1"

EndSection


なおここまで来るのに色々苦労したので失敗した方法もメモとして残しておく

失敗したこと色々

ドライバのインストール

MPI3508でぐぐってドライバインストール方法を探す

github.com

下記のコマンドを入れて再起動するとカーネルパニックで死んだ

sudo rm -rf LCD-show
git clone https://github.com/goodtft/LCD-show.git
chmod -R 755 LCD-show
cd LCD-show/
sudo ./MPI3508_720_480-show

失敗した原因はどうもVolumioはパスが違うらしくファイルの無い場所を読みに行く設定に書き換えられてしまうようだ。
そもそもタッチパネル自体は認識されてるからきっとドライバは入れなくていいのである。
ということでLCD-showの中身を見て手動でコンフィグを書換えることにした。

キャリブレーション

キャリブレーションツールがあるのでそれを使えばいいだろうと思ってやってみるがキャリブレーションツールが起動しない

sudo apt-get install xinput-calibrator
xinput_calibrator

99-calibiration.confを作って書けばよいらしくとりあえず

sudo nano /usr/share/X11/xorg.conf.d/99-calibiration.conf

の中に下記を書いたが変わらず

Section "InputClass"
        Identifier      "calibration"
        MatchProduct    "ADS7846 Touchscreen"
        Option  "Calibration"   "3945 233 3939 183"
        Option  "SwapAxes"      "1"
EndSection


xのログを見ると設定ファイルは読み込まれているようだが無視されてのだろうか。

cat /var/log/Xorg.0.log

[    33.255] (**) ADS7846 Touchscreen: Applying InputClass "calibration"
[    33.255] (II) No input driver specified, ignoring this device.
[    33.255] (II) This device may have been added with another device file.

ということで他に設定方法がないか探す

40-libinput.confを変更してみる

40-libinput.confのファイルにTransformationMatrix形式で指定する方法を見つける。
TransformationMatrixtとは…
Transformation matrix - Wikipedia
なるほど、さっぱりわからん。

#in case of swapping x and y
Option "TransformationMatrix" "0 1 0 1 0 0 0 0 1"

とりあえず上のように書いてみたら今までとカーソルが違う挙動をしたのでここのパラメータをいじればいいことがわかった。
XY入替を指定するとXYが入れ替わるが両方とも逆方向にカーソルが動く。

  ⎡ C  B  A ⎤   ⎡ g  h  i ⎤ 
  ⎜ F  E  D ⎥   ⎜ d  e  f ⎥ 
  ⎣ I  H  G ⎦   ⎣ a  b  c ⎦

XY入替プラスX反転Y反転すればよさそうだがパラメータの指定がよくわからん。

waveshare-dtoverlays/README.md at master · swkim01/waveshare-dtoverlays · GitHub

とりあえずTransformationMatrixの意味はわからんが反転は1文字目か2文字目の1をマイナスにして3文字目を1にすればいいのかなと感で直したら当たりだった

   XY入れ替え
   Option "TransformationMatrix" "0 1 0 1 0 0 0 0 1"
  ⎡ 0  1  0 ⎤ 
  ⎜ 1  0  0 ⎥ 
  ⎣ 0  0  1 ⎦ 

   XY入れ替え+X反転+Y反転
   Option "TransformationMatrix" "0 -1 1 -1 0 1 0 0 1"
  ⎡ 0 -1  1 ⎤ 
  ⎜-1  0  1 ⎥ 
  ⎣ 0  0  1 ⎦

やったこれで液晶を買ってから3日間の長い戦いは終わった。
ということで今日は推しメンのハロウィンライブがあるので、
渋谷に出かけてライブを見てチェキを撮って帰った。
めでたしめでたし。