製品の概要
今回はタッチセンサー付きのLCD の説明です。LCD 2.5" 解像度 240x320 です。裏面には SDカードソケットが付いています。 外見がほとんど同じでタッチセンサの無い製品が有ります。注意してください。 今回はタッチセンサ有りの製品です。
| サイズ | 2.8” |
| LCDドライバ | ILI9341 |
| 解像度(X, Y) | 240, 320 |
| 通信方式 | SPI |
| 動作電圧 | 3.3~5V |
| タッチセンサ | 有り |
| その他 | SDカードソケット |
動作確認
ESP32に繋いで動作を確認しました。
* 配線
- SPI は ESP32 のデフォルトピンを接続。
- タッチセンサを使用しなければ、10から14(頭が”T_”で始めるピン)の配線は不要。
- SPIの信号線をLCDとタッチセンサで共有しています。
- MOSIとT_DIN 、MISOとT_DO を繋いでいる点に注意。
* ソフト
Arduino IDE を前提として話を進めます。ライブラリーとして”TFT_eSPI”を使用します。先ずはライブラリーのインストール。 Arduino IDEで ツール ー> ライブラリー管理と進み ライブラリマネージャの検索欄に”tft_espi”と入力するとTFT_eSPIが表示されます。 それをインストール。
インストール後、Arduino\libraries\TFT_eSPI-masterフォルダに”User_Setup.h”が出来ます。 これを今回のハードに合わせて編集します。このLCDのドライバは”ILI9341”なので それに合わせて設定して行きます。
- ドライバの選択
- 46行位にドライバーの選択が有ります。
- 今回は、ILI9341_2_DRIVER を選択しています。
-
- 解像度の指定
- 85行目あたりに解像度の設定が有ります。
- 240x320を下記の様に設定しています。
-
- バックライトのオンオフ設定
- 大体130行目あたりに LCDのバックライトのオンオフ設定が有ります。
- LCDのピン8のLEDがこれに当たります。今回はGPIO05と繋いでいるので define TFT_BL 5。
- その下でオン条件を設定しています。これで HIGHでオンに成ります。
-
- SPI設定
- 212行あたりにSPI信号関係の設定が有ります。
- 今回はリセットピンをESP32のリセットと共有しています。
- 設定ファイル的にはこのピンを使用していない扱いとなります。この様な場合は”ー1”を指定します。(下記217行)
-
- 今回は使用しませんが
- 今回は上記のSPIをVSPIとして使用する為設定しませんが、HSPIとして使用したい場合下記の378行のコメントを外します。
-
上記設定後、Arduino IDEで ファイル ー> スケッチ例 ー> TFT_eSPI ー> 320×240 ー> Keypad_240x320 を選択してデモ用スケッチを読み込みます。このスケッチはLCDにキーパッドを表示するプログラムです。 コンパイル後、実行して下さい。
キャリブレーションが最初の1回のみ実行されます。LCDの隅に(下記左参照)矢印が表示され矢印の先をタッチします。指でもOKですが、 付属のタッチペンの方が感度が良いです。4箇所順に聞かれます。順にタッチして下さい。なるべく正確にタッチして下さい。 いい加減にやると以後のタッチの位置がずれてしまいます。キャリブレーションが終わるとキーパッドが表示されます。
キーを押すと表示欄に数字が表示されます。Sendキーを押すと表示された文字がシリアルモニタに転送されます。 (転送レートを9600にしているのでシリアルモニタの転送レートを9600にセットして下さい)
* 割り込み
このLCDは画面タッチで割り込み信号を出す事が出来ます。これを下記のスケッチで確認しました。
#include <SPI.h>
#include <TFT_eSPI.h> // Hardware-specific library
TFT_eSPI tft = TFT_eSPI(); // Invoke custom library
int tm;
#define T_IRQ 21
//------------------------------------------------------------------------------------------
void IRAM_ATTR onTouch() {
tm ++;
Serial.println("touched " + String(tm));
}
void setup() {
// Use serial port
Serial.begin(9600);
// Initialise the TFT screen
tft.init();
// Set the rotation before we calibrate
tft.setRotation(0);
// Clear the screen
tft.fillScreen(TFT_WHITE);
tm = 0;
pinMode(T_IRQ, INPUT_PULLUP);
attachInterrupt(T_IRQ, onTouch, FALLING);
}
//------------------------------------------------------------------------------------------
void loop(void) {
delay(1000);
}
LCDからの割り込み信号はLOWがアクティブなので、 ESP32の割り込み条件を”立ち下がり”(FALLING)に設定(31行)します。 このプログラムを実行するとLCDの画面が白くなり、画面を触る度にシリアルモニタ に触った回数が表示されます。割り込みも問題無く機能します
SDカード
このカードはLCDとタッチセンサでSPI信号線を共有しCS信号でお互いを区別しています。 同じコンセプト(CSのみ別で他の信号ラインは共有)で SDカードを下記の様に配線したのですが上手く動きませんでした。
そこで、CSを含め全ての信号ラインを LCD と別にし、かつ使用する SPI を HSPI (LCD は VSPI)としたら問題無く機能しました。
下記は確認に使用したスケッチ
#include <SPI.h>
#include <SD.h>
#include <TFT_eSPI.h> // Hardware-specific library
TFT_eSPI tft = TFT_eSPI(); // Invoke custom library
#define sd_sck 26
#define sd_mosi 33
#define sd_ss 4
#define sd_miso 25
//------------------------------------------------------------------------------------------
SPIClass sd_spi(HSPI);
void setup() {
// Use serial port
Serial.begin(115200);
// Initialise the SD
sd_spi.begin(sd_sck, sd_miso, sd_mosi, sd_ss);
SD.begin(sd_ss, sd_spi);
// Initialise the TFT screen
tft.init();
}
//------------------------------------------------------------------------------------------
void loop(void) {
File fp;
String line;
tft.setRotation(1);
tft.fillScreen(TFT_BLACK); // Clear screen
tft.setTextDatum(MC_DATUM);
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.setTextSize(6);
fp = SD.open("/test.txt", FILE_WRITE);
fp.println("TEST 123");
fp.close();
fp = SD.open("/test.txt", FILE_READ);
line = fp.readStringUntil(0x0d);
fp.close();
Serial.println("data: " + line);
tft.drawString(line,160,120);
while(1) ;
}
最後に
低価格ですが描写速度は速くかつ綺麗です。タッチセンサの感度は若干悪く指でも反応 しますが付属のタッチペンを使えば問題なく反応します。