LCD(ST7789)付きESP32開発基板 TTGO T-Display V1.1を使う

コンピュータ、組み込み

技適付きでLCD(ST7789)付きESP32基板 T-Display V1.1を入手しました。
ESP32-WROOMと同じXtensa LX6を搭載しています。
基本的な入出力と、通信(UART, I2C, SPI)と、無線Bluetoothを使ってみます。
実装LCD(ST7789V)を使ってみます。

紹介するもの

T-Display V1.1

特徴

小型のLCD ST7789V 搭載。
技適付きでWifi, Bluetoothを使用できます。

接続Type C(CH9102)
CPUXtensa dual-core 32bit LX6 240MHz
メモリFlash Memory 4MB または 16MBから選択
SRAM 520KByte
フラッシュMemory4MB または 16MBから選択
GPIO16 (4本は入力のみ)
ADC13 (12bit 0 ~ 4095)
DAC2 (8bit 0 ~ 255)
PWM12 (8bit 0 ~ 255)
UART1(UART0 書き込み用)
I2C1
SPI2(ST7789Vで使用)
ボタンユーザボタン 2個 (GPIO0, GPIO35)
そのほかLCD ST7789V 1.14inch
PH2.0 バッテリーコネクタ
Wifi 802.11 b/g/n
Bluetooth V4.2 + BLE

T-Display Github

ピン配置

外観

400穴ブレッドボードでは、左右1列ずつ使用することができます。

T-Displayシリーズは専用のケースも販売されていて、収納することで小型のゲーム機のようになります。
収納後の使い勝手はT-Display RP2040で紹介しています。

使ってみて

充実した機能に、価格、サイズが手ごろで使いやすい基板です。
国内ショップでの流通はありませんが、Ali Expressから調達できます。

同基板では技適の無いもの(技適取得前の在庫品でしょうか?)もありますので、信用できるショップでの購入や、事前に確認するなど必要です。
当方が使用している基板についてもMCUにケースを貼り付けた形状をしていますが、最近の物(2023の春くらい)は、ケースがなくなりシルクでマークが印刷しているタイプになっているようです。

MCUはLX6でS3のLX7に世代交代が始まっていますが、同等の処理速度で無線も使えるのでほとんど遜色なく使用できます。
個人的には、このMCUのライブラリのほうが使い勝手がいいと感じています。
ESP32-WROOM32のスケッチを利用することができるので、ピン配線を確認して配線してください。

バッテリーコネクタがを使用する場合、コネクタ周辺の部品に干渉しやすいです。
挿抜がしにくいので部品の破損に注意して作業してください。

RP2040を搭載したT-Display RP2040 も紹介しています。

技適付きESP32-S3ではT-Display S3も販売されています。
こちらも注文した製品が必ず技適付きが送られてくるとは限りませんので、購入前に店舗に確認をするなどしてください。

準備

ライブラリ

ボードライブラリ

Arduino IDEのボードマネージャからESP32用のライブラリのインストールとボードの選択をします。

ボードマネージャのURLhttps://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
検索ESP
ボードライブラリesp32 by Espressif Systems バージョン x.x.x※
選択するボードツール > ボード > esp32 > ESP32 Dev Module
※ x.x.x Sep/2022 動作確認は2.0.5を使用しています

モジュールライブラリ

機能/モジュールライブラリ名検索確認時のバージョン
SSD1306Adafruit SSD1306 by AdafruitSSD13062.5.1
ST7735Adafruit ST7735 and ST7789
Library by Adafruit
ST77351.9.3
関連
SSD1306
ST7735
Adafruit GFX Library by AdafruitGFX1.11.3

書き込み

Arduino IDEの書き込みボタンから書き込みを行えます。

BTペアリング

BT通信をする場合こちらの作業が必要になります。

ノートPC、スマートフォン、タブレットまた、BTレシーバを準備してください。
ペアリングの方法については一般のBT製品と同じですので詳細は省略します。
個々のマニュアルを参照してください。

今回当方の確認方法としてAndroidスマートフォンでのペアリングを掲載します。

1.スケッチを書き込み、マイコンボードを起動させます。
※GPIO0とGNDをショートさせている場合は、ショートを解除してから再起動します。

2.BT設定画面から周囲のBT機器を検索します。
  今回のサンプルでは [BTSAMPLE]という名前で見つかります。

3.シリアル通信をする場合、シリアル通信用のアプリケーションをインストールします。
  参考として当方が利用している「Serial Bluetooth Terminal」を紹介します。

基本スケッチ

説明

ユーザボタンGPIO35(Left Sideとします)が押下されたらLEDを点灯
ユーザボタンGPIO0(RIght Sideとします)が押下されたらLEDを消灯

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
T-Display V1.1

【スケッチの説明】
ユーザボタンGPIO35(Left Sideとします)が押下されたらLEDを点灯
ユーザボタンGPIO0(RIght Sideとします)が押下されたらLEDを消灯

【ライブラリ】
esp32 > ESP32 Dev Module

【準備】
GPIO12 -> 保護抵抗(約200Ω) -> LED Anode, LED Cathode -> GND

【バージョン情報】
2022/12/8 : 新規
**********************************************************************/

#define LED 12       //基板実装LED 赤(基板裏面)

//USBコネクタを上側にしたときにLeftSide と RightSideとします。
#define BUTTON_L 35    //基板実装スイッチ LeftSide
#define BUTTON_R 0     //基板実装スイッチ RightSide

void setup()
{
  pinMode(LED, OUTPUT);                 //ピン出力設定

  pinMode(BUTTON_L, INPUT_PULLUP);      //プルアップで入力
  pinMode(BUTTON_R, INPUT_PULLUP);      //T-DisplayのユーザボタンはPULLDOWN設定にしてもPULLUPになるので、PULLUPとした。

  Serial.begin(115200);
}

void loop()
{
  //PULLUP設定のためボタン押下状態がLOW

  if(digitalRead(BUTTON_L) == LOW)
  {
    digitalWrite(LED, HIGH);            //ボタンLeftSideが押下されていた場合は、LEDを点灯
  }
  else if(digitalRead(BUTTON_R) == LOW)
  {
    digitalWrite(LED, LOW);             //ボタンRightSideが押下されていた場合は、LEDを消灯
  }
}
結果

ユーザボタンGPIO35(Left Sideとします)を押下するとLEDが点灯しました。
ユーザボタンGPIO0(RIght Sideとします)を押下するとLEDが消灯しました。

PWM

説明

PWMを使ってLEDのフェード点灯(ゆっくり点灯させる)を行います。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
T-Display V1.1 で利用できます。

【スケッチの説明】
PWM出力でのフェード点灯(ゆっくり点灯)とフェード消灯(ゆっくり消灯)を行います。

【ライブラリ】
esp32 > ESP32 Dev Module

【準備】
GPIO12 - 保護抵抗(約200Ω) - LED Anode, LED Cathode - GND
抵抗値は使用するLEDにより適切な抵抗値を求めてください。

【バージョン情報】
2022/12/8 : 新規
**********************************************************************/

#define PWM 12        //PWM 出力

void setup()
{
  pinMode(PWM , OUTPUT);
}

void loop()
{
  for(int i = 0; i < 256; i ++)
  {
    analogWrite(PWM, i);
    delay(2);
  }

  for(int i = 0; i < 256; i ++)
  {
    analogWrite(PWM, 255 - i);
    delay(2);
  }
}
結果

実装LEDがゆっくり点灯、ゆっくり消灯しました。

ADC

説明

T-Display V1.1にはアナログ出力があります。
DACから出力したアナログ信号をADCで読み取ります。

DACは8bit(0~255)で設定して最大で3.3V出力します。
ADCは12bit(0~4095)の最大3.3Vを読み出します。

配線

GPIO26 と GPIO36を直接配線します。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
T-Display V1.1 で利用できます。

【スケッチの説明】
DACからの電圧をADCに入力します。
読み取った電圧をCOMに出力します。

【ライブラリ】
esp32 > ESP32 Dev Module

【準備】
GPIO26(DAC) <-> GPIO36(ADC)

【バージョン情報】
2022/12/8 : 新規
**********************************************************************/
//T-Display V1.1 dacWriteに設定できるピン
// 25, 26 //DAC (8bit : 0 - 255)

#define DAC 26
#define ADC 36

void setup()
{
  Serial.begin(115200);

  pinMode(DAC, OUTPUT);
  pinMode(ADC, INPUT);
}

void loop()
{
  int iADC = 0;
  //アナログ出力を、アナログ入力で読み取ります。
  //結果はCOM出力します。
  for(int i = 0; i < 256; i ++)
  {
    dacWrite(DAC, i);
    iADC = analogRead(ADC);
    Serial.printf("(DAC, ADC) = %d, %d\r\n", i, iADC);
    delay(2);
  }

  for(int i = 0; i < 256; i ++)
  {
    dacWrite(DAC, 255 - i);
    iADC = analogRead(ADC);
    Serial.printf("(DAC, ADC) = %d, %d\r\n", 255 - i, iADC);
    delay(2);
  }
}
結果

結果を波形にしました。
横軸はデータ数(index)です。
縦軸左は設定したDA値、縦軸右が読み取ったAD値。

設定に対して読み取ったAD値は湾曲しています。

UART(省略します)

省略します。
UART0として使用はできます。

I2C(SSD1306)

説明

I2Cを使用してSSD1306の表示制御を行います。

図形の描画やそのほかの命令はArduinoサンプルスケッチを参照してください。
ファイル(F) > スケッチ例 > Adafruit SSD1306 > ssd1306_128x64_i2c

配線
T-Display V1.1配線SSD1306(0.96inch)
3.3VVCC
GNDGND
GPIO22SCL
GPIO21SDA
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
T-Display V1.1 基板で利用できます。

【スケッチの説明】
SSD1306 OLEDの制御をします。

【ライブラリ】
esp32 > ESP32 Dev Module
Adafruit SSD1306 by Adafruit
Adafruit GFX Library by Adafruit

【準備】
マイコン基板 <-> SSD1306
3V3         <-> VCC
GND         <-> GND
GPIO21(SDA) <-> SDA
GPIO22(SCL) <-> SCL

【バージョン情報】
2022/12/3 : 新規
**********************************************************************/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128                //解像度 128 x 64 で使用します。
#define SCREEN_HEIGHT 64                //SCREEN_HEIGHTは 32 に設定することができます。

#define OLED_RESET     -1               //使用しないので -1を設定する。
#define SCREEN_ADDRESS 0x3C             //I2Cアドレスは 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
                                        //表示制御にはAdafruit製 SSD1306を使用する。
                                        
void setup()
{
  

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for(;;);
  }

  display.clearDisplay();               //何か表示されている場合に備えて表示クリア

  display.setTextSize(2);               //フォントサイズは2(番目に小さい)
  display.setTextColor(SSD1306_WHITE);  //色指定はできないが必要
  display.setCursor(20, 15);            //テキストの表示開始位置
  display.print(F("TAMANEGI"));         //表示文字列
  display.setCursor(15, 35);
  display.print(F("T-Display"));

  display.display();                    //バッファ転送(表示)
}

void loop()
{
}
結果

SSD1306のサンプルスケッチが動作しました。

SPI(ST7735)

説明

SPIを使って実装ST7789V(LCD 1.14inch)とST7735(LCD 1.8inch)モニタのサンプルを動作させます。
ST7789Vは内部でVSPIが配線されています。
使用するには電源にGPIO14をHIGH, バックライトにGPIO4をHIGHにします。

GPIO14はHSPIのSCKであるために、T-Display V1.1ではHSPIを使用することができません。
今回はピン指定して使用するS/W SPIにてジャンパワイヤで配線したST7735の表示制御をします。

図形の描画やそのほかの命令はArduinoサンプルスケッチを参照してください。
ファイル(F) > スケッチ例 > Adafruit ST7735 and ST7789 Library > graphicstest

配線

実装ST7789Vは配線不要。

ST7735を使用する場合の配線

HSPIを使用したかったのですが、GPIO14(SCK)は 実装モニタST7789Vの電源に使用されているので、ピン配置を割り当てたS/W SPIで配線します。

T-Display V1.1配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GPIO15(HSPI CS)CS
GPIO27Reset
GPIO26AO(DC)
GPIO13(HSPI MOSI)SDA
GPIO2SCK
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
T-Display V1.1 で利用できます。

【スケッチの説明】
ST7735 LCDの制御をします。
VSPIは基板実装LCD ST7789V
HSPIはS/W SPIを使用し、ワイヤー接続でST7735の表示制御を行います。

基板実装LCDはバックライトにGPIO4, LCDの電源にGPIO14をHIGHにすることで動作表示されます。

【ライブラリ】
esp32 > ESP32 Dev Module

【準備】
VSPIは基板実装LCD ST7789Vを使用する。
配線は不要
マイコン基板 <-> ST7789V
GPIO5(CS)     <-> CS
GPIO23(Reset) <-> Reset
GPIO16(DC)    <-> AO
GPIO19(MOSI)  <-> SDA
GPIO18(SCK)   <-> SCK
GPIO4(BackLight)
GPIO14(PowerSupply)

HSPIは使用できません。
SCK(GPIO14)が、VSPIの電源に使用されているためです。
今回ワイヤ接続でST7735をS/W SPIで制御する。
マイコン基板 <-> ST7735
3V3           <-> VCC
GND           <-> GND
GPIO15(CS)    <-> CS
GPIO27(Reset) <-> Reset
GPIO26(DC)    <-> AO
GPIO13(MOSI)  <-> SDA
GPIO2(SCK)    <-> SCK

【バージョン情報】
2022/12/03 : 新規
**********************************************************************/

#include <Adafruit_GFX.h> 
#include <Adafruit_ST7735.h>
#include <Adafruit_ST7789.h>
#include <SPI.h>

//基板実装LCD VSPI
#define TFT0_CS       5   // CS
#define TFT0_RST      23  // Reset 
#define TFT0_DC       16  // DC
#define TFT0_MOSI     19  // MOSI
#define TFT0_SCK      18  // Clock
#define TFT0_BL       4   // BackLight 
#define TFT0_PWR      14  // Powersupply

//  Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
 Adafruit_ST7789 tft0 = Adafruit_ST7789(&SPI, TFT0_CS, TFT0_DC, TFT0_RST);

//S/W SPIで使用するため、ピンはどれでもよい。
#define TFT1_CS          15  // CS
#define TFT1_RST         27  // Reset 
#define TFT1_DC          26  // DC
#define TFT1_MOSI        13  // MOSI
#define TFT1_SCK         2   // Clock

//S/W SPIはこちら。遅いが任意のピンを使用できる。
Adafruit_ST7735 tft1 = Adafruit_ST7735(TFT1_CS, TFT1_DC, TFT1_MOSI, TFT1_SCK, TFT1_RST);

void setup(void) 
{
  //SPI0 //ピンアサイン表にピン指定してあるが、定義はされていないようなのでbegin()でピン設定する。
  SPI.begin(TFT0_SCK, -1, TFT0_MOSI, TFT0_CS);       //FSPIピンを変更して使用する場合、この行のコメントを解除
  
  //基板上のLCD(SPI0)の表示
  pinMode(TFT0_PWR, OUTPUT);
  digitalWrite(TFT0_PWR, HIGH);                 //バックライトON

  pinMode(TFT0_BL, OUTPUT);
  digitalWrite(TFT0_BL, HIGH);                 //バックライトON

  tft0.init(135, 240);
  tft0.fillScreen(ST77XX_WHITE);               //背景の塗りつぶし

  //テキスト表示
  tft0.setRotation(1);                         //画面回転
  tft0.setTextSize(3);                         //サイズ

  tft0.setCursor(0, 20);                      //カーソル位置                      
  tft0.setTextColor(ST77XX_RED);              //赤
  tft0.printf("TTGO\n");
  tft0.setCursor(0, 50);                      //カーソル位置                      
  tft0.setTextColor(ST77XX_BLUE);             //青
  tft0.printf("T-Display\n");


  tft1.initR(INITR_BLACKTAB);                 //Init ST7735S初期化
  tft1.fillScreen(ST77XX_BLACK);              //背景の塗りつぶし

  //テキスト表示
  tft1.setRotation(3);                        //画面回転
  tft1.setTextSize(3);                        //サイズ

  tft1.setCursor(0, 20);                      //カーソル位置                      
  tft1.setTextColor(ST77XX_RED);              //赤
  tft1.printf("TAMANEGI\n");

  tft1.setTextColor(ST77XX_GREEN);            //緑
  tft1.printf("TAMANEGI\n");

  tft1.setTextColor(ST77XX_BLUE);             //青
  tft1.printf("TAMANEGI\n");

  tft1.setTextColor(ST77XX_YELLOW);           //黄
  tft1.printf("TAMANEGI\n");
}

void loop()
{
}
結果

ST7789VとST7735のサンプルスケッチが動作しました。

特別な機能のスケッチ

BT(Serial受信)

スケッチの説明

スマートフォンからBTシリアル通信を行います。
データを受け取ったら、COMへ送信します。

サンプルスケッチ

/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【スケッチの説明】
ESP-WROOM32-BreakOut

BT機器からのシリアルデータを受信し、シリアルコンソールに表示します。

【ライブラリ】
esp32 > ESP32 Dev Module

【準備】
スケッチ書き込み後、スマートフォンなどBT機器とのペアリングを行います。

【バージョン情報】
2023/2/4 : 新規
**********************************************************************/
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;                 //BLEオブジェクト

void setup() 
{
  Serial.begin(115200);                   //コンソール出力用
  SerialBT.begin("BTSAMPLE");             //TDISPLAY という名前でBT通信開始
                                          //スマートフォンなどでBT機器の検索をすると、この名前が表示される
}

void loop()
{
  char BTReceive = 0;
  char SerialReceive = 0;

  if (SerialBT.available() != 0)          //受信があるかを確認
  {
    BTReceive = SerialBT.read();          //BTから読み取る
    Serial.print(BTReceive);              //読み取ったデータをコンソール表示
  }

  if(Serial.available() != 0)
  {
    SerialReceive = Serial.read();
    SerialBT.print(SerialReceive);
  }
}

結果

スマートフォンからBT接続を行いました。
一例として掲載します。


スマートフォンからの送信文字[tamanegi]は、Teraterm上で受信できたことが確認できました。
Teraterm上から文字を送信すると、スマートフォンから受信できます。

コメント

タイトルとURLをコピーしました