【CEM5861G-M11雷达模块开发指南】人体运动距离感应警报系统

分享作者:A0dy
作者昵称:A0dy?
评测品牌:萤火工场
评测型号:CEM5861G-M11
发布时间:2025-08-25 11:26:22
0
概要
CEM5861G-M11雷达模块使用方法(指令控制、上位机控制)等,开发应用方案;
开源口碑分享内容
⚠️转载、引用等   请注明出处;


一、硬件介绍

1、产品特点

Beetle RP2350【RP2350A_QFN60】是一款基于RP2350微控制器的高性能迷你开发板,双核双架构设计(支持 Arm Cortex-M33或Hazard3 RISC-V内核)为开发者提供灵活的性能配置。

双核双架构,性能自由切换

  • 采用Raspberry Pi RP2350高性能微控制器,支持Arm Cortex-M33或Hazard3 RISC-V内核选择。
  • 主频高达150MHz,配备520KB RAM和2MB Flash,可高效处理大量数据,满足高性能计算需求。

高度集成,硬币大小

  • 尺寸仅为25mm x 20.5mm,相当于一枚硬币大小,适合空间受限的应用场景。
  • 提供 11个IO接口、BAT接口和3.3V电源接口,满足多样化连接需求。

锂电池管理与监测 集成 锂电池充电管理电池电压监测 功能,支持实时电量监控,确保设备在低电量时及时采取措施,确保持续运行。

易于编程与集成

  • 支持 C/C++ 和 MicroPython 编程

2、功能引脚示意图 / 原理图

板载LED灯

IO25引脚控制

充电指示灯

指示充电状态的绿色LED灯通过三种方式指示充电状态:1、充满电或未接入电源时熄灭;2、充电时常亮;3、USB供电,未连接锂电池时高频闪烁;

用户按键

使用QSPI_SS引脚控制该按钮

引脚号数字口模拟口UARTI2CSPI其它
0D0TX1
1D1RX1
4D4SDA
5D5SCL
8D8TX2
9D9RX2
16D16SPI0/MISO
18D18SPI0/SCK
19D19SPI0/MOSI
26D26A0
27D27A1
BAT锂电池输入接口,IO29为电池电压检测引脚
GND接地引脚
VCC该引脚接在USB电源引脚,作为输出时电压为USB电压,通常为5V
3V33.3V稳压电源输出


主要原理图:


3、外部硬件

1、雷达模块【CEM5861G-M11】

CEM5816G-M11 是一款高灵敏度 24GHz 毫米波 FMCW 人体存在检测雷达模块; 本模块主要特点是在传统人体感应雷达的功能基础上,同时具备检测人体呼吸等微小幅度的运动,来判断人体存在的功能; 模块采用 FMCW 调制,可以同时输出目标的距离。 模块可选带光敏,用户可根据环境光大小,对光敏门限进行设置; 在光照充足时关闭雷达,光照黑暗时开启雷达,实现照明感应的应用;

系统框架

特性:


参数典型值
频率24G-24.25GHz
调制方式FMCW
范围挂高安装:挂高 3m,静止人体检测半径 3m (可调), 移动检测半径 6m max(可调) 水平安装:直线 7 米运动检测,4 米存在检测
供电3.6 - 5.5V
电流22mA(平均值),80mA(峰值)
输出串口电平TTL(3.3V)
检测周期实时
数据格式UART

引脚定义

序号功能备注
1OUT有人输出高电平 3.3V,无人输出低电平 0V
2UART_TX串口发送
3UART_RX串口接收
4GND
5VCC供电 3.6 ~ 5.5V


数据格式说明

所有多字节参数,均采用大端格式传输

数据格式说明
帧头(2 字节)上位机发送,雷达接收: 0x55 0x5A
雷达发送,上位机接收: 0x55 0xA5
数据长度(2 字节,高字节在前,低字节在后)长度 = 功能码 + 命令码 + 数据 + 校验和
功能码(1 字节)读:0x0、写:0x1
被动上报:0x2、主动上报:0x3  
读 / 写命令为上位机向雷达发送指令
上报命令为雷达向上位机发送信息
命令码(2 字节)命令码1:为功能分类
命令码2:表示具体功能
数据N字节
校验和(1 字节)为校验和之前所有数据按 uint8_t 格式相加之和的 低8位。


1、上位机接收到雷达发送的数据

例:55 A5 00 0E 03 81 00 00 01 00 5E 00 00 00 00 01 78 64

55 A5 00 0E 03 CMD[1] CMD[2] Data[0] ~ Data[9] SUM


帧头(55 A5):上位机接收到雷达发送的数据;

数据长度(0x0E / 14):功能码(1) + 命令码(2) + 数据(10) + 校验和(1);

功能码(0x03):主动上报;

命令码(81 00)

数据:检测到运动目标,目标距离为 0.94 米,信号强度为 376

目标 ID:0x00运动状态:0x01(检测到运动目标)
目标距离:0x00 0x5E(转换成十进制为:94cm)
速度 / 方位角度 / 俯仰角度:0
目标信号强度:0x01 0x78(转换成十进制为:376)
校验和:0x64(转换成十进制为:100)


2、Data 数据说明

Data[0]说明
Data[0]目标ID号:8位无符号整型
Data[1]目标状态:8位无符号整型;
0:无目标;
1:表示移动;
2:表示存在
Data[2]、Data[3]距离:16位无符号整型(cm)
Data[4]、Data[5]速度:16位有符号整型(cm/s)
Data[6]方位角度:8位有符号整型(°度)
Data[7]俯仰角度:8位有符号整型(°度)
Data[8]、Data[9]信号强度:16位无符号整型


雷达功能参数配置

16 进制收发,支持在线修改和保存参数:

波特率:115200、字宽: 8、停止位: 1、奇偶校验: none

使用串口工具(USB-TTL)连接至模块,并打开串口调试工具,可进行以下功能的配置;


参数功能读取指令
OTA 在线升级发送:55 5A 00 04 01 20 01 D5
接收:55 A5 00 04 02 20 01 21
恢复到默认参数发送:55 5A 00 04 01 20 02 D6
接收:55 A5 00 04 02 20 02 22
将所有参数保存到 flash 中发送:55 5A 00 04 01 20 04 D8
接收:55 A5 00 04 02 20 04 24
获取软件版本号发送:55 5A 00 04 00 00 01 B4
接收:55 A5 00 11 02 00 01 DATA1~DATA13 SUM
1米内运动检测阈值(默认值:200)读取:55 5A 00 04 00 80 03 36
设置:55 5A 00 06 01 80 03 DATA1 DATA2 SUM
接收:55 A5 00 06 02 80 03 DATA1 DATA2 SUM
1米外运动检测阈值(默认值:120)读取:55 5A 00 04 00 80 04 37
设置:55 5A 00 06 01 80 04 DATA1 DATA2 SUM
接收:55 A5 00 06 02 80 04 DATA1 DATA2 SUM
1米内存在检测阈值(默认值:300)读取:55 5A 00 04 00 80 09 3C
设置:55 5A 00 06 01 80 09 DATA1 DATA2 SUM
接收:55 A5 00 06 02 80 09 DATA1 DATA2 SUM
1米外存在检测阈值(默认值:300)读取:55 5A 00 04 00 80 0A 3D
设置:55 5A 00 06 01 80 0A DATA1 DATA2 SUM
接收:55 A5 00 06 02 80 0A DATA1 DATA2 SUM
最小检测距离(默认值 10cm)读取:55 5A 00 04 00 80 0C 3F
设置:55 5A 00 06 01 80 0C DATA1 DATA2 SUM
接收:55 A5 00 06 02 80 0C DATA1 DATA2 SUM
运动最大检测距离(默认值 :600cm)读取:55 5A 00 04 00 80 0D 40
设置:55 5A 00 06 01 80 0D DATA1 DATA2 SUM
接收:55 A5 00 06 02 80 0D DATA1 DATA2 SUM
存在最大检测距离(默认值: 450cm)读取:55 5A 00 04 00 80 0E 41
设置:55 5A 00 06 01 80 0E DATA1 DATA2 SUM
接收:55 A5 00 06 02 80 0E DATA1 DATA2 SUM
VO输出电平维持时间(默认值: 20000ms)读取:55 5A 00 04 00 80 14 47
设置:55 5A 00 06 01 80 14 DATA1 DATA2 SUM
接收:55 A5 00 06 02 80 14 DATA1 DATA2 SUM
VO指示模式(0x00:高电平指示有人;0x01:低电平指示无人)读取:55 5A 00 04 00 80 15 48
设置:55 5A 00 05 01 80 15 DATA1 SUM
接收:55 A5 00 05 02 80 15 DATA1 SUM
停止串口发送数据设置:55 5A 00 05 01 80 11 00 46
接收:55 A5 00 05 02 80 11 00 01
开启串口发送数据设置:55 5A 00 05 01 80 11 01 47
接收:55 A5 00 05 02 80 11 01 01
串口数据间隔时间(10ms / 以10倍率设置)读取:55 5A 00 04 00 20 06 D9
设置:55 5A 00 06 01 20 06 DATA1 DATA2 SUM
接收:55 A5 00 06 02 20 06 DATA1 DATA2 00


设置雷达参数

例: 雷达的移动感应距离设置为 5 米,存在距离 4 米,感应后输出高电平延时时间 5 秒

设置完成后,发送指令 55 5A 00 04 01 20 04 D8 进行保存,否则掉电会失效。

1、运动最大检测距离

串口发送:55 5A 00 06 01 80 0D 01 F4 38

串口返回信息:55 A5 00 06 02 80 0D 01 F4 84,表示移动检测距离已设置为 5 米

2、存在最大检测距离

串口发送:55 5A 00 06 01 80 0E 01 90 D5。

串口返回信息:55 A5 00 06 02 80 0E 01 90 21,表示存在检测距离已设置为 4 米

3、VO输出电平维持时间

串口发送:55 5A 00 06 01 80 14 13 88 E5。

串口返回信息:55 A5 00 06 02 80 14 13 88 31,表示感应输出高电平维持时间设置为 5 秒


上位机使用

上位机软件下载

1、连接好模块后,点击串口检测—串口选择—打开串口,此时显示界面会显示距离值及状态。


2、点击设置界面窗口,进入参数设置界面。可对模块的灵敏度,检测距离,串口延时,IO 延时等做配 置,在指令框中直接输入数值并点击写,即可修改模块参数。 灵敏度设置栏中,近距离运动/存在灵 敏度对应 1 米内设置,中距离运动 / 存在灵敏度对应 1 米外设置,修改完参数后点击保存按钮进行保存。


3、点击距离统计窗口,会实时显示距离及信号强度曲线。距离统计窗口上方曲线是实时距离曲线 色曲线代表静止目标的距离绿色曲线代表运动目标的距离

下方窗口显示的是实时信号强度曲线红色曲线代表静止目标的能量值,绿色曲线代表运动目标的能量值


2、喇叭模块【GSPK2307P-8R1W】


项目规格条件
额定阻抗8 Ohm±15%1kHz 1.0 V
额定输入功率0.5W2.0 V
最大输入功率1.0W2.0V
最低共振频率1700±20% Hz1.0 V Input
灵敏度88±3dB0.1m 0.1W
有效频率范围F0~20KHz-
谐波失真≤5% at 1kHz-


二、硬件连接

模块与开发板引脚之间的连接方式如下:

RP2350开发板VCCGNDTX2RX2A1A0
雷达模块VCCGNDRXTX--
喇叭模块-GND--VCC-
LED模块-GND---VCC


实物效果搭建如下:


三、项目功能实现思想

【人体运动感应警报系统】

实现效果:

实时检测判断人体运动 / 静止状态等相关信息;

处于运动时,输出此时的距离相关信息,并在不同距离范围内时,触发不同的警报效果;

处于静止时,绿色LED亮起,直到重新处于运动状态时才熄灭;

上位机串口输出相关数据信息;


四、功能实现主要步骤

主要相关代码

1、LED控制部分

#define LED_Pin A0
bool ledState = false;   

void Led_Control(){
  ledState = true;
  Count = 0;
}

...

if(ledState) 
   digitalWrite(LED_Pin, HIGH);
else
   digitalWrite(LED_Pin, LOW);

2、警报声音控制部分

#define Sound_Pin A1
bool soundState = false;
static unsigned long Stop = 0;

// 在不同范围内 触发不同警报声音 1s
void Sound_Control(){
  if(soundState){

    if(dis <=200){    // 2米内
      tone(Sound_Pin, 1500); // 1.5 kHz
    }else if(dis > 200 && dis <=400){  // 2~4m
      tone(Sound_Pin, 1000); 
    }else if(dis >400){   //4米外
      noTone(Sound_Pin);
    }
  }else{
    noTone(Sound_Pin);
  }

  if(millis() - Stop > 1000){
    Stop = millis();
    soundState = !soundState;
  }
}


3、雷达控制部分

#define COUNT 10 

static byte buffer[18]; //存储数据
static byte Count = 0; 
static uint16_t  dis; //距离

//雷达数据处理函数 
void Radar_Control(){
  //数据处理
  if(Serial2.available()){
  int header = Serial2.read();
  // 数据 18byte
  if(header == 0x55){
  int len = Serial2.readBytes(buffer,17);
      // 逐个字节 打印十六进制格式数据
      //A5 00 0E 03 81 00 00 02 00 67 00 00 00 00 25 B0 32  (17byte)
    for (int i = 0; i < len; i++) {
      if (buffer[i] < 0x10) Serial.print("0");
      Serial.print(buffer[i], HEX);
      Serial.print(" ");
      }
    Serial.println();

    //打印运动状态
  if(buffer[7] == 0x01){
    Serial.print("处于运动状态   ");
    if(Count>0){
      Count = 0;
      ledState = false;
    }
  }else{
    Serial.print("处于静止状态   ");
    Count++;
      //超过统计次数时 点亮LED
    if(Count >= COUNT) Led_Control();      
  }
    //打印当前距离 cm
  dis = (buffer[8] << 8) | (buffer[9] & 0XFF);
  Serial.printf("当前距离为: %dcm\r\n",dis);
  Serial.println();
  Sound_Control();
    }
  }
}
  


完整代码


#define LED_Pin A0
#define Sound_Pin A1
#define COUNT 10 

bool ledState = false;
bool soundState = false;

static unsigned long Stop = 0;
static byte buffer[18]; //存储数据
static byte Count = 0; 
static uint16_t  dis; //距离

void Led_Control(){
  ledState = true;
  Count = 0;
}


// 在不同范围内 触发不同警报声音 1s
void Sound_Control(){
  if(soundState){

    if(dis <=200){    // 2米内
      tone(Sound_Pin, 1500); // 1.5 kHz
    }else if(dis > 200 && dis <=400){  // 2~4m
      tone(Sound_Pin, 1000); 
    }else if(dis >400){   //4米外
      noTone(Sound_Pin);
    }
  }else{
    noTone(Sound_Pin);
  }

  if(millis() - Stop > 1000){
    Stop = millis();
    soundState = !soundState;
  }
}


//雷达数据处理函数 
void Radar_Control(){
  
  //数据处理
  if(Serial2.available()){
  int header = Serial2.read();
  // 数据 18byte
  if(header == 0x55){
  int len = Serial2.readBytes(buffer,17);
      // 逐个字节 打印十六进制格式数据
      //A5 00 0E 03 81 00 00 02 00 67 00 00 00 00 25 B0 32  (17byte)
    for (int i = 0; i < len; i++) {
      if (buffer[i] < 0x10) Serial.print("0");
      Serial.print(buffer[i], HEX);
      Serial.print(" ");
      }
    Serial.println();

    //打印运动状态
  if(buffer[7] == 0x01){
    Serial.print("处于运动状态   ");
    if(Count>0){
      Count = 0;
      ledState = false;
    }
  }else{
    Serial.print("处于静止状态   ");
    Count++;
      //超过统计次数时 点亮LED
    if(Count >= COUNT) Led_Control();      
  }
    //打印当前距离 cm
  dis = (buffer[8] << 8) | (buffer[9] & 0XFF);
  Serial.printf("当前距离为: %dcm\r\n",dis);
  Serial.println();
  Sound_Control();
    }
  }
}


void setup() {
  //串口初始化
  Serial.begin(115200);
  Serial2.begin(115200);
  while (!Serial);
  
  pinMode(Sound_Pin, OUTPUT);
  pinMode(LED_Pin, OUTPUT);

  analogWrite(Sound_Pin,0);
  analogWrite(LED_Pin,0);
  
}

void loop() {
    
    Radar_Control();
    if(ledState) 
        digitalWrite(LED_Pin, HIGH);
      else
        digitalWrite(LED_Pin, LOW);
}


五、实现现象

上位机串口打印距离、运动状态等相关信息,并处于不同距离范围内时,触发不同的警报声音效果;

处于静止时,LED点亮,重新处于运动时,LED熄灭;




六、优化建议

1、模块的2.00mm间距可改为2.54mm,更加便利适配普遍开发板间距,以及配合面包板使用;

2、实测误差大概在20~40cm左右?(可能和安装、环境等相关因数等有关?)

3、该模块无法输出速度 / 方位角度 / 俯仰角度等信息,可优化去除;


全部评论
暂无评论
0/144