LoginSignup
3
1

70歳の挑戦... パラレル接続のTFTモジュールを使ってみた(その2)

Last updated at Posted at 2024-04-29

 前回の、8ビットパラレル接続TFTディスプレイをUNOに接続し標準ライブラリで動かした話の続編です。あの後ESP32ボードに場所を移し「TFT_eSPIライブラリ」、さらに「LavyanGFXライブラリ」を用い動作させることができました。写真(画面下部に注目)は ArduinoIDE の
 file -> Examples -> TFT_eSPI -> 480x320 -> UTFT_Demo_480x320.ino
の最終画面(1ループ後)のスコアです。
KeyLavyan.jpg
まず、標準ライブラリ使用で「約1500msecs」かかるものが、TFT_eSPIで「約750msecs」、LavyanGFXでは「498msecs」まで速くなりました。このサイト

でも紹介されているようなスコア(475msecs)が出ています。ただ、そこで使用されているのは320x240サイズのようなので、今回かなり良い結果と思われます。
 ここまで来るにはそれなりに苦労しました。なかなか画面が出ず、使用PINを色々変えて何度も同じことを繰り返しました。ボードも手持ちの中で3つ程交換し試してみました。スケッチのダウンロード後に自動リセットが何故かかからないためダメだと思っていたこともあるのかも知れません。ジャンパー線の劣化のため接触不良だったのかも知れません。何とかここまでたどり着きました。今回も色々学ぶことが出来ました。ありがたいことです。
 最後にポイントだけ示します。LavyanGFXでの設定は次のhppファイルのようにしました。タッチパネルの設定をすると機能は使えませんが、何故か少しスピードアップするようです。(タッチ機能は残念ながら...)

myLovyanGFX.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」に変えてあります。)

UTFT_Demo_480x320.ino
#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)
{
...

 細かいところは

を参考にしてください。最後まで見ていただきありがとうございます。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1