NanoPi NEO に SPI で 3.2 インチ 液晶モニタ を繋げる (2)

やりたいこと

ちょっとしたサイネージのように延々と動画を流していたい。
あるいは、監視カメラの映像をRTSPで取得して、それを小型モニタに映しておきたい。
みたいなこと。

そして、普通にコーンソールを表示してキーボードを繋げてメンテナンスできるようにしたい。

結果できたものはこんな感じで、狭いけど普通のモニタ的に使える。

(1)でやったこととの違い

(1)ではSPIを直接叩いてた。なので速い。
速いんだけど、コンソール表示はできないし、映像を映すにもちょっと面倒くさい。ちょっとだけ。

で、結局、「別に直接叩くほど速度求めてないじゃん、俺…」となってこの(2)のやり方に落ち着いたw

てことで、SPI を直接叩くのはこっち。

NanoPi NEO に SPI で 3.2 インチ 液晶モニタ を繋げる (1)
やりたいことちょっとしたサイネージのように延々と動画を流していたい。あるいは、監視カメラの映像をRTSPで取得して、それを小型モニタに映しておきたい。みたいなこと。結果として、こんな感じなことができる。この後、別の方法でより汎用的な液晶モニ…

用意したもの

NanoPi NEO
3.2 インチ LCD:ILI9341 SPI接続 320×240

Amazon.co.jp: DIANN 3.2" ILI9341 SPI TFT LCD Display Touch Panel 320×240 TFT LCD Touch Screen Shield 5V/3.3V STM32 Display Module SPI Serial with Touch Pen : 産業・研究開発用品
Amazon.co.jp: DIANN 3.2" ILI9341 SPI TFT LCD Display Touch Panel 320×240 TFT LCD Touch Screen Shield 5V/3.3V STM32 Displ…

配線

SPI:4本   その他制御用:2本   電源:2本  LEDバックライト:1本
とりあえず、この9本配線されてればOK(削ろうと思えば削れるけど…)

そして、DC と RESET がクロスしてるのは謎…
いや、RESET を一番若い番号にしておきたかった、という思いがあっただけで、今にして思えばどっちでもいいじゃん…という感じなので、これは敢えてクロスさせる必要はない。
が、まっすぐに繋げたなら、Python 側もそれぞれに指示しているピン番号を入れ替えるのを忘れないように。

NanoPi NEO の準備

Device Tree Overlay という仕組みを利用して液晶モニタを Linux (Armbian) に認識させるためのファイルを作っていく。

まずは適当なフォルダに ili9341_overlay.dts というファイルを内容を下記のようにして作る。
(ファイル名は別にテキトーでOK。わかりやすい名前で)

/dts-v1/;
/plugin/;
 
/ {
    compatible = "allwinner,sun8i-h3";
 
    fragment@0 {
        target = <&spi0>;
        __overlay__ {
            status = "okay";
            #address-cells = <1>;
            #size-cells = <0>;
 
            ili9341@0 {
                compatible = "ilitek,ili9341";
                reg = <0>;
                spi-max-frequency = <32000000>;
                rotate = <90>;
                fps = <30>;
                buswidth = <8>;
                bgr;
 
                /* NanoPi NEOのピン指定 */
                reset-gpios = <&pio 6 8 1>; /* GPIOG8 (物理16番) */
                dc-gpios    = <&pio 6 9 0>; /* GPIOG9 (物理18番) */
            };
        };
    };
};

作ったファイルに対して以下のコマンドを実行する。

$ sudo armbian-add-overlay ili9341-overlay.dts

Compiling the overlay
Copying the compiled overlay file to /boot/overlay-user/
Overlay ili9341-overlay was already added to /boot/armbianEnv.txt, skipping
Reboot is required to apply the changes

そうすると、/boot/overlay-user 内に ili9341-overlay.dtbo というファイルが出来上がる。
同時に、/boot/armbianEnv.txt に user_overlays=ili9341-overlay という一行が加えられている。

ついでなので、この /boot/armbianEnv.txt には以下を手動で追記しておく。

extraargs=fbcon=map:0 console=tty1

これを書いておくことで、Linux が起動するときにズラズラと流れる文字列が表示されるようになる。
冒頭の画像のようなやつね。

また、起動後、「login:」という表示を出して、ちゃんとコンソールとして使えるようにするには下記を実行しておく。

$ sudo systemctl enable getty@tty1.service
$ sudo systemctl start getty@tty1.service

これであとは sudo reboot すれば見慣れが画像がかなり窮屈だけど、3.2インチの液晶モニタに表示される。

動けばそれでいい…けど、いろいろ確認するためのコマンドをメモ

上記手順で液晶モニタを使えるようにすると「フレームバッファ」というものを利用することになる。

なので…

$ ls -al /dev/fb*
crw-rw---- 1 root video 29, 0  6月 26 02:58 /dev/fb0

と言った感じで、fb0 とか場合によっては fb1 と言った感じでその存在を確認できる。

また、lsmod コマンドでもちゃんと液晶モニタが認識されているかを調べられる。

$ lsmod | grep ili9341
fb_ili9341             12288  0
fbtft                  32768  2 fb_ili9341

この2つが出ていればOK

さらに fbset というコマンドもあるけど、NanoPi NEO の Armbian だと、たぶんインストールされていないので、まずはインストール。

$ sudo apt install fbset

その後、下記のように実行すると、もう少し詳細な情報を見ることができる。

$ fbset -i -fb /dev/fb0
 
mode "320x240"
    geometry 320 240 320 240 16
    timings 0 0 0 0 0 0 0
    nonstd 1
    rgba 5/11,6/5,5/0,0/0
endmode
 
Frame buffer device information:
    Name        : fb_ili9341
    Address     : 0
    Size        : 153600
    Type        : PACKED PIXELS
    Visual      : TRUECOLOR
    XPanStep    : 0
    YPanStep    : 0
    YWrapStep   : 0
    LineLength  : 640
    Accelerator : No

しっかし、何をどうやっても SPI と I2C を同時に有効にできん…

今回、/boot/armbianEnv.txt を極力シンプルに下記のようにしてみたけど、それでもダメだった…

verbosity=1
bootlogo=false
console=serial
disp_mode=1920x1080p60
overlay_prefix=sun8i-h3
overlay=i2c0
rootdev=UUID=e5206990-8683-4f21-9742-83bbe586c250
rootfstype=ext4
user_overlays=ili9341-overlay
extraargs=fbcon=map:0 console=tty1
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u

I2C が有効になった瞬間に SPI の MOSI が死ぬんだよなぁ…
user_overlays で SPI が I2C が有効になった後になればもしかしたら…と思ったけどダメだった…w

この記事にコメントしてみる