理由は少し大きめの液晶が欲しくなったから。 選定基準として
その中でレビューやページをを読む限りESP32でも動作しているであろう SainSmartのものを購入、サンプルコードが動作するまでをまとめる。
参考:
最終的な配線はこのようになる。 ここまでの配線ができたら adafruit/Adafruit_ILI9341: Library for Adafruit ILI9341 displays の graphictest のサンプルが動作するところまできた。
基板の印字から、2.2 inch Serial LCDのピン配置はこうなっている。
このそれぞれのピンに何を繋げばいいかを調べる。
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)。
- https://github.com/adafruit/Adafruit_ILI9341 (TFT ライブラリ)
- https://github.com/adafruit/Adafruit-GFX-Library (グラフィックライブラリ)
サンプルスケッチは 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のライブラリのインストールを行う。
この2つをダウンロードし、 ~/Documents/Arduino/libraries/ 以下に展開する。 展開が終わったらArduino IDEを再起動し、スケッチ例の中に ILI9341 -> graphicstest が存在し、ESP32の設定でコンパイルできるか確認する。
コンパイルが通るようであれば、まずは以下の様に配線する。
その上で、ソースコードに上記の
// 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についてちゃんと調べねばならない。