SenseCraft AI を使って XIAO ESP32S3 Sense を AI センサーとして使用する
この Wiki では、SenseCraft AI 上でモデルの出力を設定し、XIAO ESP32S3 Sense を AI センサーとして使用するための手順を順を追って説明します。ここでの手順に従うことで、XIAO ESP32S3 Sense をコンピュータに接続し、適切な出力方法を選択し、UART、I2C、SPI などのさまざまな通信プロトコルを使用してモデルデータを取得する方法を学ぶことができます。
事前準備
作業を進める前に、以下のものを用意してください。
- XIAO ESP32S3 Sense
- モデルデータを受信するための追加の XIAO ボード(例:XIAO ESP32C3)
- XIAO ESP32S3 Sense をコンピュータに接続するための USB-C データケーブル
- Arduino IDE と、インストール済みの Seeed_Arduino_SSCMA ライブラリ
| XIAO ESP32S3 Sense |
|---|
![]() |
ステップ 1. XIAO ESP32S3 Sense ワークスペースへアクセスし、デバイスを接続する
SenseCraft AI > Models > Workspace > XIAO ESP32S3 Sense の順に進んで XIAO ESP32S3 Sense のワークスペースにアクセスするか、ワークスペースへの直接リンクを使用します。

USB-C ケーブルを使用して、XIAO ESP32S3 Sense ボードをコンピュータに接続します。接続が完了したら、ワークスペースページ左上にある Connect ボタンをクリックします。

ステップ 2. XIAO ESP32S3 Sense にモデルがロードされていることを確認する
次に進む前に、XIAO ESP32S3 Sense ボードに学習済みモデルがロードされていることを確認してください。まだモデルをロードしていない場合は、SenseCraft AI のドキュメントを参照して、デバイスにモデルを学習・デプロイする方法を確認してください。
自分で学習させたモデルを使用したい場合は、次の 2 つの Wiki を参照してください。
ステップ 3. 使用したい方式とプログラムを準備する
XIAO は UART、IIC、SPI を介してモデル結果を出力することをサポートしており、実際の状況に応じて結果の出力方法を選択できます。
オプション 1. UART 通信
2 枚の XIAO ボードの TX ピンと RX ピンをそれぞれ接続します。AI センサー(すでにモデリング済み)の XIAO ESP32S3 Sense では、出力ピンは次のように定義されています。
- TX: GPIO43
- RX: GPIO44

GitHub から Seeed_Arduino_SSCMA ライブラリをダウンロードし、Arduino 環境に追加します。
次のサンプルのコードを使用します。
ボーレートを 921600、データビット 8、パリティなし、ストップビット 1(8N1)に設定してください。
#include <Seeed_Arduino_SSCMA.h>
#ifdef ESP32
#include <HardwareSerial.h>
// Define two Serial devices mapped to the two internal UARTs
HardwareSerial atSerial(0);
#else
#define atSerial Serial1
#endif
SSCMA AI;
void setup()
{
Serial.begin(9600);
AI.begin(&atSerial);
}
void loop()
{
if (!AI.invoke(1,false,true))
{
Serial.println("invoke success");
Serial.print("perf: prepocess=");
Serial.print(AI.perf().prepocess);
Serial.print(", inference=");
Serial.print(AI.perf().inference);
Serial.print(", postpocess=");
Serial.println(AI.perf().postprocess);
for (int i = 0; i < AI.boxes().size(); i++)
{
Serial.print("Box[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.boxes()[i].target);
Serial.print(", score=");
Serial.print(AI.boxes()[i].score);
Serial.print(", x=");
Serial.print(AI.boxes()[i].x);
Serial.print(", y=");
Serial.print(AI.boxes()[i].y);
Serial.print(", w=");
Serial.print(AI.boxes()[i].w);
Serial.print(", h=");
Serial.println(AI.boxes()[i].h);
}
for (int i = 0; i < AI.classes().size(); i++)
{
Serial.print("Class[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.classes()[i].target);
Serial.print(", score=");
Serial.println(AI.classes()[i].score);
}
for (int i = 0; i < AI.points().size(); i++)
{
Serial.print("Point[");
Serial.print(i);
Serial.print("]: target=");
Serial.print(AI.points()[i].target);
Serial.print(", score=");
Serial.print(AI.points()[i].score);
Serial.print(", x=");
Serial.print(AI.points()[i].x);
Serial.print(", y=");
Serial.println(AI.points()[i].y);
}
for (int i = 0; i < AI.keypoints().size(); i++)
{
Serial.print("keypoint[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.keypoints()[i].box.target);
Serial.print(", score=");
Serial.print(AI.keypoints()[i].box.score);
Serial.print(", box:[x=");
Serial.print(AI.keypoints()[i].box.x);
Serial.print(", y=");
Serial.print(AI.keypoints()[i].box.y);
Serial.print(", w=");
Serial.print(AI.keypoints()[i].box.w);
Serial.print(", h=");
Serial.print(AI.keypoints()[i].box.h);
Serial.print("], points:[");
for (int j = 0; j < AI.keypoints()[i].points.size(); j++)
{
Serial.print("[");
Serial.print(AI.keypoints()[i].points[j].x);
Serial.print(",");
Serial.print(AI.keypoints()[i].points[j].y);
Serial.print("],");
}
Serial.println("]");
}
if(!AI.last_image().isEmpty())
{
Serial.print("Last image:");
Serial.println(AI.last_image().c_str());
}
}
}
すべてが正しく動作していれば、以下のようにモデル結果の出力メッセージが表示されます。

オプション 2. I2C 通信
2 枚の XIAO ボードの SDA ピンと SCL ピンをそれぞれ接続します。AI センサー(すでにモデリング済み)の XIAO ESP32S3 Sense では、出力ピンは次のように定義されています。
- SDA: GPIO5(プルアップ抵抗付き)
- SCL: GPIO6(プルアップ抵抗付き)
- I2C スレーブアドレスを
0x62に設定

GitHub から Seeed_Arduino_SSCMA ライブラリをダウンロードし、Arduino 環境に追加します。
次のサンプルのコードを使用します:
I2C 通信には次のプロトコルを使用します:
- READ: バイト 0x10, 0x01, LEN << 8, LEN & 0xff を送信
- WRITE: バイト 0x10, 0x02, LEN << 8, LEN & 0xff を送信
- AVAIL(データの有無を確認): バイト 0x10, 0x03 を送信
- RESET(バッファをクリア): バイト 0x10, 0x06 を送信
#include <Seeed_Arduino_SSCMA.h>
#include <Wire.h>
SSCMA AI;
void setup()
{
Wire.begin();
AI.begin(&Wire);
Serial.begin(9600);
}
void loop()
{
if (!AI.invoke())
{
Serial.println("invoke success");
Serial.print("perf: prepocess=");
Serial.print(AI.perf().prepocess);
Serial.print(", inference=");
Serial.print(AI.perf().inference);
Serial.print(", postpocess=");
Serial.println(AI.perf().postprocess);
for (int i = 0; i < AI.boxes().size(); i++)
{
Serial.print("Box[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.boxes()[i].target);
Serial.print(", score=");
Serial.print(AI.boxes()[i].score);
Serial.print(", x=");
Serial.print(AI.boxes()[i].x);
Serial.print(", y=");
Serial.print(AI.boxes()[i].y);
Serial.print(", w=");
Serial.print(AI.boxes()[i].w);
Serial.print(", h=");
Serial.println(AI.boxes()[i].h);
}
for (int i = 0; i < AI.classes().size(); i++)
{
Serial.print("Class[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.classes()[i].target);
Serial.print(", score=");
Serial.println(AI.classes()[i].score);
}
for (int i = 0; i < AI.points().size(); i++)
{
Serial.print("Point[");
Serial.print(i);
Serial.print("]: target=");
Serial.print(AI.points()[i].target);
Serial.print(", score=");
Serial.print(AI.points()[i].score);
Serial.print(", x=");
Serial.print(AI.points()[i].x);
Serial.print(", y=");
Serial.println(AI.points()[i].y);
}
for (int i = 0; i < AI.keypoints().size(); i++)
{
Serial.print("keypoint[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.keypoints()[i].box.target);
Serial.print(", score=");
Serial.print(AI.keypoints()[i].box.score);
Serial.print(", box:[x=");
Serial.print(AI.keypoints()[i].box.x);
Serial.print(", y=");
Serial.print(AI.keypoints()[i].box.y);
Serial.print(", w=");
Serial.print(AI.keypoints()[i].box.w);
Serial.print(", h=");
Serial.print(AI.keypoints()[i].box.h);
Serial.print("], points:[");
for (int j = 0; j < AI.keypoints()[i].points.size(); j++)
{
Serial.print("[");
Serial.print(AI.keypoints()[i].points[j].x);
Serial.print(",");
Serial.print(AI.keypoints()[i].points[j].y);
Serial.print("],");
}
Serial.println("]");
}
}
}
すべてが正常に動作すれば、以下のようにモデル結果の出力メッセージが表示されます。

オプション 3. SPI 通信
- 2 枚の XIAO ボードの次のピン同士を接続します。AI センサ(すでにモデリング済み)の XIAO ESP32S3 Sense では、出力ピンは次のように定義されています:
- MOSI: GPIO9(プルアップ抵抗付き)
- MISO: GPIO8
- SCLK: GPIO7(プルアップ抵抗付き)
- CS: GPIO4(プルアップ抵抗付き)

- GitHub から Seeed_Arduino_SSCMA ライブラリをダウンロードし、Arduino 環境に追加します。
- 提供されているサンプルコードを SPI 通信を使用するように変更します。
SPI 通信には次のプロトコルを使用します:
- READ: バイト 0x10, 0x01, LEN << 8, LEN & 0xff を送信
- WRITE: バイト 0x10, 0x02, LEN << 8, LEN & 0xff を送信
- AVAIL(データの有無を確認): バイト 0x10, 0x03 を送信
- RESET(バッファをクリア): バイト 0x10, 0x06 を送信
#include <Seeed_Arduino_SSCMA.h>
#include <SPI.h>
SSCMA AI;
void setup()
{
SPI.begin(SCK, MISO, MOSI, -1);
AI.begin(&SPI, D3, -1, -1);
Serial.begin(9600);
}
void loop()
{
if (!AI.invoke())
{
Serial.println("invoke success");
Serial.print("perf: prepocess=");
Serial.print(AI.perf().prepocess);
Serial.print(", inference=");
Serial.print(AI.perf().inference);
Serial.print(", postpocess=");
Serial.println(AI.perf().postprocess);
for (int i = 0; i < AI.boxes().size(); i++)
{
Serial.print("Box[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.boxes()[i].target);
Serial.print(", score=");
Serial.print(AI.boxes()[i].score);
Serial.print(", x=");
Serial.print(AI.boxes()[i].x);
Serial.print(", y=");
Serial.print(AI.boxes()[i].y);
Serial.print(", w=");
Serial.print(AI.boxes()[i].w);
Serial.print(", h=");
Serial.println(AI.boxes()[i].h);
}
for (int i = 0; i < AI.classes().size(); i++)
{
Serial.print("Class[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.classes()[i].target);
Serial.print(", score=");
Serial.println(AI.classes()[i].score);
}
for (int i = 0; i < AI.points().size(); i++)
{
Serial.print("Point[");
Serial.print(i);
Serial.print("]: target=");
Serial.print(AI.points()[i].target);
Serial.print(", score=");
Serial.print(AI.points()[i].score);
Serial.print(", x=");
Serial.print(AI.points()[i].x);
Serial.print(", y=");
Serial.println(AI.points()[i].y);
}
for (int i = 0; i < AI.keypoints().size(); i++)
{
Serial.print("keypoint[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.keypoints()[i].box.target);
Serial.print(", score=");
Serial.print(AI.keypoints()[i].box.score);
Serial.print(", box:[x=");
Serial.print(AI.keypoints()[i].box.x);
Serial.print(", y=");
Serial.print(AI.keypoints()[i].box.y);
Serial.print(", w=");
Serial.print(AI.keypoints()[i].box.w);
Serial.print(", h=");
Serial.print(AI.keypoints()[i].box.h);
Serial.print("], points:[");
for (int j = 0; j < AI.keypoints()[i].points.size(); j++)
{
Serial.print("[");
Serial.print(AI.keypoints()[i].points[j].x);
Serial.print(",");
Serial.print(AI.keypoints()[i].points[j].y);
Serial.print("],");
}
Serial.println("]");
}
}
}
すべてが正常に動作すれば、以下のようにモデル結果の出力メッセージが表示されます。

ステップ 4: コードをアップロードして実行する
選択した通信プロトコルに基づいて、Arduino IDE で適切なサンプルコードを開きます。コードを検証して受信側の XIAO ボードに書き込みます。Arduino IDE のシリアルモニタを開き、受信したモデルデータを確認します。

まとめ
このステップバイステップガイドに従うことで、SenseCraft AI 上のモデル出力を正しく設定し、XIAO ESP32S3 Sense を AI センサーとして使用できるようになりました。これで、プロジェクトの要件に応じて UART、I2C、SPI などのさまざまな通信プロトコルを使用してモデルデータを取得できます。
提供されているサンプルコードを参照し、ご自身の具体的な構成や選択した通信プロトコルに応じて必要な変更を加えるようにしてください。
問題が発生した場合や、さらに質問がある場合は、Seeed Studio のドキュメントを参照するか、コミュニティフォーラムでサポートを受けてください。
XIAO ESP32S3 Sense と SenseCraft AI で、楽しいセンシングをお楽しみください!
技術サポート & 製品ディスカッション
弊社製品をお選びいただきありがとうございます。私たちは、製品をできるだけスムーズにご利用いただけるよう、さまざまなサポートを提供しています。お好みやニーズに応じて選べる複数のコミュニケーションチャネルをご用意しています。
