Skip to main content

60GHz 毫米波跌倒检测传感器套件与 XIAO ESP32C6 (MR60FDA2) 入门指南


介绍我们为 XIAO 设计的先进毫米波传感器模块,旨在为跌倒检测和心跳监测提供前沿的监控解决方案。这些模块由强大的 XIAO ESP32 微控制器驱动,内置 Wi-Fi 和蓝牙连接功能,提供精确可靠的检测能力。无论您需要实时监测跌倒还是以敏感精度跟踪心跳,我们的模块都配备了最先进的技术,包括可定制的 RGB LED 和环境光感应。通过 Grove GPIO 端口的便捷扩展选项,这些多功能模块非常适合广泛的应用,从智能家居集成到医疗保健监测。

特性

  • Wi-Fi 和蓝牙功能:两个模块都由 XIAO ESP32 驱动,预装 ESPHome 固件,确保快速设置和定制。
  • 跌倒检测模块
    • 精确跌倒检测:覆盖 3x3x3 米区域,检测角度为 100° x 40°。
    • 静态存在检测:监测最远 6 米的静止人员。
  • 环境感应
    • BH1750 光传感器:测量 1 到 65,535 勒克斯的环境光。
    • WS2812 RGB LED:可定制 LED,用于视觉反馈和 DIY 项目。
  • 可扩展连接:包含 Grove GPIO 端口,用于添加额外的传感器和模块。

规格参数

通用参数
毫米波固件跌倒检测监测
检测范围人体静态存在检测:最远 6 米
跌倒检测:
- 3x3x3 米范围
- 水平视场角 (FoV) 120°
- 垂直视场角 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.0米,最大感应半径2米,毫米波传感器一侧需要对准检测方向。

note

请在开放空间中使用此模块,并避免在检测范围内出现以下情况,以防止对模块造成干扰:

  • 多个雷达安装距离过近
  • 风吹动窗帘和摇摆植物
  • 水流和水膜
  • 大面积金属和镜面反射
  • 透过玻璃和薄木板检测
  • 安装位置容易产生振动
  • 使用劣质电源

软件准备(Arduino)

注意

默认情况下,MR60BHA2预装了XIAO ESP32C6,但它兼容各种其他微控制器进行通信和集成。

如果这是您第一次在XIAO系列上使用Arduino,请按照适合您开发板的设置指南进行操作:

设置好开发板后,请按照以下步骤操作:

  1. 下载Seeed毫米波库
  1. 在Arduino IDE中安装库
    • 打开Arduino IDE。
    • 导航到项目 > 加载库 > 添加.ZIP库...
    • 选择下载的.zip文件来安装库。
  2. 连接您的XIAO开发板
    • 通过USB将XIAO开发板插入计算机。
    • 在Arduino IDE中,转到工具 > 开发板并选择您的XIAO开发板型号。
    • 工具 > 端口下选择正确的端口。
  3. 加载示例代码
    • 转到文件 > 示例 > Seeed Arduino mmWave
    • 选择跌倒检测的相关示例。
    • 查看代码并进行必要的调整。
  4. 上传代码
    • 点击上传将代码烧录到XIAO开发板。
    • 在Arduino IDE中打开串口监视器查看实时传感器数据。

使用方法

本节提供示例代码片段,帮助您快速开始使用Seeed Arduino毫米波库的各种功能,包括跌倒检测、RGB LED控制和光感应。

跌倒模块

此示例展示如何使用 MR60FDA2 传感器进行跌倒检测。

#include <Adafruit_NeoPixel.h>
#include <Arduino.h>
#include <hp_BH1750.h> //包含库文件
#include "Seeed_Arduino_mmWave.h"

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

#define LIGHT_GPIO D0

/****** 实例 ******/

hp_BH1750 BH1750; // 创建传感器对象

SEEED_MR60FDA2 mmWave;

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

/****** 函数 ******/

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

/****** 变量 ******/
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);
/* 初始化继电器设备*/
relay_init();

/* 初始化RGB LED */
pixels.begin();
pixels.clear();
pixels.setBrightness(8);
pixels.show();
pixels.setPixelColor(0, pixels.Color(125, 125, 125));
/* 初始化内置光环境光传感器 */
BH1750.begin(BH1750_TO_GROUND); // 如果未找到传感器将返回false
// | 已连接到I2C
BH1750.calibrateTiming();
BH1750.start(BH1750_QUALITY_HIGH2,
254); // 在setup中开始第一次测量
/* 设置毫米波跌倒参数 */
mmWave.setUserLog(0);

/** 设置安装高度 **/
if (mmWave.setInstallationHeight(height)) {
Serial.printf("setInstallationHeight success: %.2f\n", height);
} else {
Serial.println("setInstallationHeight failed");
}

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

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

/** 获取毫米波的新参数 **/
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() {
/* 获取状态 */
if (mmWave.update(100)) {
bool is_human, is_fall;
// 获取人体检测状态
if (mmWave.getHuman(is_human)) {
// 获取跌倒检测状态
if (mmWave.getFall(is_fall)) {
// 根据人体和跌倒检测确定状态
if (!is_human && !is_fall) {
status = NO_PEOPLE; // 未检测到人体和跌倒
} else if (is_fall) {
status = PEOPLE_FALL; // 检测到跌倒
} else {
status = EXIST_PEOPLE; // 检测到人体但未跌倒
}
}
}
// 获取人体检测状态
if (!mmWave.getHuman(is_human) && !mmWave.getFall(is_fall)) {
status = NO_PEOPLE; // 未检测到人体和跌倒
} else if (is_fall) {
status = PEOPLE_FALL; // 检测到跌倒
} else {
status = EXIST_PEOPLE; // 检测到人体但未跌倒
}
}

switch (status) {
case NO_PEOPLE:
Serial.printf("等待人员");
break;
case EXIST_PEOPLE:
Serial.printf("有人 !!!");
break;
case PEOPLE_FALL:
Serial.printf("跌倒 !!!");
break;
default:
break;
}
Serial.print("\n");

/* 改变交互式灯光*/
if (status != last_status) { // 切换LED
switch (status) {
case NO_PEOPLE:
pixels.setPixelColor(0, pixels.Color(0, 0, 255)); // 蓝色
break;
case EXIST_PEOPLE:
pixels.setPixelColor(0, pixels.Color(0, 255, 0)); // 绿色
break;
case PEOPLE_FALL:
pixels.setPixelColor(0, pixels.Color(255, 0, 0)); // 红色
break;
default:
break;
}
pixels.show();
last_status = status;
}

/* 更新照度值 */
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. 选择正确的开发板和端口号来上传程序。

程序成功上传后,您将看到毫米波传感器模块右侧的RGB LED开始闪烁。

光传感器 (BH1750)

此示例展示如何使用BH1750传感器读取光强度值。

  • 步骤 1. 下载 hp_BH1750

导航到 Sketch > Include Liarbry > Manage Libraries...,搜索 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 串口监视器的输出如下:

跌倒模块 API

此示例使用 SEEED_MR60FDA2 类与 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

修改雷达固件是一项有风险的操作,因此请务必仔细阅读本节,然后仔细按照每个步骤操作。请注意,如果某个步骤执行不正确,雷达可能会变砖或无法使用。

特别注意,如果您购买的是雷达 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

如果在上述步骤中您操作不当导致异常发生,并且一直无法尝试重新烧录固件且雷达无法正常工作,那么雷达可能由于固件损坏而变砖。尝试恢复设备的唯一方法是参考**此处**的文件和文档。但是,请理解我们不为因操作不当而变砖的设备提供技术支持和协助。

开放定制化

想要定制套件以适应您的独特应用?

有关定制毫米波模块时的3D点云数据生成和干扰区域配置的更多信息。Seeed提供一站式研发定制和制造服务,助力从概念到生产的快速开发。请联系我们:[email protected] 了解更多信息。

资源

技术支持与产品讨论

感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...