3.5inch LCD を使う

 SPI 接続の 3.5 inch LCD をいくつか持っていますが、持っているもののなかで満足できるものはありません。

MHS35 正面
MHS35 裏
KeDei 裏
Waveshare 裏

 満足はできませんが、持っているので動かします。

 自分が持っているのは 3 種類です。

  1. waveshare の古いもの
    製品 https://www.waveshare.com/wiki/3.5inch_RPi_LCD_(A)
    ドライバ http://github.com/waveshare/LCD-show.git
  2. kedei の V6.2
    ドライバ http://github.com/kedei/LCD-show.git
  3. MHS シリーズ
    製品 http://www.lcdwiki.com/MHS-3.5inch_RPi_Display
    ドライバ http://github.com/goodtft/LCD-show.git

 Raspbian の古いものならそれなりに動くドライバはあります。しかし、最新のものでは 1 と 3 についてはそれぞれのドライバで動くことは動くのですが、表示が遅いです。タッチパネルは使えます。

 2 に至っては表示はできませんし、当然タッチパネルも使えません。

 タッチパネルを諦めればそれなりに表示することはできます。fbcp-ili9341 というものを使います。

 実は動くドライバも表示は fbcp を使って表示しています。ただ、 fbcp はすごく遅いです。

 標準のドライバと fbcp-ili9341 は共存できません。fbcp-ili9314 を使う時は、ドライバはインストールしません。

 1 と 3 は https://github.com/juj/fbcp-ili9341.git
 2 は https://github.com/kpishere/fbcp-ili9341.git
をコンパイルすることで動きます。

WaveShare、MHS の fbcp-ili9341

 github から clone してコンパイルします。

$ git clone https://github.com/juj/fbcp-ili9341.git
$ cd fbcp-ili9341
$ mkdir build
$ cd build
$ cmake -DSPI_BUS_CLOCK_DIVISOR=16 -DWAVESHARE35B_ILI9486=ON -DDISPLAY_ROTATE_180_DEGREES=ON -DSTATISTICS=0 ..
$ make -j4
$ sudo install fbcp-ili9341 /usr/local/bin

 あとは /etc/rc.local に

/usr/local/bin/fbcp-ili9341 &

を追加し、/boot/config.txt に

hdmi_group=2
hB2dmi_mode=1
hdmi_mode=87
hdmi_cvt 480 320 60 6 0 0 0
hdmi_force_hotplug=1

を追加して再起動すれば、rc.local が実行されたときに、LCD に表示されるはずです。

kedei の fbcp-ili9341 を clone する

$ git clone https://github.com/kpishere/fbcp-ili9341.git
$ cd fbcp-ili9341

このままコンパイルしても使いづらいので、ソースを修正します。

Kedei の fbcp-ili9341 のソース修正

元のソースとの context diff の内容は以下のようになります。

共通のサブディレクトリー: fbcp-ili9341.org/.git と fbcp-ili9341/.git diff --context fbcp-ili9341.org/config.h fbcp-ili9341/config.h *** fbcp-ili9341.org/config.h 2020-12-02 13:17:41.451894404 +0900 --- fbcp-ili9341/config.h 2020-12-03 10:08:02.196140998 +0900 *************** *** 196,202 **** // #define USE_DMA_TRANSFERS // If defined, enables code to manage the backlight. ! #define BACKLIGHT_CONTROL #if defined(BACKLIGHT_CONTROL) --- 196,202 ---- // #define USE_DMA_TRANSFERS // If defined, enables code to manage the backlight. ! //#define BACKLIGHT_CONTROL #if defined(BACKLIGHT_CONTROL) 共通のサブディレクトリー: fbcp-ili9341.org/debian と fbcp-ili9341/debian diff --context fbcp-ili9341.org/fbcp-ili9341.cpp fbcp-ili9341/fbcp-ili9341.cpp *** fbcp-ili9341.org/fbcp-ili9341.cpp 2020-12-02 13:17:41.471894607 +0900 --- fbcp-ili9341/fbcp-ili9341.cpp 2020-12-03 10:28:04.165767409 +0900 *************** *** 68,74 **** { printf("Signal %s(%d) received, quitting\n", SignalToString(signal), signal); static int quitHandlerCalled = 0; ! if (++quitHandlerCalled >= 5) { printf("Ctrl-C handler invoked five times, looks like fbcp-ili9341 is not gracefully quitting - performing a forcible shutdown!\n"); exit(1); --- 68,74 ---- { printf("Signal %s(%d) received, quitting\n", SignalToString(signal), signal); static int quitHandlerCalled = 0; ! if (++quitHandlerCalled >= 1) { printf("Ctrl-C handler invoked five times, looks like fbcp-ili9341 is not gracefully quitting - performing a forcible shutdown!\n"); exit(1); 共通のサブディレクトリー: fbcp-ili9341.org/kernel と fbcp-ili9341/kernel diff --context fbcp-ili9341.org/mpi3501.cpp fbcp-ili9341/mpi3501.cpp *** fbcp-ili9341.org/mpi3501.cpp 2020-12-02 13:17:41.501894912 +0900 --- fbcp-ili9341/mpi3501.cpp 2020-12-03 09:42:02.720593540 +0900 *************** *** 18,24 **** --- 18,28 ---- static int loop = 0; bool activeTouchscreen() { + #if defined(BACKLIGHT_CONTROL) return (touch.ticksSinceLastTouch() < TURN_DISPLAY_OFF_AFTER_USECS_OF_INACTIVITY); + #else + return true; + #endif } void ReloadCalibration(int signal) { 共通のサブディレクトリー: fbcp-ili9341.org/util と fbcp-ili9341/util

変更したのは以下の内容です。

  • バックライトのコントロールを無効にしないと、放置したときに画面が止まっていしまいます。(-DBACKLIGHT_CONTROL=OFF をつけても config.h で定義されてしまっている)
  • シグナルの受信回数が 5 回だとシャットダウンで止まってしまいました。

Kedei の fbcp-ili9341 のコンパイル

$ mkdir build
$ cd build
$ cmake -DSPI_BUS_CLOCK_DIVISOR=16 -DKEDEI_V63_MPI3501=ON -DARMV8A=ON -DBACKLIGHT_CONTROL=OFF -DDISPLAY_ROTATE_180_DEGREES=ON -DSTATISTICS=0 ..
$ make -j4
$ sudo install fbcp-ili9341 /usr/local/bin

 DISPLAY_ROTATE_180_DEGREES を ON にしないと左右が反転します。

 なお、SPI_BUS_CLOCK_DIVISOR の値を小さくすれば表示はスムーズになります。Raspberry Pi 3B では 16 くらい 4B なら 6 くらいが限界のようです。

 また、表示を180度回転させるには、/boot/config.h に
display_rotate=2
を追加します。

RetroPie で KeDei の LCD に表示

 Raspberry Pi 3B に RetroPie を入れて、ぽっぷるメイルを動かしてみましたが、そこそこ動いているようです。

Raspberry Pi

Posted by sirius