前回の、8ビットパラレル接続TFTディスプレイをUNOに接続し標準ライブラリで動かした話の続編です。あの後ESP32ボードに場所を移し「TFT_eSPIライブラリ」、さらに「LavyanGFXライブラリ」を用い動作させることができました。写真(画面下部に注目)は ArduinoIDE の
file -> Examples -> TFT_eSPI -> 480x320 -> UTFT_Demo_480x320.ino
の最終画面(1ループ後)のスコアです。
まず、標準ライブラリ使用で「約1500msecs」かかるものが、TFT_eSPIで「約750msecs」、LavyanGFXでは「498msecs」まで速くなりました。このサイト
でも紹介されているようなスコア(475msecs)が出ています。ただ、そこで使用されているのは320x240サイズのようなので、今回かなり良い結果と思われます。
ここまで来るにはそれなりに苦労しました。なかなか画面が出ず、使用PINを色々変えて何度も同じことを繰り返しました。ボードも手持ちの中で3つ程交換し試してみました。スケッチのダウンロード後に自動リセットが何故かかからないためダメだと思っていたこともあるのかも知れません。ジャンパー線の劣化のため接触不良だったのかも知れません。何とかここまでたどり着きました。今回も色々学ぶことが出来ました。ありがたいことです。
ピンの接続は以下のようにしました。ESP32ボードの違いにより動作しないかもしれません。悪しからず。
8bit Parallel Display | ESP32ボード |
---|---|
RST | D33 |
CS | D27 |
RS(DC) | D12 |
WR | D14 |
RD | D32 |
D0 | D23 |
D1 | D19 |
D2 | D18 |
D3 | D26 |
D4 | D5 |
D5 | D4 |
D6 | D0 |
D7 | D15 |
この接続のため、LavyanGFXでの設定は次のhppファイルのようにしました。タッチパネルの設定をすると機能は使えませんが、何故か少しスピードアップするようです。(タッチ機能は残念ながら...)
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
class LGFX : public lgfx::LGFX_Device
{
lgfx::Panel_ILI9488 _panel_instance;
lgfx::Bus_Parallel8 _bus_instance; // 8ビットパラレルバスのインスタンス (ESP32のみ)
lgfx::Touch_XPT2046 _touch_instance;
public:
LGFX(void)
{
{ // バス制御の設定を行います。
auto cfg = _bus_instance.config(); // バス設定用の構造体を取得します。
// 8ビットパラレルバスの設定
cfg.i2s_port = I2S_NUM_0; // 使用するI2Sポートを選択 (I2S_NUM_0 or I2S_NUM_1) (ESP32のI2S LCDモードを使用します)
cfg.freq_write = 20000000; // 送信クロック (最大20MHz, 80MHzを整数で割った値に丸められます)
cfg.pin_wr = 14; // WR を接続しているピン番号
cfg.pin_rd = 32; // RD を接続しているピン番号
cfg.pin_rs = 12; // RS(D/C)を接続しているピン番号
cfg.pin_d0 = 23; // D0を接続しているピン番号
cfg.pin_d1 = 19; // D1を接続しているピン番号
cfg.pin_d2 = 18; // D2を接続しているピン番号
cfg.pin_d3 = 26; // D3を接続しているピン番号
cfg.pin_d4 = 5; // D4を接続しているピン番号
cfg.pin_d5 = 4; // D5を接続しているピン番号
cfg.pin_d6 = 0; // D6を接続しているピン番号
cfg.pin_d7 = 15; // D7を接続しているピン番号
_bus_instance.config(cfg); // 設定値をバスに反映します。
_panel_instance.setBus(&_bus_instance); // バスをパネルにセットします。
}
{ // 表示パネル制御の設定を行います。
auto cfg = _panel_instance.config(); // 表示パネル設定用の構造体を取得します。
cfg.pin_cs = 27; // 27 CSが接続されているピン番号 (-1 = disable)
cfg.pin_rst = 33; // 33 RSTが接続されているピン番号 (-1 = disable)
cfg.pin_busy = -1; // BUSYが接続されているピン番号 (-1 = disable)
// ※ 以下の設定値はパネル毎に一般的な初期値が設定されていますので、不明な項目はコメントアウトして試してみてください。
cfg.panel_width = 320; // 実際に表示可能な幅
cfg.panel_height = 480; // 実際に表示可能な高さ
cfg.offset_x = 0; // パネルのX方向オフセット量
cfg.offset_y = 0; // パネルのY方向オフセット量
cfg.offset_rotation = 0; // 回転方向の値のオフセット 0~7 (4~7は上下反転)
cfg.dummy_read_pixel = 8; // ピクセル読出し前のダミーリードのビット数
cfg.dummy_read_bits = 1; // ピクセル以外のデータ読出し前のダミーリードのビット数
cfg.readable = true; // データ読出しが可能な場合 trueに設定
cfg.invert = false; // パネルの明暗が反転してしまう場合 trueに設定
cfg.rgb_order = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定
cfg.dlen_16bit = false; // 16bitパラレルやSPIでデータ長を16bit単位で送信するパネルの場合 trueに設定
cfg.bus_shared = false; // SDカードとバスを共有している場合 trueに設定(drawJpgFile等でバス制御を行います)
_panel_instance.config(cfg);
}
{ // タッチスクリーン制御の設定を行います。(必要なければ削除)
auto cfg = _touch_instance.config();
cfg.x_min = 0; // タッチスクリーンから得られる最小のX値(生の値)
cfg.x_max = 319; // タッチスクリーンから得られる最大のX値(生の値)
cfg.y_min = 0; // タッチスクリーンから得られる最小のY値(生の値)
cfg.y_max = 479; // タッチスクリーンから得られる最大のY値(生の値)
//cfg.pin_int = 38; // INTが接続されているピン番号
cfg.bus_shared = true; // 画面と共通のバスを使用している場合 trueを設定
cfg.offset_rotation = 0; // 表示とタッチの向きのが一致しない場合の調整 0~7の値で設定
_touch_instance.config(cfg);
_panel_instance.setTouch(&_touch_instance); // タッチスクリーンをパネルにセットします。
}
setPanel(&_panel_instance); // 使用するパネルをセットします。
}
};
loop以降は変更していませんので、inoファイルの最初の部分のみ示します。(すみません、パネルのインスタンス名を「tft」から「lcd」に変えてあります。)
#include "myLovyanGFX.hpp"
#define WAIT 0 // Delay between tests, set to 0 to demo speed, 2000 to see what it does!
#define CENTRE 240
#define grey 0x7BEF
#define black 0x0000
#define white 0xFFFF
#define green 0x03E0
#define magenta 0xF81F
#define cyan 0x07FF
#define blue 0x001F
#define yellow 0xFFE0
#define red 0xF800
uint32_t runTime = 0;
static LGFX lcd; // LGFXのインスタンスを作成。
void setup(void)
{
Serial.begin(115200);
Serial.println("Lovyan Test");
lcd.init();
lcd.setRotation(1);
// 必要に応じてカラーモードを設定します。(初期値は16)
// 16の方がSPI通信量が少なく高速に動作しますが、赤と青の諧調が5bitになります。
// 24の方がSPI通信量が多くなりますが、諧調表現が綺麗になります。
lcd.setColorDepth(16); // RGB565の16ビット less than 525
//lcd.setColorDepth(24); // RGB888の24ビット 680 milliSecs
lcd.startWrite(); // ここでstartWrite()することで、SPIバスを占有したままにする。
// 580 -> 525
// -> 498 タッチパネルの設定をすると何故かここまで速く...
}
void loop(void)
{
...
細かいところは
を参考にしてください。最後まで見ていただきありがとうございます。