Arduino環境でXIAO ESP32C3を使う

コンピュータ、組み込み

Seeed Studio のXIAOシリーズ ESP32-C3搭載基板、 XIAO ESP32C3を入手しました。
XIAOシリーズの技適付き版、XIAO ESP32C3を評価します。

紹介するもの

Seeed Studio XIAO ESP32C3

特徴

切手サイズのXIAOシリーズ。
RISC-V搭載の省電力。
技適対応でWifiとBLEが使用できる。(外部アンテナが必要)。

接続Type C
CPUC3 RISC-V 160MHz
フラッシュMemory4MB
GPIO11
ADC4 (12bit 0 ~ 4095)
PWM11 (8bit 0 ~ 255)
同時に6本まで使用可能
UART1
I2C1
SPI1
ボタンBOOT
RESET
[2022/12/13 PWMピン数表記修正]

XIAOの紹介サイトです。

ピン配置
[2022/12/13 PWMピン修正、bit数追記]

公式の表ではPWMピンがわからなかったので作成しました。
当サイトでのサンプルはGPIOxでピン指定を行います。

外観

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

使ってみて

外部アンテナを使うことになるのですっきりしません。
無くても無線ができるのか、どのくらいの距離なら大丈夫なのかはこれから調査します。
[2023/6/21]
BLEを使った通信ではアンテナが無しでは2m前後、アンテナをつけると3m以上離れていてもスマートフォンと通信をすることができました。

XIAO上では高性能CPUでありながら手ごろな値段であるので、電波を出さなくてもコスパは良いと感じます。

nRF52840 搭載 XIAO規格基板はこちら

ベーシックなマイコン制御に手ごろな価格で入手性の良い XIAO RP2040の記事

ESP32-S3搭載、拡張基板でTFカードリーダとOV2640カメラモジュールを使用できるXIAO ESP32S3

amanegi.digick.jp/computer-embedded/mcuboa/xiaos3

準備

ライブラリ

ボードライブラリ

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 > XIAO_ESP32C3
※ x.x.x Sep/2022 動作確認は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

書き込み方法

スケッチの書き込みはESP32 のダウンロードモードにします。
BOOTボタンを押下しながら、RESETボタンを押します。
※COMの番号が変わりやすいので、Portが選択されていることを確認してください。

基本スケッチ

LEDチカ

説明

GPIO2を使用したLチカ(点滅)を行います。

スケッチ
#define PIN_LED 2         //GPIO2を使用する

void setup()
{
  //PIN出力モード
  pinMode(PIN_LED, OUTPUT);
}

void loop()
{
  //1秒周期で点滅を行う(500ms点灯、500ms消灯)
  digitalWrite(PIN_LED, HIGH);
  delay(500);
  digitalWrite(PIN_LED, LOW);
  delay(500);
}
結果

LEDが点滅しました。

PWM

説明

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

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

【マイコン基板】
PWM機能搭載基板で利用できます。
ピン出力については使用されるマイコン基板のピンアサイン表などを確認してください。

例 : XIAO-ESP32C3

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

【ライブラリ】

例 esp32 > XIAO_ESP32C3

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

【バージョン情報】
2022/10/26 : 新規
**********************************************************************/
// XIAO-C3のanalogWriteで設定できるピン (0 - 255)
//   2, 3, 4, 5, 6, 7 

#define PWM 2         //DA 出力は 2th 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);
  }
}
結果

PWM制御(analogWrite)でゆっくり点灯、ゆっくり消灯しました。

ADC

説明

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

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

配線
XIAO-ESP32C3配線スライド抵抗
3.3V+
GND
GPIO2(ADC0)S
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
ADCピン搭載基板で利用できます。

例 : XIAO-ESP32C3

【スケッチの説明】
ADCへの入力AD値を読み取ります。

マイコンの3.3Vを可変抵抗モジュールに通します。
可変抵抗モジュールからの電圧をマイコンの指定ピンで読み出し、シリアル出力(COM)します。

【ライブラリ】
例  esp > XIAO_ESP32C3

【準備】
マイコン <-> スライド抵抗
3V3 <-> スライド抵抗 + 
GND <-> スライド抵抗 -
指定ピン <-> スライド抵抗 s 
      
【バージョン情報】
2022/10/28 : 新規
**********************************************************************/
//XIAO-C3 analogRead (12bit 0 ~ 4095)
//2, 3, 4, 5        //analogRead


#define PIN_ADC0 2     //ADC0

void setup()
{
  delay(1000);
  Serial.begin(115200);         //結果はCOMに出力

  pinMode(PIN_ADC0, INPUT);
}

void loop()
{
  long lADC0 = 0;

  lADC0 = analogRead(PIN_ADC0);

  Serial.printf("ADC0 = %4d\n", lADC0);
  delay(100); 
}
結果

結果はADC0にスライド抵抗を接続しています。
スライド抵抗のつまみを変化させることで、A/Dの読み取り値に変化がありました。

UART(省略します)

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

I2C(SSD1306)

説明

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

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

【マイコン基板】
デフォルトでI2Cが設定されている基板で利用できます。

例 : XIAO-ESP32C3

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

【ライブラリ】
例 esp32 > XIAO_ESP32C3

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

【バージョン情報】
2022/11/02 : 新規
**********************************************************************/
//XIAO ESP32C3では I2C SDA(GPIO6), SCL(GPIO7)

#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(45, 25);
  display.print(F("XIAO"));
  display.setCursor(25, 45);
  display.print(F("ESP32C3"));

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

void loop()
{
}
結果

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

SPI(ST7735)

説明

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

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

配線
XIAO-ESP32C3配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GPIO3Reset
GPIO4AO(DC)
GP8(SPI SCK)SCK
GP10(SPI MOSI)SDA
GPIO2CS
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
XIAO-ESP32C3 基板で動作します。

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

【ライブラリ】
例 esp32 > XIAO_ESP32C3

【準備】
マイコン基板 <-> ST7735
3V3           <-> VCC
GND           <-> GND
GPIO2(CS)     <-> CS
GPIO3(Reset)  <-> Reset
GPIO4(DC)     <-> AO
GPIO10(MOSI)  <-> SDA
GPIO8(SCK)    <-> SCK

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

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

#define TFT_CS          2  // CS
#define TFT_RST         3  // Reset 
#define TFT_DC          4  // DC
#define TFT_MOSI        10 // MOSI
#define TFT_SCK         8  // 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のサンプルスケッチが動作しました。

特別な機能のスケッチ

BLE-UART

スケッチの説明

スマートフォンからBTシリアル通信を行います。

XIAO-ESP32 C3のUARTから読み取ったデータを、BLEを使いスマートフォンに送信します。
スマートフォンから読み取ったBLEデータは、UARTへ出力します。

配線

XIAO-ESP32 C3にはUSBシリアルがないので、UARTを使用するためにはUSBシリアルモジュールとXIAO-ESP32 C3を配線します。
USBシリアルモジュールにはFT232RLを使用します。

XIAO-ESP32 C3配線FT232RL
GPIO21(TX)TX
GPIO20(RX)RX
サンプルスケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
XIAO-ESP32 C3

【スケッチの説明】
BLE UART通信します。

UARTから読み取ったデータをBLEクライアントに送信します。
BLEクライアントから読み取ったデータはUARTに送信します。

参考
ファイル > スケッチ例 > ESP32 BLE Arduino > BLE_uart
を送信、受信できるように修正しています。

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

【準備】
XIAO ESP32 C3  <-> FT232RL
GPIO21(TX)     <-> RX
GPIO20(RX)     <-> TX

BLEクライアントアプリが必要です。

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

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

#define BUFFER 64

BLEServer *pServer = NULL;
BLECharacteristic * pTxCharacteristic;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint8_t txValue[BUFFER] = "";

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID           "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"


class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
    };

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
    }
};

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = pCharacteristic->getValue();

      if (rxValue.length() > 0) {
        Serial.println("*********");
        Serial.print("Received Value: ");
        for (int i = 0; i < rxValue.length(); i++)
          Serial.print(rxValue[i]);

        Serial.println();
        Serial.println("*********");
      }
    }
};


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

  // Create the BLE Device
  BLEDevice::init("BLE UART");

  // Create the BLE Server
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  // Create the BLE Service
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // Create a BLE Characteristic
  pTxCharacteristic = pService->createCharacteristic(
										CHARACTERISTIC_UUID_TX,
										BLECharacteristic::PROPERTY_NOTIFY
									);
                      
  pTxCharacteristic->addDescriptor(new BLE2902());

  BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
											 CHARACTERISTIC_UUID_RX,
											BLECharacteristic::PROPERTY_WRITE
										);

  pRxCharacteristic->setCallbacks(new MyCallbacks());

  // Start the service
  pService->start();

  // Start advertising
  pServer->getAdvertising()->start();
  Serial.println("Waiting a client connection to notify...");
}

void loop() {

  //以下修正箇所 COMからデータを読み取り、BLEに送信
  if (deviceConnected == true)
  {
    if(Serial.available() != 0)
    {
      size_t bufSize = Serial.read(txValue, Serial.available());
      pTxCharacteristic->setValue(txValue, bufSize);
      pTxCharacteristic->notify();
    }

		delay(10); // bluetooth stack will go into congestion, if too many packets are sent
	}
  //ここまで

    // disconnecting
    if (!deviceConnected && oldDeviceConnected) {
        delay(500); // give the bluetooth stack the chance to get things ready
        pServer->startAdvertising(); // restart advertising
        Serial.println("start advertising");
        oldDeviceConnected = deviceConnected;
    }
    // connecting
    if (deviceConnected && !oldDeviceConnected) {
		// do stuff here on connecting
        oldDeviceConnected = deviceConnected;
    }
}
結果

スマートフォンからBLE接続を行いました。
スマートフォンアプリケーションにはSerial Bluetoothを使用します。

アプリケーションを起動し、画面左上のメニューから「Devices」を選択します。
「Bluetooth LE」を選択し、SCANを押します。
スケッチが正常に動作していれば「BLE UART」が表示されるので選択することで接続できます。

パソコン側からはArduinoIDEのシリアルモニタを使用します。
シリアルモニタから入力した文字がアプリケーション上に表示(水色の楕円)されます。
「Serial Bluetooth」アプリケーションから入力した文字が、シリアルモニタに表示(赤色の楕円)されます。

付属のアンテナがない状態でも2m程度は通信ができました。

コメント

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