XIAO互換 Adafruit QT Py ESP32-S2

コンピュータ、組み込み

XIAO互換ボード Adafruit QT Py ESP32-S2を入手したので評価しました。
技適がないので電波の出せませんが、高性能XIAOとして基本機能を記載します。

紹介するもの

Adafruit QT Py ESP32-S2

特徴

電源とGND、GPIOピン位置は互換であるが、ピン番号互換は無い。

ESP32-S2搭載であるため、処理速度は高い。
技適未対応です。

接続Micro C
CPUXtensa LX7 (240MHz)
フラッシュMemory4MB
PSRAM8MB
GPIO11
PWM11(8bit 255まで)
同時に8個まで使用可能
ADC8 (13bit 3.3V = 8191)
UART1
I2C1
SPI1
ボタンBOOT
RESET
そのほかQWIIC (I2C) SDA(GPIO41), SCL(GPIO40)
[2022/12/14 PWMピン数修正]
ピン配置
[2022/12/14 PWMピン数修正, bit長追記]

外観

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

使ってみて

Seeedstudio XIAOとほぼ上位互換になりますが、ピン配置のややこしさが残ります。
Qwiic やNeopixelなど機能面の充実や処理能力は高いだけに、技適がないのが惜しい。
少し割高で、国内では手軽に入手できないのも残念です。

準備

ライブラリ

ボードライブラリ

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 > Adafruit QT Py ESP32-S2
※ x.x.x Jul/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
WS2812Adafruit NeoPixel by AdafruitNEOPIXEL1.10.5

スケッチの書き込み

一度スケッチを書きこむとCOMポートの認識をしなくなる。

スケッチを書き込むときは、次の2通りの方法で行う。
・BOOTボタンを押しながら電源を投入する。
・電源投入後にBOOTボタンを押しながらRESETボタンを押す。

COMポートが認識されるようになるので、ArduinoIDEからCOMポートを選択して書き込みを行う。

基本スケッチ

LEDチカ

説明

ボタンが押下されている間LEDを点灯させます。
ボタンが離されている間LEDは消灯させます。

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

【マイコン基板】
全般で使用できます。
Adafruit QT Py ESP32-S2

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

【ライブラリ】
Adafruit QT Py ESP32-S2

【準備】
GPIO35  -> 保護抵抗(約200Ω) -> LED -> GND
3.3V -> GPIO37

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

【バージョン情報】
2022/11/6 : 新規
**********************************************************************/

#define LED 35       //基板実装LED
#define BUTTON 37    //タクトスイッチ

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

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

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

PWM

説明

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

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

【マイコン基板】
 Adafruit QT Py ESP32-S2 で利用できます。

【スケッチの説明】
 DAC と PWMを使用しLEDのゆっくり点灯とゆっくり消灯をします。

【ライブラリ】
例 esp32 > Adafruit QT Py ESP32-S2

【準備】
 GPIO17(DAC) - 保護抵抗(200Ω) - LED - GND
 GPIO9(PWM) - 保護抵抗(200Ω) - LED - GND

 保護抵抗(200Ω)は目安ですので、使用するLEDの適値求めてください

【バージョン情報】
2022/11/6 : 新規
**********************************************************************/
//Adafruit QT Py ESP32-S2
//analogWriteで設定できるピン (8bit 0 - 255)
// 18, 17, 9, 8, 7, 6, 5, 16
//dacWriteで設定できるピン (8bit 0 - 255)
// 18, 17

#define DAC 17
#define PWM 9

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

DAC側(左)はある程度電圧が上昇してからLEDの点灯をしました。
電圧が下がるとLEDは消灯しました。
PWM側(右)はゆっくり点灯とゆっくり消灯を続けています。

ADC

説明

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

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

配線

GPIO17(DAC) と GPIO9(ADC)を直接配線します。

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

【マイコン基板】
 Adafruit QT Py ESP32-S2 で利用できます。

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

【ライブラリ】
例 esp32 > Adafruit QT Py ESP32-S2

【準備】
 GPIO17(DAC) - GPIO9(ADC)

【バージョン情報】
2022/11/6 : 新規
**********************************************************************/
//Adafruit QT Py ESP32-S2
//analogReadで設定できるピン (13bit 0 - 8191)
// 18, 17, 9, 8, 7, 6, 5, 16
//dacWriteで設定できるピン (8bit 0 - 255)
// 18, 17

#define DAC 17
#define ADC 9

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で出力した電圧をADCで読み取りました。
設定値と読み取ったAD値をグラフにしました。

分解能が13bitあるので細かくとれるのですが、3.3Vに達する前にサチレーション(値が上限に達して正確に読み取れない状態)しています。
一部拡大(ピンクの枠)してみましたがADCの読み取り値にばらつきがみられます。
ADCの分解能は高くても精度はいまいちのようです。

念のためDACの出力をオシロスコープで確認してみましたが、3.2V位出ています。
設定値に対してリニア(直線的)でしたので、ADCの読み取りが高めに出ていると推測します。

UART

説明

UARTは2系統ありますが、UART0はCOMになります。
ESP32-S2-Picoはスケッチ書き込み後にUSBのCOMは認識されなくなるので、UART0を使用するにはGP43(TX)とGP44(RX)を使用します。

UART1はそのままでは内部フラッシュに接続されているので、そのままでは使用できません。
スケッチでピン指定して使用しています。

UART0(COM)から読み取ったデータをUART1に送信します。
UART1から読み取ったデータをUART0(COM)に送信真します。

配線
ESP32-S2-Pico配線FT232RL(UART1側)
GP5(UART1 TX)RX
GP6(UART1 RX)TX
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Adafruit QT Py ESP32-S2 で利用できます。

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

【ライブラリ】
esp32 > Adafruit QT Py ESP32-S2

【準備】
 UARTの通信にFT232RLを使用します。

 QT Py ESP32-S2(COM側) <-> FT232RL(UART1側)
 
【バージョン情報】
2022/11/6 : 新規
**********************************************************************/
void setup()
{
  Serial.begin(115200);                 //SerialオブジェクトはUART0 (COM)
  Serial1.begin(115200);                //Serial1 オブジェクトは ピン指定で、RX = GP6, TX = GP5 で設定する
  
}

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

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

結果はTeratermを2つ起動して確認します。
Teratermから送信した文字は、エコーバックにより表示されます。

今回UART0(COM)はCOM106、UART1のFT232RLはCOM9で認識されました。

COM106側から赤実線枠”tamanegi”と入力を行うと、COM9側の赤点線枠に”tamanegi”と表示されました。
COM9側から青実線枠”Hello”と入力を行うと、COM106側の青点線枠に”Hello”と文字が出力されました。

I2C(SSD1306)

説明

I2Cを使ってSSD1306(OLED 0.96inch)モニタのサンプルを動作させます。
I2Cはデフォルトでピン定義されているため、ピン設定不要です。

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

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

【マイコン基板】
 Adafruit QT Py ESP32-S2 で利用できます。

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

【ライブラリ】
esp32 > Adafruit QT Py ESP32-S2
Adafruit SSD1306 by Adafruit
Adafruit GFX Library by Adafruit

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

【注意】
COM認識しない場合、BOOTボタンを押下しながら電源を再投入する。

【バージョン情報】
2022/11/6 : 新規
**********************************************************************/
//Adafruit QT Py ESP32-S2  I2C SDA(7), SCL(6)

#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, 5);            //テキストの表示開始位置
  display.print(F("TAMANEGI"));         //表示文字列
  display.setCursor(40, 25);
  display.print(F("QT Py"));
  display.setCursor(20, 45);
  display.print(F("ESP32-S2"));

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

void loop()
{
}
結果

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

SPI(ST7735)

説明

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

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

配線
ESP32-S2-pico配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GPIO18CS
GPIO17RESET
GPIO9AO
GP35(SPI MOSI)SDA
GP36(SPI CLK)SCK
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Adafruit QT Py ESP32-S2 基板で動作します。

【スケッチの説明】
ST7735 LCDの表示制御します。
H/W SPIを使用するための方法についてサンプル記載します。

【ライブラリ】
esp32 > Adafruit QT Py ESP32-S2
Adafruit ST7735 and ST7789 Library by Adafruit
Adafruit GFX Library by Adafruit

【準備】
マイコン基板 <-> ST7735
3V3            <-> VCC
GND            <-> GND
GPIO18(CS)     <-> CS
GPIO17(Reset)  <-> Reset
GPIO9(DC)      <-> AO
GPIO35(MOSI)   <-> SDA
GPIO36(SCK)    <-> SCK

【バージョン情報】
2022/11/6 : 新規
**********************************************************************/

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

#define TFT_CS          18  // CS
#define TFT_RST         17  // Reset 
#define TFT_DC          9   // DC
#define TFT_MOSI        35  // MOSI
#define TFT_SCK         36  // SCK

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

//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);   //H/W SPIを使用する場合こちらでピン番号を指定する。
                                              //S/W SPIで使用する場合はコメントアウトする。
  

  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のサンプルスケッチが動作しました。

特別なスケッチ

Neopixel(W2812)

説明

1秒ごとに、LEDの色を変化させます。
赤->緑->黄->青->紫->水->白

配線

基板実装W2812を使用するので配線不要。

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

【マイコン基板】
Adafruit QT Py ESP32-S2 で利用できます。

【スケッチの説明】
実装 W2812を点灯させます。
1秒間隔で、赤->緑->黄->青->紫->水->白 の順で点灯させます。

【ライブラリ】
esp32 > Adafruit QT Py ESP32-S2
Adafruit NeoPixel by Adafruit

【準備】
配線不要

【バージョン情報】
2022/11/6 : 新規
**********************************************************************/

#include <Adafruit_NeoPixel.h>

#define DIN_PIN 39            // NeoPixel の出力ピン番号はGP23
#define POWER_PIN 38
#define LED_COUNT 1           // LEDの連結数
#define WAIT_MS 1000          // 次の点灯までのウエイト
#define BRIGHTNESS 16        // 輝度(Max 255)
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  pinMode(POWER_PIN, OUTPUT);
  digitalWrite(POWER_PIN, HIGH);

  pixels.begin();             //NeoPixel制御開始
}

void loop()
{
  pixels.clear();
  
  //pixels.Color(Red, Green, Blue)で、パレット情報を作成する。
  //赤点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, 0, 0));
  pixels.show();
  delay(WAIT_MS);

  //緑点灯
  pixels.setPixelColor(0, pixels.Color(0, BRIGHTNESS, 0));
  pixels.show();
  delay(WAIT_MS);

  //赤 + 緑 で 黄点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, BRIGHTNESS, 0));
  pixels.show();
  delay(WAIT_MS);

  //青点灯
  pixels.setPixelColor(0, pixels.Color(0, 0, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);

  //赤 + 青 で 紫点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, 0, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);

  //緑 + 青 で 水点灯
  pixels.setPixelColor(0, pixels.Color(0, BRIGHTNESS, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);

  //赤 + 緑 + 青 で 白点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);
}
結果

Nexpixelが1秒毎に色の変化をしました。

コメント

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