以下の内容はhttps://lipoyang.hatenablog.com/entry/2025/09/05/120244より取得しました。


XIAO RP2040でST7789 LCDに日本語を表示 (LovyanGFX使用)

やりたいこと

  • XIAO RP2040でST7789 LCDに日本語文字列を表示させる
  • 開発環境はPlatformIOのArduinoフレームワーク (C++)
  • LovyanGFXライブラリを使用する。

 → Adafruit_GFX と efont を使用する場合は こちら

使用するLCDモジュール

配線

下図のように接続する。VCCを5Vではなく3V3に接続することに注意。
(Arduino UNOのような5V系マイコンであれば5Vに接続する。)


使用するライブラリ

  • LovyanGFX

platformio.ini は下記の通り。

[env:seeed_xiao_rp2040]
platform = https://github.com/Seeed-Studio/platform-seeedboards.git
board = seeed-xiao-rp2040
framework = arduino
lib_deps = 
	lovyan03/LovyanGFX

テストプログラム

// ピン割り当て
#define TFT_MISO      -1 // 接続しない
#define TFT_MOSI      D10
#define TFT_SCLK      D8
#define TFT_CS        D7
#define TFT_DC        D6
#define TFT_RST       D5
#define TFT_BL        D4

// 画面デバイスの定義
#include <LovyanGFX.hpp>
class LGFX : public lgfx::LGFX_Device
{
  lgfx::Panel_ST7789  _panel_instance;
  lgfx::Bus_SPI       _bus_instance;
  lgfx::Light_PWM     _light_instance;

public:
  LGFX(void)
  {
    { // SPIバスの設定
      auto cfg = _bus_instance.config();

      cfg.spi_host = 0;          // 使用するSPIを選択
      cfg.spi_mode = 3;          // SPI通信モード (0 ~ 3)
      cfg.freq_write = 40000000; // 送信時のSPIクロック
      cfg.freq_read = 20000000;  // 受信時のSPIクロック

      cfg.pin_sclk = TFT_SCLK;
      cfg.pin_mosi = TFT_MOSI;
      cfg.pin_miso = TFT_MISO;
      cfg.pin_dc   = TFT_DC;

      _bus_instance.config(cfg);
      _panel_instance.setBus(&_bus_instance);
    }
    { // 表示パネルの設定
      auto cfg = _panel_instance.config();

      cfg.pin_cs   = TFT_CS;
      cfg.pin_rst  = TFT_RST;
      cfg.pin_busy = -1; // 接続しない

      cfg.panel_width  = 240;   // 幅
      cfg.panel_height = 280;   // 高さ
      cfg.offset_x = 0;         // X方向オフセット
      cfg.offset_y = 20;        // Y方向オフセット (なぜか20ドットずれる)

      cfg.invert = true;        // 明暗が反転する場合 true

      _panel_instance.config(cfg);
    }
    { // バックライトの設定
      auto cfg = _light_instance.config();

      cfg.pin_bl = TFT_BL;
      cfg.invert = false;       // 輝度が反転する場合 true
      cfg.freq   = 44100;       // バックライトのPWM周波数
      cfg.pwm_channel = 0;      // 使用するPWMのチャンネル番号 (注意!)

      _light_instance.config(cfg);
      _panel_instance.setLight(&_light_instance);
    }
    setPanel(&_panel_instance);
  }
};
#include <LGFX_TFT_eSPI.hpp>
TFT_eSPI tft = TFT_eSPI();
TFT_eSprite sprite = TFT_eSprite(&tft); // スプライト

String text1, text2; // 表示する文字列

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Hello! ST7789 LCD Test"));

  // 画面の初期化
  tft.init();
  tft.setRotation(1);     // 画面回転(横向き)
  tft.setBrightness(255); // バックライト100%(全点灯)
  tft.fillScreen(TFT_BLACK);

  // スプライトの初期化
  int screenWidth = tft.width();
  int screenHeight = tft.height();
  sprite.createSprite(screenWidth, screenHeight);

  // 表示データ
  text1 = "吾輩は猫である。名前はまだ無い。\nどこで生れたかとんと見当がつかぬ。";
  text1 += "何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。";
  text2 = text1;
  text2 += "吾輩はここで始めて人間というものを見た。";
  text2 += "しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。";
  text2 += "この書生というのは時々我々を捕えて煮て食うという話である。";
  text2 += "しかしその当時は何という考もなかったから別段恐しいとも思わなかった。";
  text2 += "ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。";
  text2 += "掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。";
}

void loop()
{
  // USBシリアルでスペース ' ' を送ると文字サイズが変わる
  static bool update = true;
  static bool baikaku = false;
  while(Serial.available() > 0){
    char c = Serial.read();
    if(c == ' '){
      update = true;
      baikaku = !baikaku;
    }
  }

  if(update){
    update = false;
    if(baikaku == false){
      // 16ドットフォント, 緑色
      const lgfx::v1::IFont *font = &fonts::lgfxJapanGothic_16;
      sprite.setFont(font);
      // sprite.setTextSize(2);
      sprite.setTextColor(TFT_GREEN, TFT_BLACK);
      sprite.fillScreen(TFT_BLACK);
      sprite.setCursor(0, 0);
      sprite.setTextWrap(true);
      const char* str = text2.c_str();
      sprite.println(str);
      sprite.pushSprite(0, 0);
    }else{
      // 24ドットフォント, 水色
      const lgfx::v1::IFont *font = &fonts::lgfxJapanGothic_24;
      sprite.setFont(font);
      sprite.setTextColor(TFT_CYAN, TFT_BLACK);
      sprite.fillScreen(TFT_BLACK);
      sprite.setCursor(0, 0);
      sprite.setTextWrap(true);
      const char* str = text1.c_str();
      sprite.println(str);
      sprite.pushSprite(0, 0);
    }
  }
}

参考





以上の内容はhttps://lipoyang.hatenablog.com/entry/2025/09/05/120244より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14