【Arduino】Seeedstudio XIAO ESP32C6を使う

it

SeeedStudioのXIAOシリーズ XIAO ESP32C6を使ってみました。
Arduino環境での準備や基本的な使い方をまとめました。
IOの設定、通信(UART, I2C, SPI)、WiFiでWebServerを使った内容を記事にしました。

XIAO ESP32C6

簡単紹介

SeeedStudioのXIAOシリーズでピン互換があり、小型の基板でも多くの機能を使えます。
技適付きで手軽に無線による通信制御ができます。
技適付きマイコンでは安定した入手性。

XIAO ESP32 C6の公式サイトです。

◆XIAOシリーズの記事

XIAO SAMD21XIAO SAMD21を使った記事。
基本的なGPIOの操作とDAC出力、書き込み時のトラブルについてまとめた記事です。
XIAO RP2040XIAO RP2040を使った記事。
使っている時に発生したI2CのWireとWire1問題、WS2812の点灯などトラブルを中心に記載しました。
XIAO ESP32-C3XIAO ESP32-C3を使った記事。
GPIOを使った基本スケッチ、BLE UARTを使った内容を記事にしました。
XIAO ESP32-S3XIAO ESP32-S3/XIAO ESP32-S3 Sense を使った記事。
GPIOを使った基本スケッチの他静電容量タッチセンサ、カメラWebサーバーを使った内容を記事にしました。
XIAO nRF52840XIAO nRF52840/XIAO nRF52840 Senseを使った記事。
GPIOを使った基本スケッチ、BLE UART他、XIAO nRF52840 SenseのIMU 6軸センサ、PDM Microphoneを使った内容を記事にしました。
XIAO RA4M1XIAO RA4M1を使った記事。
基板特有のトラブルと基本的なGPIOの操作について記事にしました。
XIAO RP2350XIAO RP2350を使った記事。
XIAO RP2040との比較を中心に搭載機能を使った内容を記事しました。
XIAO ESP32C6XIAO ESP32C6を使った記事。
基本的なGPIOの使い方からWiFiServerにして読み取ったDA値を表示してみた内容を記事にしました。

ピン配置

外観

使ってみた

◆開発

Arduino環境で開発しました。
ボードライブラリはボードライブラリは「esp32 by Espressif SystemsのESP32 Dev Module」、選択したボードは「XIAO_ESP32C6」です。
「ESP32C6 Dev Module」でもコンパイルはできますが、通信線などピン定義が変わるので自身でのピンアサイン管理が必要です。

◆USBシリアルとUART

Arduino開発ではマイコン内のデバッグ情報を手軽に出力するのにUSBシリアルを使用することがあります。
この基板では同じ「Serial」オブジェクトを使用した振る舞いをコンパイルオプションで変更します。
詳しくはこちら。

USB-CDCを有効にするとUSBコネクタから、無効にするとUARTを使用できます。
下図はUSB CDC On Boot: Enabledで実行した結果です。
(COM3はUART、COM13はUSBシリアルです)


準備

ライブラリのインストール

Arduino IDEでESP32 C6を開発するために、ESP32ボードライブラリをインストールします。
この作業をするために、ArduinoIDEがインストールされている必要があります。

ボードライブラリ

ボードマネージャのURLhttps://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
検索ESP
ボードライブラリesp32 by Espressif Systems バージョン x.x.x※
選択するボードツール > ボード > esp32 > XIAO_ESP32C6
※ x.x.x Apr/2025 動作確認は2.0.3を使用しています

I2C,SPIの記事では小型のOLEDとLCDの表示をします。
サンプルを利用する場合は以下のライブラリのインストールが必要です。

モジュールライブラリ

I2CとSPIの動作を見るためにOLED(SSD1306)を使います。
モジュールを使用するためのモジュールライブラリが必要です。

機能/モジュールライブラリ名検索確認時のバージョン
SSD1306Adafruit SSD1306 by AdafruitSSD13062.5.1
関連
SSD1306
Adafruit GFX Library by AdafruitGFX1.11.3

スケッチの書き込み方法

XIAO ESP32C6のスケッチの書き込み方法について。
ESP32C6搭載基板はUSBからの書き込みます。

ダウンロードモードにします。
BOOTボタンを押しながら電源を投入するか、BOOTボタンを押しながらリセットボタンを押して再起動します。
ArduinoIDEのスケッチ書き込みボタンを押すことで書き込みができます。
※COMの番号が変わりやすいので、正しいCOM番号が選択されていることを確認してください。

スケッチの書き込み後は電源を再投入するか、リセットボタンを押します。

スケッチ

デジタル出力

説明

GPIOのデジタル出力を使ってLow/High処理を繰り返し、プログラム繰り返し速度の計測をします。

オシロスコープ(HDS272)で信号をモニタし、信号の立ち上がりから次の立ち上がり(または立下りから次の立下り)までの時間を計測します。

このスケッチをコンパイルするのにかかった時間をストップウォッチで計測します。

配線

配線不要
信号をモニタするために、D0(GPIO0)とGNDをオシロスコープでプローブします。

スケッチ

#define PIN    (D0)

void setup()
{
  pinMode(PIN, OUTPUT);
}

void loop()
{
  while(1)
  {
    digitalWrite(PIN, HIGH);
    digitalWrite(PIN, LOW);
  }
}

結果

スケッチのコンパイルにかかった時間は 25秒 でした。

オシロスコープ(HDS272)でGPIOのLow/High時間を計測しました。
信号の立下りで計測したA-B間の時間は1.872us(0.534MHz)でした。

GPIO(ボタン、LED)

説明

GPIOを使ってボタンの入力状態の確認と電圧の出力でLEDの点灯/消灯をします。
ボタンを押している間LEDを消灯、ボタンを押していない間LEDを点灯させます。

ボタンはタクトボタンを使いD0(GPIO0)の状態を読み取ります。
LEDは基板実装LED黄 (GPIO15)を使います。
LEDはGPIO15の状態がLowで点灯、Highで消灯します。

配線

スケッチ

#define PIN_LED (2)

void setup()
{
  pinMode(PIN_LED, OUTPUT);
}

void loop()
{
  digitalWrite(PIN_LED, HIGH);
  delay(500);
  digitalWrite(PIN_LED, LOW);
  delay(500);
}

結果

画像上がボタンを押していない状態でLED(赤)が点灯しています。
画像下がボタンを押している状態でLEDは消灯しています。

小さなLEDでわかりにくいですが、I/O操作だけですぐに使えるLEDがあると動作のインジケータとして重宝します。

PWM

説明

PWMを使って多段階のLED輝度調整をします。
8chアレイLEDモジュールを使い、流れるように使い端から徐々に明るくする表現にします。

輝度はグローバル配列を使いあらかじめ8段階の輝度になるように計算します。
制御に使うGPIOは合計7chです。
ESP32C6が一度に使えるPWMは7chのようです。

配線

スケッチ

int16_t tblPin[] = {
  D0, D1, D2, D3, D4, D5, D6
};

int16_t tblCounter[] = {
  (255 / 8) * 0, (255 / 8) * 1, (255 / 8) * 2, (255 / 8) * 3,
  (255 / 8) * 4, (255 / 8) * 5, (255 / 8) * 6, (255 / 8) * 7
};

void setup()
{
  int16_t Count = sizeof(tblPin) / sizeof(tblPin[0]);
  while(1)
  {
    for(int16_t i = 0; i < Count; i ++)
    {
      analogWrite(tblPin[i], tblCounter[i]);

      tblCounter[i] ++;
      if(tblCounter[i] > 255) tblCounter[i] = 0;
    }
    delay(2);
  }
}

void loop()
{}

結果

流れるような演出でゆっくり点灯しました。
D0をオシロスコープでモニタしました。

PWMによるDutyの変化を見ることができました。
PWMの周期(A – B間)を計測すると1ms(1kHz)でした。

ADC(アナログ入力)

説明

XIAO ESP32C6のADCを使って入力電圧を読み取ります。
XIAO ESP32C6のADCは0~3.3Vの電圧を12bit(0~4095)の分解能で読み取ります。
読み取った結果はUSBシリアルに出力します。

電圧の入力にXIAO SAMD21のDACを使いました。
0~3.3Vを約2秒、3.3~0Vを約2秒で変化するようにスケッチしました。

配線

スケッチ

#define ADC_PIN   (A0)

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

  pinMode(ADC_PIN, INPUT);

  while(1)
  {
    delay(2);
    Serial.println(analogRead(ADC_PIN));
  }
}

void loop()
{
}

結果

画像はXIAO SAMD21の出力電圧を読み取っている様子です。

USBシリアルに出力した結果をグラフにしました。
読み取り値は3457が最大なので、この値が3.3Vになると思います。

ESP系は3V以上の電圧で線形から外れる印象ですが、ESP32C6は終始線形でした。

UART

説明

XIAO ESP32C6のUARTを使います。

XIAO ESP32C6では同じスケッチでもコンパイルオプションにより振る舞いが変わります。
スケッチではシリアル通信オブジェクトに”Serial”を使っています。

コンパイルオプション「USB CDC on Boot」の設定「Enabled / Disabled」の違いにより変化する結果になるかを確認します。

EnabledDisabled
USBシリアルUART(TX GPIO16, RX GPIO17)

配線

スケッチ

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

  while(1)
  {
    Serial.println("COM");
    delay(1000);
  }
}

void loop()
{}

結果

UARTから入出力するために USB CDC On Boot をDisabledにします。
下図COM3はUART出力した結果をUSB-UART変換アダプタで受信したものです。

USBシリアルから入出力するためには USB CDC On Boot をEnabledにします。
下図COM13はUSBシリアルで受信したものです。

I2C(SSD1306)

説明

XIAO ESP32C6のI2Cを使いOLED(SSD1306)を表示制御します。

ESP32C6ではI2Cピンを任意のピンに設定できますが、今回デフォルト位置で使用します。
スケッチは、当サイトのサイトロゴの表示と文字列を表示します。

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

配線

スケッチ


#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH    (128)
#define SCREEN_HEIGHT   (64)

#define OLED_RESET      (-1)
#define SCREEN_ADDRESS  (0x3C)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define LOGO_HEIGHT     (32)
#define LOGO_WIDTH      (32)

static const unsigned char PROGMEM logo_bmp[] =
{
0x00, 0x00, 0x00, 0x00,    //0
0x00, 0x00, 0x00, 0x00,    //1
0x00, 0x00, 0x00, 0x00,    //2
0x00, 0x00, 0x00, 0x00,    //3
0x00, 0x00, 0x06, 0x00,    //4
0x00, 0x00, 0x1B, 0xA0,    //5
0x00, 0x00, 0x30, 0x70,    //6
0x00, 0x00, 0xE0, 0x30,    //7
0x00, 0x7F, 0x80, 0x30,    //8
0x01, 0xC0, 0x00, 0x10,    //9
0x03, 0x70, 0x07, 0x98,    //10
0x0F, 0xFC, 0x1C, 0x8C,    //11
0x19, 0x3C, 0x30, 0x44,    //12
0x12, 0x7E, 0x78, 0x46,    //13
0x32, 0xF2, 0xF8, 0x42,    //14
0x23, 0xA2, 0xCC, 0x83,    //15
0x21, 0xF6, 0xDD, 0x81,    //16
0xE0, 0x7E, 0xFF, 0x01,    //17
0x70, 0x38, 0xFC, 0x71,    //18
0x4F, 0x00, 0x07, 0xF1,    //19
0x61, 0xFF, 0xFC, 0x21,    //20
0x20, 0x00, 0x00, 0x61,    //21
0x30, 0xE0, 0x01, 0x83,    //22
0x18, 0x3F, 0xFE, 0x06,    //23
0x0C, 0x00, 0x00, 0x0C,    //24
0x03, 0xF8, 0x00, 0xF0,    //25
0x00, 0x0F, 0x7F, 0xC0,    //26
0x00, 0x00, 0x00, 0x00,    //27
0x00, 0x00, 0x00, 0x00,    //28
0x00, 0x00, 0x00, 0x00,    //29
0x00, 0x00, 0x00, 0x00,    //30
0x00, 0x00, 0x00, 0x00,    //31
};

void testdrawbitmap(void);

void setup()
{
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for(;;);
  }

  display.clearDisplay();

  display.drawBitmap(0, 0, logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);

  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(40, 15);
  display.println(F("XIAO"));
  display.print(F("ESP32C6"));
  display.display();
}

void loop()
{
}

結果

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

SPI(SSD1306)

説明

SPIを使ってOLED(SSD1306)を表示制御します。
表示内容はI2C(SSD1306)で使用したものと同じ内容です。

図形の描画やそのほかの命令はArduinoサンプルスケッチを参照してください。
Example > Adafruit SSD1306 > ssd1306_128x64_spi

配線

スケッチ

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

#define SCREEN_WIDTH    (128)
#define SCREEN_HEIGHT   (64)

#define OLED_CS         (D0)
#define OLED_RESET      (D1)
#define OLED_DC         (D2)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &SPI, OLED_DC, OLED_RESET, OLED_CS);

#define LOGO_HEIGHT     (32)
#define LOGO_WIDTH      (32)

static const unsigned char PROGMEM logo_bmp[] =
{
0x00, 0x00, 0x00, 0x00,    //0
0x00, 0x00, 0x00, 0x00,    //1
0x00, 0x00, 0x00, 0x00,    //2
0x00, 0x00, 0x00, 0x00,    //3
0x00, 0x00, 0x06, 0x00,    //4
0x00, 0x00, 0x1B, 0xA0,    //5
0x00, 0x00, 0x30, 0x70,    //6
0x00, 0x00, 0xE0, 0x30,    //7
0x00, 0x7F, 0x80, 0x30,    //8
0x01, 0xC0, 0x00, 0x10,    //9
0x03, 0x70, 0x07, 0x98,    //10
0x0F, 0xFC, 0x1C, 0x8C,    //11
0x19, 0x3C, 0x30, 0x44,    //12
0x12, 0x7E, 0x78, 0x46,    //13
0x32, 0xF2, 0xF8, 0x42,    //14
0x23, 0xA2, 0xCC, 0x83,    //15
0x21, 0xF6, 0xDD, 0x81,    //16
0xE0, 0x7E, 0xFF, 0x01,    //17
0x70, 0x38, 0xFC, 0x71,    //18
0x4F, 0x00, 0x07, 0xF1,    //19
0x61, 0xFF, 0xFC, 0x21,    //20
0x20, 0x00, 0x00, 0x61,    //21
0x30, 0xE0, 0x01, 0x83,    //22
0x18, 0x3F, 0xFE, 0x06,    //23
0x0C, 0x00, 0x00, 0x0C,    //24
0x03, 0xF8, 0x00, 0xF0,    //25
0x00, 0x0F, 0x7F, 0xC0,    //26
0x00, 0x00, 0x00, 0x00,    //27
0x00, 0x00, 0x00, 0x00,    //28
0x00, 0x00, 0x00, 0x00,    //29
0x00, 0x00, 0x00, 0x00,    //30
0x00, 0x00, 0x00, 0x00,    //31
};

void testdrawbitmap(void);

void setup()
{
  if(!display.begin(SSD1306_SWITCHCAPVCC)) {
    for(;;);
  }

  display.clearDisplay();

  display.drawBitmap(0, 0, logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);

  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(40, 15);
  display.println(F("XIAO"));
  display.print(F("ESP32C6"));
  display.display();
}

void loop()
{
}

結果

OLED(SSD1306 SPI)のスケッチが動作しました。

WiFi WebServer

説明

WiFiを使ったWebServerを作ります。

アナログ入力(ADC)から電圧を読み取った結果をWebServer上にバー表示します。
入力する電圧はXIAO SAMD21のDACを使いました。

配線

スケッチ

#include <WiFi.h>

#define ADC_PIN (A0)

const char* ssid = "your SSID";
const char* password = "your password";
const int ledPin = 2;

WiFiServer server(80);

void setup()
{
  Serial.begin(115200);
  pinMode(ADC_PIN, INPUT);
 
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected.");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  server.begin();
}

void loop()
{
    WiFiClient client = server.available();
    if (client)
    {
        String request = "";
        while (client.connected())
        {
            if (client.available())
            {
                char c = client.read();
                request += c;
                if (c == '\n') break;
            }
        }

        int32_t ADCValue = analogRead(ADC_PIN);
        int percentage = map(ADCValue, 0, 4095, 0, 100);
        
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        client.println("<html><head>");
        client.println("<meta http-equiv='refresh' content='0.1'>");
        client.println("<style>");
        client.println(".bar-container { width: 100%; background-color: #ddd; }");
        client.println(".bar { width: " + String(percentage) + "%; height: 30px; background-color: #4CAF50; }");
        client.println("</style>");
        client.println("</head><body>");
        client.println("<h1>XIAO ESP32C6 ADC Monitor</h1>");
        client.println("ADC Value = " + String(ADCValue) + "<br>");
        client.println("<div class='bar-container'><div class='bar'></div></div>");
        client.println("</body></html>");
        client.stop();
    }
}

結果

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


コメント

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