LOLIN D32 PRO

コンピュータ、組み込み

ESP32-WROVER LOLIN D32 PROを入手しました。
技適、TFカードスロット、TFTコネクタ、バッテリーコネクタと豊富に付属があります。
基本的な入出力、通信(UART, I2C, SPI)と付属機能を使ってみます。

紹介するもの

LOLIN D32 PRO

特徴

接続Micro A
CPUWROVER (240MHz)
フラッシュMemory4MB または 16MB
PSRAM4MB
GPIO23 (3pinは入力専用)
PWM23 (同時に16個まで) (8bit 0 – 255)
DAC2 (8bit 0 – 255, 3.3V)
ADC16 (12bit 0 – 4095, 3.3V)
UART1 (COM)
I2C1
SPI2
ボタンRESET
LED1 赤 (GPIO5)
Wifi, Bluetooth
Lipoコネクタ ph2.0 (500mA充電)
TFカードスロット
TFTコネクタ SH 1.0-10pin
I2Cコネクタ SH 1.0-4pin
ピン配置

外観

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

使ってみて

ESP32-WROVERに載せられるだけの機能を載せたような基板です。
気を付けたいのは、SH1.0mm 4pinコネクタがありますがSparkfunのQwiicとは配線が違うのでそのまま使用することはできません。(ピン配置表を参照してください)

技適付きで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ハブ(電源無し)を使用すると書き込みができなかったり、起動しないなどの症状がみられます。

トラブル

現象

デジタル入力でのPULLDOWN, PULLUPを設定しても読み取り値が常にHIGHになる。

HIGHとLOWへの反応が遅いなどそのほかの現象もみられます。

PULLDOWNを指定しても正しい結果を得られなかったピン番号
4, 18, 19, 22, 23

PULLUPを指定しても正しい結果を得られなかったピン番号
34, 39, 36

対応

PULLDOWN指定では、回路上でPULLDOWN回路を作成する。
PULLUP指定では、回路上でPULLUP回路を作成する。

基本スケッチ

buttonLED

説明

ボタンが押されている間LEDを点灯します。

GPIOピンの入力では、INPUT_PULLDOWNを指定しても
4, 18, 19, 22, 23 は回路でPULLDOWNしないと正しく機能しません。
GPIOピンの入力では、INPUT_PULLUPを指定しても
34, 39, 36 は回路でPULLUPしないと入力が正しく機能しません。

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

【マイコン基板】
LOLIN D32 PRO

【スケッチの説明】
ボタンが押されている間LEDを点灯します。

GPIOピンの入力では、INPUT_PULLDOWNを指定しても
4, 18, 19, 22, 23 は回路でPULLDOWNしないと正しく機能しません。
GPIOピンの入力では、INPUT_PULLUPを指定しても
34, 39, 36 は回路でPULLUPしないと入力が正しく機能しません。

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

【準備】
GPIO2 -> 保護抵抗(200Ω) -> LED -> GND
3.3V -> タクトボタン -> GPIO15

【バージョン情報】
2023/1/28 : 新規
**********************************************************************/

#define LED 2        //LED
#define BUTTON 15    //15
void setup()
{
  pinMode(LED, OUTPUT);               //ピン出力設定
  pinMode(BUTTON, INPUT_PULLDOWN);    //プルダウンで入力
}

void loop()
{
  int iStat = digitalRead(BUTTON);   //PULL UPしているので状態反転する
  digitalWrite(LED, iStat);           //ボタンの状態をLEDに出力
}
結果

ボタンを押すとLEDが点灯、離すと消灯しました。

PWM-DAC

説明

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

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

【マイコン基板】
LOLIN D32 PRO

【スケッチの説明】
PWMとDACを使用しLEDのフェード点灯とフェード消灯をします。

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

【準備】
GPIO27(PWM) -> 保護抵抗(200Ω) -> LED -> GND
GPIO26(DAC) -> 保護抵抗(200Ω) -> LED -> GND

【バージョン情報】
2023/1/28 : 新規
**********************************************************************/

#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で出力の違いを確認しました。

結果の動画は他のESPから流用していますが同じ動作になります。
DAC制御(黄)ではLEDの発光電圧になるまでは消灯していますが、点灯後はゆっくり点灯とゆっくり消灯が確認できます。
PWM制御(青)ではゆっくり点灯、ゆっくり消灯がきれいに見えています。

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

DAC, ADC

説明

LOLIN D32 PROにはアナログ出力があります。
出力したアナログ信号をADCで読み取ります。

配線

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

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

【マイコン基板】
LOLIN D32 PRO

【スケッチの説明】
DACで出力した電圧を、ADCで読み取りCOMに出力する。

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

【準備】
GPIO27(INPUT) <-> GPIO26(DAC)

【バージョン情報】
2023/1/28 : 新規
**********************************************************************/
#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を読み出しています。

結果を波形はTTGO T8の流用です。
差異はほとんどありません。

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

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

UART

説明

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

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

【マイコン基板】
LOLIN D32 PRO

【スケッチの説明】
DACで出力した電圧を、ADCで読み取りCOMに出力する。

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

【準備】
GPIO27(INPUT) <-> GPIO26(DAC)

【バージョン情報】
2023/1/28 : 新規
**********************************************************************/

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)モニタのサンプルを動作させます。

配線
LOLIN D32 PRO配線SSD1306(0.96inch)
3.3VVCC
GNDGND
GP22(SDA)SDA
GP21(SCL)SCL
スケッチ

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

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

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

【マイコン基板】
LOLIN D32 PRO で利用できます。

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

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

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

【バージョン情報】
2023/1/28 : 新規
**********************************************************************/

#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, 0);            //テキストの表示開始位置
  display.print(F("TAMANEGI"));         //表示文字列
  display.setCursor(15, 25);
  display.print(F("OLED 0.96"));
  display.setCursor(25, 45);
  display.print(F("SSD1306"));

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

void loop() {
}
結果

SSD1306に表示ができました。

SPI(ST7735)

説明

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

配線

VSPIを使用する場合の配線

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

HSPIを使用する場合の配線

LOLIN D32 PRO配線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

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

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

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

【マイコン基板】
LOLIN D32 PRO で利用できます。

【スケッチの説明】
ST7735 LCDの表示制御します。
LOLIN D32 にはH/W SPIが2系統あります。(VSPI, HSPI)
H/W SPI(VSPI, HSPI)を使用するための方法についてサンプル記載します。

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

【準備】
VSPIを使用する場合
マイコン基板 <-> ST7735
3V3           <-> VCC
GND           <-> GND
GPIO5(CS)     <-> CS
GPIO27(Reset) <-> Reset
GPIO26(DC)    <-> AO
GPIO23(MOSI)  <-> SDA
GPIO18(SCK)   <-> SCK

VSPIを使用する場合
マイコン基板 <-> ST7735
3V3           <-> VCC
GND           <-> GND
GPIO15(CS)    <-> CS
GPIO27(Reset) <-> Reset
GPIO26(DC)    <-> AO
GPIO13(MOSI)  <-> SDA
GPIO14(SCK)   <-> SCK

【バージョン情報】
2023/1/28 : 新規
**********************************************************************/

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

//HSPIを使用する場合、この#defineをコメントアウトする。
#define SPI_VSPI

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

  Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

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

  SPIClass hspi(HSPI);
  Adafruit_ST7735 tft = Adafruit_ST7735(&hspi, TFT_CS, TFT_DC, TFT_RST);

#endif

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

void setup(void) 
{
//  SPI.begin(TFT_SCK, -1, TFT_MOSI, TFT_CS);   //任意のピンを使用する場合コメントを外す

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

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

  tft.setCursor(0, 10);                       //カーソル位置                      
  tft.setTextColor(ST77XX_GREEN);             //緑
  tft.printf("TAMANEGI\n");

  tft.setCursor(0, 50);                       //カーソル位置                      
  tft.setTextSize(2);                         //サイズ
  tft.setTextColor(ST77XX_RED);               //赤
  tft.printf("1.8inch LCD\n");
  tft.setTextColor(ST77XX_YELLOW);            //黄
  tft.printf("Res=128 x 160\n");
  tft.setTextColor(ST77XX_BLUE);              //青
  tft.printf("ST7735\n");
}

void loop()
{
}
結果

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

TFカードスロット

説明

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

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

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

【マイコン基板】
LOLIN D32 PRO で利用できます。

【スケッチの説明】
TFカードリーダからマイクロSDカードのファイル、フォルダのリストをCOMに出力します。

通信はSPIを使用します。
VSPI, HSPI どちらでも使用できます。
HSPI側はコメントしているので、HSPIを使用したい場合はHSPI側のコメントを解除して、VSPIをコメントしてください。

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

【準備】
ファイル、フォルダが保存されたマイクロSDカードをTFカードスロットに挿入

【バージョン情報】
2023/1/28 : 新規
**********************************************************************/

#include <SPI.h>
#include <SD.h>

//SDカードを使用するためのピン定義
#define SD_MOSI 23
#define SD_SCK  18
#define SD_CS   4
#define SD_MISO 19

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

//SPIClass hspi(HSPI);                      //HSPIを使用する場合

void setup()
{

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

  //SPIピン設定
 // hspi.begin(SD_SCK, SD_MISO, SD_MOSI, SD_CS);      //HSPIを使用する場合
  SPI.begin(SD_SCK, SD_MISO, SD_MOSI, SD_CS);             

 //SPIを指定ピンにするために、CSとSPIオブジェクトを使用するオーバーライド関数を使用する。
 // if (SD.begin(SD_CS, hspi) == false)               //HSPIを使用する場合
 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()
{
}
結果

画像左側は準備したマイクロSDの保存ファイルとフォルダ名です。
MicroSDカードのファイルのリストを表示しました。

コメント

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