やりたいこと
→ Adafruit_GFX と efont を使用する場合は こちら
使用するLCDモジュール
- Waveshare 1.69inch LCD Display Module
- スイッチサイエンスで購入
- 240×280ピクセル / 1.69インチ 角丸ディスプレイ
- ドライバIC: ST7789V2 / SPI接続
- コネクタ: MX1.25 8ピン (ケーブル1本付属)
- ケーブルを自作する場合は とかを使用
使用するライブラリ
- 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); } } }
参考
