2022年2月2日水曜日

1.3 inch IPS LCD 240x 240 (ST7789)

1.3 Inch LCDをRaspberry Piと接続してRetroPieで使用してみました。


[関連記事]


1.3 inch IPS LCD Display Module




1.3 inch IPS Display Modul
1.3 inch IPS Display Modul



今までもこの1.3インチLCDは下記サイトを参考によく使用していました。

[参考リンク]

[過去の作例]


Raspberry Pi ZeroPi 3 Model B+ではOSにStretchを選択すれば特に問題なかったので有難く使わせてもらっていたのですが、Pi 4Zero2(もってないけど)やBusterのことを踏まえ別の接続方法を模索することにしました。
基本的にはRetroPieの使用用途しか考えていませんので注意して下さい。


raspberry Piとの接続は以前までの機器と互換性を持たせるため、今迄と同じ配置にしました。

GND → PIN20(GND)
VCC → PIN17(3V3:power)
SCL → PIN23(GPIO11:SPI_SCLK)
SDA → PIN19(GPIO10:SPI_MOSI)
RES → PIN13(GPIO27)
DC → PIN22(GPIO25)
BLK → PIN18(GPIO24)


Raspberry Pi 4と接続、RetroPieをSDカードにインストールする。
今回は"retropie-buster-4.7.1-rpi4_400.img.gz"を使用。
※SPIはオンにしない。
※試行の結果を書き留めるだけであり、正しい設定かはわかりません。



fbcp-ili9341をダウンロード
sudo apt-get install cmake cd ~ git clone https://github.com/juj/fbcp-ili9341.git cd fbcp-ili9341



display.hを変更(赤字を追記)
sudo vi display.h #ifndef DISPLAY_SPI_DRIVE_SETTINGS #define DISPLAY_SPI_DRIVE_SETTINGS (0) #define DISPLAY_SPI_DRIVE_SETTINGS (1 | BCM2835_SPI0_CS_CPOL | BCM2835_SPI0_CS_CPHA) #endif



ビルド
mkdir build cd build cmake -DSTATISTICS=0 -DST7789VW=ON -DGPIO_TFT_DATA_CONTROL=25 -DGPIO_TFT_RESET_PIN=27 -DGPIO_TFT_BACKLIGHT=24 -DSPI_BUS_CLOCK_DIVISOR=10 -DUSE_DMA_TRANSFERS=OFF .. make -j
・-DSTATISTICS=0 :オーバーレイ統計の無効
-DST7789VM=ON :ST7789有効
-DSPI_BUS_CLOCK_DIVISOR=10 :表示速度の指定(6~30の偶数)
-DGPIO_TFT_DATA_CONTROL=25 :データ/制御(DC)をGPIO25に
-DGPIO_TFT_RESET_PIN=27 :リセットをGPIO27に
-DGPIO_TFT_BACKLIGHT=24 :バックライトラインをGPIO24に
-DUSE_DMA_TRANSFERS=OFF :DMA転送の無効


※現時点では/boot/config.txtは変更しません


/etc/rc.localに追記
sudo vi /etc/rc.local sudo /home/pi/fbcp-ili9341/build/fbcp-ili9341 & exit 0

再起動
sudo reboot


※設定変更時はディレクトリを削除後ビルドから
cd fbcp-ili9341 rm -rf build




標準の表示位置
標準の表示位置



これで画面が表示されたと思います。






画面の回転


画面の表示はできましたが、このままだと画面の向きが使いにくいので回転してみます。
以前Raspberry Pi 4使用時に画面の回転では苦労して、EmulationStation他それぞれ設定を行いなんとか画面を回転させましたがやはり面倒なので出来ればシステムごとの回転を模索しました。
180°回転が必要な場合は"-DDISPLAY_ROTATE_180_DEGREES=ON"をビルドオプションに追記すればいいかと思います。



[過去記事]


fbcp-ili9341にはその機能もあるようなのでそれを活用します。
fbcp-ili9341の機能を使用した場合、外部HDMIとは独立させて回転させることができます。




90°回転(反転前)
90°回転(反転前)




90°回転


config.hを変更
cd fbcp-ili9341 sudo vi config.h // If defined, rotates the display 180 degrees. This might not rotate the panel scan order though, // so adding this can cause up to one vsync worth of extra display latency. It is best to avoid this and // install the display in its natural rotation order, if possible. //#define DISPLAY_ROTATE_180_DEGREES // If defined, displays in landscape. Undefine to display in portrait. //#define DISPLAY_OUTPUT_LANDSCAPE

270°回転


config.hを変更
cd fbcp-ili9341 sudo vi config.h // If defined, rotates the display 180 degrees. This might not rotate the panel scan order though, // so adding this can cause up to one vsync worth of extra display latency. It is best to avoid this and // install the display in its natural rotation order, if possible. #define DISPLAY_ROTATE_180_DEGREES // If defined, displays in landscape. Undefine to display in portrait. //#define DISPLAY_OUTPUT_LANDSCAPE





画面の反転



90°回転(反転後)
90°回転(反転後)



270°回転(反転後)
270°回転(反転後)



画面が鏡像になっている場合は以下の設定を行います。


st7735r.cppを変更
cd fbcp-ili9341 sudo vi st7735r.cpp #if defined(DISPLAY_FLIP_ORIENTATION_IN_HARDWARE) madctl |= MADCTL_ROW_COLUMN_EXCHANGE; #endif //madctl |= MADCTL_ROW_ADDRESS_ORDER_SWAP;

ここまで設定を行ったらディレクトリを削除後ビルドしてください。
これで思い通りの画面がでましたでしょうか?






コントラストの調整



コントラストを少し調整してみました。


st7735r.cppを変更
sudo vi st7735r.cpp #ifndef ST7789VW // This is disabled on ST7789VW because it was observed to look visually bad, makes colors a bit too contrasty/deep //SPI_TRANSFER(0x26/*Gamma Curve Select*/, 0x04/*Gamma curve 3 (2.5x if GS=1, 2.2x otherwise)*/); #endif

元々2.4 Inch LCDの時とは違いそこまで悪くなかったので、変化がわかりにくいかも?
設定箇所もここではなくバックライトの項目のほうが良かったかもしれませんが、そこはまた後日にでも調べてみたいと思います。





config.txtの変更


ここまでの設定でSPI LCDは使用できるのですが、現在のconfig.txtの設定のままですと外部に接続したHDMIディスプレイに依存されます。
ここままのほうが使い易い場合もありますが、HDMIディスプレイを接続しないとSPI LCDには何も表示されなくなります。
また4:3のディスプレイを接続したら4:3に、16:9のディスプレイを接続したら16:9になると思います(これはある意味メリットかもしれませんが)



16:9のディスプレイを接続
16:9のディスプレイを接続



このままの設定では使いにくいので設定を変更します。


/boot/config.txtを変更
sudo vi /boot/config.txt hdmi_group=2 hdmi_mode=87 hdmi_cvt=640 480 60 1 0 0 0 hdmi_force_hotplug=1


"hdmi_cvt=640 480 60 1 0 0 0"の解像度の部分は任意で変更します。
※HDMIディスプレイの可否はディスプレイの仕様によると思います。





hdmi_cvt=240 240 60 1 0 0 0
hdmi_cvt=240 240 60 1 0 0 0



hdmi_cvt=240 240 60 1 0 0 0
1.3 inch IPS LCDの解像度が240x240なのでそのまま設定。
・RetroPIEメニューが画面いっぱいにできる
HDMIディスプレイは映らない
・一部のエミュレーターの設定が必要となる。

hdmi_cvt=640 640 60 1 0 0 0
・RetroPIEメニューが画面いっぱいにできる
HDMIディスプレイは映るがアスペクト比はおかしくなる。
・一部のエミュレーターの設定が必要となる。

hdmi_cvt=320 240 60 1 0 0 0
HDMIディスプレイは映らない

hdmi_cvt=640 480 60 1 0 0 0
HDMIディスプレイが多少ボケる。

hdmi_cvt=1024 768 60 1 0 0 0
・一番使い勝手は良いが負荷が高い?

と結局用途によると思います。



やはり"dtoverlay=vc4-fkms-v3d"を使用したまま回転できるのは大変楽で良いと感じます。
また自分のやり方が間違っていただけかもしれませんが、今回はKODI(メディアプレイヤー)が使用できるようになりましたので使用目的に幅ができました。
取り敢えずここまでで1.3 inch IPS LCDに表示することはできましたが、組み込み用にオーバースキャン等の設定も試してみたいのですがそれはまた後日に。




0 件のコメント:

コメントを投稿