はじめに
CYD (Cheep Yellow Display 安い黄色いヤツ) の一種(亜種?)である ESP32-8048S050C を入手し、 LovyanGFX ベースで動かそうとしたらめっちゃハマったので、供養のために記事を書きます。
開発環境は PlatformIO を使っています。
ボード定義ファイル
ボード定義ファイルは割と簡単に見つかって、下記URLから入手可能です。
これを boards ディレクトリの下に置きます。
PlatformIO Project Configuration File
書くまでもないですが、platformio.ini を置いときます。
[env:esp32-8048S050C]
platform = espressif32
board = esp32-8048S050C
framework = arduino
monitor_speed = 115200
テストプログラム
ごくごく単純な、Hello world プログラムです。
ヘッダ LGFX_ESP32-8048S050C.hpp は次に説明します。
#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クラスのヘッダファイル
いろいろ調べながらヘッダファイルを作りました。
#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);
}
};
パネルの設定はこれでいいはずですが、どうも表示が変です。
よく観察して見ると、横長の線だけ表示できているようです。
この現象はクロックの設定が間違っている予感がします。
ヘッダで定義した設定が実際に使われているところを調べてみました。
すると、、、
lcd_clock.lcd_ck_idle_edge = false;
lcd_clock.lcd_ck_out_edge = _cfg.pclk_idle_high;
なんかおかしくないですか! pclk_active_neg が使われてないし!
真正面から質問してみましたが、応答がありませんでした。
(ChatGPTに翻訳させたので、ちゃんと伝わっていない可能性もあります。)
解決策は2種類あります。
1つ目は、LovyanGFX を書き換えちゃう案。
lcd_clock.lcd_ck_idle_edge = _cfg.pclk_idle_high;
lcd_clock.lcd_ck_out_edge = _cfg.pclk_active_neg;
2つ目は、現物合わせでヘッダを記述する案。
// 本来こうなのでは
//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; // ねじれ
どっちを選ぶにしてもキモイですね。。。
ちゃんと設定できると、ちゃんと表示できます。
その他
バックライトの
cfg.freq = 1000;
cfg.pwm_channel = 7;
は、かなり苦労しました。
freq の値によって50%にしたときの明るさが異なります。
自分の体感で、50%が50%になるような値を探ったつもりです。
タッチパネルの
cfg.pin_int = -1; // GT911_TOUCH_CONFIG_INT;
も、苦労しました。正しそうな値を設定するとなぜか動きません。
-1 が正解のようです。
なお、タッチパネルのキャリブレーションは不要で、LCDでの座標がそのまま得られるようです。


