WROVER TTGO-T8

コンピュータ、組み込み

TTGOより販売されたWROVER TTGO-T8を入手しました。
技適付きで高性能マイコンであるWROVERの評価をします。

紹介するもの

TTGO-T8

特徴

WROOM32より少し大型ですがPSRAM搭載であるため、画像処理などに有利。
技適付きで無線の仕様もできます。
電源用アダプタとSDカードもついているので、単体でデータロガーとしても使用できます。

高速処理ができますがマイコンとしては消費電力がやや大きい。(USBハブでの開発や起動には電源アダプタが必要になります。)

接続Micro A
CPUWROVER (240MHz)
フラッシュMemory4MB
PSRAM8MB
GPIO24
PWM16 (8bit 255まで)
DAC2 (8bit 255まで) 3.3V
ADC16 (12bit 3.3V = 4095)
UART1 (COM)
I2C1
SPI2
ボタンRESET
LED1 赤 (GPIO5)
Wifi, Bluetooth
Lipoコネクタ ph2.0 (500mA充電)
TFカードスロット
ピン配置

表記がよくわからないので、当サイトで紹介するサンプルのピン配置表を作成しました。
参考までに公開ピン配置表も掲載します。

外観

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

使ってみて

この基板自体には、バッテリーコネクタがついているので単体駆動するのに重宝します。
またSDカードもついているのでロガーとしても活躍が期待できます。

技適付きでWifiやBluetoothが使用できるので、広い用途での期待ができます。

準備

ライブラリ

ボードライブラリ

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 Wrover Module
※ x.x.x Jul/2022 では2.0.4

スケッチの書き込み

特別な手順はなく書き込みができます。
ArduinoIDEからCOMポートを選択して書き込みを行う。

供給力の低い電源や、USBハブ(電源無し)を使用すると書き込みができなかったり、起動しないなどの症状がみられます。

基本スケッチ

LEDチカ

説明

基板上のLEDを点滅させます。
TTGO-T8のビルトインLEDのGPIO番号はGP5です。

スケッチ
//digitalWriteで設定できるピン
//GPIO 5はビルトインLEDと共通。基板上のLEDは逆論理(HIGHで消灯、LOWで点灯)
//15, 2, 0, 4, 5, 18, 19, 21, 3, 1, 22, 23, 13, 12, 14, 27, 26, 25, 33, 32

#define LED1 5       //BuiltINLED (緑)
void setup()
{
  pinMode(LED1, OUTPUT);  //ピン出力設定
}

void loop()
{
  digitalWrite(LED1, HIGH);
  delay(500);

  digitalWrite(LED1, LOW);
  delay(500);
}
結果

LEDが点滅しました。

PWM-DAC

説明

PWMとDACを使ってLEDのフェード点灯(ゆっくり点灯)とフェード消灯(ゆっくり消灯)を行います。

スケッチ
//analogWriteで設定できるピン (0 - 255)
//15, 2, 0, 4, 5, 18, 19, 21, 3, 1, 22, 23, 13, 12, 14, 27
//dacWriteで設定できるピン (0 - 255)
//25, 26

#define DAC 26
#define PWM 27

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

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

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

結果

同じ抵抗と同色のLEDで出力の違いを確認しました。
PWM制御(analogWrite)ではゆっくり点灯、ゆっくり消灯がきれいに見えています。
DAC制御(dacWrite)ではLEDの発光電圧になるまでは消灯していますが、点灯後はゆっくり点灯とゆっくり消灯が確認できます。

オシロスコープで確認します。
PWMではDuty比(LOW時間とHIGH時間の比)の変化が確認できますが、0Vと約3Vの矩形波形が確認できます。
DACでは実際の電圧が0Vから約3Vまでの電圧変化が確認できます。

ADC

説明

TTGO-T8 WROVERにはアナログ出力があります。
出力したアナログ信号をADCで読み取ります。

配線

GP26 と GP27を直接配線します。

スケッチ
#define DAC 26
#define ADC 27

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);
  }
}
結果

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

結果を波形にしました。
横軸はデータ数(index)です。
縦軸左は設定したDA値、縦軸右が読み取ったAD値。
設定は直線的な三角波に見えますが、読み取ったAD値は湾曲しています。

DAC出力した電圧をオシロで確認します。
きれいな三角波に見えるので、DAC側は設定に対してリニアに出力しているようです。
ADC側が電圧が高くなると感度のリニアリティに変化があるようです。
すべてのchを確認していませんが、精度が求められる使い方をする場合事前に校正する必要がありそうです。

UART

説明

UARTは1系統だけで、書き込みに行うUART0です。
単純にオウム返しを行います。

スケッチ
void setup()
{
  Serial.begin(115200);                       //SerialオブジェクトはUART0 (COM)
}

void loop()
{
  if(Serial.available() != 0)                 //UART0にデータがあれば、読み取った内容をUART0に送信
  {
      Serial.write(Serial.read());
  }
}
結果

結果はTeratermを起動して確認します。
Teratermから送信した文字は、エコーバックにより表示されます。
文字が2つずつ表示されるのはTeratermのエコーバック機能により、入力した文字と帰ってきた文字が表示されるためです。

I2C

説明

I2Cを使ってSSD1306(OLED 0.96inch)モニタのサンプルを動作させます。

配線
TTGO T8配線SSD1306(0.96inch)
3.3VVCC
GNDGND
GP22(SDA)SDA
GP21(SCL)SCL
スケッチ

SSD1306をI2Cで表示を挿せるサンプルです。
文字列の表示を行います。

そのほか描画サンプルは
Adafruitサンプルスケッチを参考にしてください。
ファイル(F) > スケッチ例 > Adafruit SSD1306 > ssd1306_128x64_i2c

#include <SPI.h>
#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を使用する。
                                        //初期化時には I2C0を使用する (Wire)
                                        
void setup() 
{
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for(;;);
  }

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

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

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

void loop() {
}
結果

SSD1306に表示ができました。
※配線図の書きやすさから3V3とGNDが違います。

SPI(ST7735)

説明

SPIを使ってST7735(LCD 1.8inch)モニタのサンプルを動作させます。

配線

VSPIを使用する場合の配線

TTGO T8配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GP27Reset
GP26AO(DC)
GP18(VSPI SCK)SCK
GP23(VSPI MOSI)SDA
GP5(VSPI CS0)CS

HSPIを使用する場合の配線

TTGO T8配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GP27Reset
GP26AO(DC)
GP14(HSPI SCK)SCK
GP13(HSPI MOSI)SDA
GP15(HSPI CS0)CS
スケッチ

ST7735をSPIで表示を挿せるサンプルです。
文字列の表示を行います。

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

TTGO-T8ではVSPIとHSPIの2系統が使用できます。
どちらのピンア配置もサンプルに掲載されているので用途に応じてコメントを解除してください。

下記サンプルではHSPIで動作します。

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


//ピン番号設定
//VHSPIを使用する場合
// #define TFT_CS       5   // CS
// #define TFT_RST      27  // Reset 
// #define TFT_DC       26  // DC
// #define TFT_SCLK     18  // Clock
// #define TFT_MOSI     23  // MOSI

//HSPIを使用する場合
#define TFT_CS          15  // CS
#define TFT_RST         27  // Reset 
#define TFT_DC          26  // DC
#define TFT_MOSI        13  // Clock
#define TFT_SCK         14  // MOSI

//HSPIを使用する場合、HSPIのオブジェクトを宣言(VSPIは不要)
SPIClass hspi(HSPI);

//H/W SPI(VSPI)はこちら
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

//H/W SPI(HSPI)はこちら。コンストラクタでHSPIオブジェクトを設定する
Adafruit_ST7735 tft = Adafruit_ST7735(&hspi, TFT_CS, TFT_DC, TFT_RST);

//S/W SPIはこちら。遅いが任意のピンを使用できる。
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

void setup(void) 
{

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

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

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

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

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

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

void loop()
{
}
結果

ST7735のサンプルスケッチが動作しました。
※画像はVSPIの配線時です。また配線図の書きやすさから一部使用しているピンが違います。
配線は配線図を参照してください。

TFカードスロット

説明

使い方はSDカードモジュールと同じです。

ピン配置変更のための代表としてファイル、フォルダ一覧読み出しを掲載します。

スケッチ
#include <SPI.h>
#include <SD.h>

//TTGO-T8 SDカードを使用するためのピン定義
#define SD_MOSI 15
#define SD_SCK  14
#define SD_CS   13
#define SD_MISO 2

File tFiles;      //Fileオブジェクト

void setup()
{

  delay(500);
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  //SPIピン設定
  SPI.begin(SD_SCK, SD_MISO, SD_MOSI, SD_CS);

  //SPIを指定ピンにするために、CSとSPIオブジェクトを使用するオーバーライド関数を使用する。
  if (SD.begin(SD_CS, SPI) == false)
  {
    Serial.println("initialization failed.");   //SDカードモジュールの初期化に失敗したらポーリング
    while (1);
  }
  tFiles = SD.open("/");        //ルートフォルダ(/)のファイルをすべて読み取る。

  File tNewFile;
  int iFileIndex = 1;

  while(1)
  {
    tNewFile = tFiles.openNextFile();      //ルートフォルダの見つかったリストがまだあるか?
    if(tNewFile == 0)break;

    //見つかったリストがファイルなら F, ディレクトリ(フォルダ)ならF を表示
    if(tNewFile.isDirectory() == true)
    {
      Serial.printf("D ");
    }
    else
    {
      Serial.printf("F ");
    }

    //見つかったインデックス、ファイル名、ファイルサイズを表示する
    Serial.printf("%02d : %s : %d\n", iFileIndex, tNewFile.name(), tNewFile.size());        //見つかった番号とファイル名をシリアル出力
    iFileIndex ++;
  }

  tNewFile.close();
  tFiles.close();

}

void loop()
{
}
結果

結果はTeratermを起動して確認します。
Teratermから送信した文字は、エコーバックにより表示されます。
文字が2つずつ表示されるのはTeratermのエコーバック機能により、入力した文字と帰ってきた文字が表示されるためです。

コメント

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