Arduino環境でCOER-ESP32S3-A10を使う

コンピュータ、組み込み

ESP32 S3搭載基板 CORE-ESP32S3-A10を入手しました。
Arduino環境での基本的な入出力(デジタルとアナログ)、通信(UART, I2C, SPI)を使ってみます。

紹介するもの

LUAT OS CORE-ESP32S3-A10

特徴

無線の機能はありますが技適マークがないので、当サイトでは無線機能は使用しません。
カメラモジュールコネクタが付いています。
(現在動作確認できていません。)

CORE-ESP32S3-A10
接続Type C
CH343
CPUESP32-S3
Xtensa 32bit LX7 Dual core
240MHz
MemoryPSRAM 16MB
GPIO19
ADC
(12bit 0 – 4095, 3.3V)
DAC
PWM19 (8bit 0 – 255, 3.3V)
同時に8本まで
UART2
I2C2
SPI2
ボタンBOOT
リセット
そのほかカメラモジュールコネクタ
LED 2個
(GPIO10, GPIO11)
ピン配置

ピン配置表を作成しました。
UART, I2C, SPIの定義はありますが、ライブラリが見つからないため使用するためにはピン指定が必要です。

公開されていたピン配置表です。

外観

ESP32-S3搭載基板ですが近い基板がないので、BPI BananaPi PicoWと比べてみました。
基板のサイズ感は同じですが、ピン数、配置が違います。
ESP32-S3-A10にはカメラ用コネクタが実装されています。

価格帯も同じなので、カメラモジュールを使用することができればCORE-ESP32S3-A10を使用する価値が大きくなりそうです。

使ってみて

ESP32-S3搭載基板を使った経験があればすぐに使うことができます。
ESP32-S3自体が自由度が高く導入しやすい基板だと思うので、Arduino環境で使用するのであれば躓くことも少ないと思います。
技適がないので無線が使えない点が残念です。

Ali Expressでしか見つかっていないので入手性は悪いです。
価格も販売店に依存するのでコスパ観点では判断が難しいですが、送料込みの価格が\1,200~1,500程度なので、ESP32 S3搭載基板としては平均的な価格だと思います。

基板サイズに対してピン数が少ないと感じますが、カメラモジュールコネクタが付いているからでしょうか。
通常大きな組み込みをしなければ十分なピン数です。

有線通信で使用する電子工作では可不可のない使いやすいボードだと思います。

LUAT OSのESP32 C3搭載基板

準備

ライブラリ

ボードライブラリ

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 > ESP32S3 Dev Module
※ x.x.x 動作確認は2.0.3を使用しています

モジュールライブラリ

機能やモジュールを使用しない場合インストールの必要はありません。

機能/モジュールライブラリ名検索確認時のバージョン
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の書き込みボタンからスケッチの書き込みができます。

書き込みをするとCOMポート番号が変更されることがあるので、書き込み前の確認をしてください。

基本スケッチ

ボタンLED

説明

基板上のボタン押下するとLEDを点灯させます。
ボタンを離すとLEDを消灯させます。

配線

GPIO11(LED出力用) -> 保護抵抗(約200Ω) -> LED -> GND
3.3V -> タクトスイッチ -> GPIO12(INPUT)

保護抵抗は目安です。使用されるLEDの適値を求めてください。

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

【マイコン基板】
Waveshare ESP32-S3-Pico

【スケッチの説明】
プルダウンしたピンの状態がHighならLEDを点灯、LowならLEDを消灯させます。

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

【準備】
GPIO11 -> 保護抵抗(約200Ω) -> LED Anode, LED Cathode -> GND
3.3V -> タクトスイッチ -> ボタンピン(GPIO12)

【バージョン情報】
2023/5/12 : 新規
**********************************************************************/

#define LED 11       //LED
#define BUTTON 12    //タクトスイッチ

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

void loop()
{
  int iStat = digitalRead(BUTTON);
  digitalWrite(LED, iStat);           //ボタンの状態をLEDに出力
}
結果

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

PWM

説明

PWMを使ってLEDをゆっくり点灯、ゆっくり消灯します。

ESP32-S3の同時に使用できるPWMの数は8です。
9個以上設定してもコンパイルエラーにはなりませんが、9番目以降に設定されたピンからは信号はでないようです。

配線

GPIO11 – 保護抵抗(約200Ω) – LED – GND
ワイヤとLEDで動作させる場合の抵抗値は使用するLEDにより適切な抵抗値を求めてください。

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

【マイコン基板】
LUAT OS CORE-ESP32S3-A10

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

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

【準備】
実装LEDを使用するため、配線不要

GPIO1 - 保護抵抗(約200Ω) - LED - GND
ワイヤとLEDで動作させる場合の抵抗値は使用するLEDにより適切な抵抗値を求めてください。

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

#define PWM 1        //PWM 出力 pin

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

説明

ADCに入力された電圧を読み取りCOMに出力します。

電圧の入力にLOLIN32 Liteを使用します。
0~255(約3.3V) まで2msごとに1ずつ上昇し、255(約3.3V)~0までを2msごとに1ずつ下降する設定を繰り返します。

配線
CORE-ESP32S3-A10配線LOLIN32 Lite
GPIO1(ADC)GPIO26(DAC)
GNDGND
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
 LUAT OS CORE-ESP32S3-A10

【スケッチの説明】
入力された電圧を読み取ります。

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

【準備】
CORE-ESP32S3-A10 <-> LOLIN32 Lite
GPIO1(ADC)       <-> GPIO26(DAC)
GND              <-> GND

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

#define ADC 1

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

  pinMode(ADC, INPUT);
}

void loop()
{
  int iADC = 0;

  //外部から入力された電圧を読み取り、結果をCOMに出力します。
  iADC = analogRead(ADC);
  Serial.printf("(ADC) = %d\r\n", iADC);
  delay(2);
}
結果

入力した電圧を読み取った結果をグラフにしました。
電圧の変化は0V -> 3.3Vまでを約500msで上昇し、3.3V -> 0Vまで約500msで下降します。

ADC読み取り値が高くなる(4000付近)で感度が若干高くなっていますが、ほかのESP系の中ではきれいな波形と思います。

電圧と読み取り値の同期はできていませんが、参考程度に入力電圧を添付します。

UART

説明

UART1から読み取ったデータをUART2に送信します。
UART2から読み取ったデータをUART1に送信します。

公開されているピン配置表ではUART1とUART2が定義されていますが、CORE-ESP32S3-A10ライブラリが見つからないのでピン指定が必要です。
サンプルスケッチではUART1(GPIO1 TX, GPIO2 RX)と、UART2(GPIO6 TX, GPIO7 RX)にピン指定して使用しています。
ピンは任意のピンに設定することができます。

配線

UART0のUSBシリアル(COM)を使用します。

CORE-ESP32S3-A10配線FT232RL(1)配線FT232RL(2)
GPIO1(UART1 TX)RX
GPIO2(UART1 RX)TX
GPIO6(UART2 TX)RX
GPIO7(UART2 RX)TX
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
LUAT OS CORE-ESP32S3-A10

【スケッチの説明】
 UART1から読み取った情報を UART2へ出力します。
 UART2から読み取った情報を UART1へ出力します。

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

【準備】
 CORE-ESP32S3-A10 <-> FT232RL(UART1側)
 GPIO1(TX) <-> RX
 GPIO2(RX) <-> TX

 CORE-ESP32S3-A10 <-> FT232RL(UART2側)
 GPIO6(TX) <-> RX
 GPIO7(RX) <-> TX

【バージョン情報】
2023/8/2 : 新規
**********************************************************************/

#define UART1_TX 1
#define UART1_RX 2
#define UART2_TX 6
#define UART2_RX 7

void setup()
{
//  Serial1.begin(115200);                                   //USB-Serial(COM)入出力されます
  // Serial1.begin(115200);                                   //USB-Serial(COM)入出力されます
  // Serial2.begin(115200);                                   //USB-Serial(COM)入出力されます
  Serial1.begin(115200, SERIAL_8N1, UART1_RX, UART1_TX);      //Serial1 オブジェクトはピン指定で使用します
  Serial2.begin(115200, SERIAL_8N1, UART2_RX, UART2_TX);      //Serial1 オブジェクトはピン指定で使用します
}

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

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

結果はTeratermを2つ起動して確認します。
1つはUART1用で、もう一つはUART2用。

UART1のTeratermから入力した文字はUART2用のTeratermに表示されます。
UART2のTeratermから入力した文字はUART1用のTeratermに表示されます。

I2C(SSD1306)

説明

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

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

公開されているピン配置表ではI2Cが定義されていますが、CORE-ESP32S3-A10ライブラリが見つからないのでピン指定が必要です。

配線
CORE-ESP32S3-A10配線SSD1306(0.96inch)
3.3VVCC
GNDGND
GPIO11(SCL)SCL
GPIO12(SDA)SDA
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
LUAT OS CORE-ESP32S3-A10

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

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

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

【バージョン情報】
2023/8/2 : 新規
**********************************************************************/

#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);     //I2C0を使う場合
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire1, OLED_RESET);  //I2C1を使う場合

#define PIN_SDA 11
#define PIN_SCL 12                                   

void setup()
{
  Wire.setPins(PIN_SDA, PIN_SCL);     //I2C0を使う場合
//  Wire1.setPins(PIN_SDA, PIN_SCL);  //I2C1を使う場合

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

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

公開されているピン配置表ではSPIが定義されていますが、CORE-ESP32S3-A10ライブラリが見つからないのでピン指定が必要です。

配線
CORE-ESP32S3-A10配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GPIO14(SPI CS)CS
GPIO1RESET
GPIO2AO(DC)
GPIO17(SPI MOSI)SDA
GPIO18(SPI SCK)SCK
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
LUAT OS CORE-ESP32S3-A10

【スケッチの説明】
ST7735 LCDの表示制御します。

【ライブラリ】
esp32 > ESP32S3 Dev Module
Adafruit ST7735 and ST7789 Library
Adafruit GFX Library

【準備】
マイコン基板 <-> ST7735
3V3              <-> VCC
GND              <-> GND
GPIO14(SPI CS)   <-> CS
GPIO1            <-> Reset
GPIO2            <-> AO
GPIO17(SPI MOSI) <-> SDA
GPIO18(SPI SCK)  <-> SCK

【補足】
スケッチ書き込み時、シリアル認識されない場合は
書き込みはFLASHを押しながら電源を投入するか、FLASHボタンを押しながらリセットボタンを押す。

COMが2つ認識されますが、どちらを選択しても書き込みはできます。

【バージョン情報】
2023/5/12 : 新規
**********************************************************************/

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

#define TFT_CS    14
#define TFT_RST   1
#define TFT_DC    2
#define TFT_MOSI  17
#define TFT_SCK   18

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);     //SPI(VSPI)を使用する場合

// SPIClass hspi(HSPI);
// Adafruit_ST7735 tft = Adafruit_ST7735(&hspi, TFT_CS, TFT_DC, TFT_RST);     //SPI2(HSPI)を使用する場合

//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);   //SPI1(VSPI)を使用する場合
 // hspi.begin(TFT_SCK, -1, TFT_MOSI, TFT_CS);    //SPI2(HSPI)を使用する場合
 
  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のサンプルスケッチが動作しました。


コメント

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