Seeed Studio のXIAOシリーズ ESP32-C3搭載基板、 XIAO ESP32C3を入手しました。
XIAOシリーズの技適付き版、XIAO ESP32C3を評価します。
紹介するもの
Seeed Studio XIAO ESP32C3
特徴
切手サイズのXIAOシリーズ。
RISC-V搭載の省電力。
技適対応でWifiとBLEが使用できる。(外部アンテナが必要)。
接続 | Type C |
CPU | C3 RISC-V 160MHz |
フラッシュMemory | 4MB |
GPIO | 11 |
ADC | 4 (12bit 0 ~ 4095) |
PWM | 11 (8bit 0 ~ 255) 同時に6本まで使用可能 |
UART | 1 |
I2C | 1 |
SPI | 1 |
ボタン | BOOT RESET |
XIAOの紹介サイトです。
ピン配置
公式の表では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用のライブラリのインストールとボードの選択をします。
ボードマネージャのURL | https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json |
検索 | ESP |
ボードライブラリ | esp32 by Espressif Systems バージョン x.x.x※ |
選択するボード | ツール > ボード > esp32 > XIAO_ESP32C3 |
モジュールライブラリ
機能/モジュール | ライブラリ名 | 検索 | 確認時のバージョン |
---|---|---|---|
SSD1306 | Adafruit SSD1306 by Adafruit | SSD1306 | 2.5.1 |
ST7735 | Adafruit ST7735 and ST7789 Library by Adafruit | ST7735 | 1.9.3 |
関連 SSD1306 ST7735 | Adafruit GFX Library by Adafruit | GFX | 1.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.3V | 赤 | VCC |
GND | 黒 | GND |
GPIO7 | 白 | SCL |
GPIO6 | 黄 | SDA |
スケッチ
/**********************************************************************
【ライセンスについて】
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.3V | 赤 | VCC |
3.3V | 赤 | LED |
GND | 黒 | GND |
GPIO3 | 青 | Reset |
GPIO4 | 橙 | AO(DC) |
GP8(SPI SCK) | 紫 | SCK |
GP10(SPI MOSI) | 緑 | SDA |
GPIO2 | 黄 | CS |
スケッチ
/**********************************************************************
【ライセンスについて】
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程度は通信ができました。
コメント