XIAOとArduinoでの24GHz mmWaveセンサー開発
このセクションでは、XIAO用mmWaveのライブラリの使用方法と二次開発について説明します。
このWikiのすべての内容は、XIAO用24GHz mmWaveにのみ適用され、他のミリ波センサーでは使用できない場合があります。
はじめに
ハードウェアの準備
この記事のチュートリアル内容を始める前に、ミリ波センサーを使用するために、現在販売中のXIAOのいずれかを購入することをお勧めします。
Seeed Studio XIAO SAMD21 | Seeed Studio XIAO RP2040 | Seeed Studio XIAO nRF52840 (Sense) | Seeed Studio XIAO ESP32C3 | Seeed Studio XIAO ESP32S3 |
---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
この記事のチュートリアルでは、XIAO ESP32C3とmmWaveセンサーを使用例として、センサーのArduinoライブラリと関連機能の使用方法をガイドします。
Seeed Studio XIAO ESP32C3 | 24GHz mmWave for XIAO |
---|---|
![]() | ![]() |
このセンサーはXIAO互換性を考慮して設計されているため、一般的に、このセンサーを使用したい場合は、XIAOを準備し、センサー用のメスヘッダーピンを取り付ける必要があります。XIAOに接続する際は、センサーの取り付け方向に特に注意してください。逆向きに差し込まないでください。そうしないと、センサーやXIAOを焼損する可能性があります。
正しい方向は、センサーのアンテナが外側を向くようにすることです。

接続方向が正しいことを確認した後、USB-Cタイプケーブルをコンピューターまたは電源に接続すると、センサーが動作を開始します。
ソフトウェアの準備
センサーが使用するデフォルトのボーレートは256000であり、XIAOが設計したソフトシリアルポートのボーレートでは、このような高速ボーレートでのデータ伝送を満たすことができない可能性があるため、センサーを使用する前に、ソフトウェアを使用してセンサーのボーレートを調整する必要があります。次に、使用している携帯電話システムに応じて、対応するAPPをダウンロードしてください。
APPはボーレートを読み取ることができません。変更後も、APPは依然としてデフォルトのボーレートを表示します。

Arduinoライブラリ概要
Arduinoを初めて使用する場合は、Getting Started with Arduinoを参照することを強くお勧めします。
関数
スケッチの開発を始める前に、ライブラリで利用可能な関数を見てみましょう。
-
Seeed_HSP24(Stream &serial)
—— センサーが接続されているシリアルポートを渡し、センサーの初期化を開始するために使用されます。-
入力パラメータ:
- serial: センサーが接続されているシリアルポート。
-
-
Seeed_HSP24(Stream &serial, Stream &debugSerial)
—— センサーが接続されているシリアルポートを渡し、デバッグシリアルポートを追加してセンサーの初期化を開始するために使用されます。-
入力パラメータ:
- serial: センサーが接続されているシリアルポート。
- debugSerial: シリアルデバッグを有効にし、受信シリアルポートで出力します。
-
-
String getVersion()
—— センサーのソフトウェアバージョン番号を取得します。- 戻り値: センサーのソフトウェアバージョン番号。
-
RadarStatus getStatus()
—— センサーのステータス情報を取得します。センサーから報告されるすべての情報は、この関数によって解析されます。- 戻り値:
- radarStatus.radarMode: エンジニアリングモードまたはベースモード。1はエンジニアリングモードに対応し、2はベースモードに対応します。
- radarStatus.targetStatus: 監視対象の現在の状況を示します。合計4つの状況があります(NoTarget)、1つ目は人が検出されない場合、2つ目は誰かが静止していると検出された場合(MovingTarget)、3つ目は同時に検出された場合(StaticTarget)、4つ目は異常な場合(BothTargets)です(ErrorFrame)。BothTargetは誰かの動きを指します。センサーが現在の環境を監視し、動きエネルギーと静止エネルギーの両方が設定されたしきい値を超えるため、「BothTarget」と名付けました。動きエネルギーのみがしきい値を超える場合は、「MovingTarget」を出力します。
- radarStatus.distance: この値は、センサーが検出されたオブジェクトから検出する距離を指します。
- radarStatus.radarMovePower.moveGate(エンジニアリングモードで有効): この配列は、異なる距離ゲートの移動エネルギー値を格納します。
- radarStatus.radarStaticPower.staticGate(エンジニアリングモードで有効): この配列は、異なる距離ゲートの静的エネルギー値を格納します。
- radarStatus.photosensitive(エンジニアリングモードで有効): この値は、センサーの光感度値を指し、範囲は0-255です。
- 戻り値:
-
DataResult sendCommand(const byte* sendData, int sendDataLength)
—— この関数を通じてセンサーにコマンドが送信されます。-
入力パラメータ:
- sendData: 送信されるコマンドフレームの配列。
- sendDataLength: 送信されるコマンドフレームの長さ。
-
戻り値:
- resultBuffer: 動的に割り当てられた配列を指します。
- length: 配列の長さ。
-
-
AskStatus setDetectionDistance(int distance,int times)
—— この関数で最大距離ゲートと無人継続時間を設定します。- 入力パラメータ:
- distance: 最大距離ゲートを設定します。
- times: 無人継続時間。
- 入力パラメータ:
-
Return:
- 成功 0x00 または エラー 0x01。
-
AskStatus setGatePower(int gate,int movePower, int staticPower)
—— この関数で異なる距離ゲートと感度を設定します。-
入力パラメータ:
- gate: ドアまでの距離、範囲 0-8 m。
- movePower: 動作閾値をトリガーするエネルギー値。
- staticPower: 静止閾値をトリガーするエネルギー値。
-
Return:
- 成功 0x00 または エラー 0x01。
-
-
RadarStatus getConfig()
—— 設定センサーのパラメータ値を読み取ります。- Return:
- radarStatus.detectionDistance: レーダーの動作検出距離ゲート数。
- radarStatus.moveSetDistance: レーダーの静止検出距離ゲート数。
- radarStatus.staticSetDistance: レーダーの最長検出範囲ゲート。
- radarStatus.noTargrtduration: 無人継続時間。
- Return:
-
AskStatus setResolution(int resolution)
—— ドアまでの距離の解像度を設定します。1は0.25M、0は0.75M。デフォルト0.75M。-
入力パラメータ:
- resolution: 1は0.25M、0は0.75M。デフォルト0.75M。
-
Return:
- 成功 0x00 または エラー 0x01。
-
-
RadarStatus getResolution()
—— ドアまでの距離の解像度を取得します。1は0.25M、0は0.75M。デフォルト0.75M。- Return:
- radarStatus.resolution: 1は0.25M、0は0.75M。デフォルト0.75M。
- Return:
-
AskStatus rebootRadar()
—— レーダー再起動コマンド。- Return:
- 成功 0x00 または エラー 0x01。
- Return:
-
AskStatus refactoryRadar()
—— レーダーを工場設定に復元します。- Return:
- 成功 0x00 または エラー 0x01。
- Return:
-
AskStatus enableEngineeringModel()
—— センサーエンジニアリングモード出力を有効にします。- Return:
- 成功 0x00 または エラー 0x01。
- Return:
-
AskStatus disableEngineeringModel()
—— エンジニアリングモード出力を終了します。- Return:
- 成功 0x00 または エラー 0x01。
- Return:
デフォルト変数
#define BUFFER_SIZE 256 // Serial Buffer Size
class Seeed_HSP24
{
public:
static const int FRAME_START_SIZE = 4;
static const int FRAME_END_SIZE = 4;
static const byte frameStart[FRAME_START_SIZE];
static const byte frameEnd[FRAME_END_SIZE];
static const byte frameAskStart[FRAME_START_SIZE];
static const byte frameAskEnd[FRAME_END_SIZE];
struct RadarMovePower // Energy value per movement distance gate
{
int moveGate[9] = {-1, -1, -1, -1, -1, -1, -1, -1, -1};
};
struct RadarStaticPower // Energy value per stationary distance gate
{
int staticGate[9] = {-1, -1, -1, -1, -1, -1, -1, -1, -1};
};
// Define the TargetStatus enum class
enum class AskStatus : byte
{
Success = 0x00, // Success
Error = 0x01, // Failed
};
// 定义TargetStatus枚举类
enum class TargetStatus : byte
{
NoTarget = 0x00, // No target
MovingTarget = 0x01, // Moving target
StaticTarget = 0x02, // Static target
BothTargets = 0x03, // It can be interpreted as motion, meaning that both the set motion and stationary thresholds are above the set value
ErrorFrame = 0x04 // Failed to get status
};
// Define the RadarStatus structure
struct RadarStatus
{
TargetStatus targetStatus = TargetStatus::ErrorFrame; // Target status of the radar
int distance = -1; // Target distance of the radar in mm
int moveSetDistance = -1; // The number of motion detection distance gates of the radar, which generally do not have to be configured
int staticSetDistance = -1; // Number of static detection distance gates of the radar, which generally do not have to be configured
int detectionDistance = -1; // Radar's longest detection range gate
int resolution = -1; // Distance gate resolution of radar
int noTargrtduration = -1; // Unmanned duration
int radarMode = -1; // Used to distinguish whether the module is in basic reporting mode (2) or engineering reporting mode (1)
RadarMovePower radarMovePower; // Exercise Energy Value
RadarStaticPower radarStaticPower; // Stationary energy value
int photosensitive = -1; // Photosensitive 0-255
};
// Used to return the result of an issued command
struct DataResult
{
byte *resultBuffer; // Points to a dynamically allocated array
int length; // Length of the array
};
};
インストール
zipライブラリをダウンロードしたので、Arduino IDEを開き、Sketch > Include Library > Add .ZIP Libraryをクリックしてください。ダウンロードしたzipファイルを選択し、ライブラリが正しくインストールされると、通知ウィンドウにLibrary added to your librariesと表示されます。これはライブラリが正常にインストールされたことを意味します。

XIAOの例
ライブラリがインストールされ、基本機能を理解したので、24GHz mmWaveセンサーのいくつかの例を実行して、その動作を確認してみましょう。
ステップ1. Arduinoアプリケーションを起動します。

ステップ2. 開発ボードモデルを選択し、Arduino IDEに追加します。
-
後のルーチンでSeeed Studio XIAO SAMD21を使用したい場合は、**このチュートリアル**を参照して追加を完了してください。
-
後のルーチンでSeeed Studio XIAO RP2040を使用したい場合は、**このチュートリアル**を参照して追加を完了してください。
-
後のルーチンでSeeed Studio XIAO nRF52840を使用したい場合は、**このチュートリアル**を参照して追加を完了してください。
-
後のルーチンでSeeed Studio XIAO ESP32C3を使用したい場合は、**このチュートリアル**を参照して追加を完了してください。
-
後のルーチンでSeeed Studio XIAO ESP32S3を使用したい場合は、**このチュートリアル**を参照して追加を完了してください。
このチュートリアルではXIAO ESP32C3を例として使用します。
ステップ3. センサーをXIAOに接続し、USB-Cタイプケーブルを使用してXIAOをPCに接続します。
ステップ4. ダウンロードしたHLKRadarToolアプリを開き、センサーに適切なボーレートを設定します。
アプリを開くと、アプリが近くのレーダーデバイスを検索します。デバイスのブロードキャスト名はHLK-LD2410_xxxxです(xxxxはmacアドレスの最後の4桁)。

ソフトウェアの右上角のMoreオプションで、設定メニューにアクセスして、センサーのカスタムパラメータと機能を設定できます。センサーのボーレートを9600に設定して保存してください。

その後、センサーの再起動を待ちます。
ステップ5. 必要なライブラリを追加します。
Arduino環境に追加する必要があるセンサー用のライブラリに加えて、ESP32シリーズXIAOを使用している場合は、提供されている例を使用できるように、ソフトシリアルポート用のライブラリを別途インストールする必要がある場合があります。
デモ1. 基本モード出力
最初のプログラム例では、センサーによって報告される一般的な情報を解析します。これは、この製品の主要な機能情報出力を表します。例えば、人の存在、動き、距離などのデータです。
#if defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) || defined(ARDUINO_SEEED_XIAO_NRF52840)
#error "XIAO nRF52840 please use the non-mbed-enable version."
#endif
#include <SoftwareSerial.h>
#include <mmwave_for_xiao.h>
// Define the SoftwareSerial object, D2 as RX, D3 as TX, connect to the serial port of the mmwave sensor
SoftwareSerial COMSerial(D2, D3);
// Creates a global Serial object for printing debugging information
#define ShowSerial Serial
// Initialising the radar configuration
// Seeed_HSP24 xiao_config(COMSerial, ShowSerial);
Seeed_HSP24 xiao_config(COMSerial);
Seeed_HSP24::RadarStatus radarStatus;
void setup() {
COMSerial.begin(9600);
ShowSerial.begin(9600);
delay(500);
ShowSerial.println("Programme Starting!");
xiao_config.disableEngineeringModel();
}
void loop() {
int retryCount = 0;
const int MAX_RETRIES = 10; // Maximum number of retries to prevent infinite loops
//Get radar status
do {
radarStatus = xiao_config.getStatus();
retryCount++;
} while (radarStatus.targetStatus == Seeed_HSP24::TargetStatus::ErrorFrame && retryCount < MAX_RETRIES);
//Parses radar status and prints results from debug serial port
if (radarStatus.targetStatus != Seeed_HSP24::TargetStatus::ErrorFrame) {
ShowSerial.print("Status: " + String(targetStatusToString(radarStatus.targetStatus)) + " ---- ");
ShowSerial.println("Distance: " + String(radarStatus.distance) + " Mode: " + String(radarStatus.radarMode));
}
delay(200);
}
// Parsing the acquired radar status
const char* targetStatusToString(Seeed_HSP24::TargetStatus status) {
switch (status) {
case Seeed_HSP24::TargetStatus::NoTarget:
return "NoTarget";
case Seeed_HSP24::TargetStatus::MovingTarget:
return "MovingTarget";
case Seeed_HSP24::TargetStatus::StaticTarget:
return "StaticTarget";
case Seeed_HSP24::TargetStatus::BothTargets:
return "BothTargets";
default:
return "Unknown";
}
}
プログラムをコンパイルしてアップロードした後、シリアルモニターを開いてボーレートを9600に設定してください。すべてが正常に動作すれば、以下の結果出力が表示されるはずです。

デモ2. エンジニアリングモード出力
2番目のサンプルプログラムでは、センサーのエンジニアリングデータアップロードを有効にし、このエンジニアリング情報を解析します。ベースモードと比較して、エンジニアリング情報には異なる距離ゲートに対するより多くの動作エネルギー値と静的エネルギー値が含まれています。これらの値の表示により、現在の環境における動的および静的エネルギーの変化を視覚化でき、実際の状況に応じて誰かが存在している、静止している、または動いているかを判断するためのセンサーのトリガーを調整しやすくなります。
#if defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) || defined(ARDUINO_SEEED_XIAO_NRF52840)
#error "XIAO nRF52840 please use the non-mbed-enable version."
#endif
#include <SoftwareSerial.h>
#include <mmwave_for_xiao.h>
// Define the SoftwareSerial object, D2 as RX, D3 as TX, connect to the serial port of the mmwave sensor
SoftwareSerial COMSerial(D2, D3);
// Creates a global Serial object for printing debugging information
#define ShowSerial Serial
// Initialising the radar configuration
// Seeed_HSP24 xiao_config(COMSerial, ShowSerial);
Seeed_HSP24 xiao_config(COMSerial);
Seeed_HSP24::RadarStatus radarStatus;
void setup() {
COMSerial.begin(9600);
ShowSerial.begin(9600);
delay(500);
ShowSerial.println("Programme Starting!");
xiao_config.enableEngineeringModel();
}
void loop() {
int retryCount = 0;
const int MAX_RETRIES = 10; // Maximum number of retries to prevent infinite loops
//Get radar status
do {
radarStatus = xiao_config.getStatus();
retryCount++;
} while (radarStatus.targetStatus == Seeed_HSP24::TargetStatus::ErrorFrame && retryCount < MAX_RETRIES);
//Parses radar status and prints results from debug serial port
if (radarStatus.targetStatus != Seeed_HSP24::TargetStatus::ErrorFrame) {
ShowSerial.print("Status: " + String(targetStatusToString(radarStatus.targetStatus)) + " ---- ");
ShowSerial.println("Distance: " + String(radarStatus.distance) + " Mode: " + String(radarStatus.radarMode));
if (radarStatus.radarMode == 1) {
ShowSerial.print("Move:");
for (int i = 0; i < 9; i++) {
ShowSerial.print(" " + String(radarStatus.radarMovePower.moveGate[i]) + ",");
}
ShowSerial.println("");
ShowSerial.print("Static:");
for (int i = 0; i < 9; i++) {
ShowSerial.print(" " + String(radarStatus.radarStaticPower.staticGate[i]) + ",");
}
ShowSerial.println("");
ShowSerial.println("Photosensitive: " + String(radarStatus.photosensitive));
}
}
delay(100);
}
// Parsing the acquired radar status
const char* targetStatusToString(Seeed_HSP24::TargetStatus status) {
switch (status) {
case Seeed_HSP24::TargetStatus::NoTarget:
return "NoTarget";
case Seeed_HSP24::TargetStatus::MovingTarget:
return "MovingTarget";
case Seeed_HSP24::TargetStatus::StaticTarget:
return "StaticTarget";
case Seeed_HSP24::TargetStatus::BothTargets:
return "BothTargets";
default:
return "Unknown";
}
}
プログラムをコンパイルしてアップロードした後、シリアルモニターを開いてボーレートを9600に設定してください。すべてが正常に動作すれば、以下の結果出力が表示されるはずです。

デモ 3. その他の設定照会と工場出荷時設定の復元
3番目の例では、センサー設定を復元する方法と、パラメータ照会機能の使用に関するその他の例を提供します。
特に注意すべき点は、センサーを工場出荷時設定に復元すると、センサーのボーレートも256000に復元されることです。他のXIAOプログラムを使用する前に、前の手順に従ってスマートフォンアプリでボーレートを9600にリセットする必要があります。
#if defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) || defined(ARDUINO_SEEED_XIAO_NRF52840)
#error "XIAO nRF52840 please use the non-mbed-enable version."
#endif
#include <SoftwareSerial.h>
#include <mmwave_for_xiao.h>
// Define the SoftwareSerial object, D2 as RX, D3 as TX, connect to the serial port of the mmwave sensor
SoftwareSerial COMSerial(D2, D3);
// Creates a global Serial object for printing debugging information
#define ShowSerial Serial
// Initialising the radar configuration
// Seeed_HSP24 xiao_config(COMSerial, ShowSerial);
Seeed_HSP24 xiao_config(COMSerial);
Seeed_HSP24::RadarStatus radarStatus;
void setup() {
COMSerial.begin(9600);
ShowSerial.begin(9600);
while(!ShowSerial); // Turn on the serial monitor and start executing
delay(500);
ShowSerial.println("Programme Starting!");
ShowSerial.print("Sensor Software Version: ");
ShowSerial.println(xiao_config.getVersion());
radarStatus = xiao_config.getConfig();
if (radarStatus.detectionDistance != -1) {
ShowSerial.println("Detection Distance: " + String(radarStatus.detectionDistance) + " m ");
ShowSerial.println("Moveing Set Distance: " + String(radarStatus.moveSetDistance) + " m ");
ShowSerial.println("Static Set Distance: " + String(radarStatus.staticSetDistance) + " m ");
ShowSerial.println("No Target Duration Time: " + String(radarStatus.noTargrtduration) + " seconds ");
}
else ShowSerial.println("Failed to get configuration information, please retry.");
/*** Restore or reset the radar settings, please operate with caution.
* * After restoring or resetting the factory settings, please re-modify
* * the baud rate to 9600 before using XIAO!
* */
xiao_config.refactoryRadar();
// xiao_config.rebootRadar(); // Reboot the Sensor
}
void loop() {}
このプログラムは、シリアルモニターをオンにした後にリセットを実行します。

トラブルシューティング
Q1: XIAO nRF52840 (Sense)を使用していますが、どの開発ボードバージョンを選択すべきですか?
プログラムに必要なソフトシリアルポートライブラリが含まれているため、XIAO nRF52840開発ボードパッケージの非mbedバージョンを使用する必要があります。

Q2: フレームドロップやセンサーデータストリームの文字化けが発生するのはなぜですか?
これは、センサーのボーレートを変更していないことが原因である可能性が高いです。この製品の工場出荷時ファームウェアのデフォルトボーレートは256000です。XIAOのソフトシリアルポートはこのような高速データストリームを処理できない場合があり、プログラムが異常に停止してデータフレームを正しく解析できなくなる可能性があります。そのため、ボーレートを下げてからプログラムを再度使用してください。9600のボーレートの使用をお勧めします。
Q3: Demo2を使用する際にデータストリームが1〜2秒遅れるのはなぜですか?
これは正常な現象である可能性があります。エンジニアリングモードでのデータフローは大きく、ソフトシリアルポートがCPUを占有してデータを処理する能力には限界があるため、時々一時停止することがあります。
技術サポートと製品ディスカッション
弊社製品をお選びいただきありがとうございます!弊社製品での体験が可能な限りスムーズになるよう、さまざまなサポートを提供いたします。さまざまな好みやニーズに対応するため、複数のコミュニケーションチャンネルを提供しています。