2021年9月19日日曜日

Orange Pi PCでSPI接続のLCDを使ってみた。

 Orange Pi PCでSPI接続のTFT液晶が使えるかどうか試してみることに。使用したLCDは4年前ぐらいに838円でeBayで購入したILI9341っていうLCDコントローラICを搭載した2.8インチのもの。解像度は320x240だった。おそらく秋月でも売っているMSP2807と互換かな?刻印が違うけど見た目ほぼ同じだし。

Orange Pi PCの方にはArmbian 21.08 BullseyeのCLI版を入れてある。SPI接続のTFT液晶をLinuxで使えるようにする場合、PythonとかでSPIを直接叩いてLCDに表示する方法もあるみたいなんだけど、今回はFBTFTを使用して普通のディスプレイを繋いだときと同じように使えるようにしてみた。小型TFTディスプレイ用のディスプレイドライバ的な感じなので、ドライバが読み込まれた時点からディスプレイに起動時のメッセージを表示したりもできる。

早速試してみようと思ったらなんとfbtft_deviceモジュールが入っていない…
調べてみるとfbtftは2015年から更新されておらず、GPIOの実装が変わったことにより使えなくなるので、Linux Kernel 5.4以降では削除されたらしい。

しかしながらDevice Tree Overlay経由では使えるらしい。Device Tree Overlayには最初から用意されているoverlaysとユーザーが自分で作成して使用できるuser_overlayがあるようで、今回はOrange Pi Zeroで動作確認されていたuser_overlayを改良してOrange Pi Zeroようにしてみた。

device tree overlay for small lcd
こちらのOrange Pi Zero用のdtsファイルを参考にさせてもらった。というかGPIOピンの設定とSPIの設定だけ変更するだけだった。Orange Pi ZeroはSPI1しか出てないけど、Orange Pi PCはSPI0が使えるのし。

まずはOrange Pi PCのSPIを有効にする。

sudo nano /boot/armbianEnv.txt

でArmbianの設定ファイルを開いて

overlays=spi-spidev
param_spidev_spi_bus=0

を追加する。ちなみにもうすでにoverlaysの行があったら後ろにスペースでspi-spidevを追加すればいい。(overlaysの行は2行あってはいけないので読み込みたいオーバーレイを列挙する)

あとは保存して一旦再起動。
再起動後にSPIが有効になってるか

ls /dev

で確認する。リストにspidev0.0が追加されていればSPIが有効になってる。最初にarmbian-configでSPIを有効にしたつもりが実は有効になってなくてハマったのでarmbianEnv.txtを直接編集するほうがいいかもしれない…

SPIが有効になったら次にuser_overrayの設定をする。

ili9341opizero.dtsをダウンロードしてきて、&spi1となっている2箇所を&spi0に変更する。
その編集したファイルのディレクトリで

sudo armbian-add-overlay ili9341opizero.dts

を実行する。するとoverlayファイルをコンパイルしてさらには/boot/armbianEnv.txtにuser_overlayの設定を追加してくれる。

設定が終わったのでとりあえずOrange Pi PCの電源を切る。
ILI9341な液晶をOrange Pi PCに接続する。

VCC→3.3V or 5.0V(LCDのジャンパで設定した方につなぐこと)
GND→GND
CS→PC3
RESET→PA10
DC→PA2
MOSI→PC0
SCK→PC2
LED→3.3V
MISO→PC1

LEDはバックライトなんだけど、
led-gpios = <&pio 0 6 0>;
でPA6に割り当ててfbtft側からオンオフできそうだった。しかしGPIOで直接駆動できるような電流じゃなさそうなので今回は電源に直結した。GPIOで制御するならFETとかロードスイッチ入れないとだめそう。

RESETピンとDCピンはdtsファイルを編集すれば他のピンにも割り当て可能。

LCDを繋いで電源を入れると

こんな感じでHDMIディスプレイを繋いだときみたいにそのまま使える。
GUI版を入れればそのままデスクトップが表示されるんだけど解像度が小さすぎる。フレームバッファを使用して描画できるアプリならそのまま動く。

SPIのクロックとか配線を調整すればもしかしたら動画もヌルヌル動いちゃうかな?
今回はできるだけ短い線を使用したけどこの状態だとクロック早くしすぎると表示が乱れそうである。

Device Tree Overlayはラズパイとかではそのまま用意されてるやつを使ったことがあったけど、コンパイルしてdtsファイルをdtboにしないといけないのを知らなかったりして結構ハマった…
armbian-add-overlayなんて便利なコマンドがあるのも知らなかったし。(コンパイルしてちゃんとしたフォルダに保存して読み込み設定までしてくれちゃう)

ちなみにタッチパネルはTSC2046互換のXPT2046がのってるっぽいんだけど、TSC2046の古いバージョンであるADS7846のドライバモジュールが使えるっぽい?

0 件のコメント:

コメントを投稿