SainSmart 2.2inch Serial LCDを買った

理由は少し大きめの液晶が欲しくなったから。 選定基準として

  • 解像度はそこまで必要がない
  • 2.0inch 前後の液晶のサイズ
  • タッチパネル機能はいらない
  • 動作報告がある

その中でレビューやページをを読む限りESP32でも動作しているであろう SainSmartのものを購入、サンプルコードが動作するまでをまとめる。

参考:

最終的な配線

ESP32Sと2.2inch Serial LCD Displayの配線図

最終的な配線はこのようになる。 ここまでの配線ができたら adafruit/Adafruit_ILI9341: Library for Adafruit ILI9341 displaysgraphictest のサンプルが動作するところまできた。

2.2 inch Serial LCD のピン配置

基板の印字から、2.2 inch Serial LCDのピン配置はこうなっている。

ESP32ボードのピン配置

このそれぞれのピンに何を繋げばいいかを調べる。

他サイトから情報を探す

SPIでググるといろんなものがでてくる

SPIでもSPI、VSPI、HSPIの表記があってどれがどれかわからない。

Switch Scienceさんの https://trac.switch-science.com/wiki/esp32_tips#SPI%E9%80%9A%E4%BF%A1 がわかりやすかった。

SPI通信

内部の仕様について

ESP-WROOM-32に搭載されているコントローラーにはSPIモジュールが3つ内蔵されています。それぞれ、

  • SPI
  • HSPI
  • VSPI

の名称がつけられています。このうち、SPIに関しては上記ピンアサインの項目の通りFSPIとして内蔵FLASHとの接続に使われています。 よって、普段周辺機器を接続する際にはHSPIもしくはVSPIの回路を利用することになります。 この2つに関しては、SlaveとMasterどちらも利用可能です。

一方で、ArduinoのSPIライブラリは、 ライブラリ中 に定義されるように、VSPI回路を利用します。 更に、独自にSPIクラスをインスタンス化すると、 こちら にあるようにHSPIが利用されます。 例えば、SPIclass SPI2; とやると、SPI2インスタンスはHSPI回路を利用し、 標準のSPIインスタンスとは別の回路で動きます。

各SPIモジュールのピンアサインは以下の通りです。ただし、GPIOマトリックスの項目で説明した通り、比較的自由にリマッピング可能です。

  • HSPI - SCK,MISO,MOSI,SS = 14,12,13,15
  • VSPI - SCK,MISO,MOSI,SS = 18,19,23,5

ピンを指定するときは、SPI.begin(SCK, MISO, MOSI, SS); というふうに引数を指定します。

And the SPI library should support all three possible SPI interfaces. By default, here are the pin mappings for those interfaces:

SPI Signal ESP32 Pin
MOSI 23
MISO 19
SCLK 18
SS 5

ESP32-dev-moduleのピンマップを確認する。 も照らし合わせると、どうやら上記の表までは正しいようだ。

しかしまだ余っているピンが4つくらいある。これはどうすればよいのだろうか。

  TFT ESP-WROOM-32
1 VCC 3V3 / VCC
2 GND GND
3 CS IO5 (VSPICS0)
4 RESET IO16
5 DC IO17
6 MOSI IO23 (VSPID)
7 SCK IO18 (VSPICLK)
8 LED 3V3 / VCC
9 MISO IO19 (VSPIQ)

この TFT モジュールを使うのに必要なライブラリは以下の2つです。Arduino IDE の libraries フォルダにコピーしてください (zip で取得したのであれば [スケッチ | ライブラリをインクルード | .zip 形式のライブラリをインストール…] からでも OK)。

サンプルスケッチは graphicstest.ino ですが、このままではうまく動きませんので少し修正します。


ESP-WROOM-32

// For the Adafruit shield, these are the default.
#define TFT_RST 16 // 追加
#define TFT_DC 17
#define TFT_CS 5

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

最終的にはこのピン配置とこの変更で graphictest サンプルが動作するようになった。 SPI用のピン以外にも必要な処理があるようだ。LEDはバックライトか。

コレ以外に、ディスプレイの製造元、SainSmartのページにもドキュメントやサンプルソースコードが落ちている。

2.2 inch Serial Port TFT SPI LCD Screen Module Support the Arduino Board DIY – SainSmart.com

しかし、SainSmartのページで配布されているライブラリは古すぎてESP32で利用する場合、変更する箇所がとても多くなる。 githubから落としてくる方が無難。

ということで Adafruitのライブラリのインストールを行う。

Arduino IDEにライブラリのインストールを行う

この2つをダウンロードし、 ~/Documents/Arduino/libraries/ 以下に展開する。 展開が終わったらArduino IDEを再起動し、スケッチ例の中に ILI9341 -> graphicstest が存在し、ESP32の設定でコンパイルできるか確認する。

コンパイルが通るようであれば、まずは以下の様に配線する。

ESP32Sと2.2inch Serial LCD Displayの配線図

その上で、ソースコードに上記の

// For the Adafruit shield, these are the default.
#define TFT_RST 16 // 追加
#define TFT_DC 17
#define TFT_CS 5

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

という変更を加え、実際に書き込み動作を確認する。

実際に配線して確かめる

またどこかでSPIについてちゃんと調べねばならない。