製品の概要

今回はタッチセンサー付きのLCD の説明です。LCD 2.5" 解像度 240x320 です。裏面には SDカードソケットが付いています。 外見がほとんど同じでタッチセンサの無い製品が有ります。注意してください。 今回はタッチセンサ有りの製品です。

TFT 2.5inch display outline
サイズ2.8”
LCDドライバILI9341
解像度(X, Y)240, 320
通信方式SPI
動作電圧3.3~5V
タッチセンサ有り
その他SDカードソケット

動作確認

ESP32に繋いで動作を確認しました。

* 配線

TFT 2.5inch display pin layout
  • SPI は ESP32 のデフォルトピンを接続。
  • タッチセンサを使用しなければ、10から14(頭が”T_”で始めるピン)の配線は不要。
  • SPIの信号線をLCDとタッチセンサで共有しています。
  • MOSIとT_DIN 、MISOとT_DO を繋いでいる点に注意。

* ソフト

Arduino IDE を前提として話を進めます。ライブラリーとして”TFT_eSPI”を使用します。先ずはライブラリーのインストール。 Arduino IDEで ツール ー> ライブラリー管理と進み ライブラリマネージャの検索欄に”tft_espi”と入力するとTFT_eSPIが表示されます。 それをインストール。

Install TFT_eSPI

インストール後、Arduino\libraries\TFT_eSPI-masterフォルダに”User_Setup.h”が出来ます。 これを今回のハードに合わせて編集します。このLCDのドライバは”ILI9341”なので それに合わせて設定して行きます。

  • ドライバの選択
    • 46行位にドライバーの選択が有ります。
    • 今回は、ILI9341_2_DRIVER を選択しています。
    • TFT_eSPI setup for drier
  • 解像度の指定
    • 85行目あたりに解像度の設定が有ります。
    • 240x320を下記の様に設定しています。
    • TFT_eSPI setup for resolution
  • バックライトのオンオフ設定
    • 大体130行目あたりに LCDのバックライトのオンオフ設定が有ります。
    • LCDのピン8のLEDがこれに当たります。今回はGPIO05と繋いでいるので define TFT_BL  5。
    • その下でオン条件を設定しています。これで HIGHでオンに成ります。
    • TFT_eSPI setup for backlight
  • SPI設定
    • 212行あたりにSPI信号関係の設定が有ります。
    • 今回はリセットピンをESP32のリセットと共有しています。
    • 設定ファイル的にはこのピンを使用していない扱いとなります。この様な場合は”ー1”を指定します。(下記217行)
    • TFT_eSPI setup for SPI
  • 今回は使用しませんが
    • 今回は上記のSPIをVSPIとして使用する為設定しませんが、HSPIとして使用したい場合下記の378行のコメントを外します。
    • TFT_eSPI setup for HSPI

上記設定後、Arduino IDEで ファイル ー> スケッチ例 ー>  TFT_eSPI ー>  320×240 ー> Keypad_240x320 を選択してデモ用スケッチを読み込みます。このスケッチはLCDにキーパッドを表示するプログラムです。 コンパイル後、実行して下さい。

キャリブレーションが最初の1回のみ実行されます。LCDの隅に(下記左参照)矢印が表示され矢印の先をタッチします。指でもOKですが、 付属のタッチペンの方が感度が良いです。4箇所順に聞かれます。順にタッチして下さい。なるべく正確にタッチして下さい。 いい加減にやると以後のタッチの位置がずれてしまいます。キャリブレーションが終わるとキーパッドが表示されます。

test result (keypad)

キーを押すと表示欄に数字が表示されます。Sendキーを押すと表示された文字がシリアルモニタに転送されます。 (転送レートを9600にしているのでシリアルモニタの転送レートを9600にセットして下さい)

* 割り込み

このLCDは画面タッチで割り込み信号を出す事が出来ます。これを下記のスケッチで確認しました。

interrupt.ino arduino
#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の画面が白くなり、画面を触る度にシリアルモニタ に触った回数が表示されます。割り込みも問題無く機能します

touched 1 touched 2 touched 3 touched 4 touched 5 touched 6 touched 7

SDカード

このカードはLCDとタッチセンサでSPI信号線を共有しCS信号でお互いを区別しています。 同じコンセプト(CSのみ別で他の信号ラインは共有)で SDカードを下記の様に配線したのですが上手く動きませんでした。

SD_Card_socket type1

そこで、CSを含め全ての信号ラインを LCD と別にし、かつ使用する SPI を HSPI (LCD は VSPI)としたら問題無く機能しました。

SD_Card_socket type2

下記は確認に使用したスケッチ

SD_test.ino arduino
#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) ; }

最後に

低価格ですが描写速度は速くかつ綺麗です。タッチセンサの感度は若干悪く指でも反応 しますが付属のタッチペンを使えば問題なく反応します。

SINCE 2026