M5 ATOM Lite LovyanGFXでST7735S液晶を描画。SPI通信

# LovyanGFXでST7735S液晶に描画するときの初期設定SPI通信
![IMG_4866.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/3c189e02-e508-2659-795f-d6538c2c2b47.jpeg)
液晶を横置きで描画できるように、メモリマップを回転。
![IMG_4867.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/dd5534d2-3000-7824-41d9-9796884c0ffa.jpeg)
LEDとリセット、SPIラインを基板化。
![IMG_4870.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/6b12d95e-9445-bdf7-6043-a74d26202310.jpeg)



:::note
液晶：ST7735S
128×160ピクセル
左上を(0,0)にしています。
:::

:::note info
ATOM Lite SPI接続配線
|pin番号|SPI名|
|:---:|:---:|
|G22|mosi|
|G19|SCK|
|G23|A0(D/C)データコマンド選択端子|
|G33|CSチップセレクト|
:::

![配線図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/e820e572-2cd2-3c3e-c561-a3a93ef95d67.jpeg)
LED端子はIOピンでON,OFFできます。

:::note info
開発環境：VSCODE＋platformIO
[env:m5stack-atom]
platform = espressif32
board = m5stack-atom
framework = arduino
lib_deps = 
	m5stack/M5Atom@^0.1.2
	fastled/FastLED@^3.7.0
	lovyan03/LovyanGFX@^1.1.16
:::

# コード
```CPP:main.cpp
#include <M5Atom.h>
#include <FastLED.h>
#include <LovyanGFX.hpp>

// ESP32でLovyanGFXを独自設定で利用する場合の設定例

/// 独自の設定を行うクラスを、LGFX_Deviceから派生して作成します。
class LGFX : public lgfx::LGFX_Device
{

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

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

public:

  // コンストラクタを作成し、ここで各種設定を行います。
  // クラス名を変更した場合はコンストラクタも同じ名前を指定してください。
  LGFX(void)
  {
    { // バス制御の設定を行います。
      auto cfg = _bus_instance.config();    // バス設定用の構造体を取得します。

      // SPIバスの設定
      cfg.spi_host = VSPI_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   = false;        // トランザクションロックを使用する場合はtrueを設定
      cfg.dma_channel = 0; // 使用するDMAチャンネルを設定 (0=DMA不使用 / 1=1ch / 2=ch / SPI_DMA_CH_AUTO=自動設定)
      // ※ ESP-IDFバージョンアップに伴い、DMAチャンネルはSPI_DMA_CH_AUTO(自動設定)が推奨になりました。1ch,2chの指定は非推奨になります。
      cfg.pin_sclk = 19;            // SPIのSCLKピン番号を設定
      cfg.pin_mosi = 22;            // SPIのMOSIピン番号を設定
      cfg.pin_miso = -1;            // SPIのMISOピン番号を設定 (-1 = disable)
      cfg.pin_dc   = 23;            // 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           =    33;  // CSが接続されているピン番号   (-1 = disable)
      cfg.pin_rst          =    -1;  // RSTが接続されているピン番号  (-1 = disable)
      cfg.pin_busy         =    -1;  // BUSYが接続されているピン番号 (-1 = disable)

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

      cfg.panel_width      =   128;  // 実際に表示可能な幅
      cfg.panel_height     =   160;  // 実際に表示可能な高さ
      cfg.offset_x         =     0;  // パネルのX方向オフセット量
      cfg.offset_y         =     0;  // パネルのY方向オフセット量
      cfg.offset_rotation  =     1;  // 回転方向の値のオフセット 0~7 (4~7は上下反転)
      cfg.dummy_read_pixel =     8;  // ピクセル読出し前のダミーリードのビット数
      cfg.dummy_read_bits  =     1;  // ピクセル以外のデータ読出し前のダミーリードのビット数
      cfg.readable         = false;  // データ読出しが可能な場合 trueに設定
      cfg.invert           = false;  // パネルの明暗が反転してしまう場合 trueに設定
      cfg.rgb_order        = true;  // パネルの赤と青が入れ替わってしまう場合 trueに設定
      cfg.dlen_16bit       = false;  // 16bitパラレルやSPIでデータ長を16bit単位で送信するパネルの場合 trueに設定
      cfg.bus_shared       = false;  // SDカードとバスを共有している場合 trueに設定(drawJpgFile等でバス制御を行います)

      // 以下はST7735やILI9163のようにピクセル数が可変のドライバで表示がずれる場合にのみ設定してください。
      cfg.memory_width     =   128;  // ドライバICがサポートしている最大の幅
      cfg.memory_height    =   160;  // ドライバICがサポートしている最大の高さ

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

LGFX display;

void setup(void)
{
  M5.begin(true,false,true);
  M5.dis.drawpix(0,0x00000F);
  display.init();
  display.fillScreen(TFT_LIGHTGRAY);
  display.drawRect(5,5,150,120,TFT_NAVY);
  display.setCursor(0,0);
  display.print("ST7735S");
}

int clr[6]={TFT_BLUE,TFT_GREEN,TFT_RED,TFT_YELLOW,TFT_MAGENTA,TFT_VIOLET};

void loop(void)
{
  int i,j; 
  int x,y;
  j=0;
  i=0;
  do
  {
    y=10+20*i;
    display.fillRect(10,y, 100, 15,clr[j]);
    Serial.printf("y=%d\n",y);
    delay(1000);
    i++;
    j++;
    if(j>=6)
      j=0;
    if(y>=110)break;
  }while(1);
  display.fillScreen(TFT_LIGHTGRAY);
  display.drawRect(5,5,150,120,TFT_NAVY);
  display.setCursor(0,0);
  display.print("ST7735S");
}

```