Waveshare RP2040-LCD-1.28でLovyanGFXを使う方法

RP2040と1.28インチの丸型液晶が載った「Waveshare RP2040-LCD-1.28」でLovyanGFXを動かしてみます。

製品情報はこちら
ドライバ：**GC9A01A**
インターフェース：**SPI**

https://www.waveshare.com/wiki/RP2040-LCD-1.28


こちらのボード情報を設定しておけば、**Waveshare RP2040 LCD 1.28**がサポートされてるので便利

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/f4019e54-795d-764b-8737-a41c0a6a71fd.png" width="50%"/>

https://github.com/earlephilhower/arduino-pico/



### LovyanGFXを使ってみる 

GC9A01ドライバに対応するLGFX作ります。
以下のベースを参考にすると楽になります。

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

#### 変更点

##### パネルを、**GC9A01**に変更

```cpp
// 接続するパネルの型にあったインスタンスを用意します。
lgfx::Panel_GC9A01      _panel_instance;
```


##### バスにSPIを指定

バスは、**SPI**を指定
```
lgfx::Bus_SPI        _bus_instance;   // SPIバスのインスタンス
```

##### 各種パラメータを合わせる
###### ポート番号

|GPIO  |TYPE |REMAKRS  |
|---|---|---|
|GP6  |IMU_SDA  |I2C SDA  |
|GP7  |IMU_SCL  |I2C SCL  |
|GP8  |LCD_DC  |LCD Command/Data Selection  |
|GP9  |LCD_CS  |LCD Chip Selection  |
|GP10  |LCD_CLK  |LCD CLK  |
|GP11  |LCD_DIN  |LCD MOSI  |
|GP12  |LCD_RST  |LCD Rest  |
|GP25  |LCD_BL  |LCD Backlight Control |
|GP29  |BAT_ADC  |Battery Voltage Acquition Pin  |

バス制御の設定
```CPP
auto cfg = _bus_instance.config();    // バス設定用の構造体を取得します
cfg.pin_sclk   = 10;
cfg.pin_miso   = -1;
cfg.pin_mosi   = 11;
cfg.pin_dc     = 8;
```


表示パネル制御の設定
画面の解像度は、240 x 240
```
auto cfg = _panel_instance.config();    // 表示パネル設定用の構造体を取得します。
cfg.pin_cs           =    9;  // CSが接続されているピン番号   (-1 = disable)
cfg.pin_rst          =    12;  // RSTが接続されているピン番号  (-1 = disable)
cfg.panel_width      =   240;  // 実際に表示可能な幅
cfg.panel_height     =   240;  // 実際に表示可能な高さ
```

バックライト制御の設定
```
auto cfg = _light_instance.config();
cfg.pin_bl      = 25;
cfg.pwm_channel = 1;
```

#### LGFXクラス（Waveshare RP2040-LCD-1.280)
LCDのポート等を設定したLGFXクラスは以下の通り

```CPP
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();    // バス設定用の構造体を取得します。
        cfg.spi_host   = 1;
        cfg.spi_mode   = 0;
        cfg.freq_write = 80000000;
        cfg.pin_sclk   = 10;
        cfg.pin_miso   = -1;
        cfg.pin_mosi   = 11;
        cfg.pin_dc     = 8;
        _bus_instance.config(cfg);
        _panel_instance.setBus(&_bus_instance);
      }

      { // 表示パネル制御の設定を行います。
        auto cfg = _panel_instance.config();    // 表示パネル設定用の構造体を取得します。
        cfg.pin_cs           =    9;  // CSが接続されているピン番号   (-1 = disable)
        cfg.pin_rst          =    12;  // RSTが接続されているピン番号  (-1 = disable)
        cfg.panel_width      =   240;  // 実際に表示可能な幅
        cfg.panel_height     =   240;  // 実際に表示可能な高さ
        cfg.offset_x         =     0;  // パネルのX方向オフセット量
        cfg.offset_y         =     0;  // パネルのY方向オフセット量
        cfg.readable         =  true;  // データ読出しが可能な場合 trueに設定
        cfg.invert           =  true;  // パネルの明暗が反転してしまう場合 trueに設定

        _panel_instance.config(cfg);
      }
      {
        auto cfg = _light_instance.config();
        cfg.pin_bl      = 25;
        cfg.pwm_channel = 1;
        _light_instance.config(cfg);
        _panel_instance.setLight(&_light_instance);
      }

      setPanel(&_panel_instance); // 使用するパネルをセットします。
    }
};
```
※同じメーカーのこちらが大変参考になりました。
https://github.com/lovyan03/LovyanGFX/blob/develop/src/lgfx_user/LGFX_RP2040_096_Waveshare_sample.hpp


### 動かしてみる

あとは、LovyanGFXのサンプルと上記クラスを組み合わせたらこんな感じに。

https://twitter.com/masaya3/status/1633839827039961090


### まとめ
LGFXクラスができるまで少し詰まりましたが、できたらLovyanGFXが動くので表示はすごく簡単で便利です。
ウェアラブルなどの開発が捗りそうですな。