0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CYD ESP32-8048S050C + LovyanGFX

0
Posted at

はじめに

CYD (Cheep Yellow Display 安い黄色いヤツ) の一種(亜種?)である ESP32-8048S050C を入手し、 LovyanGFX ベースで動かそうとしたらめっちゃハマったので、供養のために記事を書きます。

IMG20260208022032.jpg

開発環境は PlatformIO を使っています。

ボード定義ファイル

ボード定義ファイルは割と簡単に見つかって、下記URLから入手可能です。

これを boards ディレクトリの下に置きます。

PlatformIO Project Configuration File

書くまでもないですが、platformio.ini を置いときます。

platformio.ini
[env:esp32-8048S050C]
platform = espressif32
board = esp32-8048S050C
framework = arduino

monitor_speed = 115200

テストプログラム

ごくごく単純な、Hello world プログラムです。

ヘッダ LGFX_ESP32-8048S050C.hpp は次に説明します。

main.cpp
#include <LovyanGFX.hpp>
#include "LGFX_ESP32-8048S050C.hpp"

static LGFX lcd;

void setup(void)
{
  lcd.init();
  lcd.fillRect(0, 0, lcd.width(), lcd.height(), TFT_BLUE);
  lcd.drawString("Hello, world", 0, 0, 2);
}

void loop(void)
{
}

本ボード用LGFXクラスのヘッダファイル

いろいろ調べながらヘッダファイルを作りました。

LGFX_ESP32-8048S050C.hpp (ボツ)
#include <LovyanGFX.hpp>
#include <lgfx/v1/platforms/esp32s3/Panel_RGB.hpp>
#include <lgfx/v1/platforms/esp32s3/Bus_RGB.hpp>

class LGFX : public lgfx::LGFX_Device
{
public:
    lgfx::Bus_RGB _bus_instance;
    lgfx::Panel_RGB _panel_instance;
    lgfx::Light_PWM _light_instance;
    lgfx::Touch_GT911 _touch_instance;

    LGFX(void)
    {
        {
            auto cfg = _panel_instance.config();
            cfg.memory_width = ST7262_PANEL_CONFIG_TIMINGS_H_RES;
            cfg.memory_height = ST7262_PANEL_CONFIG_TIMINGS_V_RES;
            cfg.panel_width = ST7262_PANEL_CONFIG_TIMINGS_H_RES;
            cfg.panel_height = ST7262_PANEL_CONFIG_TIMINGS_V_RES;
            cfg.offset_x = 0;
            cfg.offset_y = 0;
            _panel_instance.config(cfg);
        }
        {
            auto cfg = _panel_instance.config_detail();
            cfg.use_psram = 1;
            _panel_instance.config_detail(cfg);
        }

        {
            auto cfg = _bus_instance.config();
            cfg.panel = &_panel_instance;

            cfg.pin_d0 = ST7262_PANEL_CONFIG_DATA_R0;
            cfg.pin_d1 = ST7262_PANEL_CONFIG_DATA_R1;
            cfg.pin_d2 = ST7262_PANEL_CONFIG_DATA_R2;
            cfg.pin_d3 = ST7262_PANEL_CONFIG_DATA_R3;
            cfg.pin_d4 = ST7262_PANEL_CONFIG_DATA_R4;
            cfg.pin_d5 = ST7262_PANEL_CONFIG_DATA_G0;
            cfg.pin_d6 = ST7262_PANEL_CONFIG_DATA_G1;
            cfg.pin_d7 = ST7262_PANEL_CONFIG_DATA_G2;
            cfg.pin_d8 = ST7262_PANEL_CONFIG_DATA_G3;
            cfg.pin_d9 = ST7262_PANEL_CONFIG_DATA_G4;
            cfg.pin_d10 = ST7262_PANEL_CONFIG_DATA_G5;
            cfg.pin_d11 = ST7262_PANEL_CONFIG_DATA_B0;
            cfg.pin_d12 = ST7262_PANEL_CONFIG_DATA_B1;
            cfg.pin_d13 = ST7262_PANEL_CONFIG_DATA_B2;
            cfg.pin_d14 = ST7262_PANEL_CONFIG_DATA_B3;
            cfg.pin_d15 = ST7262_PANEL_CONFIG_DATA_B4;

            cfg.pin_henable = ST7262_PANEL_CONFIG_DE;
            cfg.pin_vsync = ST7262_PANEL_CONFIG_VSYNC;
            cfg.pin_hsync = ST7262_PANEL_CONFIG_HSYNC;
            cfg.pin_pclk = ST7262_PANEL_CONFIG_PCLK;
            cfg.freq_write = ST7262_PANEL_CONFIG_TIMINGS_PCLK_HZ;

            cfg.hsync_polarity = ST7262_PANEL_CONFIG_TIMINGS_FLAGS_HSYNC_IDLE_LOW;
            cfg.hsync_front_porch = ST7262_PANEL_CONFIG_TIMINGS_HSYNC_FRONT_PORCH;
            cfg.hsync_pulse_width = ST7262_PANEL_CONFIG_TIMINGS_HSYNC_PULSE_WIDTH;
            cfg.hsync_back_porch = ST7262_PANEL_CONFIG_TIMINGS_HSYNC_BACK_PORCH;

            cfg.vsync_polarity = ST7262_PANEL_CONFIG_TIMINGS_FLAGS_VSYNC_IDLE_LOW;
            cfg.vsync_front_porch = ST7262_PANEL_CONFIG_TIMINGS_VSYNC_FRONT_PORCH;
            cfg.vsync_pulse_width = ST7262_PANEL_CONFIG_TIMINGS_VSYNC_PULSE_WIDTH;
            cfg.vsync_back_porch = ST7262_PANEL_CONFIG_TIMINGS_VSYNC_BACK_PORCH;

            cfg.pclk_active_neg = ST7262_PANEL_CONFIG_TIMINGS_FLAGS_PCLK_ACTIVE_NEG;
            cfg.pclk_idle_high = ST7262_PANEL_CONFIG_TIMINGS_FLAGS_PCLK_IDLE_HIGH;
            cfg.de_idle_high = ST7262_PANEL_CONFIG_TIMINGS_FLAGS_DE_IDLE_HIGH;

            _bus_instance.config(cfg);
            _panel_instance.setBus(&_bus_instance);
        }

        {
            auto cfg = _light_instance.config();
            cfg.pin_bl = DISPLAY_BCKL;
            cfg.invert = false;
            cfg.freq = 1000;
            cfg.pwm_channel = 7;

            _light_instance.config(cfg);
            _panel_instance.setLight(&_light_instance);
        }

        {
            auto cfg = _touch_instance.config();
            cfg.x_min = 0;
            cfg.x_max = GT911_TOUCH_CONFIG_X_MAX;
            cfg.y_min = 0;
            cfg.y_max = GT911_TOUCH_CONFIG_Y_MAX;
            cfg.pin_int = -1; // GT911_TOUCH_CONFIG_INT;
            cfg.pin_rst = GT911_TOUCH_CONFIG_RST;
            cfg.bus_shared = true;
            cfg.offset_rotation = 0;

            cfg.i2c_port = 0;
            cfg.i2c_addr = 0x5d;
            cfg.pin_sda = GT911_I2C_CONFIG_SDA;
            cfg.pin_scl = GT911_I2C_CONFIG_SCL;
            cfg.freq = GT911_I2C_CONFIG_MASTER_CLK_SPEED;

            _touch_instance.config(cfg);
            _panel_instance.setTouch(&_touch_instance);
        }
        setPanel(&_panel_instance);
    }
};

パネルの設定はこれでいいはずですが、どうも表示が変です。

IMG20260208011910.jpg

よく観察して見ると、横長の線だけ表示できているようです。

この現象はクロックの設定が間違っている予感がします。

ヘッダで定義した設定が実際に使われているところを調べてみました。

すると、、、

src/lgfx/v1/platforms/esp32s3/Bus_RGB.cpp (抜粋)
lcd_clock.lcd_ck_idle_edge = false;
lcd_clock.lcd_ck_out_edge = _cfg.pclk_idle_high;

なんかおかしくないですか! pclk_active_neg が使われてないし!

真正面から質問してみましたが、応答がありませんでした。

(ChatGPTに翻訳させたので、ちゃんと伝わっていない可能性もあります。)

解決策は2種類あります。

1つ目は、LovyanGFX を書き換えちゃう案。

src/lgfx/v1/platforms/esp32s3/Bus_RGB.cpp (抜粋)
lcd_clock.lcd_ck_idle_edge = _cfg.pclk_idle_high;
lcd_clock.lcd_ck_out_edge  = _cfg.pclk_active_neg;

2つ目は、現物合わせでヘッダを記述する案。

LGFX_ESP32-8048S050C.hpp (抜粋)
// 本来こうなのでは
//cfg.pclk_active_neg = ST7262_PANEL_CONFIG_TIMINGS_FLAGS_PCLK_ACTIVE_NEG;
//cfg.pclk_idle_high = ST7262_PANEL_CONFIG_TIMINGS_FLAGS_PCLK_IDLE_HIGH;

// ver 1.2.19 現物合わせ
cfg.pclk_active_neg = false; // 未使用
cfg.pclk_idle_high = ST7262_PANEL_CONFIG_TIMINGS_FLAGS_PCLK_ACTIVE_NEG; // ねじれ

どっちを選ぶにしてもキモイですね。。。

ちゃんと設定できると、ちゃんと表示できます。

IMG20260208012005.jpg

その他

バックライトの

cfg.freq = 1000;
cfg.pwm_channel = 7;

は、かなり苦労しました。
freq の値によって50%にしたときの明るさが異なります。
自分の体感で、50%が50%になるような値を探ったつもりです。

タッチパネルの

cfg.pin_int = -1; // GT911_TOUCH_CONFIG_INT;

も、苦労しました。正しそうな値を設定するとなぜか動きません。
-1 が正解のようです。

なお、タッチパネルのキャリブレーションは不要で、LCDでの座標がそのまま得られるようです。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?