🐡

Seeed Studio Round Display for XIAOをLGFXで制御

2024/05/28に公開

背景

とあるきっかけでXIAO ESP32C3とSeeed Studio Round Display for XIAOの組み合わせでグラフィック処理を含むプログラムを開発することとなった。

Seeed Studioのサイトで公開されている下記の手順に従って開発を進めようとするも、ライブラリのバージョン違いの影響か正常起動に至らず。
https://wiki.seeedstudio.com/using_lvgl_and_tft_on_round_display/

公式サイト以外に当該デバイスの制御に関する情報が少なく、しかもLGFXを使用した例を見つけられなかったため備忘録として記事に残すこととした。

開発環境、機器構成

  • PlatformIO(VSCode)
  • XIAO ESP32C3
  • Seeed Studio Round Display for XIAO

開発準備

ボード、フレームワークなどを選択し、最終的にplatform.iniが下記となるようにする。
ライブラリとしてLovyanGFXをインストールする。

platform.ini
[env:seeed_xiao_esp32c3]
platform = espressif32
board = seeed_xiao_esp32c3
framework = arduino
lib_deps = 
	lovyan03/LovyanGFX@^1.1.12
board_build.f_cpu = 160000000L ; 160 MHz
monitor_speed = 115200


LGFXを使用するためのヘッダファイル準備

LGFXは様々なディスプレイをサポートしているが、サポート外のディスプレイでも独自で設定用のヘッダファイルを作成することでLGFXのライブラリを利用できる。

https://github.com/lovyan03/LovyanGFX
https://github.com/lovyan03/LovyanGFX/blob/master/examples/HowToUse/2_user_setting/2_user_setting.ino

※本設定ファイルの例はディスプレイのグラフィック制御を主目的としており、タッチスクリーンの設定は割愛している。

LGFX_ESP32_RoundDisplay.hpp
LGFX_ESP32_RoundDisplay.hpp
#pragma once

#define LGFX_USE_V1

#include <LovyanGFX.hpp>

/// 独自の設定を行うクラスを、LGFX_Deviceから派生して作成します。
class LGFX : public lgfx::LGFX_Device
{
// 接続するパネルの型にあったインスタンスを用意します。
lgfx::Panel_GC9A01      _panel_instance;

// パネルを接続するバスの種類にあったインスタンスを用意します。
  lgfx::Bus_SPI       _bus_instance;   // SPIバスのインスタンス

// バックライト制御が可能な場合はインスタンスを用意します。(必要なければ削除)
lgfx::Light_PWM     _light_instance;

public:

  LGFX(void)
  {
    { // バス制御の設定を行います。
      auto cfg = _bus_instance.config();    // バス設定用の構造体を取得します。

      // SPIバスの設定
      cfg.spi_host = SPI2_HOST;     // 使用するSPIを選択  ESP32-S2,C3 : SPI2_HOST or SPI3_HOST / ESP32 : VSPI_HOST or HSPI_HOST
      // ※ ESP-IDFバージョンアップに伴い、VSPI_HOST , HSPI_HOSTの記述は非推奨になるため、エラーが出る場合は代わりにSPI2_HOST , SPI3_HOSTを使用してください。
      cfg.spi_mode = 0;             // SPI通信モードを設定 (0 ~ 3)
      cfg.freq_write = 40000000;    // 送信時のSPIクロック (最大80MHz, 80MHzを整数で割った値に丸められます)
      cfg.freq_read  = 16000000;    // 受信時のSPIクロック
      cfg.spi_3wire  = false;        // 受信をMOSIピンで行う場合はtrueを設定
      cfg.use_lock   = true;        // トランザクションロックを使用する場合はtrueを設定
      cfg.dma_channel = SPI_DMA_CH_AUTO; // 使用するDMAチャンネルを設定 (0=DMA不使用 / 1=1ch / 2=ch / SPI_DMA_CH_AUTO=自動設定)
      // ※ ESP-IDFバージョンアップに伴い、DMAチャンネルはSPI_DMA_CH_AUTO(自動設定)が推奨になりました。1ch,2chの指定は非推奨になります。
      cfg.pin_sclk = D8;            // SPIのSCLKピン番号を設定
      cfg.pin_mosi = D10;            // SPIのMOSIピン番号を設定
      cfg.pin_miso = D9;            // SPIのMISOピン番号を設定 (-1 = disable)
      cfg.pin_dc   = D3;            // SPIのD/Cピン番号を設定  (-1 = disable)
     // SDカードと共通のSPIバスを使う場合、MISOは省略せず必ず設定してください。

      _bus_instance.config(cfg);    // 設定値をバスに反映します。
      _panel_instance.setBus(&_bus_instance);      // バスをパネルにセットします。
    }

    { // 表示パネル制御の設定を行います。
      auto cfg = _panel_instance.config();    // 表示パネル設定用の構造体を取得します。

      cfg.pin_cs           =    D1;  // CSが接続されているピン番号   (-1 = disable)
      cfg.pin_rst          =    -1;  // RSTが接続されているピン番号  (-1 = disable)
      cfg.pin_busy         =    -1;  // BUSYが接続されているピン番号 (-1 = disable)

      // ※ 以下の設定値はパネル毎に一般的な初期値が設定されていますので、不明な項目はコメントアウトして試してみてください。

      cfg.panel_width      =   240;  // 実際に表示可能な幅
      cfg.panel_height     =   240;  // 実際に表示可能な高さ
      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           =  true;  // パネルの明暗が反転してしまう場合 trueに設定
      cfg.rgb_order        =  false;  // パネルの赤と青が入れ替わってしまう場合 trueに設定
      cfg.dlen_16bit       =  false;  // 16bitパラレルやSPIでデータ長を16bit単位で送信するパネルの場合 trueに設定
      cfg.bus_shared       =  true;  // SDカードとバスを共有している場合 trueに設定(drawJpgFile等でバス制御を行います)

      _panel_instance.config(cfg);
    }

    setPanel(&_panel_instance); // 使用するパネルをセットします。
  }
};


main.cppからの呼び出し

srcフォルダに上記で準備したLGFX_ESP32_RoundDisplay.hppが配置されている前提とする。

main.cpp
main.cpp
#include <Arduino.h>
#include <LovyanGFX.hpp>
#include "LGFX_ESP32_RoundDisplay.hpp"

static LGFX lcd;
uint32_t count;

void setup()
{
  lcd.init();
}

void loop()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.printf("%d\r\n", count++);
  delay(1000);
}

Discussion