Skip to main content

60GHz mmWave転倒検知センサーキット XIAO ESP32C6 (MR60FDA2) の使用開始


XIAO用の先進的なmmWaveセンサーモジュールをご紹介します。転倒検知と心拍監視の両方に対応した最先端の監視ソリューションを提供するよう設計されています。Wi-FiとBluetooth接続機能を内蔵した堅牢なXIAO ESP32マイクロコントローラーを搭載し、これらのモジュールは精密で信頼性の高い検知機能を提供します。リアルタイムでの転倒監視や敏感な精度での心拍追跡が必要な場合でも、当社のモジュールはカスタマイズ可能なRGB LEDと環境光センシングを含む最先端技術を搭載しています。Grove GPIOポートによる簡単な拡張オプションにより、これらの多用途モジュールはスマートホーム統合からヘルスケア監視まで、幅広いアプリケーションに最適です。

特徴

  • Wi-Fi & Bluetooth対応: 両モジュールはESPHomeファームウェアがプリフラッシュされたXIAO ESP32を搭載し、迅速なセットアップとカスタマイズを保証します。
  • 転倒検知モジュール:
    • 精密な転倒検知: 100° x 40°の検知角度で3x3x3メートルエリアをカバーします。
    • 静的存在検知: 最大6メートル離れた静止している個人を監視します。
  • 環境センシング:
    • BH1750光センサー: 1から65,535ルクスの環境光を測定します。
    • WS2812 RGB LED: 視覚的フィードバックとDIYプロジェクト用のカスタマイズ可能なLED。
  • 拡張可能な接続性: 追加のセンサーやモジュールを追加するためのGrove GPIOポートを含みます。

仕様

一般パラメータ
mmWaveファームウェア転倒検知監視
検知範囲人間静的存在検知: 最大6メートル
転倒検知:
- 3x3x3メートル範囲
- 水平視野角(FoV) 120°
- 垂直FoV 100°
MCUSeeed Studio XIAO ESP32C6
LEDWS2812 RGB LED
ボタンリセット
光センサーBH1750 範囲: 1から65,535ルクス、最大100,000ルクスまでの調整可能な測定
接続性1 GPIOポート (D0, D10)
ピンヘッダー間隔2.54mm
電源供給5V/1A入力
消費電力0.5w: スタンバイモード
0.8w: アクティベーションモード
1.4w: Groveリレー状態での動作

アプリケーション

  • セキュリティシステム
  • ヘルスケアモニタリング
  • スマートホームオートメーション
  • 高齢者ケア

ハードウェア概要


はじめに

設置方法と検知範囲

天井取り付け高さ2.2-3.0m、最大検知半径2m、mmWaveセンサーがある面を検知方向に向けて設置してください。

note

このモジュールは開放的な空間で使用し、モジュールの干渉を防ぐため、検知範囲内で以下のシナリオを避けてください:

  • 複数のレーダーが近すぎる場所に設置されている
  • 風でカーテンが動いたり植物が揺れたりする
  • 水流や水膜
  • 大きな金属面や鏡の反射
  • ガラスや薄い木板を通しての検知
  • 振動しやすい設置場所
  • 低品質な電源の使用

ソフトウェア準備(Arduino)

注意

デフォルトでは、MR60BHA2はXIAO ESP32C6が事前に組み立てられていますが、通信と統合のために他の様々なマイクロコントローラーとも互換性があります。

XIAO シリーズでArduinoを初めて使用する場合は、お使いのボードに適したセットアップガイドに従ってください:

ボードのセットアップが完了したら、以下の手順に進んでください:

  1. Seeed mmWave ライブラリをダウンロード
  1. Arduino IDEにライブラリをインストール
    • Arduino IDEを開きます。
    • **スケッチ > ライブラリをインクルード > .ZIP形式のライブラリをインストール...**に移動します。
    • ダウンロードした.zipファイルを選択してライブラリをインストールします。
  2. XIAOボードを接続
    • XIAOボードをUSB経由でコンピューターに接続します。
    • Arduino IDEで、ツール > ボードに移動し、XIAOボードモデルを選択します。
    • ツール > ポートで正しいポートを選択します。
  3. サンプルスケッチを読み込み
    • ファイル > スケッチ例 > Seeed Arduino mmWaveに移動します。
    • 転倒検知に関連するサンプルを選択します。
    • コードを確認し、必要に応じて調整を行います。
  4. スケッチをアップロード
    • アップロードをクリックしてコードをXIAOボードに書き込みます。
    • Arduino IDEでシリアルモニターを開いて、リアルタイムのセンサーデータを表示します。

使用方法

このセクションでは、転倒検知、RGB LED制御、光センシングなど、様々な機能でSeeed Arduino mmWaveライブラリを素早く使い始めるためのサンプルコードスニペットを提供します。

Fall Module

This example shows how to use the MR60FDA2 sensor for fall detection.

#include <Adafruit_NeoPixel.h>
#include <Arduino.h>
#include <hp_BH1750.h> //inlude the library
#include "Seeed_Arduino_mmWave.h"

#ifdef ESP32
# include <HardwareSerial.h>
HardwareSerial mmwaveSerial(0);
#else
# define mmwaveSerial Serial1
#endif

#define LIGHT_GPIO D0

/****** instance ******/

hp_BH1750 BH1750; // create the sensor object

SEEED_MR60FDA2 mmWave;

Adafruit_NeoPixel pixels =
Adafruit_NeoPixel(1, /* pixelPin */ D1, NEO_GRB + NEO_KHZ800);

/****** funtions ******/

void relay_init();
void relay_on();
void relay_off();

/****** variables ******/
uint32_t sensitivity = 15;
float height = 2.8, threshold = 1.0;
float rect_XL, rect_XR, rect_ZF, rect_ZB;

const uint8_t dark_lux = 10;

void setup() {
bool result;
Serial.begin(115200);
mmWave.begin(&mmwaveSerial);
/* init relay device*/
relay_init();

/* init RGB LED */
pixels.begin();
pixels.clear();
pixels.setBrightness(8);
pixels.show();
pixels.setPixelColor(0, pixels.Color(125, 125, 125));
/* init built-in light ambient light sensor */
BH1750.begin(BH1750_TO_GROUND); // will be false no sensor found
// | already connected to I2C
BH1750.calibrateTiming();
BH1750.start(BH1750_QUALITY_HIGH2,
254); // start the first measurement in setup
/* set mmwave-fall parameters */
mmWave.setUserLog(0);

/** set the height of the installation **/
if (mmWave.setInstallationHeight(height)) {
Serial.printf("setInstallationHeight success: %.2f\n", height);
} else {
Serial.println("setInstallationHeight failed");
}

/** Set threshold **/
if (mmWave.setThreshold(threshold)) {
Serial.printf("setThreshold success: %.2f\n", threshold);
} else {
Serial.println("setThreshold failed");
}

/** Set sensitivity **/
if (mmWave.setSensitivity(sensitivity)) {
Serial.printf("setSensitivity success %d\n", sensitivity);
} else {
Serial.println("setSensitivity failed");
}

/** get new parameters of mmwave **/
if (mmWave.getRadarParameters(height, threshold, sensitivity, rect_XL,
rect_XR, rect_ZF, rect_ZB)) {
Serial.printf("height: %.2f\tthreshold: %.2f\tsensitivity: %d\n", height,
threshold, sensitivity);
Serial.printf(
"rect_XL: %.2f\trect_XR: %.2f\trect_ZF: %.2f\trect_ZB: %.2f\n", rect_XL,
rect_XR, rect_ZF, rect_ZB);
} else {
Serial.println("getRadarParameters failed");
}
}

typedef enum {
EXIST_PEOPLE,
NO_PEOPLE,
PEOPLE_FALL,
} MMWAVE_STATUS;

MMWAVE_STATUS status = NO_PEOPLE, last_status = NO_PEOPLE;
float lux = 100;
void loop() {
/* get status */
if (mmWave.update(100)) {
bool is_human, is_fall;
// Get the human detection status
if (mmWave.getHuman(is_human)) {
// Get the fall detection status
if (mmWave.getFall(is_fall)) {
// Determine the status based on human and fall detection
if (!is_human && !is_fall) {
status = NO_PEOPLE; // No human and no fall detected
} else if (is_fall) {
status = PEOPLE_FALL; // Fall detected
} else {
status = EXIST_PEOPLE; // Human detected without fall
}
}
}
// Get the human detection status
if (!mmWave.getHuman(is_human) && !mmWave.getFall(is_fall)) {
status = NO_PEOPLE; // No human and no fall detected
} else if (is_fall) {
status = PEOPLE_FALL; // Fall detected
} else {
status = EXIST_PEOPLE; // Human detected without fall
}
}

switch (status) {
case NO_PEOPLE:
Serial.printf("Waiting for people");
break;
case EXIST_PEOPLE:
Serial.printf("PEOPLE !!!");
break;
case PEOPLE_FALL:
Serial.printf("FALL !!!");
break;
default:
break;
}
Serial.print("\n");

/* change interactive Light*/
if (status != last_status) { // switching LED
switch (status) {
case NO_PEOPLE:
pixels.setPixelColor(0, pixels.Color(0, 0, 255)); // BLUE
break;
case EXIST_PEOPLE:
pixels.setPixelColor(0, pixels.Color(0, 255, 0)); // GREEN
break;
case PEOPLE_FALL:
pixels.setPixelColor(0, pixels.Color(255, 0, 0)); // RED
break;
default:
break;
}
pixels.show();
last_status = status;
}

/* update lux value */
if (BH1750.hasValue() == true) {
lux = BH1750.getLux();
BH1750.start(BH1750_QUALITY_HIGH2, 254);
}

Serial.print("LUX: ");
Serial.print(lux);
Serial.print("\t");

if ((status == EXIST_PEOPLE || status == PEOPLE_FALL) && lux < dark_lux) {
relay_on();
} else {
relay_off();
}
}

void relay_init() {
pinMode(LIGHT_GPIO, OUTPUT);
}
void relay_on() {
digitalWrite(LIGHT_GPIO, HIGH);
}
void relay_off() {
digitalWrite(LIGHT_GPIO, LOW);
}

Arduino シリアルモニターでの出力は以下のようになります:

RGB LED を点滅させる

この例では、NeoPixel ライブラリを使用して RGB LED を制御する方法を示します。

  • ステップ 1. Adafruit_NeoPixel ライブラリをダウンロードする

Sketch > Include Liarbry > Manage Libraries... に移動し、Adafruit_NeoPixel を検索して、最新バージョンをインストールします。

  • ステップ 2. 以下のコードを新しいスケッチにコピーします:
#include <Adafruit_NeoPixel.h>
#include <Arduino.h>

const int pixelPin = D1;

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, pixelPin, NEO_GRB + NEO_KHZ800);

void setup() {
Serial.begin(115200);
pixels.begin();
pixels.clear();
pixels.show();
}

void loop() {
for (int i = 0; i < 10; i++) {
pixels.setPixelColor(0, pixels.Color(255, 0, 0));
pixels.show();
delay(100);
pixels.setPixelColor(0, pixels.Color(0, 0, 0));
pixels.show();
delay(100);
}

for (int i = 255; i >= 0; i--) {
pixels.setPixelColor(0, pixels.Color(i, 0, 0));
pixels.show();
delay(10);
}
}
  • ステップ 3. 正しいボードとポート番号を選択してプログラムをアップロードします。

プログラムが正常にアップロードされると、mmWave センサーモジュールの右側にある RGB LED が点滅しているのが確認できます。

光センサー (BH1750)

この例では、BH1750 センサーを使用して光強度値を読み取る方法を示します。

  • ステップ 1. hp_BH1750 ライブラリをダウンロードします

スケッチ > ライブラリをインクルード > ライブラリを管理... に移動し、hp_BH1750 を検索して、最新バージョンをインストールします。

  • ステップ 2. 以下のコードを新しいスケッチにコピーします:
#include <Arduino.h>
#include <hp_BH1750.h>

hp_BH1750 BH1750;

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

bool avail = BH1750.begin(BH1750_TO_GROUND);

if (!avail) {
Serial.println("No BH1750 sensor found!");
while (true) {}
}

Serial.printf("conversion time: %dms\n", BH1750.getMtregTime());
BH1750.start();
}

void loop() {
if (BH1750.hasValue()) {
float lux = BH1750.getLux();
Serial.println(lux);

BH1750.start();
}
}
  • ステップ 3. 正しいボードとポート番号を選択してプログラムをアップロードします。

Arduino シリアルモニターでの出力は以下のようになります:

Fall Module API

この例では、転倒検知のためにMR60FDA2センサーとインターフェースするSEEED_MR60FDA2クラスを使用します。各主要機能の動作は以下の通りです:

  • mmWave.begin(&mmWaveSerial):

    • 通信用にセンサーを初期化し、XIAOボードとMR60FDA2センサー間のシリアル接続を設定します。
  • mmWave.setInstallationHeight(float height):

    • レーダーの設置高度を設定します。これは正確な転倒検知にとって重要です。heightパラメータはセンサーが設置される高度(メートル単位)を指定し、初期化設定パラメータは2.2 mで、有効範囲は通常1〜5メートルです。
  • mmWave.setThreshold(float threshold):

    • 転倒検知の閾値を設定します。レーダーのデフォルト転倒閾値は0.6 mです。この値は、センサーからの高度と距離に基づいて転倒を検知する際のレーダーの感度を決定します。
  • mmWave.setSensitivity(uint32_t sensitivity):

    • 転倒検知のためのレーダーの感度を調整します。感度の初期値は3で、これは3フレームのデータの平均を表します。通常の値は3〜10の範囲で、値が高いほどセンサーが潜在的な転倒により敏感に反応します。
  • mmWave.getRadarParameters(float &height, float &threshold, uint32_t &sensitivity):

    • 設置高度、転倒検知閾値、感度設定を含む、レーダーの現在の設定パラメータを取得します。これらのパラメータは参照変数を通じて返されます。
  • mmWave.getHuman():

    • レーダーによって人の存在が検知されているかどうかをチェックします。人が検知された場合はtrueを、そうでなければfalseを返します。
  • mmWave.getFall():

    • 転倒が検知されたかどうかを判定します。この関数は転倒が検知された場合はtrueを、そうでなければfalseを返します。

モジュールファームウェアアップグレード

caution

レーダーファームウェアの変更は危険な操作ですので、各ステップを慎重に実行する前に、このセクションを注意深く読んでください。ステップが正しく実行されない場合、レーダーがブリック状態になったり、使用できなくなったりする可能性があることをご承知おきください。

特別な注意事項:Radar MR60BHA2を購入された場合は、以下の方法で不正にファームウェアをフラッシュしないでください。デバイスが確実にブリック状態になります!!!!

まず、XIAO ESP32C6とMR60FDA2モジュールを接続します。次に、以下のコードを使用してXIAOをプログラムします。

#include <Arduino.h>
#include "Seeed_Arduino_mmWave.h"

// If the board is an ESP32, include the HardwareSerial library and create a
// HardwareSerial object for the mmWave serial communication
#ifdef ESP32
# include <HardwareSerial.h>
HardwareSerial mmWaveSerial(0);
#else
// Otherwise, define mmWaveSerial as Serial1
# define mmWaveSerial Serial1
#endif

void setup() {
// Initialize the serial communication for debugging
Serial.begin(115200);
while (!Serial) {
; // Wait for Serial to initialize
}

// Initialize the mmWaveSerial communication
mmWaveSerial.begin(115200);
}

void loop() {
// Check if there is data available from mmWaveSerial
while (mmWaveSerial.available() > 0) {
char receivedChar = mmWaveSerial.read();
Serial.write(receivedChar); // Forward data to Serial
}

// Check if there is data available from Serial
while (Serial.available() > 0) {
char receivedChar = Serial.read();
mmWaveSerial.write(receivedChar); // Forward data to mmWaveSerial
}
}
tip

上記のコードの機能は、モジュールのシリアルポートをXIAOのUSBシリアルポートに透過的に送信することで、XIAOを通じてモジュールのファームウェアをアップグレードできるようにすることです。
アップグレードプロセス中は、XIAOをPCに接続してください。

モジュールから送信された元のデータが表示されます。

次に、OTAツールとファームウェアをここからダウンロードして解凍する必要があります。

  1. シリアルポートを確認して接続します(ボーレートを115200に設定)
  1. 「REQUEST UPDATE」をクリックしてアップグレードモードに入ります:
  1. 「C」または「43」が印刷された場合、モジュールがアップグレードモードに入ったことを意味します。
  1. アップグレードするファームウェアを選択します。選択後、自動的にアップグレード状態に入ります。

アップグレードが完了すると、自動的に通常モードにジャンプします。ジャンプしない場合は、電源を切って再起動し、OTAツールを使用してシリアルポートデータを表示してください。

  1. アップグレードが完了した後、OTAツールを使用してバージョンと生データを読み取ることができます。
  1. アップグレード完了後、XIAO ESP32C6のファームウェアを再フラッシュする必要があります。
tip

上記の手順で誤った操作により異常が発生し、ファームウェアの書き込みを再試行できず、レーダーが正常に動作しない場合、ファームウェアの破損によりレーダーがブリック状態になった可能性があります。デバイスを復旧する唯一の方法は、**こちら**のファイルとドキュメントを参照することです。ただし、誤った操作によりブリック状態になったデバイスについては、技術サポートや支援を提供していないことをご理解ください。

カスタマイズ対応

キットをあなた独自のアプリケーションに合わせてカスタマイズしたいですか?

mmWaveモジュールをカスタマイズする際の3Dポイントクラウドデータ生成と干渉ゾーン設定について詳しく知りたい場合は、Seeedがコンセプトから製造まで迅速な開発のためのワンストップR&Dカスタマイズおよび製造サービスを提供しています。詳細については [email protected] までお問い合わせください。

カスタマイズサービスの説明

レーダーのファームウェアとアルゴリズムはオープンソースではなく、転倒高さ設定、取り付け位置設定などのレーダーの複雑なパラメータにはカスタマイズサービスが必要で、追加のカスタマイズ費用とMOQが発生する場合があります。

リソース

技術サポート & 製品ディスカッション

私たちの製品をお選びいただき、ありがとうございます!私たちは、お客様の製品体験が可能な限りスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、複数のコミュニケーションチャンネルを提供しています。

Loading Comments...